Algorithm 从每个区间中找出一个数,使或等于X

Algorithm 从每个区间中找出一个数,使或等于X,algorithm,optimization,data-structures,bit-manipulation,Algorithm,Optimization,Data Structures,Bit Manipulation,给定N个整数区间,每种形式[a,b]包含从a到b的整数 从每个间隔中,我们必须选择1个数字,这样所有所选数字的按位OR=X。X是已知的 当我们有多个候选人从每个间隔形成X时,我被卡住了 以下是我能想到的: 算法: 1) 从每个间隔中消除X中位j=1和位j=0的数字 2) 现在找到所需的号码 问题出现在步骤2中 考虑区间:[1,3][17,19][15,18] 设X为17=(10001) 1 十一, 10001 10010 10011 01111 10000 10001 10010 应用algo可

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

从每个间隔中,我们必须选择1个数字,这样所有所选数字的按位OR=X。X是已知的

当我们有多个候选人从每个间隔形成X时,我被卡住了

以下是我能想到的:
算法:
1) 从每个间隔中消除
X
中位
j=1
和位
j=0
的数字
2) 现在找到所需的号码

问题出现在
步骤2中

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

1
十一,

10001
10010
10011

01111
10000
10001
10010

应用algo可能候选项的步骤1:

00001(1)

10001(17)

10000(16)
10001(17)

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

现在,我们必须选择每一个可能的对,并检查它们的OR是否等于X。
若成对的是大的,那个么得到答案将花费很多时间。
那么,可以应用一些好的技巧(优化上面的)或任何其他算法来解决它吗?

这里有一种完全不同的方法


对于每个范围
r[i]=(a,b)
,创建一个BDD
x[i]
,表示您的示例不起作用的事实。从间隔
[9,11]
中选取将导致设置第四个最低有效位(
1xxx
),这不是在目标编号17中设置的。好的,你说得对,让我编辑帖子。谢谢你的指点。我相信你可以简单地简化到这个问题,而k-SAT是NP完全的,所以不,实际上没有“好的技巧”,只有一些有用的启发式方法(与适用于k-SAT的方法相同)。这也与问题有关。@Dukeling,不,我说过你可以将k-SAT简化到这个问题,不是相反。请告诉BDD的完整格式。@ac\u C0要完整格式吗?不管怎样,《计算机编程艺术》第4A卷有一个很好的章节,你可以阅读相关章节的旧版本