表达二进制的子集

时间:2017-04-03 12:28:12

标签: c# arrays binary compression subset

根据顺序列出256个数字(0-255),我想表达该列表中128个数字的子集。每个数字都是唯一的,不会重复。

表达此子集的最简洁方法是什么?

到目前为止,我所提出的是拥有256个长度的位阵列并将相应的索引设置为1.此方法显然需要256位来表示128个值,但是有一种不同的,更节省空间的方式?

谢谢!

2 个答案:

答案 0 :(得分:0)

由于您不关心子集的顺序,也不关心将每个元素恢复到原始数组中的位置,这只是生成数组的随机子集的情况,类似于绘图卡片来自甲板。

要从数组中获取唯一元素,您可以简单地对源数组进行混洗,然后在前X个索引处获取许多元素:

int[] srcArray = Enumerable.Range(0, 256).ToArray();

Random r = new Random();
var subset = srcArray.OrderBy(i => r.Next()).Take(128).ToArray();

注意:我使用上面的随机化方法来保持示例简洁。对于更强大的混洗方法,我推荐this post中描述的Fisher-Yates算法。

答案 1 :(得分:0)

有256个! /(128!*(256 - 128)!)来自一组256个项目的128个元素的唯一组合,当顺序无关紧要时(请参阅wiki关于组合)。

如果你计算这个数字并取基数2对数 - 你会发现它是251.6。这意味着您需要至少252位来表示256个项目中128个项目的唯一选择。由于.NET无论如何都不能表示位(只有整个字节) - 没有理由真正找出如何做到这一点。

在这方面,128是最差的数字。如果您选择说5个元素或256个中的251个 - 可以用34位表示,那么尝试找到那种有效的表示会很有用。