哥伦布编码是一个针对整数的变长编码方式,详细介绍可以看维基百科。这里简单介绍下:

哥伦布编码使用指定的整数 M 把输入的整数分成两部分:商数 q、余数 r。 商数当做一元编码,而余数放在后面做为可缩短的二进制编码。

将整数变为一元编码非常简单:q 的一元编码结果就是 q 个 1 加上 1 个 0。如下表:

整数 一元编码
0 0
1 10
2 110
3 1110
4 11110
5 111110
6 1111110

一元编码可以用以下代码实现;

function unary_encoding(q) {
return (1 << (q + 1)) - 2;
}

将 M 选为 64 时,余数取值区间为 [0, 64),只需要用 6 位二进制表示。将待处理的数组每一项都除以 64,并将商数和余数分别做一元编码和二进制编码,得到如下结果:

整数 商数 余数 商数一元编码 余数二进制编码
151 2 23 110 010111
41 0 41 0 101001
16 0 16 0 010000
61 0 61 0 111101
192 3 0 1110 000000
         

表格中每一行后两列拼起来就是该整数对应的哥伦布编码,可以看到,64 以下的整数编码后会变短。

这段代码运行结果如下:

["110010111", "0101001", "0010000", "0111101", "1110000000"]

摘自:https://imququ.com/post/golomb-coded-sets.html

go语言的实现:
https://github.com/tcnksm/go-casper/blob/master/internal/encoding/golomb/golomb.go
https://github.com/dave-andersen/deltagolomb/blob/master/deltagolomb.go
 

GOLOMB-RICE 编码

Golomb-Rice是Golomb编码的一个变种,它给Golomb编码的参数m添加了个限制条件:m必须是2的次幂。这样有两个好处:

不需要做模运算即可得到余数r,r = N & (m - 1) 对余数r编码更为简单,只需要取r二进制的低\(\log_2(m)\)位即可。

则Golomb-Rice的编码过程更为简洁:

初始化参数m,m必须为2的次幂 计算q和r,q = N / m ; r = N & (m - 1) 使用一元编码编码q 取r的二进制位的低\(\log_2(m)\)位作为r的码字。

最新文章

  1. MVC4 +EasyUI 使用TreeGrid 方法
  2. 重新开源UDS
  3. [转]关于 initWithNibName 和 loadNibNamed 的区别和联系
  4. Tomcat Manager 用户名和密码配置
  5. c++重载运算符注意
  6. BC.5200.Trees(dp)
  7. 整理一些有意思的php笔试题
  8. 事务&amp;视图和索引
  9. 从数组中随机取n条不重复的数据
  10. skynet启动过程_1
  11. 2017-06-22初识python
  12. {style}/index_article.htm {style}表示什么意思啊
  13. kubernetes 1.14安装部署metrics-server插件
  14. gradle.properties使用
  15. 解决Nginx+Tomcat下客户端https请求跳转成http的问题
  16. go get 碰壁怎么办?
  17. mysql 添加外键
  18. c# 测试方法执行时间
  19. [Oracle]如何查看一个数据文件是否是自动扩展
  20. 一款基于jQuery可放大预览的图片滑块插件

热门文章

  1. Android HTTP 数据提交
  2. CloseableHttpClient 在使用过程中遇到的问题
  3. Hive扩展功能(五)--HiveServer2服务高可用
  4. Android Binder机制(一) Binder的设计和框架
  5. js获得子节点, 获得tab转json值
  6. 创建全局函数 匹配查找 std::map
  7. 什么是ACID
  8. python numpy array 与matrix 乘方
  9. My97DatePicker 开始日期不能大于 结束日期
  10. Python模块 os.walk