日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图的两种存储形式(邻接矩阵、邻接表)

發(fā)布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图的两种存储形式(邻接矩阵、邻接表) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

圖可以使用兩種存儲結構,分別是鄰接矩陣和鄰接表。
注意:一個圖所對應的鄰接矩陣唯一,所對應的鄰接表不唯一

一、鄰接矩陣

鄰接矩陣以矩陣的形式存儲圖所有頂點間的關系。鄰接矩陣具有以下特點:

  • 1.鄰接矩陣是正矩陣,即橫縱維數相等。
  • 2.矩陣的每一行或一列代表一個頂點,行與列的交點對應這兩個頂點的邊。
  • 3.矩陣的點代表邊的屬性,1代表有邊,0代表無邊,所以矩陣的對角線都是0,因為對角線上對應的橫縱軸代表相同的頂點,邊沒有意義。
  • 4.如果是無向圖,那么矩陣是對稱矩陣;如果是有向圖則不一定是對稱矩陣。

  • 5.如果是有權圖,矩陣點數值可以是權值。
  • 6.鄰接矩陣表示圖的關系非常清晰,但消耗空間較大。
  • 7.代碼實現(Java)
    鄰接矩陣無向圖:
public class MatrixNDG {int size;//圖頂點個數char[] vertexs;//圖頂點名稱int[][] matrix;//圖關系矩陣public MatrixNDG(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;//無向圖,在兩個對稱位置存儲matrix[p2][p1] = 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'},};MatrixNDG pG;// 自定義"圖"(輸入矩陣隊列)// 采用已有的"圖"for(int i=0;i<10000;i++){pG = new MatrixNDG(vexs, edges);//pG.print(); // 打印圖 } }

鄰接矩陣有向圖:

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)
    鄰接表無向圖:
public class ListNDG {Vertex[] vertexLists;//鄰接表數組int size;class Vertex{//鄰接表節(jié)點類,單鏈表數據結構char ch;Vertex next;Vertex(char ch){//初始化方法this.ch=ch;}void add(char ch){//加到鏈表尾Vertex node=this;while(node.next!=null){node=node.next;}node.next=new Vertex(ch);}}public ListNDG(char[] vertexs,char[][] edges){size=vertexs.length;this.vertexLists=new Vertex[size];//確定鄰接表大小//設置鄰接表頭節(jié)點for(int i=0;i<size;i++){this.vertexLists[i]=new Vertex(vertexs[i]);}//存儲邊信息for(char[] c:edges){int p1=getPosition(c[0]);vertexLists[p1].add(c[1]);int p2=getPosition(c[1]);vertexLists[p2].add(c[0]);}}//跟據頂點名稱獲取鏈表下標private int getPosition(char ch) {for(int i=0; i<size; i++)if(vertexLists[i].ch==ch)return i;return -1;}//遍歷輸出鄰接表public void print(){for(int i=0;i<size;i++){Vertex temp=vertexLists[i];while(temp!=null){System.out.print(temp.ch+" ");temp=temp.next;}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'},};ListNDG pG;for(int i=0;i<10000;i++){pG = new ListNDG(vexs, edges);//pG.print(); // 打印圖 }} }

鄰接表有向圖:

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(); // 打印圖 }} }

本文參考

總結

以上是生活随笔為你收集整理的图的两种存储形式(邻接矩阵、邻接表)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。