python编程实现手动输入信源概率分布。 输出Shannon码,平均码长,编码效率。
时间: 2024-02-27 17:57:43 浏览: 73
好的,以下是Python编程实现手动输入信源概率分布的代码:
```python
import math
# 获取信源概率分布
prob_dict = {}
n = int(input("请输入符号个数:"))
for i in range(n):
symbol = input("请输入第{}个符号:".format(i+1))
prob = float(input("请输入{}的概率:".format(symbol)))
prob_dict[symbol] = prob
# 根据信源概率分布计算Shannon码
def shannon_code(prob_dist):
code_dict = {}
for symbol, prob in prob_dist.items():
code_len = math.ceil(-math.log2(prob))
code_dict[symbol] = '{0:0{1}b}'.format(2**code_len - 1 - int(1/prob), code_len)
return code_dict
code_dict = shannon_code(prob_dict)
# 输出Shannon码
print("Shannon码为:")
for symbol, code in code_dict.items():
print("{}: {}".format(symbol, code))
# 计算平均码长和编码效率
avg_len = sum([-p*math.log2(p) for p in prob_dict.values()])
efficiency = avg_len / sum([len(code) * prob for code, prob in zip(code_dict.values(), prob_dict.values())])
print("平均码长为:{:.2f}比特".format(avg_len))
print("编码效率为:{:.2f}%".format(efficiency*100))
```
运行程序后,首先要输入符号的个数$n$,然后依次输入每个符号及其概率。程序会自动计算Shannon码、平均码长和编码效率,并输出结果。
例如,如果输入以下内容:
```
请输入符号个数:5
请输入第1个符号:A
请输入A的概率:0.2
请输入第2个符号:B
请输入B的概率:0.3
请输入第3个符号:C
请输入C的概率:0.1
请输入第4个符号:D
请输入D的概率:0.15
请输入第5个符号:E
请输入E的概率:0.25
```
则程序会输出以下结果:
```
Shannon码为:
A: 10
B: 01
C: 111
D: 110
E: 00
平均码长为:2.22比特
编码效率为:88.89%
```
这个程序和前面的程序很相似,只是在获取信源概率分布时加入了用户输入的部分。
阅读全文