我有一个字节数据流,也称为基数256个符号。什么是最好的算法,在理想情况下将其转换为新的符号流,每个符号的基数变化并且只在运行时才知道?输入字节流和目标基数列表的长度都很长但是有限。所有非负整数,无浮点。此外,目标基数不能保证均匀分配或是256的倍数。从基数256转换为多基数并返回的算法
回答
您的问题是算术编码的一个子集,它被用作许多压缩算法的最后一个阶段。这是最酷的事情在CS学习一种:
http://www.drdobbs.com/cpp/data-compression-with-arithmetic-encodin/240169251 https://en.wikipedia.org/wiki/Arithmetic_coding
如何您的问题具体涉及:
你想要的编码器是算术解码器,并为每个解码您将使用一个不同大小的字母表(基数),所有符号的概率相同。
编码器的主循环会做这样的事情:
int val=0; //information from the stream
int range=1; //val is in [0,range)
while(...)
{
int radix = next_radix();
//ensure adequate efficiency
while(range < radix*256)
{
val = (val<<8)|(next_byte()&255);
range<<=8;
}
int output = (int)(radix*(long)val/range);
//find the smallest possible val that produces this output
int low = (int)((output*(long)range+radix-1)/radix);
//find the smallest possible val that produces the next output
int high = (int)(((output+1)*(long)range+radix-1)/radix);
val-=low;
range = high-low;
write(output);
}
没有与处理终止的条件和处理在您的解码器进行(算术编码器)的并发症,所以你必须阅读文学,从我链接的东西开始。尽管如此,我希望这能够让你了解它的工作原理。
好运
是否这样:'(out * self._range + radix - 1)/ radix'没有评估这个? '(out * self.range - 1)/ radix + 1'?同样,'((out + 1)* self._range + radix-1)/ radix' ='((out + 1)* self._range - 1)/ radix + 1' – Reinderien
当out = = 0,因为整数除法舍去而不是舍入。 (A + B-1)/ B是四舍五入的,(A +(B >> 1))/ B是四舍五入到最近的A/B,并且A/B是A/B向下取整。 –
- 1. 我需要将数字从基数255转换为基数256
- 2. 从基数10转换为基数2
- 3. 从基数10转换为基数3
- 4. 从基数60转换为基数10
- 5. 使用按位运算从基数10转换为基数
- 6. 在JavaCard平台上将基数10数字转换为基数256数字
- 7. Python:如何从二进制转换为基本64并返回?
- 8. 将数字从基数10转换为基数4
- 9. 将基数为10的数字转换为基数为N的数字的算法
- 10. bcp导入数据为基数256?
- 11. 递归转换基数为10的数字为基数
- 12. 将自然数转换为特定基并将其作为列表返回
- 13. 转换3.333333333基数为二
- 14. 基数转换的计算复杂度
- 15. 如何从8位字节转换为7位字节(基地256基地128)
- 16. 用于基数转换算法的SQL函数
- 17. 将从mysql查询返回的数据转换为json(基于树)
- 18. 如何将基于回调的函数转换为基于Promise的函数?
- 19. 大基数转换
- 20. 为什么从基数10转换为基数2被认为是慢?
- 21. Arduino从基准十二转换为十基数,反之亦然
- 22. 数字基数转换递归方法
- 23. 将基数10转换为基数3数
- 24. 无法转换为基类
- 25. 从基本转换为Javascript?
- 26. 基本Java:方法计算返回NaN
- 27. 整数转换为给定的基地
- 28. 从NSString转换为NSDate并返回
- 29. 将多维数组转换为字符串并返回
- 30. 转换从数据库返回的多维数组数据
确实输出流需要具有任何特殊性能(如以某种方式的数字),或者你只需要能够从输出流和基数得到原来的流背清单? –
@MattTimmermans基本上,分开指定基数的非负整数。是的,原始流必须稍后恢复。 – Reinderien