如果数组大小很大,则找到两个数组的公共元素。记忆可用

时间:2012-12-20 01:03:19

标签: algorithm collections

使用排序O(mlog(n))或散列O(m + n)以及额外空间O(m)或O(n)或O(m + n)中的索引增量方法,有几种方法可以解决此问题)。

但是如果内存有限并且我的数组大小在数百万的范围内,我会更感兴趣。

我们可以将数组A或B分成几段并将其加载到内存中,但我想知道是否有更好的方法。

3 个答案:

答案 0 :(得分:2)

element distinctness问题(至少与您的问题一样难)是O(nlogn)而不使用任何额外空间。

但是,使用实际上可以在平均情况下改进的散列解决方案。

您建议的方法实际上是在数据库系统中实现intersection的方法之一:

创建k存储桶(在磁盘上),迭代列表,并将每个元素e添加到bucket[hash(e)]
一旦完成,假设有足够的空间使每个桶足够小以便加载到内存 1 ,你只需要为每个列表加载bucket[i] - 并且在每个桶的内存交集(基于排序和迭代)中。
结果将为您提供交叉点的答案 - 这是常见元素。


在数据库系统中完成(交叉)的另一种方式是使用external sort(通常是合并排序的变体)并迭代,或创建针对磁盘优化的索引(例如B+ trees


(1)通常情况下,如果不是这样的话 - 重复每个桶的进程(具有不同的哈希函数),直到你有足够小的桶。

答案 1 :(得分:1)

如果数组已排序,则只需同时遍历数组并复制常用元素。如果是大型数组,请加载它们的一部分。

答案 2 :(得分:1)

您可以使用外部合并排序来使用有限的RAM进行排序。 http://en.wikipedia.org/wiki/External_sorting