<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • JavaScript-JavaScript數(shù)據(jù)結(jié)構(gòu)和算法之圖和圖算法,

    時間:2024-10-25 13:21:36 JavaScript 我要投稿
    • 相關(guān)推薦

    JavaScript-JavaScript數(shù)據(jù)結(jié)構(gòu)和算法之圖和圖算法,

      圖的定義

      圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。

      有向圖

      有向邊:若從頂點Vi到Vj的邊有方向,則稱這條邊為有向邊,也成為弧(Arc),用有序偶來表示,Vi稱為弧尾,Vj稱為弧頭。

      無序圖

      無向邊:若頂點Vi到Vj之間的邊沒有方向,則稱這條邊為無向邊(Edge),用無序偶(Vi,Vj)來表示。

      簡單圖

      簡單圖:在圖結(jié)構(gòu)中,若不存在頂點到其自身的邊,且同一條邊不重復(fù)出現(xiàn),則稱這樣的圖為簡單圖。

      圖類

      表示頂點

      創(chuàng)建圖類的第一步就是要創(chuàng)建一個Vertex類來保存頂點和邊。這個類的作用和鏈表、二叉搜索樹的Node類一樣。Vertex類有兩個數(shù)據(jù)成員:一個用于標(biāo)識頂點,另一個表明是否被訪問過的布爾值。分別被命名為label和wasVisited。

      復(fù)制代碼 代碼如下:

      function Vertex(label){

      this.label = label;

      }

      我們將所有頂點保存在數(shù)組中,在圖類里,可以通過他們在數(shù)組中的位置引用他們

      表示邊

      圖的實際信息都保存在“邊”上面,因為他們描述了圖的結(jié)構(gòu)。二叉樹的一個父節(jié)點只能有兩個子節(jié)點,而圖的結(jié)構(gòu)卻要靈活得多,一個頂點既可以有一條邊,也可以有多條邊和它相連。

      我們將表示圖的邊的方法成為鄰接表或者鄰接表數(shù)組。它將存儲由頂點的相鄰頂點列表構(gòu)成的數(shù)組

      構(gòu)建圖

      定義如下一個Graph類:

      復(fù)制代碼 代碼如下:

      function Graph(v){

      this.vertices = v;//vertices至高點

      this.edges = 0;

      this.adj = [];

      for(var i =0;I<this.vertices;++i){

      this.adj[i] = [];

      this.adj[i].push(');

      }

      this.addEdge = addEdge;

      this.toString = toString;

      }

      這個類會記錄一個圖表示了多少條邊,并使用一個長度與圖的頂點數(shù)來記錄頂點的數(shù)量。

      復(fù)制代碼 代碼如下:

      function addEdge(){

      this.adj[v].push(w);

      this.adj[w].push(v);

      this.edges++;

      }

      這里我們使用for循環(huán)為數(shù)組中的每個元素添加一個子數(shù)組來存儲所有的相鄰頂點,并將所有元素初始化為空字符串。

      圖的遍歷

      深度優(yōu)先遍歷

      深度優(yōu)先遍歷(DepthFirstSearch),也有稱為深度優(yōu)先搜索,簡稱為DFS。

      比如在一個房間內(nèi)尋找一把鑰匙,無論從哪一間房間開始都可以,將房間內(nèi)的墻角、床頭柜、床上、床下、衣柜、電視柜等挨個尋找,做到不放過任何一個死角,當(dāng)所有的抽屜、儲藏柜中全部都找遍后,接著再尋找下一個房間。

      深度優(yōu)先搜索:

      深度優(yōu)先搜索就是訪問一個沒有訪問過的頂點,將他標(biāo)記為已訪問,再遞歸地去訪問在初始頂點的鄰接表中其他沒有訪問過的頂點

      為Graph類添加一個數(shù)組:

      復(fù)制代碼 代碼如下:

      this.marked = [];//保存已訪問過的頂點

      for(var i=0;i<this.vertices;++i){

      this.marked[i] = false;//初始化為false

      }

      深度優(yōu)先搜索函數(shù):

      復(fù)制代碼 代碼如下:

      function dfs(v){

      this.marked[v] = true;

      //if語句在這里不是必須的

      if(this.adj[v] != undefined){

      print("Visited vertex: " + v );

      for each(var w in this.adj[v]){

      if(!this.marked[w]){

      this.dfs(w);

      }

      }

      }

      }

      廣度優(yōu)先搜索

      廣度優(yōu)先搜索(BFS)屬于一種盲目搜尋法,目的是系統(tǒng)地展開并檢查圖中的所有節(jié)點,以找尋結(jié)果。換句話說,它并不考慮結(jié)果的可能位置,徹底地搜索整張圖,直到找到結(jié)果為止。

      廣度優(yōu)先搜索從第一個頂點開始,嘗試訪問盡可能靠近它的頂點,如下圖所示:

      其工作原理為:

      1. 首先查找與當(dāng)前頂點相鄰的未訪問的頂點,將其添加到已訪問頂點列表及隊列中;

      2. 然后從圖中取出下一個頂點v,添加到已訪問的頂點列表

      3. 最后將所有與v相鄰的未訪問頂點添加到隊列中

      下面是廣度優(yōu)先搜索函數(shù)的定義:

      復(fù)制代碼 代碼如下:

      function bfs(s){

      var queue = [];

      this.marked = true;

      queue.push(s);//添加到隊尾

      while(queue.length>0){

      var v = queue.shift();//從隊首移除

      if(v == undefined){

      print("Visited vertex: " + v);

      }

      for each(var w in this.adj[v]){

      if(!this.marked[w]){

      this.edgeTo[w] = v;

      this.marked[w] = true;

      queue.push(w);

      }

      }

      }

      }

      最短路徑

      在執(zhí)行廣度優(yōu)先搜索時,會自動查找從一個頂點到另一個相連頂點的最短路徑

      確定路徑

      要查找最短路徑,需要修改廣度優(yōu)先搜索算法來記錄從一個頂點到另一個頂點的路徑,我們需要一個數(shù)組來保存從一個頂點操下一個頂點的所有邊,我們將這個數(shù)組命名為edgeTo

      復(fù)制代碼 代碼如下:

      this.edgeTo = [];//將這行添加到Graph類中

      //bfs函數(shù)

      function bfs(s){

      var queue = [];

      this.marked = true;

      queue.push(s);//添加到隊尾

      while(queue.length>0){

      var v = queue.shift();//從隊首移除

      if(v == undefined){

      print("Visited vertex: " + v);

      }

      for each(var w in this.adj[v]){

      if(!this.marked[w]){

      this.edgeTo[w] = v;

      this.marked[w] = true;

      queue.push(w);

      }

      }

      }

      }

      拓?fù)渑判蛩惴?/p>

      拓?fù)渑判驎䦟τ邢驁D的所有頂點進行排序,使有向邊從前面的頂點指向后面的頂點。

      拓?fù)渑判蛩惴ㄅcBFS類似,不同的是,拓?fù)渑判蛩惴ú粫⒓摧敵鲆言L問的頂點,而是訪問當(dāng)前頂點鄰接表中的所有相鄰頂點,直到這個列表窮盡時,才會將當(dāng)前頂點壓入棧中。

      拓?fù)渑判蛩惴ū徊鸱譃閮蓚函數(shù),第一個函數(shù)是topSort(),用來設(shè)置排序進程并調(diào)用一個輔助函數(shù)topSortHelper(),然后顯示排序好的頂點列表

      拓?fù)渑判蛩惴ㄖ饕ぷ魇窃谶f歸函數(shù)topSortHelper()中完成的,這個函數(shù)會將當(dāng)前頂點標(biāo)記為已訪問,然后遞歸訪問當(dāng)前頂點鄰接表中的每個頂點,標(biāo)記這些頂點為已訪問。最后,將當(dāng)前頂點壓入棧中。

      復(fù)制代碼 代碼如下:

      //topSort()函數(shù)

      function topSort(){

      var stack = [];

      var visited = [];

      for(var i =0;i<this.vertices;i++){

      visited[i] = false;

      }

      for(var i = 0;i<this.vertices;i++){

      if(visited[i] == false){

      this.topSortHelper(i,visited,stack);

      }

      }

      for(var i = 0;i<stack.length;i++){

      if(stack[i] !=undefined && stack[i] != false){

      print(this.vertexList[stack[i]]);

      }

      }

      }

      //topSortHelper()函數(shù)

      function topSortHelper(v,visited,stack){

      visited[v] = true;

      for each(var w in this.adj[v]){

      if(!visited[w]){

      this.topSortHelper(visited[w],visited,stack);

      }

      }

      stack.push(v);

      }

    【JavaScript-JavaScript數(shù)據(jù)結(jié)構(gòu)和算法之圖和圖算法,】相關(guān)文章:

    常用排序算法之JavaScript實現(xiàn)代碼段06-04

    工程制圖之圈叉圖的制圖原理09-02

    棋類游戲的算法有哪些07-03

    棋類游戲算法有哪些05-20

    3D效果圖制作流程和注意事項07-17

    客廳布置效果圖之沙發(fā)擺放方式01-04

    3D效果圖之色彩原理12-07

    冬至祝福圖10-26

    JAVA認(rèn)證基礎(chǔ)知識:近似算法(格雷厄姆算法)簡介10-29

    網(wǎng)站從企鵝2.1算法中恢復(fù)07-21

    主站蜘蛛池模板: 自拍偷自拍亚洲精品第1页 | 99re8这里有精品热视频免费| 精品久久久无码中文字幕| 久久精品国产第一区二区三区| 合区精品中文字幕| 精品人妻一区二区三区毛片| 精品国产网红福利在线观看| 国精品无码一区二区三区在线 | 亚洲综合一区二区精品导航| 国精无码欧精品亚洲一区| 亚洲线精品一区二区三区 | 国产在线精品免费aaa片| 亚洲一级Av无码毛片久久精品 | 国产精品成人无码久久久久久| 国产精品www| 国产成人精品日本亚洲18图| av国内精品久久久久影院| 欧美精品hdvideosex4k| 亚洲国产精品无码久久| 亚洲国产成人精品无码久久久久久综合 | 亚洲第一精品在线视频| 国产精品爽黄69天堂a| 99国产精品国产精品九九| 国内精品久久久久影院优 | 亚洲国产精品热久久| 久久精品99无色码中文字幕| 日本精品久久久久中文字幕| 国产在视频线精品视频二代| 91精品国产91久久久久福利| 国产成人精品白浆久久69| 精品一区二区三区自拍图片区| 无码精品一区二区三区在线| 午夜精品久久久久久中宇| 人妻精品久久无码区| 亚洲精品高清国产一线久久| 亚洲精品无码久久一线| 亚洲国产一二三精品无码 | 精品精品国产高清a毛片| 国产偷国产偷高清精品| 精品国内自产拍在线观看| 热RE99久久精品国产66热|