博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golomb哥伦布编码——本质上就是通过0来区分商和余数
阅读量:7078 次
发布时间:2019-06-28

本文共 1101 字,大约阅读时间需要 3 分钟。

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

哥伦布编码使用指定的整数 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的码字。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
,如需转载请自行联系原作者
你可能感兴趣的文章
Service层getParameter方法接受字符转换成int类型
查看>>
监控利器 sysdig - 每天5分钟玩转 Docker 容器技术(79)
查看>>
mssql中sp_executesql的用法
查看>>
Oracle 数据库实例启动关闭过程
查看>>
从ftp上传下载文件(一)
查看>>
12月12日云栖精选夜读:阿里云API创新应用大赛启动:智慧开放,互链解决
查看>>
一个段子的随感
查看>>
ORACLE 修改11.2.0.4 RAC 默认监听端口号1521为1621
查看>>
记一次patch升级过程
查看>>
十张图看懂未来的大数据世界
查看>>
归档模式下四种完全恢复的场景
查看>>
绝妙好文
查看>>
java注解(转)
查看>>
HDOJ 2081 手机短号
查看>>
短信验证——上行和下行
查看>>
关系型数据库表结构设计规范-浅谈(转)
查看>>
POJ 2260(ZOJ 1949) Error Correction 一个水题
查看>>
一个通用的Makefile
查看>>
vagrant学习笔记 - 基本命令的使用
查看>>
Ramdisk文件系统的制作与调试运行
查看>>