我在这里读到,对于无向图,当表示为邻接表时,空间复杂度是O(V+E)
,其中V
和E
分别是顶点和边的个数。
我的分析是,对于一个完全连通的图,列表中的每个条目将包含v-1
节点,那么我们总共有v
顶点,因此,空间复杂度似乎是O(v*v-1)
这似乎是O(v^2)
我在这里遗漏了什么?
对于一个完全连通的图,你的分析是正确的。但是,请注意,对于一个完全连通图,e
的边数是o(v^2)
本身,所以表示空间复杂度的符号o(v+e)
也是正确的。
然而,邻接列表的真正优势在于,它们允许为并非真正紧密连接的图节省空间。如果边数比v^2
小得多,则邻接列表将占用O(V+E)
空间,而不是O(V^2)
空间。
请注意,当您谈论o
-Notation时,您通常有三种类型的变量(或者,好吧,通常是输入数据)。首先是你所研究的变量依赖关系;其次是那些被认为是常数的变量;第三种是“自由”变量,你通常假设它取最坏的值。例如,如果您谈到对n
整数数组进行排序,通常希望研究排序时间对n
的依赖关系,因此n
是第一种。您通常认为整数的大小是常量(也就是说,您假设比较是在O(1)
等中完成的),并且您通常认为特定的数组元素是“自由的”,也就是说,您研究该运行时以寻找特定数组元素的最坏可能组合。但是,您可能希望从不同的角度研究相同的算法,而这将导致复杂度的不同表达方式。
对于图算法,当然可以考虑顶点数v
是第一类,边数是第三类,并研究给定v
和最坏情况下边数的空间复杂度。那么您确实会得到O(v^2)
。但将v
和e
都视为第一类变量也是很有用的,因此将复杂性表达式表示为O(V+E)
。
在斯坦福的一门算法课程中,教授为图的邻接表表示列出了以下成分: 顶点数组或列表 边的数组或列表 顶点列表中的每个顶点都指向其上的边。 边列表中的每个边都指向其边点。 这种表示法与图形的“关联表”表示法相同吗?如果是,为什么本文认为“邻接表”和“发生率表”是分开的?
本文向大家介绍Dijkstra的邻接表表示算法,包括了Dijkstra的邻接表表示算法的使用技巧和注意事项,需要的朋友参考一下 有一个给定的图G(V,E)及其邻接列表表示形式,并且还提供了一个源顶点。Dijkstra的算法,用于找到源顶点与图G的任何其他顶点之间的最小最短路径。 为了解决这个问题,我们将使用两个列表。一种是存储已被视为最短路径树的顶点,另一种将保存尚未被考虑的顶点。在算法的每个阶段
本文向大家介绍C++实现图的邻接矩阵表示,包括了C++实现图的邻接矩阵表示的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++实现图的邻接矩阵表示代码,供大家参考,具体内容如下 1.遇到的问题:教材中写着子类Graphmtx(我用GrapMatrix)继承基类Graph 但是我在子类GraphMatrix中使用父类Graph的保护成员属性:maxVertices 显示没有声明(如下
在书中,他们做过这样的宣示: 我应该如何将下面图的输入作为邻接表并输出它的邻接表表示?假设,edge的每个成本是10。
首先道歉,英语不是我的第一语言。 这是我对图的理解,它表示为形容词列表:它通常用于稀疏图,这是大多数图的情况,它使用V(顶点数)列表。因此,对于无向图,V个头指针+2e个(边数)节点。因此,空间复杂度=O(e+V),因为任何节点可以有多达V-1条边(不包括自身),所以检查节点邻接的时间复杂度为O(V)。 我想知道的是,有没有可能将列表(边缘节点)变成二叉树?因此,要确定A节点是否与B节点相邻,时间
主要内容:邻接表计算顶点的出度和入度通常,图更多的是采用 链表存储,具体的存储方法有 3 种,分别是 邻接表、 邻接多重表和 十字链表。 本节先讲解图的邻接表存储法。邻接表既适用于存储无向图,也适用于存储有向图。 在具体讲解邻接表存储图的实现方法之前,先普及一个"邻接点"的概念。在图中,如果两个点相互连通,即通过其中一个顶点,可直接找到另一个顶点,则称它们互为邻接点。 邻接指的是图中顶点之间有边或者弧的存在。 邻接表存储图的实现方式