使用heapq在堆中的Python深度元素

时间:2014-03-27 04:59:00

标签: python heap

我已经在这个问题上工作了一天。我有一个频率列表,我想把它放在一堆。我正在使用heapq。问题是当放置在霍夫曼树中时找到每个频率的深度。 我试过实现我自己的二叉树类,但我似乎无法正确。 有谁知道如何使用python中的模块heapq找到堆中每个元素的深度必须有一个更简单的方法?我用它来编码。谢谢!

1 个答案:

答案 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