【问题标题】:Superset of Ranges -- Finding greatest distance范围超集——寻找最大距离
【发布时间】:2013-12-02 02:41:58
【问题描述】:

我有一个范围列表,每个范围都有相关的成本。一个例子是这样的:

1 to 1 | distance 10
1 to 2 | distance 9
2 to 3 | distance 8
3 to 4 | distance 2

我想在给定范围内构建具有最大距离(称为 L)的范围,条件是每个选择添加“L”的范围必须是“L”的超集。 “L”以一个空范围开始,所以任何东西都是它的超集。

例如,在给定的范围内,

Take the first range [1..1] and then the range [1..2]
which combined gives a distance of 19.

解释:

Since L is originally empty, [1..1] has the greatest distance so it is now L.
L is now [1..1] whose only superset is [1..2] so that is now L.
L is now [1..2] which has no supersets so the greatest possible distance is 10 + 9 = 19.

我很确定这是一个动态规划问题,但我不知道可以使用的递归关系。这是最有效的方法吗?任何人都可以帮忙吗?

【问题讨论】:

  • 除非我遗漏了什么,否则在您的示例中建立一个最大距离的范围是微不足道的;你只包括整个范围。我是否缺少其他限制(例如,负距离的可能性)?否则,我认为DP是矫枉过正。
  • 正如我的帖子中提到的,条件是“选择添加“L”的每个范围都必须是“L”的超集。”包括整个范围是行不通的。
  • 你为什么假设距离最大的基本范围必须是解决方案的一部分?

标签: algorithm range dynamic-programming


【解决方案1】:

对于每一对范围,构建一个邻接矩阵 (i->j),这意味着 i 是 j 的子集。您最终会得到多个有向图(其中一些相互断开)。

邻接矩阵可以如下构建:

首先将所有开始时间和结束时间按升序排序。
然后从左到右遍历它,并按排序顺序保持活动间隔开始时间的双端队列(双端队列)。
每当到达起点时,push_back 在双端队列中的间隔。
每当到达终点时,它就成为列表中开始时间小于该区间的所有区间的子区间。从前面弹出这个间隔。这将确保 O(区间的超集数)的时间复杂度
此操作的复杂度应为 O(n+E),其中 n 是区间数,E 是边数。

对于每个图,现在的问题是在无环有向图中找到最长的路径。这个link 解释了如何解决这个问题,有一个小的变化是在你的问题中,成本与节点而不是边相关联。

编辑:对于示例间隔:

1a to 1b | distance 10
1c to 2a | distance 9
2b to 3a | distance 8
3b to 4 | distance 2

开始和结束时间的排序列表:

1a, 1c, 1b, 2b, 2a, 3b, 3a, 4

只要开始时间和结束时间重合,我们就会在结束时间之前取开始时间。

The deque is empty initially.   
1a added to deque from the back (start time of 1st interval).  
1c added to deque (start time of 2nd interval)  
The deque is now ___1a1c____ (double ended)  
1b (end time of 1st interval encountered)

现在从前面弹出,直到你得到它的开始时间 (1a)。

____1c_____

现在我们看到 1c 等于 1a,因此我们知道到达结束时间的区间是 1c 区间的子区间。所以我们从区间 1 到区间 2 构建一条边。

下一个 2b 被添加到双端队列(第 3 个间隔的开始时间)

_____1c2b___

然后遇到2a(第二个间隔的结束时间)

_____2b____

现在我们看到,与第一个 pop 不同,这里 1c 不等于 2b,因此不存在子区间关系。

下一个 3b 添加到双端队列(第 4 个间隔的开始时间)

_____2b3b___

然后遇到3a(第三个间隔的结束时间)

_____3b____

这里我们再次看到,2b 不等于 3b,因此不存在子区间关系。

最后一个区间也是如此。

所以我们看到我们最终在图中只有 1 条边,其余的都只是一个没有任何边的节点图。

Graph 1 cost: 10 + 9 = 19.
Graph 2 cost: 8.
Graph 3 cost: 2

.

【讨论】:

  • 构建矩阵不需要 O(n^2) 时间吗?
  • 我不太明白你是如何构建邻接矩阵的。您能否使用原始帖子中给出的范围举个例子?
  • @user2612743 添加了示例。这里的关键是根据需要在deque的两侧(正面和背面)进行操作。
  • 非常感谢!最后一件事 - 为了在 DAG 中找到最长的路径,其成本为顶点,您是否可以通过将 A 和 B 之间的边成本设为成本 [A] + 成本 [B] 来更改它,以便成本位于边缘?
  • 如果测试数据是这样的怎么办? (我把它放在 pastebin 上,因为这里的 cmets 不保留格式)pastebin.com/TP7mvuef
猜你喜欢
  • 2017-08-03
  • 1970-01-01
  • 2012-02-09
  • 2019-04-27
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多