Java數(shù)據(jù)結(jié)構(gòu)之有向圖設(shè)計(jì)與實(shí)現(xiàn)詳解
前言
在實(shí)際生活中,很多應(yīng)用相關(guān)的圖都是有方向性的,最直觀的就是網(wǎng)絡(luò),可以從A頁面通過鏈接跳轉(zhuǎn)到B頁面,那么a和b連接的方向是a->b,但不能說是b->a,此時(shí)我們就需要使用有向圖來解決這一類問題,它和我們之前學(xué)習(xí)的無向圖,最大的區(qū)別就在于連接是具有方向的,在代碼的處理上也會有很大的不同。
定義及相關(guān)術(shù)語
定義:
有向圖是一副具有方向性的圖,是由一組頂點(diǎn)和一組有方向的邊組成的,每條方向的邊都連著一對有序的頂點(diǎn)。
出度:
由某個頂點(diǎn)指出的邊的個數(shù)稱為該頂點(diǎn)的出度。
入度:
指向某個頂點(diǎn)的邊的個數(shù)稱為該頂點(diǎn)的入度。
有向路徑:
由一系列頂點(diǎn)組成,對于其中的每個頂點(diǎn)都存在一條有向邊,從它指向序列中的下一個頂點(diǎn)。
有向環(huán):
一條至少含有一條邊,且起點(diǎn)和終點(diǎn)相同的有向路徑。
一副有向圖中兩個頂點(diǎn)v和w可能存在以下四種關(guān)系:
- 沒有邊相連;
- 存在從v到w的邊v—>w;
- 存在從w到v的邊w—>v;
- 既存在w到v的邊,也存在v到w的邊,即雙向連接;
API設(shè)計(jì)
類名 | Digraph |
---|---|
成員變量 | 1.private final int V: 記錄頂點(diǎn)數(shù)量2.private int E: 記錄邊數(shù)量3.private Queue[] adj: 鄰接表 |
構(gòu)造方法 | Digraph(int V):創(chuàng)建一個包含V個頂點(diǎn)但不包含邊的有向圖 |
成員方法 | 1.public int V():獲取圖中頂點(diǎn)的數(shù)量2.public int E():獲取圖中邊的數(shù)量3.public void addEdge(int v,int w):向有向圖中添加一條邊 v->w4.public Queue adj(int v):獲取由v指出的邊所連接的所有頂點(diǎn)5.private Digraph reverse():該圖的反向圖 |
在api中設(shè)計(jì)了一個反向圖,其因?yàn)橛邢驁D的實(shí)現(xiàn)中,用adj方法獲取出來的是由當(dāng)前頂點(diǎn)v指向的其他頂點(diǎn),如果
能得到其反向圖,就可以很容易得到指向v的其他頂點(diǎn)。
代碼實(shí)現(xiàn)
/** * 有向圖設(shè)計(jì) * * @author alvin * @date 2022/11/1 * @since 1.0 **/ public class Digraph { //頂點(diǎn)數(shù)目 private final int V; //邊的數(shù)目 private int E; //鄰接表 private Queue<Integer>[] adj; public Digraph(int V){ //初始化頂點(diǎn)數(shù)量 this.V = V; //初始化邊的數(shù)量 this.E = 0; //初始化鄰接表 this.adj = new Queue[V]; for (int i = 0; i < adj.length; i++) { adj[i] = new ArrayDeque<>(); } } //獲取頂點(diǎn)數(shù)目 public int V(){ return V; } //獲取邊的數(shù)目 public int E(){ return E; } //向有向圖中添加一條邊 v->w public void addEdge(int v, int w) { //只需要讓頂點(diǎn)w出現(xiàn)在頂點(diǎn)v的鄰接表中,因?yàn)檫吺怯蟹较虻模罱K,頂點(diǎn)v的鄰接表中存儲的相鄰頂點(diǎn)的含義是: v->其他頂點(diǎn) adj[v].add(w); E++; } //獲取由v指出的邊所連接的所有頂點(diǎn) public Queue<Integer> adj(int v){ return adj[v]; } //該圖的反向圖 private Digraph reverse(){ //創(chuàng)建有向圖對象 Digraph r = new Digraph(V); for (int v = 0;v<V;v++){ //獲取由該頂點(diǎn)v指出的所有邊 for (Integer w : adj[v]) {//原圖中表示的是由頂點(diǎn)v->w的邊 r.addEdge(w,v);//w->v } } return r; } }
到此這篇關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之有向圖設(shè)計(jì)與實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)Java有向圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)上傳圖片并壓縮圖片大小功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)上傳圖片并壓縮圖片大小功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05SpringBoot JWT實(shí)現(xiàn)token登錄刷新功能
JWT本身是無狀態(tài)的,這點(diǎn)有別于傳統(tǒng)的session,不在服務(wù)端存儲憑證。這種特性使其在分布式場景,更便于擴(kuò)展使用。接下來通過本文給大家分享SpringBoot JWT實(shí)現(xiàn)token登錄刷新功能,感興趣的朋友一起看看吧2021-09-09synchronized背后的monitor鎖實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了synchronized背后的monitor鎖實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09springboot項(xiàng)目配置多數(shù)據(jù)庫連接的示例詳解
這篇文章主要介紹了springboot項(xiàng)目配置多數(shù)據(jù)庫連接的示例,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12