java - 在 Java 中查找两个大组之间差异的有效方法

标签 java algorithm memory hashset

在我的例子中,我需要使用 removeAll 来比较两个大的 HashSet 来找出差异。为此,我必须将来自不同数据源的所有数据放入内存中,然后进行比较。当每个 HashSet 可能包含超过 300 万条记录时,这会产生内存不足问题。是否有任何方法或库可以减少内存消耗但也可以达到相同的结果?

最佳答案

请注意,如果数据已排序,您可以在单次流式传输数据时使用非常少量的额外内存:

i <- 0
j <- 0
while i < list1.size() and j < list2.size():
    if list1[i] == list2[j]:
        i <- i+1
        j <- j+1
    else if list1[i] < list2[j]: //i definetly not in list2
        yield list[i]
        i <- i+1
    else: // j is not in list1
        yield list[j]
        j <- j+1
yield all elements in list1 from i to list1.size() if there is any
yield all elements in list2 from j to list2.size() if there is any

另一种使用散列的方法只需要加载一个列表(假设这里的数据是集合,如问题中所述,因此不需要重复处理):

load list1 as hash1
for each x in list2:
    if x is in hash1:
         hash1.remove(x)
    else:
         yield x
yield all remaining elements in hash1

请注意,如果一个列表也不适合内存,您可以拆分数据并迭代地执行第二种方法。

关于java - 在 Java 中查找两个大组之间差异的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20638903/

相关文章:

sql - 将表moSTLy或部分加载到工作内存中以供查询

r - 运行代码期间 R 中的内存使用情况

java - 在 ssl (ldaps) 的支持下连接 Activity 目录

java - 是否可以将代码存储在可以从另一个对象运行的对象中?

java - 如何在不使用 ping.exe 的情况下使用 Windows 上的 Java 一次发送多个 ping?

java - 检查给定字符串是否与其他两个字符串交错

java - 您可以从子类化该接口(interface)的接口(interface)调用父接口(interface)的默认方法吗?

algorithm - 计算符合 min(subset)+max(subset) < k 的数组子集

java - 一次仅使用 2 个成员的平均值查找数组的平均值

c++ - 转换.c++后在char类型的原始缓冲区上调用delete