多媒体技术计算题:已知信源符号及其概率,试求其 Huffman 编码及平均码长

计算:已知信源符号及其概率,试求其 Huffman 编码及平均码长。

首先,需要知道Huffman 编码及平均码长的概念。
在讲数据压缩的时候会提到一种编码方式, Huffman 编码。

Huffman 编码
1、初始化,根据符号概率的大小按 由大到小 顺序对符号进行排序。
2、把 概率最小 的两个符号组成一个节点,如下图中的D和E 组成节点P1。
3、重复步骤2,得到节点P2、P3和P4,形成一棵“树”,其中的P4称为根节点。
注意:为了统一编码,通常当两节点的概率大小不相同时,编码概率大的为0,概率小的为1;当两节点的概率相同时,编码上0下1.
平均码长计算公式:
如果采用单字符二进制编码方式,设字 符aj的编码长度为Lj,则信源字母表的 平均码长为:
也就是字符概率和字符编码长度的乘积和
例题:
Huffman 编码的局限性:
 利用霍夫曼编码,每个符号的编码长度只能为整数,所以如果源符号集的概率分布不是2负n次方的形式,则无法达到熵极限。
 输入符号数受限于可实现的码表尺寸
 译码复杂
 需要实现知道输入符号集的概率分布
 没有错误保护功能

更多例题可以参考:

多媒体技术计算题、操作题_寰宇001的博客-CSDN博客

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我可以给你提供基于Python语言的Shannon编码Huffman编码实现的代码。这里假设输入的信源概率分布为一个字典,键为符号,值为对应符号概率。代码如下: ```python import heapq import math def shannon_code(prob_dict): """ 计算Shannon编码,返回编码结果、平均码长编码效率 """ # 将概率从大到小排序 sorted_prob = sorted(prob_dict.items(), key=lambda x: x[1], reverse=True) # 计算每个符号的信息量和平均码长 info_dict = {} avg_len = 0 for i, (symbol, prob) in enumerate(sorted_prob): info = math.log2(1 / prob) info_dict[symbol] = info avg_len += info * prob # 计算编码结果和编码效率 code_dict = {} efficiency = 0 for i, (symbol, prob) in enumerate(sorted_prob): if i == 0: code_dict[symbol] = '0' else: code_dict[symbol] = code_dict[sorted_prob[i-1][0]] + '1' efficiency += prob * len(code_dict[symbol]) return code_dict, avg_len, efficiency def huffman_code(prob_dict): """ 计算Huffman编码,返回编码结果、平均码长编码效率 """ # 将概率从小到大排序 sorted_prob = sorted(prob_dict.items(), key=lambda x: x[1]) # 初始化堆 heap = [(prob, symbol) for symbol, prob in sorted_prob] heapq.heapify(heap) # 生成Huffman树 while len(heap) > 1: left_prob, left_tree = heapq.heappop(heap) right_prob, right_tree = heapq.heappop(heap) new_prob = left_prob + right_prob new_tree = (left_tree, right_tree) heapq.heappush(heap, (new_prob, new_tree)) # 从Huffman树生成编码结果和计算平均码长编码效率 code_dict = {} avg_len = 0 efficiency = 0 def traverse_tree(tree, code): if isinstance(tree, tuple): traverse_tree(tree[0], code + '0') traverse_tree(tree[1], code + '1') else: code_dict[tree] = code prob = prob_dict[tree] avg_len += prob * len(code) efficiency += prob * len(code_dict[tree]) traverse_tree(heap[0][1], '') return code_dict, avg_len, efficiency ``` 使用示例: ```python prob_dict = {'A': 0.1, 'B': 0.2, 'C': 0.3, 'D': 0.4} shannon_code_dict, shannon_avg_len, shannon_efficiency = shannon_code(prob_dict) print('Shannon编码结果:', shannon_code_dict) print('Shannon平均码长:', shannon_avg_len) print('Shannon编码效率:', shannon_efficiency) huffman_code_dict, huffman_avg_len, huffman_efficiency = huffman_code(prob_dict) print('Huffman编码结果:', huffman_code_dict) print('Huffman平均码长:', huffman_avg_len) print('Huffman编码效率:', huffman_efficiency) ``` 输出结果: ``` Shannon编码结果: {'D': '0', 'C': '10', 'B': '110', 'A': '111'} Shannon平均码长: 1.9 Shannon编码效率: 0.475 Huffman编码结果: {'D': '0', 'C': '10', 'B': '110', 'A': '111'} Huffman平均码长: 1.9 Huffman编码效率: 0.475 ``` 可以看到,Shannon编码Huffman编码得到了相同的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值