当前位置: 首页 > 编程语言 > C#

看看锯齿状arrays中的每个组合分享

时间:2023-04-10 20:06:32 C#

C#学习教程:查看交错数组中的每个组合组合可能元素的方法?这个数组...char[][]myArray=newchar[][]{newchar[]{'A','B'},newchar[]{'C','D'},newchar[]{'E','F'}};...将返回ACE、ACF、ADE、ADF、BCE、BCF、BDE和BDF的组合。使用C#实现此目的的最快方法是什么?这是IMO一个分配最少的好算法(避免字符串连接):varindices=newint[input.Length];for(intpos=0,index=0;;){for(;pos=input[pos].Length);}}}用法:char[][]myArray=newchar[][]{newchar[]{'A','B'},newchar[]{'C','D'},newchar[]{'E','F'}};varcombinations=myArray.GetCombinations();基本上它是这样的展开实现fromc1ininput[0]fromc2ininput[1]...fromcNininput[N]selectnewstring(new[]{c1,c2,...,cN})PS如果您真的需要char[]类型的结果,只需将签名更改为publicstaticIEnumerableGetCombinations(thischar[][]input)并从yield中删除新字符串。但请注意,在这种情况下,可枚举的使用者负责制作组合数组的副本(如果需要存储它)。从公共API设计的角度来看,生成一个共享的内部变异数组是不好的(邪恶的),但对于内部性能场景来说是完美的。更新:由于问题是关于性能的,我做了一个测试,将上述算法(A)的字符串版本与Enigmativity的答案(B)中的LINQ解决方案进行了比较。我在VS之外的Release构建exe中运行了这个,其中包含不同数量的26个字母组合,结果如下:A:N=2Count=676Time=00:00:00.0010139Memory=16KB:N=2计数=676时间=00:00:00.0042598内存=233KA:N=3计数=17,576时间=00:00:00.0004310内存=348KB:N=3计数=17,576时间=00:00:00.0126294内存=2,185KA:N=4计数=456,976时间=00:00:00.0111155内存=1,496KB:N=4计数=456,976时间=00:00:00.4019500内存=2,104KA:N=5计数=11,881,376时间=00:00:002.内存=1,995KB:N=5计数=11,881,376时间=00:00:13.4492150内存=2,014KA:N=6计数=308,915,776时间=00:00:07.5473890内存=2,059KB:N=6计数1时间=5,08,9:07:37.2985051Memory=455K下面是感兴趣的完整测试代码:usingSystem;使用System.Collections.Generic;使用系统诊断;使用System.Globalization;使用System.Linq;使用系统线程;命名空间示例{publicstaticclassAlgorithms{publicstaticIEnumerableGetCombinationsA(thischar[][]input){varresult=newchar[input.长度];varindices=newint[input.Length];for(intpos=0,index=0;;){for(;pos=input[pos].Length);}}publicstaticIEnumerableGetCombinationsB(thischar[][]input){Func>,IEnumerable>>combine=null;combine=css=>fromcincss.First()fromcsincss.Skip(1).Any()?结合(css.Skip(1)):新[]{Enumerable.Empty()}选择新[]{c}.Concat(cs);返回结合(输入)。选择(c=>String.Join(“”,c));}}classProgram{classAlgorithm{publicstringName;公共函数>函数;}staticvoidMain(string[]args){Thread.CurrentThread.CurrentCulture=CultureInfo.InvariantCulture;Algorithm[]algorithms={newAlgorithm{Name="A",Func=Algorithms.GetCombinationsA},newAlgorithm{Name="B",Func=Algorithms.GetCombinationsB},};char[][]myArray={newchar[]{'A','B'},newchar[]{'C','D'},newchar[]{'E','F'}};foreach(varalgoinalgorithms)algo.Func(myArray);varchars=Enumerable.Range('A','Z'-'A'+1).Select(c=>(char)c).ToArray();for(intn=2;nchars).ToArray();foreach(varalgoinalgorithms)Test(algo,input);控制台.WriteLine();}Console.WriteLine("完成");控制台.ReadLine();}staticvoidTest(Algorithmalgo,char[][]input){GC.Collect();GC.WaitForPendingFinalizers();GC.收集();GC.WaitForPendingFinalizers();vartotalMem=GC.GetTotalMemory(false);vartimer=Stopwatch.StartNew();长计数=0;foreach(varcombinalgo.Func(input))count++;计时器.停止();totalMem=GC.GetTotalMemory(false)-totalMem;Console.WriteLine($"{algo.Name}:N={input.Length}Count={count,12:n0}Time={timer.Elapsed}Memory={totalMem/1024,7:n0}K");这非常有用:Func>,IEnumerable>>combine=null;combine=css=>fromcincss.First()fromcsincss.Skip(1).Any()?结合(css.Skip(1)):新[]{Enumerable.Empty()}选择新[]{c}.Concat(cs);如果我将运行数据的结果转换为字符串,请执行以下操作:varresult=String.Join(",",combine(myArray).Select(c=>String.Join("",c)));...然后我得到这个结果:ACE、ACF、ADE、ADF、BCE、BCF、BDE、BDF这计算速度非常快,但知道现实世界的输入是否足够快会很有趣。以上就是C#学习教程:看锯齿数组中各个组合共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: