【发布时间】:2012-08-14 16:36:25
【问题描述】:
给定一个固定长度的位数组以及它包含的 0 和 1 的数量,我如何安排所有可能的组合,以便返回第 i 个组合花费尽可能少的时间? 它们返回的顺序并不重要。
这是一个例子:
array length = 6
number of 0s = 4
number of 1s = 2
可能的组合(6!/4!/2!) 000011 000101 000110 001001 001010 001100 010001 010010 010100 011000 100001 100010 100100 101000 110000
问题 第一个组合 = 000011 第 5 个组合 = 001010 第 9 个组合 = 010100
采用不同的安排,例如 100001 100010 100100 101000 110000 001100 010001 010010 010100 011000 000011 000101 000110 001001 001010
它会返回 第一个组合 = 100001 第 5 个组合 = 110000 第 9 个组合 = 010100
目前我正在使用 O(n) 算法来测试每个位是 1 还是 0。问题是我需要处理很多非常长的数组(大约 10000 位),所以它仍然很慢(而且缓存是不可能的)。我想知道您是否认为可能存在更快的算法。
谢谢
【问题讨论】:
-
也许这个答案会对你有所帮助:stackoverflow.com/a/311716/220060
-
你最终要返回多少种组合?
-
只是所有可能性中的一小部分(当然,因为它们是 2^10000),但即使它们只有 1000 也需要很多时间。
-
嗯。我不认为我理解这个问题。如果集合的顺序无关紧要,那么在您的示例中,您不能返回任何 2 位设置为第一个组合的 6 位值,以及任何 2 位设置的 6 位值(您尚未选择)作为第 5 个组合等?
-
谢谢 nalply,但我无法理解该代码与此问题的关系。我的问题是我有一个集合(如上所述),我需要准确提取第 i 个和第 j 个和第 n 个组合。第 i 个或第 j 个是什么并不重要,只要算法是一致的(也就是说,如果我要求第 i 个它总是返回相同的)并且可能比 O(n) 运行得更快(也许 O (ln n) 甚至 O(1))
标签: algorithm bit-manipulation combinations