确定一个非常大的数组是否包含重复

时间:2015-03-08 06:32:46

标签: arrays algorithm sorting duplicates

对于正常大小的数组,我们可以通过排序或使用hashset等来确定它是否包含重复数组。 但是如果我们有一个非常大的数组,比如长度是100亿,我们怎么能确定它是否包含重复?

跟进:如果我们知道这个大型数组中必定存在一个副本,我们如何确定它是哪一个?

我的想法是使用排序,但如果有更好的方法来处理这些情况,我不会这样做。

1 个答案:

答案 0 :(得分:2)

首先,使用这样的代码将数据存储到K个存储桶中。

files = array of K file handles
for each d in data {
    write d to files[hash(d) % K]
}
close each file

如果你选择足够大的K,每个水桶都可以舒适地放入RAM中。确保选择一个好的哈希函数,否则桶将是不平衡的。实际代码还取决于您正在使用的存储系统。例如,如果您使用的是常规硬盘,则搜索费用昂贵,需要注意避免颠簸磁盘。一种方法是读入适合RAM的数据,然后迭代K次,每次传递只附加一个输出文件。

接下来,只需依次浏览每个桶,看看它是否包含任何重复项。您可以使用任何有效的算法来检测重复项。

for each f in the K files {
    data = read f into RAM
    detect duplicates in data
}

另一种解决方案是使用map-reduce framework

地图步骤如下所示:

map(value) {
    emit(key=hash(value), value=value)
}

减少步骤将如下所示:

reduce(key, values) {
    if there's a duplicate in values {
        emit the duplicate value.
    }
}

请注意,每个reducer只有在重复或者有哈希冲突时才会看到多个值。如果您选择了合理的哈希函数,后者将非常罕见。