Gamma编码及Delta编码概述
一、Elias Gamma Coding
即Gamma编码,是一种对正整数进行编码的统一编码,由Peter Elias发明。适用于预先无法获知最大编码整数的情况,而且小整数出现频率高,大整数出现频率低的情况。
编码原理:
对任何正整数NUM,对INT(Log2(NUM))+1进行一元编码,后缀上NUM二进制串除去最高位的子串。如5的编码为001,01。
编码思路:
对于任意的自然数x∈N={1,2,3,...},它的二进制需要floor(log(x))+1 bits来表示。在其二进制表示的前面加上floor(log(x))个0,即Elias Gamma Code。
例如:13d = 1011b 所以,EGC(13d) = 000 1011b
解码:
首先计算出Elias Gamma Code的开始的0的个数n。
if(n == 0)
解码结果为1;
else
{
读入剩下的n+1个bits;
解码结果为这些bits的10进制表示;
}
编码示例:
|
NUM |
EliasGamma Code |
Implied probability |
|
1 = 20 + 0 |
1 |
1/2 |
|
2 = 21 + 0 |
010 |
1/8 |
|
3 = 21 + 1 |
011 |
1/8 |
|
4 = 22 + 0 |
00100 |
1/32 |
|
5 = 22 + 1 |
00101 |
1/32 |
|
6 = 22 + 2 |
00110 |
1/32 |
|
7 = 22 + 3 |
00111 |
1/32 |
|
8 = 23 + 0 |
0001000 |
1/128 |
|
9 = 23 + 1 |
0001001 |
1/128 |
编码、解码算法:
/****************************************************
Encode_EliasGamma:
Encoding algorithm of EliasGamma Coding.
*****************************************************/
int Encode_EliasGamma(int *pSourceData,char *pEncodedData,int nSourceDataLen,int &nEncodedDataLen)
{
//Encoding EliasGamma Coding.
int k=-;
for(int i=;i<nSourceDataLen;i++)
{
int num = pSourceData[i];
int numPow = int(log10(num + 0.0)/log10(+ 0.0));
int j = ;
for ( j=; j < numPow; j++) pEncodedData[++k]=;
pEncodedData[++k]=;
for (j=numPow-; j >= ; j--)
{
if (num & << j) pEncodedData[++k]=;
else pEncodedData[++k]=;
}
nEncodedDataLen=k+; }
//End of Encoding.
return ;
} /****************************************************
Decode_EliasGamma:
Decoding algorithm of EliasGamma Coding.
*****************************************************/
int Decode_EliasGamma(int *pDecodedData,char *pEncodedData,int &nDecodedDataLen,int nEncodedDataLen)
{
int i=,j=;
while ()
{
int numPow = ;
while (!pEncodedData[i++]) numPow++;
if(numPow >=) break;
int num = ;
for (int h=numPow-; h >= ; h--)
if (pEncodedData[i++]) num |= << h;
num |= << numPow;
pDecodedData[j++]=num;
}
nDecodedDataLen=j; return ;
}
二、Elisa Delta Code
编码:
对于任意的x∈N = {1,2,3,...},分步介绍它的编码方式:
1)用Elisa Gamma Code的方式编码x的长度:
Cr (floor(log(x)) + 1);
2)求出x的二进制表示,并且用Cr做前缀
3)去掉x二进制表示中的第一个1
for example:
x = 13d = 1101b;
log(x) = log(13) = 3;
Cr(log(x)+1) = Cr(4) = 00100b;
EDC(x) = 00100 101b;
解码:
1)首先计算EDC中前缀0的个数n
2)读出n+1个bits,即m = log(x) + 1的二进制表示
3)读出剩余的(m-1)bits,并且在前面加1,即最终的解码结果
for example:
EDC(x) = 00100 101b
n = 2;
m = n+1bits:100b = 4d
(m-1)bits:101b
1101b = 13d
效率:对特别大的整型范围N,EDC的长度接近熵,是近似最优的,但是在小N的时候,EGC要好一些。
Gamma编码及Delta编码概述的更多相关文章
- 刨根究底字符编码之八——Unicode编码方案概述
Unicode编码方案概述 1. 前面讲过,随着计算机发展到世界各地,于是各个国家和地区各自为政,搞出了很多既兼容ASCII但又互相不兼容的各种编码方案.这样一来同一个二进制编码就有可能被解释成不 ...
- 刨根究底字符编码之—UTF-16编码方式
在网上已经转悠好几天了, 这篇文章让我知道了UTF-16的前世今生, 感谢作者https://cloud.tencent.com/developer/article/1384687 1. UTF-16 ...
- UTF-8和GBK编码之间的区别(页面编码、数据库编码区别)以及在实际项目中的应用
第一节:UTF-8和GBK编码概述 UTF-8 (8-bit Unicode Transformation Format) 是一种针对Unicode的可变长度字符编码,又称万国码,它包含全世界所有国家 ...
- 【字符编码】字符编码 && Base64编码算法
一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ...
- cnless.sh:改进版less,可自动识别GBK编码或UTF-8编码。
#!/bin/bash #功能:让GBK编码的文件可以使用less正常显示中文(自动识别GBK和UTF-8编码) #v0. 在LINUX下,使用UTF-8编码,less UTF-8的文件时显示中文正常 ...
- 签名、BOM头、编码、Windows记事本编码、java编码解码的那些事
对于Windows记事本: ANSI :GB2312 java中应使用GBK解码 Unicode :有签名的UTF-16LE java中应使用UTF-16解码 Unicode big endian : ...
- 天气预报API(五):城市代码--“新编码”和“旧编码” 对比
参考一些博客.文章 来查找 测试 接口,后来发现两套城市编码标准,有点想法,故拿来对比分析. 注:新旧编码是个人主观叫法,只是为了方便称呼,可能有不当之处,请留言更正. 暂且称 中国天气网等网站使用的 ...
- 各种编码问题产生原因以及解决办法---------响应编码,请求编码,URL编码
响应编码 产生原因以及解决办法: 示例: package cn.yzu; import java.io.IOException; import javax.servlet.ServletExcept ...
- HTTP 协议中的 Content-Encoding 和 Transfer-Encoding(内容编码和传输编码)
转自:http://network.51cto.com/art/201509/491335.htm Transfer-Encoding,是一个 HTTP 头部字段,字面意思是「传输编码」.实际上,HT ...
随机推荐
- SQL Server 禁止和启用约束
Alter Table XXX nocheck constraint xxx Alter Table XXX check constraint xxx
- link_to和其对应要跳转的的url,用path和直接路由方法
link_to和其对应要跳转的的url,用path和直接路由方法 看看link_to <% @order.each do |oo| %> <div> <%= oo.nam ...
- java分布式集群
http://blog.csdn.net/guzicheng/article/details/11580841
- jQuery EasyUI教程之datagrid应用-2
二.DataGrid的扩展应用 上一份教程我们创建的一个CRUD应用是使用对话框组件来增加或编辑用户信息.本教程将教你如何创建一个CRUD 数据表格(datagrid). 为了让这些CRUD功能正常工 ...
- js元素绑定事件
想给一个元素绑定一个方法之后,在绑定一个方法而且不被覆盖 window.onload = function () { alert('a'); } window.onlaod=function(){ a ...
- Wellner 自适应阈值二值化算法
参考文档: Adaptive Thresholding for the DigitalDesk.pdf Adaptive Thresholding Using the Integral I ...
- (转)I 帧和 IDR 帧的区别
I 帧和 IDR 帧的区别:http://blog.csdn.net/skygray/article/details/6223358 IDR 帧属于 I 帧.解码器收到 IDR frame 时,将所 ...
- 多个进程对同一个监听套接字调用函数gen_tcp:accept/1
源于<<erlang程序设计>>的第14章的14.1.4大约第197页. 未发现多个进程对同一个监听套接字调用函数gen_tcp:accept/1比单进程的效率更高或者更快.
- perl 函数的参数列表
在perl中,定义一个函数的时候,不需要在圆括号内指定具体的参数,所有的参数都从@_ 这个列表中得到 代码示例: sub test { my ($a, $b) = @_; print qq{$a\t$ ...
- CentOS下安装Filezilla软件
说到Centos大家都是非常熟悉了,当然Filezilla也是日常中应用的软件,但是在linux下安装怎么操作呢.安装Filezilla有多个方式,但用户应该最喜欢用的就是下载安装包,然后执行安装.安 ...