c# - 用二进制表示子集

标签 c# arrays binary compression subset

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

表达这个子集的最紧凑的方式是什么?

到目前为止,我想出的是拥有一个 256 位长度的位数组并将适当的索引设置为 1。这种方法显然需要 256 位来表示 128 个值,但是否有不同的、更节省空间的方式?

谢谢!

最佳答案

有256个!/(128! * (256 - 128)!) 一组 256 个项目中的 128 个元素的独特组合,顺序无关紧要(参见 wiki 关于组合)。

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

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

关于c# - 用二进制表示子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43184710/

相关文章:

c# - 查找两个 C# 对象之间的属性差异

c# - c# - web api中 "$"关键字的用途是什么

java - 移位时字节值的内存分配

java - 二进制字符串转十进制的函数

c - 使用矩阵作为一维数组参数

c++ - 如何将单个位转换为字符?

c# - 提前访问 ASP.NET MVC 中的异步操作结果

c# - 为什么 for 中定义的私有(private)变量与外面的同一个变量冲突?

javascript - 根据状态在特定表格单元格中显示 "Task"。响应式JS

arrays - 哈希数组元素复制