Shannon-Fano-Elias编码的C语言实现
来源:互联网 发布:宋喆职务侵占罪知乎 编辑:程序博客网 时间:2024/04/29 11:06
Shannon-Fano-Elias编码
一.理论分析
Shannon-Fano-Elias编码是利用累积分布函数来分配码字。
不失一般性,假定取X={1,2,…m}。假设对于所有的x,有p(x)>0。定义累积分布函数F(X)为
其函数图形见下图所示,修正的累积分布函数为其中表示小于x的所有字符的概率和加上字符x概率的一般得到的值。由于随机变量是离散的,故累积分布函数所含的阶梯高度为p(x)。函数的值恰好与x对应的那个阶梯的中点。
我们现在要确定的唯一性,这样才能保证可以对应到相应的x。因为所有的概率值均为正值,若则因此通过累积分布函数就可以得到相应的X。但一般情况下为十进制小数,要表示为二进制小数需要很多比特位,(在编码实现的过程中要注意此处,若是C语言实现,要注意存储二进制比特位的数组的长度,此处极易发生数组越界)这在现实的编码中是并不可行的。因此我们需要取一个精度,到底精确到哪一位呢?取到l(x)位即可。
二.编码实现
Shannon-Fano-Elias编码是用C语言来实现的。
code数组的长度建议定的大一些,此处极易发生数组越界(这都是血的教训啊….)
基本的结构体如下:
typedef struct { double px; //px概率值 double Fx; //fx函数值 double Fbax; //Fba(X)的值 int lx; //编码的长度 int code[A]; //存储二进制比特}SFE;
1.初始化结构体,输入p(x)
void init_code(int code[],int i){ int j; for (j=0;j<A;j++) code[j] = 0;}void init_px(SFE SFEA[],int length)//初始化px{ printf("请输入概率值:\n"); int i; for(i=1;i<=length;i++) { scanf("%lf",&SFEA[i].px); init_code(SFEA[i].code,i); }}
2.计算fx累积分布函数
void count_fx(SFE SFEA[],int length)//计算fx累积分布函数{ double sum =0; int i,j; for (i=1;i<=length;i++) { for (j=1;j<=i;j++) { sum = sum + SFEA[j].px; } SFEA[i].Fx = sum; sum = 0; }}
3.计算
void count_fbax(SFE SFEA[],int length)//计算fbax的函数值{ int i,j; double sum = 0; for (i=1;i<=length;i++) { if (i==1) { SFEA[i].Fbax = SFEA[i].px/2.0; } else { for (j=1;j<i;j++) { sum = sum + SFEA[j].px; } SFEA[i].Fbax = sum + SFEA[i].px/2.0; sum = 0; } }}
4.计算lx的长度,lx向上取整
void count_lx(SFE SFEA[],int length)//计算lx的长度,lx向上取整{ int i; for (i=1;i<=length;i++) { SFEA[i].lx = ceil(log(1/SFEA[i].px)/log(2))+1; }}
5.转化为二进制比特位
void decimal(double m,int code[]){ int *p = code; if(m>ZERO) { m=m*NUM; *p = (long)m; p++; decimal(m-(long)m,p); }}void f_binary(SFE SFEA[],int length){ int i; for (i=1;i<=length;i++) { decimal(SFEA[i].Fbax,SFEA[i].code); }}
整个编码过程至此结束,因为数组操作比较多,所以要注意防止数组越界。
三.编码结果分析
1.先给出一个例子,其十进制小数均可以转化为有限位数的二进制小数。
2.这个例子中二进制小数表示可能为无线位数的小数,开始的时候我将code数组的大小定义为20,执行完1中都很正常,到了这个例子,一直不停的发生数组越界,原因是因为,此例中二进制表示可能有无穷位数字。如果先转化二进制,再编码表示的话,code数组的长度要足够长。当然,你也可以只存储到l(x)位。这样就不用那么大的空间了。
源代码下载地址:shannon-fanon-elias编码C语言实现
Reference:
信息论基础.Thomas M.Cover Joy A.Thomas著
- Shannon-Fano-Elias编码的C语言实现
- Shannon-Fano编码——原理与实现
- Shannon-Fano编码——原理与实现
- fano编码的递归算法
- Elias编码
- java实现 Elias Gamma 编码算法
- shannon编码
- shannon编码
- 香农-范诺算法(Shannon-Fano coding)原理
- 香农-范诺算法(Shannon-Fano coding)算法
- 香农编码Shannon
- 信息论实验-信源编码算法 (Huffman and Shannonn Fano编码C++实现)
- base64编码解码的实现(C语言)
- base64编码解码的实现(C语言)
- Base64编码解码的实现(C语言)
- 霍夫曼编码的C语言实现
- Base64编码解码的实现(C语言)
- 哈夫曼编码的C语言实现
- APIO2007-2015题解大集合(2008年篇)
- 你说你会C++? —— 智能指针
- Delphi手动创建数据集
- 前端性能优化-雅虎军规35条
- Git上传代码到coding.net
- Shannon-Fano-Elias编码的C语言实现
- 《Spring设计思想》AOP实现原理(基于JDK和基于CGLIB)
- Android学习(22) -- 数据存储之使用xml保存数据
- 构建乘积数组
- 【leetcode】119. Pascal's Triangle II
- 几个不错的网站,在写email的html的时候会用到
- 安卓008移动存储--SharePreference
- Python网络编程-主机-虚拟机之间TCP协议简单通信实例
- android下netperf测试网卡网速能力