【发布时间】:2018-02-12 21:36:11
【问题描述】:
给定一个包含 n 个整数的数组。在给定数组的所有子集中找到具有最大 OR 值的子集的最小长度。
如何解决这个问题?
【问题讨论】:
标签: arrays algorithm sorting subset bitwise-operators
给定一个包含 n 个整数的数组。在给定数组的所有子集中找到具有最大 OR 值的子集的最小长度。
如何解决这个问题?
【问题讨论】:
标签: arrays algorithm sorting subset bitwise-operators
最大的 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] 是覆盖掩码x 的A[0..i] 的最小子集的大小。
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])
最小覆盖的大小在S[n][m] 中找到,覆盖本身可以用通常的“向后路径跟踪”方法重建。如果min 导致其左操作数对应于包括项目i,如果min 导致其右操作数对应于不 包括项目i,如果它不明确,则任一路径都将导致同样好的解决方案。
与基于 SAT 或 ILP 的算法不同,此算法无法利用问题实例可能具有的任何有用结构。
【讨论】: