成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

圖的JS實(shí)現(xiàn)

LeanCloud / 2753人閱讀

摘要:圖的實(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ú)向圖。
如下就是有向圖

圖的數(shù)據(jù)結(jié)構(gòu)

對(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

相關(guān)文章

  • JS -- 記一種用原生JS 實(shí)現(xiàn)輪播圖的方法(非無(wú)限循環(huán)不自動(dòng)切換)

    摘要:實(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)...

    hidogs 評(píng)論0 收藏0
  • chart. js 官方文檔中文譯本

    摘要:條形圖條形圖提供了一種顯示以垂直長(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...

    chengtao1633 評(píng)論0 收藏0
  • chart. js 官方文檔中文譯本

    摘要:條形圖條形圖提供了一種顯示以垂直長(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...

    isaced 評(píng)論0 收藏0
  • D3.js繪制實(shí)時(shí)映射的縮略圖

    摘要:在做可視化的很多時(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),縮略圖跟著變化...

    miqt 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<