gpt4 book ai didi

c# - 如何快速判断列表是否仅包含重复项?

转载 作者:太空狗 更新时间:2023-10-29 17:39:40 25 4
gpt4 key购买 nike

有多个相关问题,但我正在寻找针对我的案例的解决方案。有一个(通常)14 个整数的数组。如何快速判断每个 int 是否恰好出现两次(即有 7 对)?取值范围为 1 到 35。这里的主要方面是性能。

作为引用,这是我目前的解决方案。它的编写尽可能与规范相似并且没有考虑性能,所以我确信它可以大大改进:

var pairs = Array
.GroupBy (x => x)
.Where (x => x.Count () == 2)
.Select (x => x.ToList ())
.ToList ();
IsSevenPairs = pairs.Count == 7;

使用 Linq 是可选的。我不在乎如何,只要它快:)

编辑:有一种特殊情况,即 int 出现 2n 次且 n > 1。在这种情况下,检查应该失败,即应该有 7 个不同的对.

编辑:结果我通过微小的修改测试了 Ani 和 Jon 的解决方案,并在目标应用程序的多个基准测试运行期间发现,Ani 在我的机器上的吞吐量大约是 Jon 的两倍(Win7-64 上的一些 Core 2 Duo)。生成整数数组所花的时间与相应检查的时间差不多,所以我对结果很满意。谢谢大家!

最佳答案

好吧,鉴于您的确切要求,我们可以更聪明一些。像这样:

public bool CheckForPairs(int[] array)
{
// Early out for odd arrays.
// Using "& 1" is microscopically faster than "% 2" :)
if ((array.Length & 1) == 1)
{
return false;
}

int[] counts = new int[32];
int singleCounts = 0;
foreach (int item in array)
{
int incrementedCount = ++counts[item];
// TODO: Benchmark to see if a switch is actually the best approach here
switch (incrementedCount)
{
case 1:
singleCounts++;
break;
case 2:
singleCounts--;
break;
case 3:
return false;
default:
throw new InvalidOperationException("Shouldn't happen");
}
}
return singleCounts == 0;
}

基本上,这会跟踪您还有多少未配对的值,如果找到三个相同的值,就会“提前出局”。

(我不知道这比 Ani 递增然后检查不匹配对的方法更快还是更慢。)

关于c# - 如何快速判断列表是否仅包含重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4185766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com