Shannon-Fano-Elias编码的C语言实现
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语言实现的更多相关文章
- 根据Unicode编码用C#语言把它转换成汉字的代码
rt 根据所具有的Unicode编码用C#语言把它转换成汉字的代码 var s = System.Web.HttpUtility.HtmlDecode(Utf8Str); var o = Newton ...
- 随机线性网络编码的C语言实现,实现可靠传输:原理(1)
线性方程组,大家都不陌生吧.来一组 A11 *X1 + A12 *X2 + A13 *X3 + A14 *X4 =Q1 A21 *X1 + A22 *X2 + A23 *X3 + A24 *X4 =Q ...
- Java语言编码规范 - Java语言编码规范(中文版)(http://doc.javanb.com/code-conventions-for-the-java-programming-language-zh/index.html)
目录 1 介绍 1.1 为什么要有编码规范 1.2 版权声明 2 文件名 2.1 文件后缀 2.2 常用文件名 3 文件组织 3.1 Java源文件 3.1.1 开头注释 3.1.2 包和引入语句 ...
- 随机线性网络编码的C语言实现,实现可靠传输:实现篇(2)
伽罗华域(2^8)乘除法的编程实现
- 变长编码表 ASCII代码等长编码
小结: 1.ASCII编码.GBK编码不是变长编码: 2.数据压缩: 示例: aabacdab → 00100110111010 → |0|0|10|0|110|111|0|10| → aabacda ...
- 为什么倒排索引不采用zlib这样的字典压缩算法——因为没法直接使用啊
看了下压缩算法的发展历史,根据倒排索引的数据结构特点,个人认为zstd不适合做倒排索引压缩,举例说明下: 假设有一份文档倒排列表为:[300, 302, 303, 332],对于这组倒排数据,是没法* ...
- 无损压缩算法历史——熵编码是最早出现的,后来才有Lzx这些压缩算法
Lossless Entropy type Unary Arithmetic Asymmetric Numeral Systems Golomb Huffman Adaptive Canonic ...
- Swift3.0语言教程删除字符与处理字符编码
Swift3.0语言教程删除字符与处理字符编码 Swift3.0语言教程删除字符 Swift3.0语言教程删除字符与处理字符编码,在字符串中,如果开发者有不需要使用的字符,就可以将这些字符删除.在NS ...
- 1 byte 8 bit 1 sh 1 bit 2. 字符与编码在程序中的实现
https://en.wikipedia.org/wiki/Shannon_(unit) 1字节(英语:Byte)=8比特(英语:bit) The shannon (symbol Sh), also ...
随机推荐
- [HIHO] 1050 树中的最长路
#1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...
- 使Linux支持exFAT和NTFS格式的磁盘
Linux支持exFAT和NTFS Linux系统默认可以自动识别到fat32格式的盘,但fat32支持的文件不能大于4G,所以只能将移动硬盘和U盘格式化为NTFS和exFAT这两种格式的,对于U盘最 ...
- vue2.0的基本特性
本文目前总结的特性如下1.侦听属性和计算属性2.class的绑定3.条件渲染时的注意事项4.v-if和v-for同时使用的注意事项5.插槽6.ref,父组件调用子组件的另一种方式7.<keep- ...
- Django中重定向页面的时候使用命名空间
urls.py from django.urls import path from . import views app_name='front' urlpatterns = [ path('',vi ...
- 数据结构( Pyhon 语言描述 ) — — 第3章:搜索、排序和复杂度分析
评估算法的性能 评价标准 正确性 可读性和易维护性 运行时间性能 空间性能(内存) 度量算法的运行时间 示例 """ Print the running times fo ...
- chardet使用方法
简单用法 chardet的使用非常简单,主模块里面只有一个函数detect.detect有一个参数,要求是bytes类型.bytes类型可以通过读取网页内容.open函数的rb模式.带b前缀的字符串. ...
- MySQL MGR集群搭建
本文来自网易云社区,转载务必请注明出处. 本文将从零开始搭建一个MySQL Group Replication集群,包含3个节点.简单介绍如何查询MGR集群状态信息.并介绍如何进行MGR节点上下线操作 ...
- js 加密混淆
没有找到合适的加密算法就用的以下方式 拿webpack打包一遍,再拿uglify压缩一遍,再拿eval加密一遍 1. webpack ./init.js ./webpack/bundle.js -p ...
- windows phone 网络开发三部曲(一)各种包的各种抓法
首先感谢大家对我上一篇博客的支持,让我也体验了一把上榜的感觉. 这无疑是对我这个刚刚打算,认真写写博客的人的莫大的鼓励,再次感谢(鞠躬)!! 接下来想和大家分享一些关于windows phone网络开 ...
- 九度oj 题目1130:日志排序
题目描述: 有一个网络日志,记录了网络中计算任务的执行情况,每个计算任务对应一条如下形式的日志记录:“hs_10000_p”是计算任务的名称,“2007-01-17 19:22:53,315”是计算任 ...