通过按位OR生成所需数字

时间:2012-02-29 11:02:13

标签: algorithm bit-manipulation

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

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

2 个答案:

答案 0 :(得分:0)

我想这个问题是NP完整的,虽然我没有发现NP难题可以轻易地减少到这个。

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

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

答案 1 :(得分:0)

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

  

给定自然数X,由自然数组成的区间[lo_1,hi_1],...,[lo_N,hi_N]和{0,1}中的位b,确定在[0,1]中是否存在自然数y_1 [lo_N,hi_N]中的lo_1,hi_1],...,y_N,使得Y = y_1 OR ...或y_N,它认为(X和Y)= X并且存在i使得x_i< = hi_i - b。

我的递归算法的基本情况是当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来准备子问题。当且仅当hi_i AND 1 = 1时,将Odd(i)设为真。让Odd + (i)当且仅当Odd(i)和lo_i< hi_i。如果X AND 1 = 0:

  

如果我存在Odd +(i),那么让b'= 0.否则,让b'= b。

如果X AND 1 = 1:

  

如果存在明显的i和j,使得Odd +(i)和Odd(j),则令b'= 0.如果不存在j使得Odd(j),则让b'= 1.否则,设b'= b。

返回子问题的答案。