面试:列出内存有限的交集
给定两组整数,大小为 M 和 N,其中 M < N. 对这两个集合执行内等连接(即找到两个列表的交集)。如果两个列表都在文件中并且可用内存的大小为 K < ,则如何执行它M<氮
You are given two sets of integers, sizes M and N with M < N. Perform inner equal join on these two sets (i.e., find intersection of the two lists). How to perform it if both the lists are in files and the available memory is of size K < M < N
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
首先使用就地排序算法对两个列表进行排序。
一旦 M 和 N 都排序完毕,计算交集就像一场竞赛。在每个列表的开头放置两个标记
a
和b
。执行这些步骤,直到任何标记到达列表末尾。用伪代码表示:给定一个不错的就地排序算法,其复杂度将为
O(nlogn)
。Using an in-place sorting algorithm to sort both the lists first.
Once both M an N are sorted, then calculating the intersection is like a race. Place two markers
a
andb
at the beginning of each list. Do these steps until any marker reaches the end of the list. In pseudocode:Given a decent in-place sorting algorithm, the complexity of this will be
O(nlogn)
.取 M 的 K/2 个元素和 N 的 K/2 个元素。
对 M 子集和 N 子集进行排序。
现在交叉点是微不足道的。
写入交集,删除交集的元素,写回左侧元素。
继续 M 和 N 的所有其他 K/2 子部分。
现在,您在第三个文件中拥有一些常见元素,以及一些部分排序的列表。
现在,对于 M 和 N 列表中的每个 K / 2(减去删除的元素),比较它们以有效地找到交集。
(您还可以添加额外的 2 M 子集和 N 子集合并轮次以加快交集速度)。
万岁!
执行示例:
take K/2 elements of M and K/2 elements of N.
Sort M-subset and N-subset.
Now the intersection is trivial.
Write the intersection, drop elements of the intersection, write back the left elements.
Continue with all other K/2 subparts of M and N.
You have now some common elements in a third file, and some partially sorted lists.
Now for each K / 2 (minus removed elements) of M and N lists, compare them to find intersection efficiently.
(You also can add extra rounds of merging of 2 M-subsets and N-subsets to speed up intersection).
Hurrah !
Example of execution:
我认为您可以使用位集来实现此目的。BitSet 每个整数仅消耗一位。
希望这有帮助。
I think you can use bit set for this purpose.BitSet only consumes one bit per integer.
Hope this helps.
嵌套循环连接将占用最少的内存。对于文件 1 中的每一行,您加载文件 2 中的每一行并进行比较。然后我猜您在文件 1 中标记了命中。
根据文件的大小,首先对其中一个文件进行排序可能会更有效(这可以用最少的内存完成)。很大程度上取决于您必须使用的内存量。
A nested loop join will take minimal memory. For each row in file 1 you load each row in file 2 and compare it. Then I guess you mark the hits in file 1.
Depending on the sizes of the files it might be more efficient to sort one of the files first (which can be done with minimal memory). A lot depends on the amount of memory you have to play with.