【问题标题】:Adjacency List representation for undirected Graph无向图的邻接表表示
【发布时间】:2018-07-14 01:15:36
【问题描述】:

我有一个简单的无向图,有 4 个顶点,如下所示: 我将其表示为(邻接列表): 带有链接节点的数组索引:

0 -> 1 ->3
1 -> 0 ->2
2 -> 1 ->3
3 -> 0 ->2

现在,当我尝试对例如 0 到 1 到 2 进行 DFS 时。我会做什么:

  1. 转到主数组中的 0 索引
  2. 获取下一个,即 1
  3. 再次转到主数组以“查找”元素 1
  4. ...等等

问题出在第 3 步,每当我需要查找任何节点的下一个节点时,我再次需要转到主数组,如果元素的数据与其索引有任何不同,我需要“查找”数组中的第一个元素.使用非数字节点数据会变得更糟。关于如何不需要“查找”主数组中的节点的任何帮助?

【问题讨论】:

  • 如果元素的数据与其索引不同,则在这种情况下使用哈希表。
  • @krpra,但是哈希表在哈希索引冲突的情况下每个桶都有一个链表。在这种情况下,他们将如何维护边链表?
  • 您打算在链表中存储的数据类型是什么。 “邻接表是一个LinkedList的数组”只是一个概念。它的性能取决于您如何实现linkedList。

标签: arrays data-structures graph


【解决方案1】:

您需要的是一种将 keysvalues 相关联的数据类型,使您能够有效地查找与任何特定键关联的值。 (在您的情况下,键是节点,值是节点列表。)这种数据类型通常称为“地图”、“表”或“字典”。流行的实现是hash tablesbinary search trees

对于您的应用程序,哈希表可能是最有效的。

【讨论】:

  • 但我正在尝试遵循图形的标准表示,即通常称为邻接列表的链接节点数组。
  • “邻接表”表示不一定要用数组来实现,也不需要用指针链接列表。您应该将邻接列表视为abstract data type。链接节点数组是一种可能的实现方式,但是(正如您所注意到的)当图的顶点不是数字时,它效率不高。
  • 不幸的是这里的术语很糟糕。术语“数组”和“列表”可互换使用,指代 ADT 和具体数据结构。
【解决方案2】:

您可以尝试使用array[LinkedList<Node>] 例如:

[0] Node 0 -> Node 1 -> Node 3
[1] Node 1 -> Node 0 -> Node 2
[2] Node 2 -> Node 1 -> Node 3
[3] Node 3 -> Node 0 -> Node 2

现在在第 3 步,您没有引用主数组,Node x 将在其中包含所有相邻节点的值。如果您正在申请dfs,请维护一组visited Nodes

【讨论】:

  • 那么,我们可能根本不需要数组。
猜你喜欢
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多