我已经在这个问题上工作了一天。我有一个频率列表,我想把它放在一堆。我正在使用heapq。问题是当放置在霍夫曼树中时找到每个频率的深度。 我试过实现我自己的二叉树类,但我似乎无法正确。 有谁知道如何使用python中的模块heapq找到堆中每个元素的深度必须有一个更简单的方法?我用它来编码。谢谢!
答案 0 :(得分:0)
我认为这个想法是你可以使用优先级队列(用堆实现)来构建一个霍夫曼树。或者,如果您只需要树中项目的深度,您可以简单地增加一个合适的计数器:
import heapq
def huffman_depths(frequencies):
depths = [0] * len(frequencies)
heap = [(f, [i]) for i, f in enumerate(frequencies)]
heapq.heapify(heap)
while len(heap) > 1:
f1, indexes1 = heapq.heappop(heap) # pop two least frequent nodes
f2, indexes2 = heapq.heappop(heap)
frequency = f1 + f2 # combine them
indexes = indexes1 + indexes2
for i in indexes:
depths[i] += 1 # increment depth count of each index
heapq.heappush(heap, (frequency, indexes)) # push the combined result back on
return depths