交叉两个最大堆

时间:2015-03-31 17:41:25

标签: algorithm heap set-intersection

我有两个最大堆(以数组表示),大小为m的H1和大小为n的H2,n> m。 我必须创建第三个最大堆,其中的元素来自H1和H2的交集。

基本解决方案(扫描两个数组)需要O(n * m)时间,并且不利用max-heap属性。

其他想法?

2 个答案:

答案 0 :(得分:2)

如果可以进行散列,请使用散列集进行交集,然后进行堆积。这是O(n)与通常的警告。

如果无法进行散列,请在H1上设置树的交点(两者中较小的一个)。这是O(n log m),它与通常的元素清晰度下限一样好。

答案 1 :(得分:2)

给定两个堆,您可以计算O(M log M + N log N)时间内的元素交集,并对结果进行排序。有序数组已经是堆,因此不需要进一步的时间。

Python语法示例:

# Given arrays heap1, heap2.

intersection = []
while len(heap1) > 0 and len(heap2) > 0:
    if heap1[0] == heap2[0]:
        # Common element, part of the intersection.
        intersection.append(heap1[0])
        heap.heappop(heap1)
        heap.heappop(heap2)
    elif heap1[0] > heap2[0]:
        heap.heappop(heap1)
    else:
        heap.heappop(heap2)

# intersection now contains the common elements of heap1 and heap2,
# in max-to-min order, so it already meets the heap invariant.