【问题标题】:Intersection of two maximum heaps两个最大堆的交集
【发布时间】:2015-03-31 17:41:25
【问题描述】:

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

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

其他想法?

【问题讨论】:

  • O(nlogn + mlogm) 显然可以轻松实现。想知道是否有类似于合并两个排序数组的线性解决方案。

标签: algorithm heap set-intersection


【解决方案1】:

给定两个堆,你可以在 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.

【讨论】:

    【解决方案2】:

    如果散列是可能的,用散列集做交集然后堆化。这是 O(n),但通常需要注意。

    如果无法进行散列运算,则与 H1 上的树集(两者中较小的一个)进行交集。这是 O(n log m),与通常的元素区别下限一样好。

    【讨论】:

    • 你能解释一下吗?散列O(m+n),相交O(m),堆化O(mlgm),总结O(n+mlgm)。为什么是线性的?
    • @HuStmpHrrr 你忘了线性时间自下而上的 heapify
    • @harold 哦,废话。记性不好。
    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 2010-12-08
    • 2018-09-29
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多