Java 当用邻接矩阵表示稀疏图时,为什么使用链表作为包含边的结构?

Java 当用邻接矩阵表示稀疏图时,为什么使用链表作为包含边的结构?,java,data-structures,graph,linked-list,Java,Data Structures,Graph,Linked List,在用Java等语言表示内存中的图时,可以使用邻接矩阵(对于密集图)或邻接列表(对于稀疏图) 所以说我们代表后者就像 Map<Integer, LinkedList<Integer>> graph; int[]或ArrayList也可以工作 不过,我不建议立即使用int[],因为如果您从一开始就不知道所有大小,您需要考虑调整大小,基本上模拟ArrayList功能,但如果内存是个问题,这可能是有意义的 LinkedList可能会稍微好一点,因为您需要将数组/ArrayLis

在用Java等语言表示内存中的图时,可以使用邻接矩阵(对于密集图)或邻接列表(对于稀疏图)

所以说我们代表后者就像

Map<Integer, LinkedList<Integer>> graph;

int[]
ArrayList
也可以工作

不过,我不建议立即使用
int[]
,因为如果您从一开始就不知道所有大小,您需要考虑调整大小,基本上模拟
ArrayList
功能,但如果内存是个问题,这可能是有意义的

LinkedList
可能会稍微好一点,因为您需要将数组/
ArrayList
设置得足够大,以处理最大数量的可能边,或者在运行时调整它的大小,如果
LinkedList
没有此问题,那么,对于大多数应用程序来说,创建图形可能不是资源最密集的任务


底线——对于大多数应用程序来说,这很可能会产生微不足道的影响——只需选择您觉得最适合的应用程序(当然,除非您需要大量使用索引进行访问,或者其中一个应用程序的性能比另一个应用程序好得多)Sedgewick和Wayne的算法第四版为图形实现提出了以下期望的性能特征,这对大多数图形处理应用程序都很有用:

  • 与V+E成比例的空间使用
  • 添加边的恒定时间
  • 与v度成比例的时间,以通过v相邻的顶点进行迭代(每个相邻顶点处理的恒定时间)

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

    比如说,我们在FaceBook上维护人们及其连通度。。我更喜欢:类图{ArrayList anAdjacencyList;}class AdjacencyEntry{//它的HashMap(K,V)类型,其中K=aPerson,V=connections节点aPerson;ArrayList connections;}
    2 -> 4 -> 1 -> 5