最小堆的唯一性?

时间:2015-12-14 15:29:46

标签: python heap

我们可以从给定的唯一非堆列表创建多个最小堆吗?

下面的L1L2(共享完全相同的元素,但不是相同的顺序)是这个原始非堆列表的合法最小堆:[12,12,3,12,12,12,12,9,6,6,10,4,20]

L1=[3,4,9,6,10,12,12,12,6,12,12,12,20] L2=[3,6,4,9,6,12,12,12,12,12,10,12,20]

这对我来说似乎很奇怪。这是常识吗?我很想得到一些确认。

附录: 此Python function检查列表是否验证了所有k的最小堆条件:heap[k] <= heap[2*k+1]heap[k] <= heap[2*k+2]

def is_min_heap(L):
    return _is_min_heap(L, 0)

def _is_min_heap(L, i):
    l, r = 2 * i + 1, 2 * i + 2

    if r < len(L): # has left and right children
        if L[l] < L[i] or L[r] < L[i]: # heap property is violated
            return False

        # check both children trees
        return _is_min_heap(L, l) and _is_min_heap(L, r)
    elif l < len(L): # only has left children
        if L[l] < L[i]: # heap property is violated
            return False

        # check left children tree
        return _is_min_heap(L, l)
    else: # has no children
        return True

1 个答案:

答案 0 :(得分:1)

  

我可以向您指出max heap的相关问题吗?

我认为简而言之,该问题的第二个答案涵盖了所有:堆约束(即子项大于其父项)并不完全指定堆,因此通常不止一个可能的安排。对于最小堆,同样的约束适用,所以再次,可能有多个可能的安排,因此无法保证唯一性。