一、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编码概述的更多相关文章

  1. 刨根究底字符编码之八——Unicode编码方案概述

    Unicode编码方案概述   1. 前面讲过,随着计算机发展到世界各地,于是各个国家和地区各自为政,搞出了很多既兼容ASCII但又互相不兼容的各种编码方案.这样一来同一个二进制编码就有可能被解释成不 ...

  2. 刨根究底字符编码之—UTF-16编码方式

    在网上已经转悠好几天了, 这篇文章让我知道了UTF-16的前世今生, 感谢作者https://cloud.tencent.com/developer/article/1384687 1. UTF-16 ...

  3. UTF-8和GBK编码之间的区别(页面编码、数据库编码区别)以及在实际项目中的应用

    第一节:UTF-8和GBK编码概述 UTF-8 (8-bit Unicode Transformation Format) 是一种针对Unicode的可变长度字符编码,又称万国码,它包含全世界所有国家 ...

  4. 【字符编码】字符编码 && Base64编码算法

    一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ...

  5. cnless.sh:改进版less,可自动识别GBK编码或UTF-8编码。

    #!/bin/bash #功能:让GBK编码的文件可以使用less正常显示中文(自动识别GBK和UTF-8编码) #v0. 在LINUX下,使用UTF-8编码,less UTF-8的文件时显示中文正常 ...

  6. 签名、BOM头、编码、Windows记事本编码、java编码解码的那些事

    对于Windows记事本: ANSI :GB2312 java中应使用GBK解码 Unicode :有签名的UTF-16LE java中应使用UTF-16解码 Unicode big endian : ...

  7. 天气预报API(五):城市代码--“新编码”和“旧编码” 对比

    参考一些博客.文章 来查找 测试 接口,后来发现两套城市编码标准,有点想法,故拿来对比分析. 注:新旧编码是个人主观叫法,只是为了方便称呼,可能有不当之处,请留言更正. 暂且称 中国天气网等网站使用的 ...

  8. 各种编码问题产生原因以及解决办法---------响应编码,请求编码,URL编码

     响应编码 产生原因以及解决办法: 示例: package cn.yzu; import java.io.IOException; import javax.servlet.ServletExcept ...

  9. HTTP 协议中的 Content-Encoding 和 Transfer-Encoding(内容编码和传输编码)

    转自:http://network.51cto.com/art/201509/491335.htm Transfer-Encoding,是一个 HTTP 头部字段,字面意思是「传输编码」.实际上,HT ...

随机推荐

  1. sqlserver被锁的表以及如何解锁

    查看sqlserver被锁的表以及如何解锁   查看被锁表: select   request_session_id   spid,OBJECT_NAME(resource_associated_en ...

  2. [3G/4G]3G/4G模块开发

    转自:http://mywutuobang.blog.sohu.com/260073467.html 一. 修改内核支持3G模块,一般内核需要枚举相关的通讯模块,其接口为串口,其数据接口和通讯接口枚举 ...

  3. Tomcat 添加为系统服务 开机自动启动

    http://jingyan.baidu.com/article/a65957f4b12b8724e77f9b5a.html Tomcat是Apache 软件基金会(Apache Software F ...

  4. socket编程函数

    连接 TCP/IP协议规定网络数据传输应采用大端字节序 socket地址 struct sockaddr{ unsigned short sa_family; char sa_data[14]; }; ...

  5. 如何打一手好Log

    如果项目上过线的话,那你一定知道Log是多么重要. 为什么说Log重要呢?因为上线项目不允许你调试,你只能通过Log来分析问题.这时打一手好Log的重要性绝不亚于写一手好代码.项目出问题时,你要能拿出 ...

  6. Jquery 技术小结

    前记: 现在项目中经常要用到JS去操作一些事,对整个团队开发来说,JS的书写规范和正确对开发具有较大的帮助.在一个团队中常常会发生JS书写的不统一性和游览器不兼容性等情况发生.我觉的最好的方法就是有一 ...

  7. 获取表单提交MVC错误信息

    if (!ModelState.IsValid)                {                    List<string> Keys = ModelState.Ke ...

  8. Mastering the game of Go with deep neural networks and tree search浅析

    Silver, David, et al. "Mastering the game of Go with deep neural networks and tree search." ...

  9. Android ArryaList 笔记

    Arraylist相当于动态数组,可以动态的添加或者删除其中的元素. 参考链接 http://beginnersbook.com/2013/12/java-arraylist/ package com ...

  10. 关于Java方法的参数

    刚好看到C++的函数这块,说C++中除了引用类型的形参,其他都是实参的副本(个人总结). 隐约记得Java中方法的参数也是这么回事,于是手动测试一番. 结果 Java中方法的参数都是值传递,哪怕是引用 ...