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

数组包含性能分享

时间:2023-04-10 13:35:47 C#

ArrayContainsPerformance我有一个使用数组的程序,在某些时候我必须检查一个值是否在数组中,这个函数占用了程序大约70%的CPU时间,所以我想知道是否有办法更有效地做到这一点。这些是我的功能:privatestaticint[]GenerateRow(intlength,RandomRNG){int[]row=InitalizeRow(length);整数索引=0;while(!AreAllNumbersGenerated(row)){intvalue=RNG.Next(0,length);if(!RowContains(row,value)){row[index]=value;索引++;}}返回行;}privatestaticboolAreAllNumbersGenerated(int[]row){for(inti=0;il&&r==last++);你可以做一些额外的优化,这些优化不会影响你的BigO复杂性,比如使用适当的循环和提前退出。编辑:我在这里假设您希望这些项目按顺序发生。如果不是这种情况,您可以使用O(N)中的~O(1)查找轻松地将数组转换为结构,然后也检查O(N)。对于大输入,这仍然比上面的O(N^2)方法更好,如下所示:返回Enumerable.Range(0,row.Length).All(i=>available.ContainsKey(i));编辑:从我在评论中读到的内容来看,这段代码的目标似乎是用随机顺序的连续数字序列填充一个数组。我没有意识到那是目标,如果是这样的话,洗牌肯定比一遍又一遍地尝试要好。但是,比生成数组然后改组(同样,对于足够大的输入)更好的是通过将每个数字分配给随机采样的索引而无需替换来简单地生成一个数组。LINQ并不容易,但您可以弄明白。正如评论中的其他人指出的那样,最有效的方法是生成一个包含所需值的数组并将其打乱:publicstaticvoidShuffle(T[]arr,Randomr){for(inti=arr.Length-1;i>0;--i){intj=r.Next(i+1);Ttmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}}publicstaticint[]Generate(intlength,Randomr){vararr=newint[length];for(inti=0;ithenvararr=Generate(10,newRandom());foreach(intiinarr){Console.WriteLine(i);}我找到了一个方法,感谢@sous2817评论,它publicstaticint[]GetRandomNumbers(intcount,RandomRNG){HashSetrandomNumbers=newHashSet();for(inti=0;i这比我正在做的快10倍并且与我程序的其余部分。我需要代码是“线性的”,所以其他解决方案会搞砸我的程序。无论如何,感谢所有帮助过的人:)您可以在列表中生成可能的值并获取值在随机位置而不是随机播放。这样,您甚至可以在生成整行之前就开始使用这些项目:IEnumerableRandomRange(intcount){varrandom=newRandom();varlist=newint[计数];对于(inti=0;i0){vari=random.Next(count);收益回报列表[i];列表[i]=列表[--计数];}}示例使用:以上是C#学习教程:数组包含了性能分享的所有内容,如果对大家有用,需要进一步了解C#学习教程。希望大家多多关注——foreach(variteminRandomRange(10))//...本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: