【问题标题】:When representing a sparse graph with an adjacency matrix, why use linked list as structure to contain edges?当用邻接矩阵表示稀疏图时,为什么要使用链表作为结构来包含边?
【发布时间】:2014-03-13 18:41:08
【问题描述】:

当用 Java 等语言在内存中表示图时,要么使用邻接矩阵(用于密集图),要么使用邻接列表来处理稀疏图。

所以说我们代表后者像

Map<Integer, LinkedList<Integer>> graph;

整数键表示顶点,LinkedList 包含它指向的所有其他顶点。

为什么使用 LinkedList 来表示边缘?不能 int[] 或 ArrayList 工作得一样好,或者有什么原因要以保持顺序的方式表示边缘,例如

2 -> 4 -> 1 -> 5

【问题讨论】:

    标签: java data-structures graph linked-list


    【解决方案1】:

    int[]ArrayList 也可以工作。

    我不会立即推荐int[],因为如果您从一开始就不知道所有尺寸,您需要调整大小,基本上模拟ArrayList 功能,但是如果内存是一个问题,这可能是有道理的。

    LinkedList 可能更可取,因为您需要使数组 /ArrayList 足够大以处理可能的最大边数,或者随时调整它的大小,而您不需要LinkedList 有这个问题,但话又说回来,对于大多数应用程序来说,创建图表可能不是最耗费资源的任务。

    底线 - 对于大多数应用程序来说,它很可能会产生微不足道的差异 - 只需选择您觉得最舒服的那个(当然,除非您需要做很多按索引访问,或者其中一个两个性能比另一个好很多)。

    【讨论】:

      【解决方案2】:

      Sedgewick 和 Wayne 的 Algorithms 4th Edition 为对大多数图形处理应用程序有用的图形实现提出了以下所需的性能特征:

      1. 空间使用量与 V + E 成正比
      2. 添加边的恒定时间
      3. 迭代与 v 相邻的顶点的时间与 v 的程度成正比(每个相邻顶点处理的恒定时间)

      使用链表来表示与每个顶点相邻的顶点具有所有这些特征。使用数组而不是链表会导致 (1) 或 (2) 都无法实现。

      【讨论】:

      • 假设我们在 FaceBook 中维护人员及其连接度。我更喜欢:class Graph{ ArrayList anAdjacencyList; } class AdjacencyEntry { //它的一种 HashMap(K,V) 其中 K= aPerson , V = 连接节点 aPerson; ArrayList 连接; }
      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      相关资源
      最近更新 更多