python中用于堆的数据结构

时间:2013-01-16 11:40:53

标签: python data-structures heap

我正在为Udacity课程编写自定义堆实现,并且需要一个堆,它将通过堆索引和元素的键返回元素的度量值。

我最终得到了一个包含tuples (Metric, Key)的堆的列表。

但是要通过密钥获取正确的元素,我必须创建一个单独的映射,并保持它对堆中每个更改的有效性。

所以最后我不得不将函数传递给所有函数 - heapup(heap, i),而不是像heapup(heap, i, map)那样使用两个参数。

我想知道是否有更简单的方法可以通过程序,列表和词典来完成。或者Heap对象需要隐藏Map里面吗?

 def heapup(L, i, map):

    if i == 0: return i # we reached the top!
    if i >= len(L): return i
    if L[parent(i)] > L[i]:
       # print "going up"
        (L[i], L[parent(i)]) = (L[parent(i)], L[i])
        map[L[i][1]] = i
        map[L[parent(i)][1]] = parent(i)
        return up_heapify(L, parent(i), map)
    else:
     #   print "going down"
        if leaf(L,i): return i
        if one_child(L,i): return i # we could only come this way
        if L[i] > L[left(i)]: # compare with left child
            (L[i], L[left(i)]) = (L[left(i)], L[i])
            map[L[i][1]] = i
            map[L[left(i)][1]] = left(i)
            return left(i)
        if L[i] > L[right(i)]: # compare with right child
            (L[i], L[right(i)]) = (L[right(i)], L[i])
            map[L[i][1]] = i
            map[L[right(i)][1]] = right(i)
            return right(i)

我想在该函数中删除map,但仍然能够通过键获取堆中的项值,我现在可以这样做:

item = heap[map[key]]

例如:

如果

L = [(3,'A'), (5, 'D'), (4, 'G') ...] 

然后

map = {'A':0, 'D':1, 'G': 2, ...} 

所以我可以获得这样一个元素的值:

L[map['G']] 

这将给我4

1 个答案:

答案 0 :(得分:3)

将heapq http://docs.python.org/2/library/heapq.html与说明一起使用:

“此模块提供了堆队列算法的实现,也称为优先级队列算法。”