3

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

基本解决方案(扫描两个数组)需要 O(n*m) 时间,并且没有利用最大堆属性。

其他想法?

4

2 回答 2

2

如果散列是可能的,则与散列集进行交集,然后堆化。这是通常需要注意的 O(n)。

如果无法进行散列,请与 H1 上的树集(两者中的较小者)进行交集。这是 O(n log m),它与通常的元素独特性下限一样好。

于 2015-03-31T18:02:01.120 回答
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.
于 2015-03-31T19:53:52.423 回答