【发布时间】:2014-01-09 12:11:32
【问题描述】:
给定 N 个整数区间,每个形式 [a,b] 包含从 a 到 b 的整数。
我们必须从每个区间中选择 1 个数字,这样所有选择的数字的按位 OR = X。 X 是已知的。
当我们在每个间隔中都有多个候选来形成 X 时,我被卡住了。
这是我能想到的:
算法:
1) 从每个区间中消除在X 中具有位j = 1 和位j = 0 的数字。
2)现在找到所需的编号。
问题出现在step 2。
考虑区间:[1,3] [17,19] [15,18]
设 X 为 17 = (10001)1
1110001
10010
1001101111
10000
10001
10010应用算法可能候选的第 1 步:
00001(1)
10001 (17)
10000 (16)
10001(17)第 2 步: 可能的配对:
1) 1 , 17 , 16
2) 1 , 17 , 17
现在我们必须选择每个可能的对并检查它们的 OR 是否等于 X。
如果对很大,则需要很长时间才能得到答案。
那么,是否可以应用一些不错的技巧(在上面进行优化)或任何其他算法来解决它?
【问题讨论】:
-
您的示例不起作用。从区间
[9,11]中选取将导致设置第 4 个最低有效位 (1xxx),而目标编号 17 中未设置该位。 -
你是对的,让我编辑帖子。谢谢指点。
-
我相信你可以轻松地将k-SAT 简化为这个问题,并且 k-SAT 是 NP-Complete,所以不,真的没有“好技巧”,只有一些有用的启发式(相同的启发式)适用于 k-SAT)。
-
这也和set cover problem有关。
-
@Dukeling,不,我说你可以将 k-SAT 减少到这个问题,而不是相反。
标签: algorithm optimization data-structures bit-manipulation