【问题标题】:Can this be solved with a line sweep algorithm?这可以用线扫描算法解决吗?
【发布时间】:2013-04-06 17:05:59
【问题描述】:

编辑:现在我认为这是一个扫描线问题。 (见底部的update2)

在这个问题中,我们得到N 对象和M 约束。 (N 可以是200kM 可以是100k)。每个物体要么是黑色的,要么是白色的。每个约束的形式为(x, y),表示在对象x..y 的范围内,恰好有一个白色对象;其余的都是黑色的。我们想确定可以存在的白色对象的最大数量,或者是否不可能满足约束。

我观察到,如果一个约束完全包含在另一个约束中,则内部约束将决定可以放置白色对象的位置。此外,如果在另一个约束中包含多个不相交的约束,这应该是不可能的,因为它违反了每个约束只能有 一个 白色对象的事实。该算法应该足够快,可以在 2-3 秒内运行。

更新:其中一个答案提到了确切的封面问题;这是不是 NP 完全的特殊实例吗?

Update2:如果我们将每个约束更改为 beginend 事件,并对这些事件进行排序,我们是否可以系统地扫过这些事件并分配白色对象?

【问题讨论】:

  • “另外,如果在另一个约束中包含多个不相交的约束,这应该是不可能的,因为它违反了每个约束只能有一个白色对象的事实。”我不跟随;什么时候约束既不相交又包含在另一个约束中?我假设“包含在另一个中”是指形式 (x,y) (u,v),其中 x
  • 是的,这就是我的意思,现在我想起来了,你认为通过处理/模拟某些东西来贪婪地确定白色物体是否可行?
  • 这可能更适合cs.stackexchange.com...
  • 这看起来根本不像是图形问题。边缘在哪里?
  • 嗯我不确定贪心,在我看来,减少约束系统后,你应该能够做到这一点并应用组合方法。考虑一下可以为约束系统推导的约简规则可能会有所帮助。例如,假设您有三个约束 (a,c) (b,f) (d,e),其中 a

标签: algorithm


【解决方案1】:

您的问题可以表示为exact cover problem:约束区间形成要覆盖的集合,每个白色对象都覆盖了它所在的约束区间。那么,您的问题是找到一个白色对象的子集,它恰好覆盖每个约束区间一次。

一般来说,精确覆盖问题是 NP 完全的,尽管这显然并不一定意味着它们的任何特定子集都是。但是,仍然存在可以非常有效地解决大多数此类问题的算法,例如 Knuth's Algorithm X(由 dancing links 实现)。

您的问题的一维结构也可能允许更直接的专门解决方法。然而,算法 X 是解决此类问题的一个非常好的通用工具。 (例如,最快的sudoku solvers 通常使用类似的东西。)

【讨论】:

  • 这很有趣,但我找不到这个问题的非 NP 完全解决方案。
  • @ZheyangShen 你是从哪里发现这个问题的?如果你知道有一个有效的解决方案,我想你知道是谁解决了这个问题?
  • @G.Bach 不知道来源是什么。这是我学校ICPC小组的练习题。如果我知道答案,我就不会在这里问了:(
【解决方案2】:

是的,有一个(点)扫描算法。这个有点不雅,但我认为它有效。

首先,扫描嵌套间隔。按排序顺序处理开始和结束事件(决胜局留给您),并保留一个不知道包含另一个间隔的活动间隔列表。要处理开始事件,请附加相应的时间间隔。要处理结束事件,请检查相应的时间间隔I是否已被删除。如果不是,请从列表中删除 IJ 之前的所有剩余间隔 I。对于每个这样的J,将两个区间(其并集为差集J \ I)附加到涂黑区间列表中。

其次,扫一扫以收缩被涂黑的间隔。换句话说,删除已知为黑色的对象,重新编号,并相应地调整约束。如果整个约束被涂黑,则没有解决方案。

第三,扫描解决现在非嵌套区间的问题。贪婪的解决方案可以证明是最优的。

示例:假设我有半开约束 [0, 4), [1, 3), [2, 5)。第一次扫描会产生中断 [0, 1) 和 [3, 4)。第二次扫描留下约束 [a, c), [a, c), [b, d)。* 贪婪扫描将白色对象放置在新位置 a、c、d(旧位置 1、4、5)。

第二次扫描示意图:

0 1 2 3 4 5  old coordinates
[       )
  [   )
    [     )
**    **     blackouts
  a b   c d  new coordinates
[       )
  [   )
    [     )

【讨论】:

  • 能否详细说明第一步?如果区间没有完全相交怎么办?
  • I 始终是J 的子区间。如果I1I2 重叠但不嵌套,则什么都不会发生。
  • 在这种情况下,如果它们重叠,那么区间I应该总是在区间J中,对吧?
  • 等等,我想我知道第一步要做什么了。你能详细说明第二个吗?
  • 所以我想我的首要问题是:如果旧坐标已被涂黑,您如何将旧坐标映射到新坐标?
猜你喜欢
  • 2021-10-06
  • 2023-04-10
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多