繁体   English   中英

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

[英]Algorithm to create a linked list from a set of nodes

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

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

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

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

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

这不是一个链表问题; 这是一个图论问题。

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

图中的路径是一系列顶点,使得从序列中的每个顶点到下一个顶点存在边。

邻接关系通常以两种方式之一表示: 邻接矩阵 (简单的2D数组)或邻接列表 (使用链表),但无论表示如何都可以定义问题和解决方案(尽管它确实对复杂)。

例如, 最短路径问题为边缘分配权重,并且需要在总权重最小化的两个节点之间的路径。 计算机科学课程中教授的经典解决方案是Dijkstra的算法

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


说了这么多之后,有一种特殊的图形被称为路径图 ,它可能是您的输入图形(只有在问题的所有假设都明确的情况下才能确认)。 如果您的输入图形是这种简单类型,那么就可以轻松解决您的问题(请参阅danben的答案 )。

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

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是票数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM