从一组节点创建链表的算法

时间:2010-04-29 04:01:57

标签: algorithm graph

我正在寻找一种算法来从一组节点创建链表。例如,假设一个节点是从源点到目的地的机票。 (例如,芝加哥到底特律)并且有几张机票。假设所有这些机票都是混乱的,那么确定整个旅程路径的最佳方法是什么。 如果有5个机票,如芝加哥 - >底特律,丹佛 - >芝加哥,底特律 - > DC,DC->纽约,圣何塞 - >丹佛,算法应该能够提出正确的开始结束。

圣何塞 - >丹佛 - >芝加哥 - >底特律 - > DC - >纽约

2 个答案:

答案 0 :(得分:3)

如果保证节点将形成单个路径(即,最大indegree为1,最大outdegree为1,正好一个节点具有indegree 0,正好一个节点具有outdegree 0),那么您可以执行以下操作:

  • 构建两个哈希:in_citiesout_cities
  • 对于每个节点A -> B,将其添加到in_cities,其中包含密钥Aout_cities,密钥为B
  • 任意选择一个节点,称之为S
  • curr指向S。虽然curr的源城市位于out_cities,但在路径的开头插入相应的节点。更新curr以指向此节点。
  • curr指向S。目标城市curr位于in_cities时,将相应的节点添加到路径的末尾。更新curr以指向此节点。

现在你完成了,相对于城市总数的线性时间。

答案 1 :(得分:1)

这不是链接列表问题;这是一个graph theory问题。

图形在数学上被定义为一组顶点和一组边,它们是被定义为“相邻”的顶点对。边也可以定义为directed(在您的场景中就是这种情况)。

图中的path是一系列顶点,使得每个顶点到序列中的下一个顶点都有一条边。

邻接关系通常用以下两种方式之一表示:adjacency matrix(简单的2D数组)或adjacency list(使用链表),但无论是什么,都可以定义问题和解决方案表示(虽然它确实对复杂性有影响)。

例如,shortest path problem为边缘分配权重,并且需要两个节点之间的路径,其总权重最小。计算机科学课程中教授的经典解决方案是Dijkstra's algorithm

大多数优秀的算法书都有一章关于基本图论。


说了这么多,有一种叫做path graph的特殊图形,它可能就是你的输入图形(只有在问题的所有假设都明确的情况下才能确认) 。如果您的输入图表属于这种简单类型,则可以轻松解决您的问题(请参阅danben's answer)。

我将以伪代码形式呈现相同的算法:

LET pred BE a MAP City=>City // "predecessor"
LET succ BE a MAP City=>City // "successor"

// build pred and succ
FOR EACH Ticket(City A, City B) DO
   pred[B] = A
   succ[A] = B

// find the starting city, i.e. one that doesn't have a pred
LET C BE any City
WHILE pred[C] != NULL
  C = pred[C]

// keep going until you reach the end
WHILE C != NULL
  PRINT C
  C = succ[C]

通过良好的MAP实施,这是O(N),其中N是门票数量。