【问题标题】:Maximum OR values in all subsets of array数组所有子集中的最大 OR 值
【发布时间】:2018-02-12 21:36:11
【问题描述】:

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

如何解决这个问题?

【问题讨论】:

    标签: arrays algorithm sorting subset bitwise-operators


    【解决方案1】:

    最大的 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] 是覆盖掩码xA[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 的算法不同,此算法无法利用问题实例可能具有的任何有用结构。

    【讨论】:

    • 这可以使用动态编程解决吗?如果可以,需要上面提到的代码。或者只是一个自我解释的算法就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    相关资源
    最近更新 更多