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 ...
随机推荐
- 【Unity笔记】物体朝着鼠标位置移动
其实思路也很简单,就是先获取到鼠标的坐标,然后赋值给目标物体即可. void Update(){ // 物体跟随鼠标移动 Vector2 mousePos = Input.mousePosition; ...
- MongoDB 简介及安装
什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供 ...
- 公司名称后缀 Inc. Co.,Ltd.
Inc. = Incorporated Co.,Ltd."连在一起为Company Limited,就是有限公司,或者有限责任公司.“Co”后面的“.”是英文中表示词语短缩省略的符号,而“C ...
- jQuery EasyUI教程之datagrid应用-2
二.DataGrid的扩展应用 上一份教程我们创建的一个CRUD应用是使用对话框组件来增加或编辑用户信息.本教程将教你如何创建一个CRUD 数据表格(datagrid). 为了让这些CRUD功能正常工 ...
- 无限级分类 mysql设计
- lambda小结
新公司用Java8,所以搜了下文档,发现其主要是两个概念:Lambda表达式和函数式接口. Lambda是一段可执行的代码(类似匿名函数). Lambda的设计者们为了让Java现有的体系与Lambd ...
- (转)_declspec(dllexport)
先看代码:以下是在dev-c++里建立自已的dll时的dll.h里面的代码,这里面有一个:_declspec(dllexport) #ifndef _DLL_H_#define _DLL_H_//防重 ...
- IOS URL scheme
常用URL scheme查询 http://handleopenurl.com/scheme QQ: mqq://新浪微博: weibo:// (sinaweibo://)腾讯微博: tencentw ...
- Linux下安装subversion1.6.5和apache2
以下安装是在RHEL5.5默认安装的情况下,以root身份进行安装!这个实验我安装了n次,最后总是不成功,因为涉及到略多的软件和配置.下面是安装步骤和配置,自己记下来.希望给下次配置的时候不要像以前那 ...
- SQL 2005 如何只安装客户端?
在“注册信息”输入合适的用户名和公司后,点击[下一步],在“要安装的组件”界面中选择要安装的组件:根据我们的需要来选择要安装的组件(各组件的说明如下表),这里我勾选所有的组件:我们可以点击 [高级 ...