|
1
1
想法1
一旦数组排序,比较就很简单了:
想法2
但我不知道如果没有实际测试它是否比排序快。
想法3
明智的价值选择
想法4
如果性能是可用的,则可以通过重用现有数组来避免数组创建。 真正地 很重要。 |
|
|
2
1
如果有34位整数类型可用,并且有C位操作,那么可以从变量列表(如果列表是V[0]、V[1]、。。。那么V是(1<<V[0]);(1<<V[1])。。。其中1与V)是同一类型的,并且具有用于静态列表的预定义整数S,其计算方式类似。查看静态列表是否包含在变量列表中的测试是(S&V)==0。 |
|
|
3
1
一种可能是改变存储数据的方式。由于可能值的范围限制为1-34,因此您可以存储每个数字的计数,而不是存储数字列表:
如果你的列表有一个1和两个3s,那么计数[0 ]=1和&&计数[2 ]=2(如果这使事情变得更快(更少的减法),你可以交替使用1个索引。 现在要计算列表中的每个int至少出现一次,只需为每个x按顺序索引到数组中,并验证所有计数都为[x]>0。将数据从counts表单转换为list表单会产生相关的开销,但如果您还经常需要查看list表单中的数据,则这只是一个问题。这种存储格式的另一个优点是,向counts添加/删除永远只涉及一个数组元素;在列表格式中,删除列表中间的元素需要多个元素的副本。 |
|
4
1
如果你想要快速的方式,你不应该使用linq,如果一个给定的列表项都在35以下,你可以删除
对于排序列表,如果列表大小很大,则可以执行以下操作
|
|
5
1
这看起来很适合按位操作,因为required中的值是不同的、静态的,并且介于1和34之间。不要将required保存为数组,而是将其保存为const ulong。在要检查的数组中,创建一个由左移每个值和按位或填充的新ulong。
|
|
6
0
编辑: 所以我理解了你的问题,可能有一些非常复杂的解决方案。另一个问题是,它的表现有多好。
|
|
7
0
你可以很容易地循环浏览这些项目,找出是否有任何项目丢失。通过您的示例,我理解您只是想知道数组中是否缺少required中的任何项。所以你可以写
这比你的方法快得多。查看下面添加了计时器的代码。你的方法用了5毫秒,但新的方法用了0毫秒
|