【发布时间】:2021-02-28 14:01:21
【问题描述】:
我有基于 Drdobbs ARcoder 的简单算术编码器。解码/编码算法归结为维护数组中的符号概率并更新它们。问题是我想扩展它以支持越来越多的符号,而不是固定的 +256 左右的符号。目前的实施
如果符号数量增加太多,update_model() 和 getsym() 的速度就会太慢。
我可以将cumulative_freq 数组转换为树状数据结构,以便更快地查找和更新吗?我不介意算法最终是否会消耗更多内存,只要它可以更好地扩展。
const u32 MAX_INPUT_VAL = 255;
const u32 CODE_RESCALE = MAX_INPUT_VAL+1;
const u32 CODE_EOF = MAX_INPUT_VAL+2;
const u32 CUMULATIVE_TOTAL = MAX_INPUT_VAL+3; // total sum of all frequencies before.
const u32 CODES_END = MAX_INPUT_VAL+4;
u32 cumulative_freq[CODES_END];
// (Init symbol freqs)
for(u32 i = 0; i < CODES_END; ++i) {
cumulative_freq[i] = i;
}
// update value propability
void update_model(u32 v) {
// how can I make this scale better for more symbols?
for(code_t i = v + 1; i < CODES_END; ++i) {
cumulative_freq[i]++;
}
}
struct sym {
u32 low;
u32 high;
u32 count;
};
// encode symbol: get symbol propability
sym propability(u32 v) {
sym p{cumulative_freq[v], cumulative_freq[v+1], cumulative_freq[CUMULATIVE_TOTAL]};
update_model(v);
return p;
}
// decode symbol:
std::pair<sym, u32> getsym(u64 prop) {
// how can I make this scale better for more symbols?
for(u32 i = 0; i < CUMULATIVE_TOTAL; ++i) {
if(prop < cumulative_freq[i+1]) {
sym p{cumulative_freq[i],cumulative_freq[i+1],cumulative_freq[CUMULATIVE_TOTAL]};
update_model(i);
return {p,i};
}
}
// error: decode failed.
}
【问题讨论】:
标签: c++ data-structures compression lossless-compression