一个数据压缩算法
2018-03-10 本文已影响0人
ww4u
- 从数据中均匀地提取一组数据,有一个比较经典的算法
- 以前在做数据抽取时非常地熟练
- 今天再次使用时,居然忘了怎样实现了,主要是理不清求余和求商间的使用关系了
- 简单推导一下
- 总共s个数,均匀地分成n组,每组有g个,余数为 m
- 即:s = g*n + m
- 那么每输出一组 就 累计一次 n,则 总共累计数值 为 n * m
- 所以,可以指定如下的规则:
- 每输出一组后,累计一次m
- 当m大于或等于n是,回滚一次n,而且当前组数量为g+1
- 由于是从0开始累计的,所以第一组的数量一定为 g
- 这样总共可以回滚m次
- m就是余数
//! now for compress
int rad, rem;
rad = inLen / maxOutLen;
rem = inLen % maxOutLen;
//! now for compress
int acc = 0;
int outIndex = 0;
for ( int i = 0; i < maxOutLen; i++, outIndex += rad )
{
pOut[ i ] = pIn[ outIndex * skipI ];
acc += rem;
if ( acc >= maxOutLen )
{
acc -= maxOutLen;
outIndex++;
}
}