算法讀書筆記之圖的基本概念

概念定義

圖是一種數(shù)學(xué)模型,它通過節(jié)點(diǎn)和邊的組成映射現(xiàn)實(shí)生活中的關(guān)系。地圖、互聯(lián)網(wǎng)本身都可以用圖來表示,地圖兩個(gè)建筑之間的距離,建筑就是節(jié)點(diǎn),具體就是邊.

圖的分類

圖分為四種:
    1.無向圖
    2.有向圖
    3.加權(quán)圖
    4.加權(quán)有向圖

圖的表示方式

圖是由vertex(頂點(diǎn))和邊(edge)相互連接而成.
一個(gè)V個(gè)頂點(diǎn)的圖,一般用0-(V-1)個(gè)頂點(diǎn)表示圖的頂點(diǎn),與數(shù)組索引的表示方式保持一致.
度數(shù)表示的是一個(gè)頂點(diǎn)被多少條邊連接
樹本質(zhì)上是一種無環(huán)連接圖
圖可以用密度這個(gè)概念來進(jìn)行區(qū)分,密度低的就是稀疏圖,反之就是稠密圖.

鄰接矩陣和鄰接表:
    要表示一個(gè)圖這種數(shù)據(jù)結(jié)構(gòu),要保證數(shù)據(jù)結(jié)構(gòu)有足夠的空間表示,同時(shí)時(shí)間復(fù)雜度、空間復(fù)雜度要盡可能的低.
    鄰接矩陣:
        它可以將V個(gè)頂點(diǎn)的圖表示位(0-V-1)^2的矩陣,并且每個(gè)元素通過bool類型來表示是否有連接關(guān)系.
        這樣表示很清晰易懂,但是空間復(fù)雜度等于V^2,而且表示稠密圖還好,如果表示稀疏圖的話,就浪費(fèi)了大量的空間.
    鄰接表:
        鄰接表的方法是通過數(shù)組的索引表示頂點(diǎn)的位置,通過數(shù)組的元素表示頂點(diǎn)連接的其他頂點(diǎn).
    
    鄰接表看起來比鄰接矩陣更有優(yōu)勢,因?yàn)榭臻g復(fù)雜度更低,而且可以表示平行矩陣
    Ps:平行矩陣代表是兩個(gè)頂點(diǎn)可以有多個(gè)邊

圖的代碼實(shí)現(xiàn)

鄰接表的實(shí)現(xiàn)方式整體上更通用,所以使用鄰接表來表示圖.一個(gè)基本的圖要實(shí)現(xiàn)以下的基本方法:
    public class AdjacencyListGraph implements Graph {

    private final int V;

    private int E;

    private LinkedList<Integer> adj[];

    public AdjacencyListGraph(int v) {
        this.V = v;
        this.E = 0;
        adj = new LinkedList[v];
        for (int i = 0; i < v; i++) {
            adj[i] = new LinkedList<>();
        }
    }

    public AdjacencyListGraph(BufferedReader bufferedReader) throws IOException {
        this(Integer.parseInt(bufferedReader.readLine()));
        int E = Integer.parseInt(bufferedReader.readLine());
        for (int i = 0; i < E; i++) {
            int v = Integer.parseInt(bufferedReader.readLine());
            int w = Integer.parseInt(bufferedReader.readLine());
            this.addEdge(v, w);
        }
    }

    @Override
    public void addEdge(int v, int w) {
        adj[v].add(w);
        adj[w].add(v);
        this.E++;
    }

    @Override
    public Iterable<Integer> adj(int v) {
        return adj[v];
    }

    @Override
    public int E() {
        return this.E;
    }

    @Override
    public int V() {
        return this.V;
    }

    @Override
    public String toString() {
        return "AdjacencyListGraph{" + "V=" + V + ", E=" + E + ", adj=" + Arrays.toString(adj) + '}';
    }

    
    

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容