赫夫曼编码长度计算问题?

例题:一组字符(a,b,c,d)在文中出现的次数分别为(7,6,3,5),字符'd'的哈夫曼编码的长度为?

题解:

首先构造huffman树
每一步都将所有数字排序
方法如下:
1:
3 5 6 7
2:
6 7 8
/ \
3 5
3:
8 13
/ \ / \
3 5 6 7
4:
21
/ \
8 13
/ \ / \
3 5 6 7
所以构造哈夫曼树如图
7 6 3 5 分别对应a b c d
如果左边为0 ,右边为 1 ,则他们编码分别为:
a 11
b 10
c 00
d 01
长度为2

例题2:


这样编码出来为 
A: 0 1bit 
B: 10 2bit 
C: 110 3bit 
D: 111 3bit 
所以中的编码位数就是出现次数×编码bit 
1×4+2×3+3×2+3×1=19 
这个就是带权路径长度,因为出现的次数就是权重,编码长度就是节点到根节点的层数, 

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这道题目。首先,我们可以使用 Python 中的 `collections` 模块中的 `Counter` 类来统计字符串中每个字符出现的次数。然后,我们可以使用 `heapq` 模块来实现赫夫曼编码。 下面是一段 Python 代码,可以完成您的要: ```python import heapq from collections import Counter def huffman_encoding(s): freq = Counter(s) heap = [[wt, [sym, ""]] for sym, wt in freq.items()] heapq.heapify(heap) while len(heap) > 1: lo = heapq.heappop(heap) hi = heapq.heappop(heap) for pair in lo[1:]: pair[1] = '0' + pair[1] for pair in hi[1:]: pair[1] = '1' + pair[1] heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:]) huffman_dict = dict(sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))) return huffman_dict def huffman_length(s): huffman_dict = huffman_encoding(s) huffman_len = sum(len(huffman_dict[ch]) for ch in s) return huffman_len def traditional_length(s): if len(set(s)) == 1: return 8 else: return len(s) * 8 def main(): s = input("请输入字符串:") huffman_len = huffman_length(s) tradition_len = traditional_length(s) if tradition_len == 0: print("该字符串为空!") else: rate = huffman_len / tradition_len print("赫夫曼编码长度为:", huffman_len) print("传统编码长度为:", tradition_len) print("两者比例为:", rate) if __name__ == '__main__': main() ``` 在上述代码中,我们首先定义了 `huffman_encoding` 函数,该函数接受一个字符串作为参数,并返回一个字典,其中每个字符对应一个赫夫曼编码。然后,我们定义了 `huffman_length` 函数和 `traditional_length` 函数,分别用于计算赫夫曼编码长度和传统编码长度。最后,我们定义了 `main` 函数,用于接受用户输入,并调用上述三个函数计算编码长度和比例。 需要注意的是,在计算传统编码长度时,我们需要特殊处理只有一种字符的情况,此时传统编码长度为8位(一个字节)。在计算比例时,我们需要避免除以0的情况。 希望这段代码可以帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值