【问题标题】:Generating a wanted number by bitwise OR通过按位或生成想要的数字
【发布时间】:2023-03-14 07:33:01
【问题描述】:

给定 N 个整数区间 [lo_i,hi_i]。

从每个区间中选择一个数字,使得它们的按位或成为给定数字 X。(结果是否比 X 多 1 位无关紧要;即,如果生成的数字是 Y,(X&Y)==X应该持有)

【问题讨论】:

  • 所有时间间隔只有一个X
  • 为每个区间选择一个 Y,这样X|Y == X?如果区间内没有Y这样的数字怎么办?我在想[8, 9]X = 6
  • 你能举个例子吗?像这样?当X == 15,从[13,14][1,2],你选择141,这样(14 | 1) & X == X
  • 通过蛮力很容易做到,但速度慢得离谱(现在只取决于 N,但范围的大小也是如此) - 我假设你想要一些合理的东西?我已经查看了许多二分匹配和设置覆盖问题,但我认为没有办法正确地做到这一点。我能想到的最好的办法是稍微修剪一下蛮力(例如,如果某个位仅出现在一个区间的上半部分,则必须从该区间的上半部分选择一个数字)。
  • xor 已经有这个属性(a xor b) xor b = a

标签: algorithm bit-manipulation


【解决方案1】:

让我们稍微概括一下这个问题。我将编写按位运算符,例如 OR、AND 和 SR(右移)。

给定一个自然数X,由自然数组成的区间[lo_1, hi_1], ..., [lo_N, hi_N],以及{0, 1}中的位b,判断[中是否存在自然数y_1 lo_1, hi_1], ..., y_N in [lo_N, hi_N] 使得 Y = y_1 OR ... OR y_N,它认为 (X AND Y) = X 并且存在 i 使得 x_i

我的递归算法的基本情况是 lo_1 = hi_1 = lo_2 = ... = hi_n = 0。当且仅当 X = 0 且 b = 0 时,存在解。

归纳地,通过让 X' = X SR 1 和 lo_i' = lo_i SR 1 和 hi_i' = hi_i SR 1 来准备一个子问题。令 Odd(i) 为真当且仅当 hi_i AND 1 = 1。令 Odd+ (i) 当且仅当 Odd(i) 且 lo_i

如果存在满足 Odd+(i) 的 i,则令 b' = 0。否则,令 b' = b。

如果 X AND 1 = 1:

如果存在不同的 i 和 j 满足 Odd+(i) 和 Odd(j),则令 b' = 0。如果不存在满足 Odd(j) 的 j,则令 b' = 1。否则,让 b' = b。

返回子问题的答案。

【讨论】:

    【解决方案2】:

    我猜这个问题是 NP 完全问题,虽然我还没有发现一个 NP 难题可以很容易地简化为这个问题。

    但是对于那些包含 2^(mostSignificantDigit) - 1 的集合,我会做一个启发式的做法:首先,尝试数字 1...1(mostSignificantDigit-1 的数字),其次是具有最高有效位的数字和尽可能多的数字其他位尽可能设置。这种启发式方法只有在您需要一个具有最高有效位集和几个不同的较低有效位的集合中的数字的情况下才不好。

    使用这种启发式方法,您还可以在这些集合中选择最大的数字 1....1 作为进一步的启发式方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多