我的n
数字范围为0..m-1
。 m
必须是2的力量
将它们打包成字节流的最有效方法是需要向上舍入log2(m)*n
位
我将数字设为List<int>
,将m
设为int m
。如何将其打包成List<byte>
不超过log2(m)*n/8
的尺寸?
打包完成后,怎样才能获得包含List<byte>
和int n, m
?
答案 0 :(得分:1)
作业?
一般来说,当你在0..M-1范围内有N个数字时,这意味着你在0..M * N-1范围内有一个数字。表示这需要相等或更少的位log2(M*N)
,然后是单独编码数字的情况。
接下来,如果您对数字(它们的分布或它们之间的相互依赖性)有所了解,您可以尝试应用各种压缩模式。当知道分布时,霍夫曼或类似的编码可能是最简单的方法。当已知顺序依赖性时,LZ(W)或类似方法将是方法。等等。
编辑:回答关于如何存储/写/读这样一个数字的评论中的问题。您可以以各种形式存储号码。字节数组似乎是一种(如果不是)最有效的方法。下面是一个使用BigInteger如何做到这一点的快速示例,它足够接近字节数组的内存效率,但在顶部有一些方便的操作。您可能希望使用更合适的存储重写此内容:
int[] Ms = new int[] { 10, 11, 12, 13 };
int N = 42;
System.Numerics.BigInteger x = new System.Numerics.BigInteger();
System.Numerics.BigInteger power = 1;
// composing the pack:
foreach (int s in Ms) {
x += power * s;
power *= N;
}
// reading the pack:
// extracting i'th number:
int i = 2;
power = System.Numerics.BigInteger.Pow(N, i);
int result = (int)((x / power) % N);
答案 1 :(得分:0)
将数字列表视为基数为m的数字。