/ b- `, x* l) z! Z5 K+ N! w0 c. o1 I
但是你发现问题了嘛,这样看起来确实是直观了很多,但是很浪费空间有没有!比如无向图,如果 A[j] 为 1 ,那么 A[j] 肯定也是 1 ,多存储 A[j] 根本没啥必要.就像买东西,明明一块钱能买到的东西,为啥非要花两块钱?. k0 V7 J' D8 `' \7 o/ k
所以如果使用邻接矩阵来表示的话,一定要清楚它的缺点.6 U/ L: U0 z) P9 X+ m
. E9 t4 ^& C! D" {8 ~5 H但这并不是说,使用邻接矩阵来存储就没啥优点.这天底下哪儿有那么绝对的事情呢. 7 r8 P; H& T1 [9 o& @* p首先,邻接矩阵的存储方式简单,直接,所以当我们需要获取两个顶点之间的关系时,相信我没有比这种存储结构更高效的了.; Y M. I, ?4 C; k7 l
还有就是使用邻接矩阵存储图的另外一个优点就是方便计算,因为可以将很多图的运算转换成矩阵之间的运算.4 ~+ D C9 N0 u# W. ?- e) V
) k' q! U5 \2 _) L2 z8 t7 A% Y邻接表. B7 f. E5 @4 @! {# S
3 r; ]# H# L& d4 F9 y/ G3 r8 r6 _
先来看图: ( [! _* L1 Z' y8 U3 T2 w
6 x ~! ^2 h( ~. m
8 K8 m7 [$ Z6 J: D
乍一看,这不是散列表嘛!每个顶点对应一条链表,链表中存储的是与这个顶点相连接的其他顶点." I4 w5 H. x: A+ d
嘿嘿,直觉超棒!: Z5 r4 t j3 E# }1 w; w. Z' g
# u; Z3 a' N# m' m: g/ z% O) C
如果你对散列表熟悉的话,应该知道,在散列表中,如果链太长了,会导致冲突概率增大,复杂度也蹭的一下升高.而且吧,链表的存储方式你也知道,不是连续的,所以相对于数组来说, CPU 读取就会慢一些,相对于邻接矩阵的存储方式,在邻接表中查询两个顶点之间的关系就没那么高效了.. L( u9 V1 F# F
所以在实际开发中要注意遇到这种情况该如何处理,或者在刚开始的时候就直接设计好实现方式.比如可以将邻接表中的链表改为平衡二叉树,或者红黑树.3 a# i+ U9 D1 l; t4 y' i# f
, v4 x/ B+ J [# Y2 Y9 p我觉得对于数据结构来说,没有最好的,只有最合适的~ 1 X$ B j& j+ z# F 5 _0 D% P" I5 r. A; Y. G9 L: ]' C参考% z" s5 I' i1 d4 D, o) v
4 `% h* x- c/ Y/ ~; u极客时间—<数据结构与算法之美>; [0 p$ ?4 U$ P* s
———————————————— : ~# M3 i. M4 l z版权声明:本文为CSDN博主「郑璐璐」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 9 e7 G+ x! m# w) c原文链接:https://blog.csdn.net/zll_0405/article/details/105209800 . L; f& {; [2 B+ ~+ r/ L% N ! g7 S! j: i. b8 q; y- k$ h: z J$ b2 _- b4 }