图的两种存储形式(邻接矩阵、邻接表)
生活随笔
收集整理的這篇文章主要介紹了
图的两种存储形式(邻接矩阵、邻接表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖可以使用兩種存儲結構,分別是鄰接矩陣和鄰接表。
注意:一個圖所對應的鄰接矩陣唯一,所對應的鄰接表不唯一
一、鄰接矩陣
鄰接矩陣以矩陣的形式存儲圖所有頂點間的關系。鄰接矩陣具有以下特點:
- 1.鄰接矩陣是正矩陣,即橫縱維數相等。
- 2.矩陣的每一行或一列代表一個頂點,行與列的交點對應這兩個頂點的邊。
- 3.矩陣的點代表邊的屬性,1代表有邊,0代表無邊,所以矩陣的對角線都是0,因為對角線上對應的橫縱軸代表相同的頂點,邊沒有意義。
- 4.如果是無向圖,那么矩陣是對稱矩陣;如果是有向圖則不一定是對稱矩陣。
- 5.如果是有權圖,矩陣點數值可以是權值。
- 6.鄰接矩陣表示圖的關系非常清晰,但消耗空間較大。
- 7.代碼實現(Java)
鄰接矩陣無向圖:
鄰接矩陣有向圖:
public class MatrixDG {int size;char[] vertexs;int[][] matrix;public MatrixDG(char[] vertexs,char[][] edges){size=vertexs.length;matrix=new int[size][size];this.vertexs=vertexs;//和鄰接矩陣無向圖差別僅僅在這里for(char[] c:edges){int p1 = getPosition(c[0]);int p2 = getPosition(c[1]);matrix[p1][p2] = 1;}}public void print(){for(int[] i:matrix){for(int j:i){System.out.print(j+" ");}System.out.println();}}private int getPosition(char ch) {for(int i=0; i<vertexs.length; i++)if(vertexs[i]==ch)return i;return -1;}public static void main(String[] args) {char[] vexs = {'A', 'B', 'C', 'D', 'E', 'F', 'G','H','I','J','K'};char[][] edges = new char[][]{{'A', 'C'}, {'A', 'D'}, {'A', 'F'}, {'B', 'C'}, {'C', 'D'}, {'E', 'G'}, {'D', 'G'},{'I','J'},{'J','G'},};MatrixDG pG;// 自定義"圖"(輸入矩陣隊列)//pG = new MatrixUDG();// 采用已有的"圖"pG = new MatrixDG(vexs, edges);pG.print();} }二、鄰接表
- 1.鄰接表示一個有但鏈表組成的數組
- 2.圖中的每一個頂點都有一個鏈,數組的大小等于圖中頂點的個數。
- 3.無向圖的鏈的第一個元素是本頂點,后繼分別連接著和這個頂點相連的頂點;有向圖的鏈第一個頂點是本頂點,后繼是以本頂點為起點的邊的終點。
- 4.鄰接表雖然在空間上有很大的優(yōu)勢,但是對于一個有向圖,如果需要查找每個頂點的入度就需要遍歷整個鄰接表,在效率上很低下的。因此才有了逆鄰接表的誕生。
注意:
鄰接表:反映的是頂點出度的情況。
逆鄰接表:反映的是頂點的入度情況。
- 5.如果是有權圖,可以在節(jié)點元素中設置權值屬性
- 6.鄰接鏈表關系表示不如鄰接矩陣清晰,數據結構相對復雜,但節(jié)省空間。
- 7.代碼實現(java)
鄰接表無向圖:
鄰接表有向圖:
import java.util.LinkedList; public class ListDG2 {LinkedList<Character>[] vertexLists;int size;public ListDG2(char[] vertexs,char[][] edges){size=vertexs.length;this.vertexLists=new LinkedList[size];for(int i=0;i<size;i++){this.vertexLists[i]=new LinkedList<Character>();vertexLists[i].add(vertexs[i]);}for(char[] c:edges){int p=getPosition(c[0]);this.vertexLists[p].add(c[1]);}}private int getPosition(char ch) {for(int i=0; i<size; i++)if(vertexLists[i].get(0)==ch)return i;return -1;}public void print(){for(int i=0;i<size;i++){LinkedList<Character> temp=vertexLists[i];for(int j=0;j<temp.size();j++){System.out.print(temp.get(j)+" ");}System.out.println();}}public static void main(String[] args){char[] vexs = {'A', 'B', 'C', 'D', 'E', 'F', 'G','H','I','J','K'};char[][] edges = new char[][]{{'A', 'C'}, {'A', 'D'}, {'A', 'F'}, {'B', 'C'}, {'C', 'D'}, {'E', 'G'}, {'D', 'G'},{'I','J'},{'J','G'},};ListDG2 pG;for(int i=0;i<10000;i++){pG = new ListDG2(vexs, edges);//pG.print(); // 打印圖 }} }本文參考
總結
以上是生活随笔為你收集整理的图的两种存储形式(邻接矩阵、邻接表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 太辛苦的钱,我建议不要挣
- 下一篇: 最短路径:Dijkstra算法和Floy