摘要:圖的實(shí)現(xiàn)如下采用鄰接表結(jié)構(gòu)實(shí)現(xiàn)。由于本次示例的是無(wú)向圖,因此每個(gè)頂點(diǎn)都互相增加為鄰接點(diǎn)。然而由于本次示例的圖為無(wú)向圖,會(huì)出現(xiàn)重復(fù)遍歷的情況,例如頂點(diǎn)的鄰接點(diǎn)有,的鄰接點(diǎn)有。
圖的定義
圖就是由若干個(gè)頂點(diǎn)和邊連接起來(lái)的一種結(jié)構(gòu)。很多東西都可以用圖來(lái)說(shuō)明,例如人際關(guān)系,或者地圖。
其中圖還分為有向圖和無(wú)向圖。
如下就是有向圖
對(duì)于圖這種關(guān)系,可以通過(guò)兩種方式來(lái)存儲(chǔ)。
領(lǐng)接表將每個(gè)頂點(diǎn)與其相鄰的頂點(diǎn)存儲(chǔ)起來(lái)。
鄰接矩陣將頂點(diǎn)間的相鄰關(guān)系用0和1來(lái)表示,0表示不相鄰,1表示相鄰。
圖的實(shí)現(xiàn)如下采用鄰接表結(jié)構(gòu)實(shí)現(xiàn)。
構(gòu)造函數(shù)class Graph { constructor() { this.vertices = []; this.adjList = new Map(); } }
verrices存儲(chǔ)所有的頂點(diǎn),adjList存儲(chǔ)頂點(diǎn)間的關(guān)系。
增addVertex(v) { this.vertices.push(v);{1} this.adjList.set(v, []);{2} } addEdge(v, w) { this.adjList.get(v).push(w); this.adjList.get(w).push(v); }
addVertex函數(shù)為新增頂點(diǎn)。{2}是為新增的頂點(diǎn)初始化一個(gè)為空的鄰接點(diǎn)。
addEdge函數(shù)為關(guān)聯(lián)兩個(gè)頂點(diǎn)為鄰接點(diǎn)。由于本次示例的是無(wú)向圖,因此每個(gè)頂點(diǎn)都互相增加為鄰接點(diǎn)。
圖的遍歷分為廣度優(yōu)先遍歷和深度優(yōu)先遍歷。
廣度優(yōu)先遍歷就是從一個(gè)頂點(diǎn)開(kāi)始,一層一層的遍歷頂點(diǎn)。而深度優(yōu)先遍歷,是從一個(gè)頂點(diǎn)開(kāi)始,選擇一個(gè)路徑一直深入遍歷,直到到達(dá)該路徑的盡頭,再返回去,按照同樣的方式,遍歷其他頂點(diǎn)。
無(wú)論廣度優(yōu)先還是深度優(yōu)先,大致原理都是,創(chuàng)建一個(gè)字段,從一個(gè)頂點(diǎn)開(kāi)始,將其鄰接點(diǎn)一個(gè)個(gè)存入該字段中,唯一的區(qū)別是,廣度優(yōu)先遍歷,該字段用隊(duì)列存儲(chǔ),而深度優(yōu)先遍歷用棧存儲(chǔ)。
然而由于本次示例的圖為無(wú)向圖,會(huì)出現(xiàn)重復(fù)遍歷的情況,例如A頂點(diǎn)的鄰接點(diǎn)有B,B的鄰接點(diǎn)有A。因此需要?jiǎng)?chuàng)建一個(gè)類(lèi),來(lái)維護(hù)這些頂點(diǎn)哪些已經(jīng)被遍歷過(guò)了,哪些還沒(méi)有遍歷。
class GraphStatus { constructor() { this.status = {}; } detect(key) { this.status[key] = true; } isDetected(key) { return !!this.status[key]; } }
如下是廣度優(yōu)先遍歷
bfs(v, cb) { const queue = [], graphStatus = new GraphStatus(); queue.push(v); while (queue.length > 0) { const u = queue.shift(); graphStatus.detect(u); this.adjList.get(u).forEach(item => { if (!graphStatus.isDetected(item)) { graphStatus.detect(item); queue.push(item); } }); if (cb) { cb(u); } } }
如下是深度優(yōu)先遍歷
dfs(v, cb) { const stack = [], colorStatus = new GraphStatus(); stack.push(v); while (stack.length > 0) { const u = stack.pop(); colorStatus.detect(u); this.adjList.get(u).forEach(item => { if (!colorStatus.isDetected(item)) { colorStatus.detect(item); stack.push(item); } }); cb(u); } }最短路徑
基于廣度優(yōu)先遍歷,可以很輕易的算出最短路徑。
findDepth(v) { let queue = [], colorStatus = new GraphStatus(), vPath = { [v]: [v] }, vDepth = {}, depth = 0; queue.push(v); while (queue.length > 0) { depth++; const u = queue.shift(); colorStatus.detect(u); // 相鄰頂點(diǎn) const edgeVertex = this.adjList.get(u); edgeVertex.forEach(item => { if (!colorStatus.isDetected(item)) { // 深度統(tǒng)計(jì) vDepth[item] = depth; // 路徑統(tǒng)計(jì) vPath[item] = [...vPath[u], item]; colorStatus.detect(item); queue.push(item); } }); } return { depth: vDepth, path: vPath }; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88999.html
摘要:實(shí)現(xiàn)一個(gè)非無(wú)限循環(huán)不自動(dòng)切換的輪播圖只需要幾張圖片和兩個(gè)按鈕簡(jiǎn)化部分兩個(gè)按鈕,幾張圖片假如有四張圖右側(cè)按鈕左側(cè)按鈕部分動(dòng)態(tài)添加刪除的屬性部分已是最后一張圖這是第一張圖 實(shí)現(xiàn)一個(gè)非無(wú)限循環(huán)不自動(dòng)切換的輪播圖只需要幾張圖片和兩個(gè)按鈕(簡(jiǎn)化) HTML部分 兩個(gè)按鈕,幾張圖片(假如有四張圖) 右側(cè)按鈕 左側(cè)按鈕 CSS部分 動(dòng)態(tài)...
摘要:條形圖條形圖提供了一種顯示以垂直長(zhǎng)條表示的數(shù)據(jù)值的方式。這些屬性用于設(shè)置特定數(shù)據(jù)集的顯示效果。這樣做將使所有創(chuàng)建的氣泡圖在此之后創(chuàng)建新的默認(rèn)值。重要的是要注意,圖表中的屬性是不可縮放的。它表示在氣泡圖上對(duì)應(yīng)的氣泡的原始半徑以像素為單位。 條形圖 條形圖提供了一種顯示以垂直長(zhǎng)條表示的數(shù)據(jù)值的方式。有時(shí)用于顯示代表某一趨勢(shì)的數(shù)據(jù),并且可同時(shí)并排比較多個(gè)數(shù)據(jù)集。 { type: bar, d...
摘要:條形圖條形圖提供了一種顯示以垂直長(zhǎng)條表示的數(shù)據(jù)值的方式。這些屬性用于設(shè)置特定數(shù)據(jù)集的顯示效果。這樣做將使所有創(chuàng)建的氣泡圖在此之后創(chuàng)建新的默認(rèn)值。重要的是要注意,圖表中的屬性是不可縮放的。它表示在氣泡圖上對(duì)應(yīng)的氣泡的原始半徑以像素為單位。 條形圖 條形圖提供了一種顯示以垂直長(zhǎng)條表示的數(shù)據(jù)值的方式。有時(shí)用于顯示代表某一趨勢(shì)的數(shù)據(jù),并且可同時(shí)并排比較多個(gè)數(shù)據(jù)集。 { type: bar, d...
摘要:在做可視化的很多時(shí)候,我們需要在主圖的一角設(shè)置一個(gè)縮略圖來(lái)掌握全局情況。,縮略圖的繪制完成,很簡(jiǎn)單的例子,按照這個(gè)思路可以完成大部分可視化的縮略圖繪制。 在做可視化的很多時(shí)候,我們需要在主圖的一角設(shè)置一個(gè)縮略圖來(lái)掌握全局情況。本次將使用力導(dǎo)向圖作為例子,完成縮略圖的實(shí)現(xiàn)。 繪制的原理就是依靠主圖的數(shù)據(jù)再畫(huà)一個(gè)圖出來(lái),無(wú)需再次計(jì)算,只改變圖形形態(tài)。 最終效果 主圖節(jié)點(diǎn)拖動(dòng),縮略圖跟著變化...
閱讀 2678·2021-11-25 09:43
閱讀 2590·2021-11-22 09:34
閱讀 2860·2021-11-12 10:34
閱讀 1447·2021-10-20 13:46
閱讀 2308·2019-08-30 13:21
閱讀 938·2019-08-30 11:21
閱讀 492·2019-08-30 11:20
閱讀 2196·2019-08-29 17:20