先给出整体代码 要copy的朋友可以拿去
下面给出

from math import *
class FanoCod: #费诺编码code_dict = {}x_p = {}x_plist = []AvgCodeLength = 0CodingEfficiency = 0def sort(self,data:str):# 统计信源中各个概率self.x_p = {}  # 一个信源和概率对应的字典x_list = []for i in data:if i not in x_list:x_list.append(i)length = len(data)for i in x_list:self.x_p[i] = data.count(i) / length# 对概率进行降序排序 并返回一个列表self.x_plist = sorted(self.x_p.items(), key=lambda kv: (kv[1], kv[0]))  # 直接百度找来的字典跟据值进行排序self.x_plist=self.x_plist[::-1]# 更新码字表的字典值for i in self.x_plist:self.code_dict[i[0]]=''# 返回一个列表 列表元素是一个元组 元组有两个东西组成,分别是字符和概率return self.x_plistdef GeneratedCodeWord(self,list1):if len(list1)!=1:length=len(list1)pos = self.getIndex(list1)  # 获取最佳分组点left = list1[0:pos + 1]right = list1[pos + 1:]#加0或1for i in range(0,length):if i<=pos:self.code_dict[list1[i][0]]+='0'else:self.code_dict[list1[i][0]]+='1'#递归self.GeneratedCodeWord(left)self.GeneratedCodeWord(right)def getAvgCodeLength(self):sum=0for i in self.code_dict:length=len(self.code_dict[i])sum+=length*self.x_p[i]self.AvgCodeLength=sumreturn sumdef getCodingEfficiency(self):Hx=0for i in self.x_plist:Hx+=-i[1]*log(i[1],2)self.CodingEfficiency=Hx/self.AvgCodeLengthreturn self.CodingEfficiencydef getIndex(self,list1):temp = []for i in range(0, len(list1) - 1):left = 0right=0for j in range(0, i + 1):left += self.x_plist[j][1]for k in range(i+1,len(list1)):right+=self.x_plist[k][1]temp.append(abs(left-right))return temp.index(min(temp))if __name__=='__main__':print("{:-^20}".format("费诺编码"))data = '1111222334'费诺=FanoCod()x_plist= 费诺.sort(data)费诺.GeneratedCodeWord(x_plist)print("平均码长为:%f" % 费诺.getAvgCodeLength())print("编码效率为:%f" % 费诺.getCodingEfficiency())print(费诺.code_dict)

1.先将输入的消息排序
统计所有输入计算概率 然后从大到小排序
从大到小排序先

    def sort(self,data:str):# 统计信源中各个概率self.x_p = {}  # 一个信源和概率对应的字典x_list = []for i in data:if i not in x_list:x_list.append(i)length = len(data)for i in x_list:self.x_p[i] = data.count(i) / length# 对概率进行降序排序 并返回一个列表self.x_plist = sorted(self.x_p.items(), key=lambda kv: (kv[1], kv[0]))  # 直接百度找来的字典跟据值进行排序self.x_plist=self.x_plist[::-1] # 降序# 这里得到的x_plist的形式为[('1', 0.5), ('2', 0.3), ('3', 0.2)] 排序把字典转换为了对应的元组列表# 创建码字表的字典值for i in self.x_plist:self.code_dict[i[0]]=''# 返回一个列表 列表元素是一个元组 元组有两个东西组成,分别是字符和概率return self.x_plist

接下来就是递归生成码表
这里我一直想要用循环实现,但是研究了好长时间放弃了循环的想法 还是递归香
但是理论上能有递归就可以用循环,希望哪位写出用循环代码的大佬能分享下

    def GeneratedCodeWord(self,list1):if len(list1)!=1:length=len(list1)pos = self.getIndex(list1)  # 获取最佳分组点left = list1[0:pos + 1]right = list1[pos + 1:]#加0或1for i in range(0,length):if i<=pos:self.code_dict[list1[i][0]]+='0'else:self.code_dict[list1[i][0]]+='1'#递归self.GeneratedCodeWord(left)self.GeneratedCodeWord(right)def getIndex(self,list1): #获取最佳分组位置的函数temp = [] #存放每次for i in range(0, len(list1) - 1):left = 0right=0for j in range(0, i + 1): #这里最起码要循环一次所以 右边界为i+1left += self.x_plist[j][1] #计算左边和for k in range(i+1,len(list1)):right+=self.x_plist[k][1] #计算右边和temp.append(abs(left-right)) #计算差的绝对值return temp.index(min(temp)) #利用python的函数获取最小值所对用的位置

然后就是求编码效率和平均码长了
编码效率公公式

这个函数写的就很容易看懂了这里就不讲了

信息论与编码 python实现 费诺编码 代码详解相关推荐

  1. 费诺编码实验报告c语言,信息论编码实验报告费诺编码附源代码..doc

    信息论编码实验报告费诺编码附源代码. 中南大学 信息论与编码实验报告 选 题: 费诺编码 学生姓名: 学 号: 专业班级: 通信工程 指导老师: 学 院: 信息科学与工程学院 时 间: 2015 目录 ...

  2. java实现.费诺编码_信息论编码实验报告费诺编码附源代码

    信息论编码实验报告费诺编码附源代码 中南大学信息论与编码实验报告选 题: 费诺编码 学生姓名: 学 号: 专业班级: 通信工程 指导老师: 学 院: 信息科学与工程学院 时 间: 2015 目录1.实 ...

  3. python之汉诺塔问题详解

    #汉诺塔问题 传说古老印度在一个圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片圣庙,一块黄铜板上插着三根宝石针.印度教的主神梵 ...

  4. python命令行大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

  5. python 代码命令大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

  6. python中欧拉-罗德里格斯的代码详解

    我们可以在python中定义以下函数来完成三维和四维的罗德里格斯公式的数值计算,即统一了旋转运动和一般螺旋运动的Euler-Rodrigues公式: R = e θ A s = I + s i n θ ...

  7. python 图像语义分割mIOU代码详解

    mIOU公式在此不赘述. 1.fast_hist(label.flatten(), pred.flatten(), num_classes) 2.生成关于像素的混淆矩阵 k = (a >= 0) ...

  8. Python VTK 球体贴图代码详解(二)

    效果 继昨天的柱体代码学习,之后尝试了一把球体并进行贴图,效果如下: 代码 代码是在昨天柱体基础上修改成球体,并针对球体贴图多了两步: import vtk# *************柱体***** ...

  9. 费诺码设计matlab,费诺编码的matlab实现.doc

    费诺编码的matlab实现.doc 多媒体技术实验报告学院:城南学院 姓名:学号:指导老师:尹波时间:2015年11月25日 教师评语:成绩 评阅教师 日期 实验一:费诺编码的matlab实现1实验目 ...

最新文章

  1. 神经科学中的数学之美
  2. SqlServer学习笔记【暂】
  3. 20应用统计考研复试要点(part13)--应用多元分析
  4. LeetCode(1029)——两地调度(JavaScript)
  5. CCF NOI1170 质因数分解
  6. Lattice Diamond 学习总结---“疑难杂症”杂篇
  7. 【实用技巧】下载音乐到本地电脑
  8. 教你用illustrator画十二色环
  9. 伟大的数学思想家—黎曼
  10. Hyperledger Fabric 管理链码 peer lifecycle chaincode 指令使用
  11. idea中translation插件显示网络异常(试一试)
  12. 实现微信自定义分享网页(java)
  13. Java SE基础(更新中)
  14. 【微信小程序】首行缩进、 去掉/取消首行缩进
  15. C++ 大作业 记账本
  16. 64位系统office Excel 2007导入oracle数据库出错问题解决
  17. 关于发那科机器人点焊故障处理方法
  18. 图谱实战 | 阿里新零售多模态知识图谱AliMe MKG的建设与应用
  19. 神经网络量化入门--Add和Concat
  20. [HTML5CSS3]20 个酷炫 应用及源码

热门文章

  1. pandas数据处理基础——筛选指定行或者指定列的数据
  2. 手把手教做Excel直方图
  3. FFmpeg和RTMP结合编译
  4. 关于c3p0报错:An attempt by a client to checkout a Connection has timed out.
  5. PDF应该怎么转换成Excel文档呢?
  6. Allocate exception for servlet LoginServletjava.lang.ClassNotFoundException:
  7. Flutter的android项目跳转谷歌市场
  8. tensorfow/model下object_detection训练错误记录
  9. 快速提取过火区域,卫星影像评估西昌山火方法初探
  10. 【CVPR2021】【语义编辑】SeFa(Closed-Form Factorization of Latent Semantics in GANs)论文分析