我正在考虑排序然后进行二分查找。这是最好的方式吗?
答案 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
列表时,但在未排序的列表中搜索元素并非易事。