c# - 迭代获取特定集合的所有子集

标签 c# algorithm binary

我知道迭代解决方案:

给定一组n个元素

保存一个 int v = 2^n 并生成所有二进制数直到这个 v

但是如果 n > 32 呢?

我知道它已经是 2^32 个子集,但是 - 绕过 32 个元素限制的方法是什么?

最佳答案

  1. 如果您对 64 项限制感到满意,您可以简单地使用 long

  2. int/long 的数组/ArrayList。有一个类似next 的函数:

    bool next(uint[] arr)
      for (int i = 0; i < arr.length; i++)
        if (arr[i] == 2^n-1) // 11111 -> 00000
          arr[i] = 0
        else
          arr[i]++
          return true
      return false // reached the end -> there is no next
    
  3. BitArray .与上述相比,可能不是一个非常有效的选择。

    您可以使用 next 函数将最低有效位 0 设置为 1,并将所有剩余位设置为 0。例如:

    10010 -> 10011
    10011 -> 10100
    

注意 - 这可能需要很长时间,因为子集太多了,但这不是问题所在。

关于c# - 迭代获取特定集合的所有子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14788028/

相关文章:

python - 如何在 python 中用相等的非重叠正方形近似覆盖一个(不一定是凸的)多边形?

python - 在单个操作中使用二进制列表拆分 numpy 数组

c# - 为遗传算法表示二进制基因组的明智方法是什么?

c# - URL 的正则表达式,包括查询字符串

c# - 我的文档类应该有打印方法还是应该有一个专用的打印机类?

c# - 在 Windows 8 应用程序中使用 C# 从 NTP 服务器获取时间

c# - 将空 XML 元素反序列化为 Guid.Empty

algorithm - 在图算法中找到最短路径

algorithm - 多词网络搜索算法

parsing - binary.Read() 未在结构中产生预期值