一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

JavaScript-JavaScript數據結構和算法之圖和圖算法,

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

JavaScript-JavaScript數據結構和算法之圖和圖算法,

  圖的定義

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

  有向圖

  有向邊:若從頂點(diǎn)Vi到Vj的邊有方向,則稱(chēng)這條邊為有向邊,也成為弧(Arc),用有序偶來(lái)表示,Vi稱(chēng)為弧尾,Vj稱(chēng)為弧頭。

  無(wú)序圖

  無(wú)向邊:若頂點(diǎn)Vi到Vj之間的邊沒(méi)有方向,則稱(chēng)這條邊為無(wú)向邊(Edge),用無(wú)序偶(Vi,Vj)來(lái)表示。

  簡(jiǎn)單圖

  簡(jiǎn)單圖:在圖結構中,若不存在頂點(diǎn)到其自身的邊,且同一條邊不重復出現,則稱(chēng)這樣的圖為簡(jiǎn)單圖。

  圖類(lèi)

  表示頂點(diǎn)

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

  復制代碼 代碼如下:

  function Vertex(label){

  this.label = label;

  }

  我們將所有頂點(diǎn)保存在數組中,在圖類(lèi)里,可以通過(guò)他們在數組中的位置引用他們

  表示邊

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

  我們將表示圖的邊的方法成為鄰接表或者鄰接表數組。它將存儲由頂點(diǎn)的相鄰頂點(diǎn)列表構成的數組

  構建圖

  定義如下一個(gè)Graph類(lèi):

  復制代碼 代碼如下:

  function Graph(v){

  this.vertices = v;//vertices至高點(diǎn)

  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;

  }

  這個(gè)類(lèi)會(huì )記錄一個(gè)圖表示了多少條邊,并使用一個(gè)長(cháng)度與圖的頂點(diǎn)數來(lái)記錄頂點(diǎn)的數量。

  復制代碼 代碼如下:

  function addEdge(){

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

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

  this.edges++;

  }

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

  圖的遍歷

  深度優(yōu)先遍歷

  深度優(yōu)先遍歷(DepthFirstSearch),也有稱(chēng)為深度優(yōu)先搜索,簡(jiǎn)稱(chēng)為DFS。

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

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

  深度優(yōu)先搜索就是訪(fǎng)問(wèn)一個(gè)沒(méi)有訪(fǎng)問(wèn)過(guò)的頂點(diǎn),將他標記為已訪(fǎng)問(wèn),再遞歸地去訪(fǎng)問(wèn)在初始頂點(diǎn)的鄰接表中其他沒(méi)有訪(fǎng)問(wèn)過(guò)的頂點(diǎn)

  為Graph類(lèi)添加一個(gè)數組:

  復制代碼 代碼如下:

  this.marked = [];//保存已訪(fǎng)問(wèn)過(guò)的頂點(diǎn)

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

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

  }

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

  復制代碼 代碼如下:

  function dfs(v){

  this.marked[v] = true;

  //if語(yǔ)句在這里不是必須的

  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)屬于一種盲目搜尋法,目的是系統地展開(kāi)并檢查圖中的所有節點(diǎn),以找尋結果。換句話(huà)說(shuō),它并不考慮結果的可能位置,徹底地搜索整張圖,直到找到結果為止。

  廣度優(yōu)先搜索從第一個(gè)頂點(diǎn)開(kāi)始,嘗試訪(fǎng)問(wèn)盡可能靠近它的頂點(diǎn),如下圖所示:

  其工作原理為:

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

  2. 然后從圖中取出下一個(gè)頂點(diǎn)v,添加到已訪(fǎng)問(wèn)的頂點(diǎn)列表

  3. 最后將所有與v相鄰的未訪(fǎng)問(wèn)頂點(diǎn)添加到隊列中

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

  復制代碼 代碼如下:

  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);

  }

  }

  }

  }

  最短路徑

  在執行廣度優(yōu)先搜索時(shí),會(huì )自動(dòng)查找從一個(gè)頂點(diǎn)到另一個(gè)相連頂點(diǎn)的最短路徑

  確定路徑

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

  復制代碼 代碼如下:

  this.edgeTo = [];//將這行添加到Graph類(lèi)中

  //bfs函數

  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);

  }

  }

  }

  }

  拓撲排序算法

  拓撲排序會(huì )對有向圖的所有頂點(diǎn)進(jìn)行排序,使有向邊從前面的頂點(diǎn)指向后面的頂點(diǎn)。

  拓撲排序算法與BFS類(lèi)似,不同的是,拓撲排序算法不會(huì )立即輸出已訪(fǎng)問(wèn)的頂點(diǎn),而是訪(fǎng)問(wèn)當前頂點(diǎn)鄰接表中的所有相鄰頂點(diǎn),直到這個(gè)列表窮盡時(shí),才會(huì )將當前頂點(diǎn)壓入棧中。

  拓撲排序算法被拆分為兩個(gè)函數,第一個(gè)函數是topSort(),用來(lái)設置排序進(jìn)程并調用一個(gè)輔助函數topSortHelper(),然后顯示排序好的頂點(diǎn)列表

  拓撲排序算法主要工作是在遞歸函數topSortHelper()中完成的,這個(gè)函數會(huì )將當前頂點(diǎn)標記為已訪(fǎng)問(wèn),然后遞歸訪(fǎng)問(wèn)當前頂點(diǎn)鄰接表中的每個(gè)頂點(diǎn),標記這些頂點(diǎn)為已訪(fǎng)問(wèn)。最后,將當前頂點(diǎn)壓入棧中。

  復制代碼 代碼如下:

  //topSort()函數

  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()函數

  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數據結構和算法之圖和圖算法,】相關(guān)文章:

常用排序算法之JavaScript實(shí)現代碼段06-04

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

棋類(lèi)游戲的算法有哪些07-03

棋類(lèi)游戲算法有哪些05-20

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

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

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

冬至祝福圖10-26

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

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

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看