算法 - 检测小数组中重复数的最佳算法是什么?

时间:2015-11-29 08:22:39

标签: arrays algorithm sorting

检测数组中重复数字的最佳算法是什么,最好的速度,内存和避免开销。 像[5,9,13,3,2,5,6,7,1]这样的小数组注意5我是dublicate。

在搜索和阅读有关排序算法之后,我意识到我将使用其中一种算法,快速排序,插入排序或合并排序。

但实际上我真的很困惑在我的情况下使用什么是一个小阵列。

提前致谢。

2 个答案:

答案 0 :(得分:4)

老实说,使用这个大小的数组,您也可以选择if(secondMasterTesting != null) secondMasterTesting.Text = "Hello World form Second Master"; 解决方案(检查每个元素与其他元素的对比)。

如果/当阵列变大时,您通常只需要担心性能。对于像这样的小型数据集,你很可能已经找到了效率低下的副本。在有效解决方案的排序阶段之前的解决方案将完成: - )

换句话说,你可以使用类似(伪代码)的东西:

O(n2)

这将找到数组中具有重复的第一个值。

如果你想要一个详尽的重复列表,那么只需将重复值添加到另一个(最初为空)数组(每个值一次)并继续。

充足。然后,您只需按顺序处理已排序的项目,查找值的运行,但在您的情况下可能有点过分。

答案 1 :(得分:0)

两种好方法取决于您是否知道拾取数字的范围。

案例1:范围已知。

假设您知道所有数字都在[a, b[范围内,因此范围的长度为l=b-a

您可以创建一个数组A,其长度为l,并用0填充它,从而迭代原始数组并为每个元素e增量A[e-a]的值(这里我们实际上是在[0,l[中映射范围。)

完成后,您可以迭代A并找到重复的数字。事实上,如果i存在A[i]大于1,则意味着i+a是重复的数字。

counting sort背后有同样的想法,它也可以解决您的问题。

案例2:范围未知。

非常简单。稍微修改上面提到的方法,而不是数组使用地图,其中键是原始数组中的数字,值是您找到它们的时间。最后,迭代这组键并搜索那些已经找到的键,然后再搜索一次。

注意。

在上述两种情况中,复杂性应为O(N)并且您无法做得更好,因为您至少要访问所有存储的值。 查看第一个示例:我们迭代两个数组,其长度为Nl<=N,因此复杂度为最大2*N,即O(N)。 第二个例子确实有点复杂,并且依赖于地图的实现,但为了简单起见,我们可以安全地假设它是O(N)

在内存中,您构建的数据结构的大小与原始数组中包含的不同值的数量成正比。

通常情况下,内存占用和性能是您选择的关键。前者越大,后者越好,反之亦然。正如在另一个响应中所建议的那样,如果你知道数组很小,你可以放心地依赖一个复杂度为O(N^2)的算法,但这根本不需要内存。

哪个是最佳选择?嗯,这取决于你的问题,我们不能说。