目录

  • 基于Python实现的费诺编码
    • (一)费诺编码原理及过程
      • 1.原理
      • 2.过程
    • Talk is cheap. Show me the code.
      • 测试结果

前言:学习信息论与编码时想实现费诺编码,遇到点困难,上网搜索无果,却突然开窍,所以写一篇仅供各位朋友参考。

基于Python实现的费诺编码

(一)费诺编码原理及过程

1.原理

费诺码是按照累加概率(如不知参考下列例子就一目了然)尽可能相等的原则对信源符号进行分组,对于二元码,每次分为两组;对于n元码,则每次分为n组,并且给不同的组分配一个不同地码元符号。
注:本文章过程叙述、例子及具体实现代码为二元码

2.过程

若采用二元码,则编码步骤为:
(1)将信源符号按其出现的概率大小从大到小依次排列。
(2)将依次排列的信源符号分为两组,使两个组的概率之和尽可能近似相等,并将各组分别赋予一个二进制码元“0”和“1”。
(3)将每一组的信源符号再分为两组,使划分后的两个组的概率之和尽可能近似相等,并将各组分别赋予一个二进制码元“0”和“1”。
(4)如此重复,直至每个组只剩下一个信源符号为止。

Talk is cheap. Show me the code.

import math
def Group(probabilitySpace,encodeSpaceDictionary):      if(len(probabilitySpace)==1):#当分组只有一个时不应再继续分组和编码,退出        return    #通过累加概率尽可能相等原则找到分组最佳位置    groupProbability=1    findPosition=-1    for i in range(len(probabilitySpace)):        tempSum1=0        tempSum2=0        for j in range(i):            tempSum1=tempSum1+probabilitySpace[j]                for j in range(i,len(probabilitySpace)):            tempSum2=tempSum2+probabilitySpace[j]        if(abs(tempSum1-tempSum2)<groupProbability):           groupProbability=abs(tempSum1-tempSum2)            findPosition=i    #通过累加概率尽可能相等原则找到分组最佳位置    #编码                str0,str1="0","1"    for i in range(len(probabilitySpace)):if(i<findPosition):tempDictionaryElement={probabilitySpace[i]:encodeSpaceDictionary[probabilitySpace[i]]+str0}encodeSpaceDictionary.update(tempDictionaryElement)else:tempDictionaryElement={probabilitySpace[i]:encodeSpaceDictionary[probabilitySpace[i]]+str1}encodeSpaceDictionary.update(tempDictionaryElement)   #编码#分组leftGroup=[]rightGroup=[]for j in range(findPosition):leftGroup.append(probabilitySpace[j])for j in range(findPosition,len(probabilitySpace)):rightGroup.append(probabilitySpace[j])#分组#递归分组编码Group(leftGroup,encodeSpaceDictionary)Group(rightGroup,encodeSpaceDictionary)#递归分组编码return(encodeSpaceDictionary)#返回编码空间
def Fano(probabilitySpace=[0.2,0.19,0.18,0.17,0.15,0.1,0.01]):probabilitySpace.sort()probabilitySpace.reverse()encodeSpaceDictionary={}#编码空间#初始化编码空间for i in range(len(probabilitySpace)):tempDictionaryElement={probabilitySpace[i]:""}encodeSpaceDictionary.update(tempDictionaryElement)#初始化编码空间Result=Group(probabilitySpace,encodeSpaceDictionary)i=1for p in Result:print("消息符号a{}对应码字为:{}".format(i,Result[p]))i+=1#求平均码长averageL=0listResult=list(Result)for p in listResult:averageL=averageL+len(Result[p])*pprint("平均码长为:{:.3}比特/符号".format(averageL))#求平均码长#求编码效率H=0for i in range(len(probabilitySpace)):H=H+probabilitySpace[i]*math.log2(probabilitySpace[i])H=-Hprint("编码效率为:{:.3%}".format(H/averageL))#求编码效率return(Group(probabilitySpace,encodeSpaceDictionary))
def typeInFano():while(True):try:mode=eval(input("是否输入概率空间?(否为默认概率空间)->({}:是 or {}:否):".format(1,2)))if mode==1 or mode==2:breakelse:print("!!!请按格式输入.")except:print("!!!请按格式输入.")if(mode==1):print("!!!输入'.'结束")i=1typeIn=[]while(True):while(True):try:tempTypeIn=input("请输入第{}个参数:".format(i))if(tempTypeIn=="."):breaktypeIn.append(eval(tempTypeIn))i=i+1                except:print("!!!请输入数字或'.'")sum=0for i in range(len(typeIn)):sum=sum+typeIn[i]if(sum!=1):print("!!!概率空间和不为1请重新输入.")i=1else:Fano(typeIn)breakif(mode==2):Fano()
if __name__=="__main__":    typeInFano()

测试结果

基于Python实现的费诺编码相关推荐

  1. 信息论与编码-python实现三种编码(香农编码,费诺编码,赫夫曼编码)

    香农编码,费诺编码,赫夫曼编码(python实现) 开始参考了网上其他人的代码,但后来都发现要么代码有错误,要么输出结果不符合自己的预期,于是就重新实现了一下,代码仍存在一些小问题,但是能够满足作业要 ...

  2. 信息论与编码 python实现 费诺编码 代码详解

    先给出整体代码 要copy的朋友可以拿去 下面给出 from math import * class FanoCod: #费诺编码code_dict = {}x_p = {}x_plist = []A ...

  3. 香农费诺编码 c语言实现,信息论课程设计(香农、费诺编码)

    <信息论课程设计(香农.费诺编码)>由会员分享,可在线阅读,更多相关<信息论课程设计(香农.费诺编码)(34页珍藏版)>请在人人文库网上搜索. 1.华北科技学院信息论基础课程设 ...

  4. java费诺编码_费诺编码的分析与实现.doc

    费诺编码的分析与实现 吉林建筑大学 电气与电子信息工程学院 设计题目: 费诺编码的分析与实现 专业班级: 电子信息工程 111 学生姓名: 马 超 学 号: 指导教师: 吕卅 王超 设计时间: 201 ...

  5. 用MATLAB实现费诺编码

    一.简述 <信息论与编码>是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充.其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能, ...

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

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

  7. 信源编码算法(费诺编码哈夫曼编码)

    信源编码算法 费诺编码 Fano coding 哈夫曼编码 Huffman coding 费诺编码 编码步骤 将信源符号按照其概率大小,从大到小排列: 将这一组信源符号分成概率之和尽可能接近或者相等的 ...

  8. 信源编码的代码实现 (香农编码、费诺编码、哈夫曼编码、游程编码、算术编码)

    文章目录 香农编码 费诺编码 哈夫曼编码 C++版 C语言版 游程编码 算术编码 香农编码 (1) 将信源消息符号按其出现的概率大小依次排列 p1 ≥ p2 ≥ - ≥ pn (2) 确定满足下列不等 ...

  9. 2022P02014139杨智关于香农编码、哈夫曼编码和费诺编码的比较

    注:以下三种编码比较都是在二进制下讨论的,其它进制下的编码情况可以与二进制下的情况类比. 1香农编码 概念: 香农编码是是采用信源符号的累计概率分布函数来分配字码的.香农编码是根据香农第一定理直接得出 ...

最新文章

  1. 触发ALV事件时报错MOVE_TO_LIT_NOTALLOWED_NODATA
  2. 指令系统寻址方式——指令寻址,数据寻址
  3. jqGrid细节备注—pager文字的设置,更改默认的提交方式
  4. php三维数组转换二维数组,php 三维数组转二维数组(多维数组变合拼二维数组)(foreach循环 数组叠加)...
  5. JeeWx_2.4.2 版本发布,免费开源微信管家系统
  6. CRM 4.0得到用户个人信息
  7. 20年研发安全积累,5大研发安全能力让软件“天生安全”
  8. 基于TCP协议用多线程实现并发服务器,实现思路、算法和demo
  9. 数据结构 5分钟带你搞定哈希表(建议收藏)!!!
  10. 启动两个tomcat,两个端口,两个tomcat都启动时回显示端口被占用
  11. 编程加速服务器_英特尔:将可编程加速进行到底
  12. springcloud(十):服务网关zuul
  13. python中向量长度_线性代数精华——矩阵的特征值与特征向量
  14. Eclipse—在Eclipse中如何发布创建的JavaWeb工程
  15. gsonformat java代码_插件GsonFormat快速實現JavaBean
  16. 【FPGA——协议篇】:I2C总线协议详解+verilog源码
  17. 现代控制理论(二)李雅普诺夫稳定性分析
  18. 《产品经理面试攻略》PART 9:HR面试题
  19. python库之pyserial用法,pyserial和serial的区别
  20. 大数据发展的7个趋势 -- 阿里技术专家权威解读

热门文章

  1. python牛顿迭代法应用_浅谈牛顿迭代法与编程
  2. 安装Google Chrome OS 操作系统
  3. android同时预览多个监控,基于VLC的Android多路视频监控系统.pdf
  4. codeforces contest 985E. Pencils and Boxes+思维
  5. Java输出、变量、数据类型及其转换
  6. 【iMessage苹果相册推】CSR邮箱必须与证书分属的AppID相同。 若是您可以在步伐中吸取令牌,则此步伐是成功的。
  7. 一年之计在于春,一日之计在于晨,劲爆
  8. 实战 Vue 之实现拖曳排序功能
  9. 系统分析大作业用户手册
  10. CobaltStrike XSS