数组所有子集中的最大OR值

时间:2017-09-04 15:52:29

标签: arrays algorithm sorting subset bitwise-operators

给定n个整数数组。找到给定数组的所有子集中具有最大OR值的子集的最小长度。

如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

最大OR只是所有项目的OR,唯一真正的问题是找到OR值到该值的最小子集。

这是Set Cover问题的搜索版本,在某种意义上它显然可以通过将其视为Set Cover的搜索版本的实例来解决,并且在某种意义上你可以编写一个Set Cover实例这个问题的条款,所以它是NP难的(不是NP完全的,因为它不是决策问题)。

你可以用整数线性规划,SAT求解(因为SAT没有优化而花费多个查询),动态编程,以及其他技术无疑来解决这个问题。

例如,要使用DP,我们可以执行以下操作,假设WLOG * 输入数组(A)的OR为m,这是2减去1的幂。(*因为任何始终为0的位位置都可以忽略并从问题中删除而不更改结果子集)

建立一个大小为S的表格,S[i][x]是覆盖面具A[0..i]的{​​{1}}的最小子集的大小。

x

最小封面的大小可以在S[0][0] = 0 for x in 1..m+1: S[0][x] = n+1 for i in 0..n: for x in 0..m+1: S[i+1][x] = min(S[i][x & ~A[i]] + 1, S[i][x]) 中找到,封面本身可以在#34;后面的通常"向后路径中重建。方法。如果S[n][m]导致其左操作数与包含项min相对应,则i导致其右操作数与对应,包括项{{ 1}},如果它不明确,那么任何一条路径都会导致一个同样好的解决方案。

与基于SAT或ILP的算法不同,此算法无法利用问题实例可能具有的任何有用结构。