我做了一个Rice解码器(和编码器)的天真实现:
void rice_decode(int k) {
int i = 0
int j = 0;
int x = 0;
while(i < size-k) {
int q = 0;
while(get(i) == 0) {
q++;
i++;
}
x = q<<k;
i++;
for(j=0; j<k; j++) {
x += get(i+j)<<j;
}
i += k;
printf("%i\n", x);
x = 0;
}
}
输入位集的大小为size
,get(i)
返回位集的i
位的基元,以及k
Rice参数。由于我关注的是性能,我还使用预计算进行了更精细的实现,这更快。但是,当我在-O3
中打开gcc
标记时,天真的实现实际上优于后者。
我的问题是:确实知道Rice编码器/解码器的任何现有有效实现(我更关心解码)比这更好(我能找到的那些更慢或可比较)?或者,您是否有任何聪明的想法可以使解码比预计算更快?
答案 0 :(得分:0)
Rice编码可以视为variable-length codes.的变体因此,在过去,我使用基于表格的技术生成自动/状态机,可以快速解码固定的霍夫曼代码和米编码。快速搜索fast variable-length codes或fast huffman的网络会产生许多适用的结果,其中一些是基于表格的。
答案 1 :(得分:0)
这里有一些适用的教科书。
while (get(i) == 0) { q++; i++;}
找到流中设置的最低有效位。
可以用-data & data
代替,它返回单个位集。那可以用一些hash + LUT转换为索引'q'(例如一个涉及37的模数 - 或者使用带有crc32的SSE4指令,我敢打赌可以简单地做LUT[crc32(-data&data) & 63]
;
下一个循环for(j=0; j<k; j++) x += get(i+j)<<j;
OTOH应该替换为x+= data & ((1<<k)-1);
,因为只需从流中获取k位并将它们视为无符号整数。
最后一个移位data>>=(q+k);
并从输入流中读取足够的字节。