从每个间隔中找到1个数字,使得所有的OR等于X.

时间:2014-01-09 12:11:32

标签: algorithm optimization data-structures bit-manipulation

给定N个整数区间,每个区间形式为[a,b],其中包含从a到b的整数。

从每个区间我们必须选择1个数字,这样所有选择的数字的按位OR = X. X是众所周知的。

当我们从每个区间有多个候选人来形成X时,我被困住了。

这是我能够想到的:
Algo:
1)从每个区间消除j = 1中位j = 0和位X的数字。
2)现在找到所需的号码。

问题出现在step 2

  

考虑区间:[1,3] [17,19] [15,18]
  设X为17 =(10001)

     

1
  11

     

10001
  10010个
  10011

     

01111
  10000个
  10001个
  10010

     

应用算法的第1步:

     

00001(1)

     

10001(17)

     

10000(16)
  10001(17)

     

第2步:   可能的对:
  1)1,17,16
  2)1,17,17

现在我们必须选择每个可能的对并检查它们的OR是否等于X.
如果对很大,则需要很长时间才能得到答案。 那么,可以应用一些不错的技巧(优化上述)或任何其他算法来解决它吗?

1 个答案:

答案 0 :(得分:1)

这是一种完全不同的方式。

对于每个范围r[i] = (a, b),创建一个表达x[i]事实的BDD a <= v[i] <= b

创建另一个表达OR[0 <= i < n](v[i]) == X

事实的BDD

将所有这些BDD相交。在结果上,找到任何解决方案。

作为奖励,您还可以:

  • 查找解决方案的数量(无需全部访问)
  • 找出最小(或最大)重量的解决方案
  • 找到一个随机解决方案,其中每个解决方案都同样可能

存在一个缺点,即对于某些输入,BDD的大小将会爆炸。

顺便说一下,这是由this website处理的方式(当BDD变得太大时它将切换到SAT求解器,然后它将无法再报告解决方案的数量)