如何计算每个Huffman编码的长度?已知编码1、10、11需得到{1,2,2}结果
你之前打印仅输出最后一个编码11,核心原因是生成哈夫曼编码的逻辑里没有把每个字符对应的编码持久化存储到独立的容器(比如字典)中,而是使用了同一个可修改的变量存储当前编码,每次生成新编码就把旧值覆盖了,最后遍历完只剩最后一个叶子节点的编码。
要计算编码长度得到{1,2,2}的结果,按以下步骤操作即可:
先正确存储所有字符和对应编码的映射关系
用Python字典作为存储容器,生成编码时每遍历到一个叶子节点,就把当前字符和编码写入字典,示例代码如下:# 初始化存储映射的空字典 huffman_code_map = {} def generate_code(node, current_code: str = ""): if not node: return # 叶子节点存入字典 if node.symbol: huffman_code_map[node.symbol] = current_code return generate_code(node.left, current_code + "0") generate_code(node.right, current_code + "1")调用函数生成完映射后,
huffman_code_map的内容就是{'P_0':'1', 'P_1':'10', 'P_2':'11'}。遍历映射计算每个编码的长度
直接调用字符串内置的len()方法计算每个编码的长度即可,如果你要保留重复的长度值,用列表存储;如果要去重用集合存储:# 保留重复长度,输出为[1,2,2] code_length_list = [len(code) for code in huffman_code_map.values()] # 去重后输出为{1,2},如果需要保留多重集结构可以用collections.Counter code_length_set = set(code_length_list)
如果你要的{1,2,2}是带重复值的输出,直接打印code_length_list即可。
内容的提问来源于stack exchange,提问作者User1086
相关产品推荐
相关产品推荐

