Algorithm 从每个区间中找出一个数,使或等于X
给定N个整数区间,每种形式[a,b]包含从a到b的整数 从每个间隔中,我们必须选择1个数字,这样所有所选数字的按位OR=X。X是已知的 当我们有多个候选人从每个间隔形成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可
算法:
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)
,创建一个BDDx[i]
,表示您的示例不起作用的事实。从间隔[9,11]
中选取将导致设置第四个最低有效位(1xxx
),这不是在目标编号17中设置的。好的,你说得对,让我编辑帖子。谢谢你的指点。我相信你可以简单地简化到这个问题,而k-SAT是NP完全的,所以不,实际上没有“好的技巧”,只有一些有用的启发式方法(与适用于k-SAT的方法相同)。这也与问题有关。@Dukeling,不,我说过你可以将k-SAT简化到这个问题,不是相反。请告诉BDD的完整格式。@ac\u C0要完整格式吗?不管怎样,《计算机编程艺术》第4A卷有一个很好的章节,你可以阅读相关章节的旧版本