从许多二进制序列中选择一些,使"或"它们的结果为1111111111 .... 111

Han*_*nXu 4 algorithm

我有N个长度为L的二进制序列,其中N和L可能非常大,并且那些序列可能非常稀疏,比如说有更多的0然后是1.

我想从它们中选择M序列,即b_1,b_2,b_3 ......,这样

b_1 | b_2 | b_3 ... | b_M = 1111...11 (L 1s)
Run Code Online (Sandbox Code Playgroud)

有算法可以实现吗?

我的想法是:

步骤1:对于从1到L的位置,计算在该位置具有1的序列的总数.将其命名为"拥有号码"

步骤2:考虑具有最小拥有数的位置,并从该位置的拥有序列中选择具有最大数量1的序列.

第3步:忽略所选序列,更新拥有号码并返回STEP2.

我相信我的方法无法产生最佳答案.

有没有人有更好的主意?

Gar*_*ees 8

这是众所周知的套装问题.它是NP难的 - 实际上,它的决策版本是规范的NP完全问题之一,并且是Karp 1972年论文中包含的21个问题之一- 因此没有解决它的有效算法.

您在问题中描述的算法被称为" 贪婪算法 ",并且(除非您的问题具有一些您没有告诉我们的特殊功能),它本质上是最着名的方法.它找到的集合集合不超过最小此类集合的大小的O(log | N |)倍.