圖的基礎知識(2、存儲)

圖須要存儲的信息有如下這些java

一、頂點信息數組

二、邊或弧的信息,若是有權,也須要表示出來it

三、頂點個數、邊(弧)的個數class

 

鄰接矩陣及其實現效率

頂點數據存儲:List

一維數組遍歷

邊(弧)信息存儲im

鄰接矩陣鏈表

圖中n個頂點之間相鄰關係的n階矩陣(即二維數組a[n][n])數據

下面舉例說明

無向圖鄰接矩陣,中間斜着的一條線上的0,表明的意義是同一頂點,其他部分,1表明2頂點之間有邊,0表明無邊。

無向網鄰接矩陣,中間斜着的一條線上的0,表明的意義是同一頂點,其他部分,用一個大於全部邊的權值的值來表示沒有沒有邊,具體的值表示邊上的權值。

有向圖鄰接矩陣,有幾個特色,不必定對稱,行方向上的非0元素的個數意味着該頂點的出度,列方向上的非0元素的個數意味着該頂點的入度。

 

鄰接矩陣法的優勢:

容易實現圖的操做,如:求某頂點的度、判斷頂點之間是否有邊(弧)、找頂點的鄰接點

鄰接矩陣法的缺點:

n個頂點,須要n*n個單元存儲邊(弧),空間效率爲O(n2),

對於稀疏圖的話,尤爲浪費空間

 

圖的java定義,圖當中頂點類型爲int,而後有4個頂點,6條邊(弧),該定義既能夠表示有向圖,也能夠表示無向圖,同時也能夠表示有整形權的網。

public class Graph {
    int vn;
    int en;
    int[] vex;
    int[][] arc;
    
    public static void main(String[] args){
        Graph graph = new Graph();
        graph.vn = 10;
        graph.en = 20;
        graph.vex = new int[graph.vn];
        graph.arc = new int[graph.vn][graph.vn];
    }
}

 

建圖運算,咱們設置了1,2,3,4一共四個頂點,而後,在全部不一樣頂點之間畫上了邊,其實這裏咱們就是作了一個徹底圖(至因而有向仍是無向,全看你怎麼理解和使用了)

        for (int i = 1; i <= 4; i ++){
            graph.vex[i - 1] = i;
        }

        for (int i = 1; i <= 4; i ++){
            for (int j = 1; j <= 4; j ++) {
                graph.arc[i - 1][j - 1] = i == j ? 0 : 1;
            }
        }

 

鄰接表及其實現

是順序與連接相結合的圖的存儲方式

全部頂點組成一個數組,爲每一個頂點創建一個單向鏈表

下面仍是舉例說明

無向圖鄰接表

無向網鄰接表,增長了每一條邊的權值信息

有向圖鄰接表

鄰接表的優勢:

空間效率高;容易尋找頂點的鄰接點

鄰接表的缺點:

對於有向圖而言,查詢頂點的出度很容易,可是要查詢入度,就須要遍歷整個表。

 

鄰接表的java定義,這裏咱們跟前面的概念部分有所不一樣,不過問題不大,須要注意的是,若是是網的存儲的話,這樣的作法就不行了,可能須要針對邊,再作一個類。

public class GraphWithLink {
    Vex[] vex;
    List<Vex> arc = new LinkedList<Vex>();
    int vn;
    int en;
}

public class Vex {
    int i;
}

建圖運算,咱們仍是建一個4個頂點的徹底圖

    public static void main(String[] args){
        GraphWithLink graph = new GraphWithLink();
        graph.vn = 4;
        graph.en = 6;
        graph.vex = new Vex[graph.vn];
        for (int i = 1; i <= 4; i ++){
            Vex vex = new Vex();
            vex.i = i;
            graph.vex[i - 1] = vex;
        }

        for (int i = 1; i <= 4; i++) {             graph.arc.add(graph.vex[i - 1]);             for (int j = 1; j <= 4; j++) {                 if (i != j){                     graph.arc.add(graph.vex[j - 1]);                 }             }         }     }

相關文章
相關標籤/搜索