我有两个最大堆(以数组表示),大小为m的H1和大小为n的H2,具有n> m。
我必须创建第三个max堆,其中的元素来自H1和H2的交叉点。
基本解决方案(扫描两个数组)需要O(N*M)时间,并且不利用最大堆属性。
其他想法?

最佳答案

给定两个堆,可以计算元素在o(m logm+n logn)时间内的交集,结果是有序的。有序数组已经是堆,因此不需要更多时间。
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.

07-27 22:38