我正在寻找一种算法来从一组节点创建链表。例如,假设一个节点是从源点到目的地的机票。 (例如,芝加哥到底特律)并且有几张机票。假设所有这些机票都是混乱的,那么确定整个旅程路径的最佳方法是什么。 如果有5个机票,如芝加哥 - >底特律,丹佛 - >芝加哥,底特律 - > DC,DC->纽约,圣何塞 - >丹佛,算法应该能够提出正确的开始结束。
圣何塞 - >丹佛 - >芝加哥 - >底特律 - > DC - >纽约
答案 0 :(得分:3)
如果保证节点将形成单个路径(即,最大indegree为1,最大outdegree为1,正好一个节点具有indegree 0,正好一个节点具有outdegree 0),那么您可以执行以下操作:
in_cities
和out_cities
A -> B
,将其添加到in_cities
,其中包含密钥A
和out_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
是门票数量。