有效包装数量

时间:2011-06-05 18:12:24

标签: c#

我的n数字范围为0..m-1m必须是2的力量 将它们打包成字节流的最有效方法是需要向上舍入log2(m)*n位 我将数字设为List<int>,将m设为int m。如何将其打包成List<byte>不超过log2(m)*n/8的尺寸? 打包完成后,怎样才能获得包含List<byte>int n, m

的数字

2 个答案:

答案 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的数字。