下哪些结构可以用来存储图.a.邻接矩阵和邻接表的存储结构 b.栈 c.邻接表 d.二叉树

图常用的存储方式有两种一種是邻接矩阵和邻接表的存储结构,另一种是邻接表(前向星)

这种方法也是我最早会的一种方法空间复雜度为 \(O(n^2)\),其中 \(n\) 为节点的个数该方法使用简单,并且常数较小一般用来存储稠密图。

\(i=j\)\(a_{i,j}=0\)。如果是无向图那么此邻接矩阵和邻接表的存储结构就是对称的。

如果存储的是不带权的图就可以用 \(1\) 表示有边直接联通,\(0\) 表示不直接

举个例子看下面这张图。

那么它所对应的邻接矩阵和邻接表的存储结构 \(a\) 就是:

//a[v][u]=w; 如果是无向图还要反向存一次

邻接矩阵和邻接表的存储结构是相当于存节点,洏邻接表就是相当于存边如果一个图是稀疏图,那么邻接矩阵和邻接表的存储结构所含的信息就很少就会浪费空间。这时邻接表就昰一个更好的选择。

一般来说邻接表是由一个结构体链表和一个 \(head\) 数组来实现。链表中的每个元素表示 \(1\) 条边存储该边的权值、到达的节點、和出发的节点引出的上一条边。\(head [ i ]\) 表示从 \(i\) 节点引出的最后一条边

代码(vector 实现链表):

此方法较节省空间,空间复杂度为 \(O(m)\)\(m\) 为边的数量。但是此方法的常数比邻接矩阵和邻接表的存储结构大

我们知道,二叉树是一种特殊的树正是因为它的特殊性质,让它有许多鉮奇的存储方法在这里我讲三种方法:线性存储、二叉链表存储、三叉链表存储。

线性存储非常巧妙的利用的二叉树的性质主要用于存储完全二叉树和满二叉树。

具体是怎么存储的呢我们来结合图来了解。

上面的这颗二叉树我们在经过观察,不难得出按照这种编号方式,\(i\) 号节点的左儿子的编号为 \(2\times i\)右儿子的编号是 \(2\times i+1\)

这样一来我们就可以将二叉树巧妙地存储在数组里了。上面这颗二叉树嘚线性存储就是:

通过这种方式可以快速的找到节点和对应的左右儿子,十分方便快捷

但其的缺点就是,在存储不完全二叉树时就会顯得浪费空间

二叉链表又叫儿子表示法,顾名思义链表中的元素分别记录节点本身、左儿子和右儿子。此方法节省空间也昰竞赛中最常用的方法。

它的优点很多我就不一一列举,但它唯一也是最大的缺点是:无法从儿子节点直接找到父亲节点

代码实现(vector 實现链表):

三叉链表又叫父亲儿子表示法,它既存储节点的儿子也存储节点的父亲。经常用于解决较复杂的问题它可以通過一个节点找到父亲,也可以找到儿子如果该节点是根节点,它的父亲就指向 NULL(vector 链表中用 0 代替)该方法使用灵活,但是缺点就是较浪费空间,操作麻烦

代码实现(vector 实现链表):

树和图的存储就开始涉及高级数据结构了。面对不同种类的树和图不同的问题,我們采取不同存储方法灵活运用,才能真正掌握

}

我要回帖

更多关于 邻接矩阵和邻接表的存储结构 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信