【问题标题】:merging linear lists - reconstruct railway network合并线性列表 - 重建铁路网络
【发布时间】:2016-08-13 02:49:29
【问题描述】:

我需要从任意车站请求的单次行程序列中重建铁路网络中的车站序列。数据中没有给出方向。但是每个请求都会返回一个终端站。单次旅行的序列可以有间隙。 (最终)结果始终是一个线性列表 - 不允许分叉。

例如:

请求站“4”的行程结果:

4 - 3 - 2 - 1 4 - 1 4 - 5 - 6 4 - 8 - 9 4 - 6 - 7 - 8 - 9

手动重新排序:

1 - 2 - 3 - 4 1 - 4 - 4 - 5 - 6 - 4 - 8 - 9 - 4 - 6 - 7 - 8 - 9

合并后的结果应该是:

1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9

开始/停止:1、9

是否有一种算法可以计算得到的“珍珠绳”列表?我试图用 perls graph-module 来解决这个问题,但没有运气。我关于算法的书也无济于事。

我认为,在某些病理情况下,可能有多种解决方案,具体取决于输入数据。

也许有人有解决它的想法!

正如您在答案中看到的,解决方案不止一种。所以这是一个真实世界的数据集:

2204236 -> 2200007 -> 2200001
2204236 -> 2203095 -> 2203976 -> 2200225 -> 2200007 -> 2200001
2204236 -> 2204805 -> 2204813 -> 2204401 -> 2219633 -> 2204476 -> 2202024 -> 2202508 -> 2202110 -> 2202026
2204236 -> 2204813 -> 2204401 -> 2219633 -> 2202508 -> 2202110 -> 2202026 -> 3011047 -> 3011048 -> 3011049
2204236 -> 2204813 -> 2204401 -> 2219633 -> 2204476 -> 2202024 -> 2202508 -> 2202110 -> 2202352 -> 2202026
2204236 -> 2204813 -> 2204401 -> 2219633 -> 2204476 -> 2202024 -> 2202508 -> 2209637 -> 2202110

用 perl 解决示例数据:

use Graph::Directed;
use Graph::Traversal::DFS;

my $g = Graph::Directed->new;

$g->add_path(1,2,3,4);
$g->add_path(1,4);
$g->add_path(4,5,6);
$g->add_path(4,8,9);
$g->add_path(4,6,7,8,9);

print "The graph is $g\n";
my @topo = $g->toposort;
print "g toposorted = @topo\n";

输出

> The graph is 1-2,1-4,2-3,3-4,4-5,4-6,4-8,5-6,6-7,7-8,8-9
> g toposorted = 1 2 3 4 5 6 7 8 9

使用另一个方向

$g->add_path(4,3,2,1);
$g->add_path(4,1);
$g->add_path(4,5,6);
$g->add_path(4,8,9);
$g->add_path(4,6,7,8,9);

揭示第二个解决方案

The graph is 2-1,3-2,4-1,4-3,4-5,4-6,4-8,5-6,6-7,7-8,8-9
g toposorted = 4 3 2 1 5 6 7 8 9

【问题讨论】:

  • 4 - 5 - 6 - 7 - 8 - 9 - 3 - 2 - 1 也是一种解决方案。
  • 为什么这是一个解决方案? 9和3之间没有联系。9只和8联系。
  • 我对您的问题的理解是,您需要找到这样的电台列表,其中每个给定列表都是子列表。您和我的解决方案都具有此属性。否则,我不理解“连接”一词。
  • 哦,好的,现在我有了。所以在这个例子中没有单一的解决方案。

标签: algorithm list merge


【解决方案1】:

处理图表中的列表节点链接。 4-3-2-1 应该意味着 4 必须在 3 之前,3 在 2 之前和 2 在 1 之前。因此,将弧从 4 添加到 3、3 到 2、2 到 1。 一旦你有了所有这些,你就在结果图上运行一个拓扑排序(在维基百科上查找)。这将保证您获得的订单将始终尊重您获得的部分订单。

您无法找到解决方案的唯一情况是数据自相矛盾(如果您有4-3-24-2-3,则无法排序)。

你是对的,有多种情况。另一个很好的解决方案是4-5-6-7-8-9-3-2-1,以您为例。

【讨论】:

  • 如果我在整个图上运行拓扑搜索,我会因为图中的循环而出错。
  • @MPH 那就没有办法了。除非你在图的构造上有错误。
  • 好的,现在可以了!该图必须是定向的。则图中没有循环,拓扑排序有效。
【解决方案2】:

终点站是关节节点,它将图分割成多个分区:分区内的所有节点相互可达,不同分区中的节点只能通过已知的终点站到达。在您的示例中,分区数为 2,但可能要大得多,例如考虑星型结构1 - 2, 1 - 3, 1 - 4, 1 - 5

首先您需要枚举分区。您将您的图视为无向图,并从每个方向的停止站运行 DFS。在第一次运行时您会发现分区 #1,在第二次运行时会发现分区 #2,依此类推。

然后,您将图形视为所有分区的根节点,并将停止站作为根节点,并为每个分区运行拓扑排序 (TS)。

可能的结果:

  1. 其中一个分区的 TS 失败。这意味着没有解决方案。
  2. 分区数为 1 且 TS 成功。解决方案是独一无二的。
  3. 分区数多于一个,并且所有分区的 TS 都成功。这意味着有多种解决方案。要获得任何单个有效结果,您可以选择某个分区并声明它包含另一个终端站。所有其他分区都插入到任意一对节点之间的第一个分区中。

【讨论】:

    猜你喜欢
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多