【问题标题】:The Most efficient way to compare two huge arrays of objects比较两个巨大的对象数组的最有效方法
【发布时间】:2020-06-20 03:53:11
【问题描述】:

我想比较两个巨大的数组,我正在分批读取这两个数组(每次从每个数组中获取 10 个对象)。完成读取这两个数组后,我想要以下数据(两个巨大数组之间的交集 - 对象仅存在于第一个数组中 - 对象仅存在于第二个数组中)。这样做的最佳做法是什么?

小规模示例:

让 arr1 = [ obj1, obj2, obj3, obj4, obj5, obj6, obj7];

让 arr2 = [ obj7, obj2, obj5, obj1, obj9, obj8];

那我就分批读取这两个数组(每次两个元素):

第一个循环

->obj2 是相互的

->obj1 只存在于 arr1 中

->obj7 只存在于 arr2 中

这里的问题,直到我完成对整个数组的循环以获得正确的结果,这不是最终结果:

相互的对象是obj1,obj2,obj5,obj7

arr1 中的对象只有 obj3,obj4,obj6

arr2 中的对象只有 obj8,obj9

注意:由于数组太大,我必须批量读取。

【问题讨论】:

  • 所以换句话说你想要交集(你不想要只在其中一个中的对象的事实已经在交集的定义中=“对象在两个集")
  • 什么样的对象?
  • 普通 JSON 对象
  • 查看与 lodash stackoverflow.com/questions/29320817/…类似的方法
  • 不适合批量读取数组

标签: javascript arrays algorithm data-structures


【解决方案1】:

为了有效地比较您的数组,您需要以某种方式对它们进行排序。无论数组是否太大而无法放入内存,都是如此。

按照惯例,有两种选择:要么对每个数组中的对象进行排序并按顺序进行比较,要么对每个数组中的对象进行哈希处理并与哈希图进行比较。

每种方法都有处理太大而无法放入内存的数据的技术。对于排序,有不受内存大小限制的“外部”排序算法,以及用于比较的简单数据流。对于散列,您可以将数据(根据散列)划分为足够小的 bin 以在内存中处理。


作为一个例子,考虑这个类似 Python 的伪代码,用于对数据项进行哈希分箱:

// split data into bins
files = []
for i in 0 .. N-1:
    files.push_back(open_for_write("{filename}_bin{i}"))
for item in read_items(open_for_read(filename)):
    bin = item.hash() mod N
    write_item(item, files[bin])

您可以对两个输入文件执行此操作,然后按 bin 处理它们:

// compare by bin
outfile = open_for_write(out_filename)
for i in 0 .. N-1:
    items = new_set()
    for item in read_items(open_for_read("{in_filename_1}_bin{i}")):
        items.insert(item)
    for item in read_items(open_for_read("{in_filename_2}_bin{i}")):
        if item in items:
            write_item(item, outfile)

【讨论】:

  • 谢谢@comingstorm,您能否为上面提供的示例提供哈希映射方法的解决方案?我只是需要更多说明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2019-12-16
  • 2021-04-29
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
相关资源
最近更新 更多