我正在为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
答案 0 :(得分:3)
将heapq http://docs.python.org/2/library/heapq.html与说明一起使用:
“此模块提供了堆队列算法的实现,也称为优先级队列算法。”