Algorithm 从许多二进制序列中选择一些,使“或”它们一起的结果为1111111…111

Algorithm 从许多二进制序列中选择一些,使“或”它们一起的结果为1111111…111,algorithm,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) 是否有一个算法来实现它 我的想法是: 步骤1:对于从1到L的位置,计算在该位置有1的序列总数。将其命名为“拥有号码” 步骤2:考虑具有最小拥有数的位置,并从该位置的拥有序列中选择具有最大数量的序列。 步骤3:忽略所选序列,更新拥有编号并返回步骤2 我相信我的

我有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)
是否有一个算法来实现它

我的想法是:

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

步骤2:考虑具有最小拥有数的位置,并从该位置的拥有序列中选择具有最大数量的序列。 步骤3:忽略所选序列,更新拥有编号并返回步骤2

我相信我的方法不能给出最好的答案

有人有更好的主意吗?

听起来像是一项典型的任务

是的,如果你想快速得到一个好的答案,你的算法听起来很合理。如果你想拥有尽可能少的样本组合,最好是尝试所有组合。

这是众所周知的。事实上,它的决策版本是一个典型的NP完全问题,是其中包括的21个问题之一,因此没有有效的算法来解决它


你在问题中描述的算法称为,除非你的问题有一些你没有告诉我们的特殊特征,否则它本质上是最著名的方法。它找到的集合的大小不超过最小集合大小的Olog | N |倍。

根据问题的确切结构,还有一种技术通常效果良好,实际上可以提供最佳结果:

设x[j]是一个布尔变量,表示是否在结果中包含第j个二进制序列的选择。零抑制二元决策图现在可以简洁地表示——取决于问题的特征,集合族使得集合中包含的变量x[j]对应的二元序列的OR都是1。如果ZDD是简洁的,那么找到最小的这样的集合从而最小化包含的序列的数量是相对容易的。详见《计算机编程艺术》第4A卷第7.1.4章


通过采用集合族,使每个位置正好有一个1,也很容易适应精确的覆盖。

您是指以随机均匀概率进行选择吗?或者任何选择都可以是输出?您当前设置问题的方式允许一个给定位置被多个b_i覆盖-这是有意的吗?@Andrey..也许我没有清楚地呈现。我的意思是找到一个算法来找到最佳选择,而不是随机选择。使用分支定界搜索可以做得更好一些。这与回溯相同,只是在这种情况下,当你有一个具有k个集合的不完整解,并且在搜索的早期已经找到了一个k个集合的完整解时,你就不再深入了。我的输入大小可能非常大,可能n=10000。使用回溯成本太高。实际上,Gareth Rees指出这是NP难的,所以使用贪婪算法来寻找解决方案就足够满足我了。我要说的是“最著名的大输入方法”。对于小的输入,指数时间算法仍然是可行的,计算最优解可能值得额外的时间。@MvG:这是一个公平的观点。OP确实说输入可能非常大…太好了。谢谢!现在我只需要找到一个近似解。而且,OLGN-近似可能是。也许我没有清楚地说明,这里不涉及概率。我的意思是找到一个算法来找到最佳选择,而不是随机选择。@harold.对不起。我把你的“布尔变量”错当成了“随机变量”…请原谅:。。。