如何从n个数组中找到常用元素

时间:2010-10-15 21:37:31

标签: arrays algorithm search

我正在考虑排序然后进行二分查找。这是最好的方式吗?

5 个答案:

答案 0 :(得分:3)

在这种情况下,我主张散列:你的时间与两个阵列的共同大小成正比 由于大多数主要语言都在其标准库中提供哈希表,因此我几乎不需要展示如何实现此类解决方案。

答案 1 :(得分:2)

遍历每个并使用哈希表来存储计数。键是整数的值,值是出现次数。

答案 2 :(得分:1)

定义“最佳”。

如果你想快速做,你可以通过迭代每个数组并保持每个唯一元素的计数来做O(n)。如何计算唯一元素的细节取决于数组中可能存在的事物的字母表,例如稀疏或密集?

请注意,这是数组中的O(n),但对于长度为 m 的数组,则为O( nm )。

答案 3 :(得分:1)

这取决于。如果一个集合比另一个集合小得多,或者由于某些其他原因,您希望交集点非常稀疏,那么二进制搜索可能是合理的。否则,最简单的方法就是一次性完成。如果一个中的当前元素小于另一个中的当前元素,则前进到该数组中的下一个项目。当/如果你得到相等的元素,你将它作为输出发送,并前进到两个数组中的下一个项目。 (这假设,正如你所倡导的那样,你当然已经对它们进行了排序)。

这是一个O(N + M)操作,其中N是一个数组的大小,M是另一个数组的大小。使用二进制搜索,您可以获得O(N lg 2 M),如果一个阵列比另一个阵列小得多,则可以降低复杂度,但如果它们是一个净损失则可能是接近相同的大小。

根据您的需要/需要,尝试仅计算出现次数的版本可能会导致相当大的问题:如果一个数组中出现多个单个项目,它们仍将计为该项目的两次出现,表示不存在的交叉点。您可以阻止这种情况,但这样做会使作业变得不那么简单 - 您将项目从一个数组插入到哈希表中,但始终将计数设置为1.完成后,通过将计数设置为2来处理第二个数组当且仅当该项目已存在于表格中时。

答案 4 :(得分:0)

最好的方法可能是对所有值进行哈希处理并保持一定的出现次数,在检查i i的数组i = {1, 2, ..., n}时,剔除所有未发生的事件O(n*m)次。不幸的是,没有确定性算法可以让你的运行时间少于i-1,因为如果不检查所有数组中的所有值,就不可能做到这一点。

更快的算法需要具有可接受的概率水平(蒙特卡罗),或者依赖列表的某些已知条件来仅检查元素的子集(即,您只关心在所有元素中发生的元素{ {1}}以前的列表在考虑i列表时,但在未排序的列表中搜索元素并非易事。