【问题标题】:Finding 1 number from each interval such that OR of all equals X从每个区间中找到 1 个数字,使得所有的 OR 等于 X
【发布时间】: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
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。
如果对很大,则需要很长时间才能得到答案。 那么,是否可以应用一些不错的技巧(在上面进行优化)或任何其他算法来解决它?

【问题讨论】:

  • 您的示例不起作用。从区间[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


【解决方案1】:

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

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

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

与所有这些 BDD 相交。根据结果​​,找到任何解决方案。

作为奖励,您还可以:

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

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

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

【讨论】:

  • 请说出 BDD 的完整形式。
  • @ac_c0der 完整版?无论如何在计算机编程艺术第4A卷中有一个关于它们的好章节,您可以查看相关章节的旧版本here
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
相关资源
最近更新 更多