最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS使用Dijkstra算法求解最短路徑

 更新時間:2019年01月17日 11:09:23   作者:隨風丶逆風  
這篇文章主要為大家詳細介紹了JS使用Dijkstra算法求解最短路徑,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、Dijkstra算法的思路

Dijkstra算法是針對單源點求最短路徑的算法。

其主要思路如下:

1. 將頂點分為兩部分:已經(jīng)知道當前最短路徑的頂點集合Q和無法到達頂點集合R。

2. 定義一個距離數(shù)組(distance)記錄源點到各頂點的距離,下標表示頂點,元素值為距離。源點(start)到自身的距離為0,源點無法到達的頂點的距離就是一個大數(shù)(比如Infinity)。

3. 以距離數(shù)組中值為非Infinity的頂點V為中轉跳點,假設V跳轉至頂點W的距離加上頂點V至源點的距離還小于頂點W至源點的距離,那么就可以更新頂點W至源點的距離。即下面distance[V] + matrix[V][W] < distance[W],那么distance[W] = distance[V] + matrix[V][W]。

4. 重復上一步驟,即遍歷距離數(shù)組,同時無法到達頂點集合R為空。

二、具體例子

偷個懶,直接用上一篇博客《最小生成樹算法——Prim算法和Kruskal算法的JS實現(xiàn)》的圖為例子。

它的鄰接矩陣如下:

求解步驟 

第一步:假設源點為V0,那么目前最短路徑的頂點集合Q中就只有{V0}和無法到達頂點集合R中有{V1, V2, V3, V4}

第二步:初始化distance數(shù)組,就是下面這樣

第三步:以distance數(shù)組中值為非Infinity的頂點為中轉跳點,這一步就是V0,依照如果distance[V] + matrix[V][W] < distance[W],那么distance[W] = distance[V] + matrix[V][W]的規(guī)則,distance數(shù)組就會變成下面這樣,同時集合Q變成了{V0, V1, V2, V4},集合R變成了{V3}

第四步:因為集合R中還有1個頂點,所以重復第三步的方法,然后變成以V1為中轉跳點,但是以V1為中轉頂點都不滿足distance[V] + matrix[V][W] < distance[W],所以沒更新distance和兩個集合

第五步:因為集合R中還有1個頂點,所以重復第三步的方法,此時變成以V2為中轉跳點,然后發(fā)現(xiàn)V0到達V3的距離可以更新,因為2 + 3 < 9,所以distance更新,集合也更新。

之后同理,遍歷完distance之后,輸出

三、代碼實現(xiàn)

這個代碼沒有考慮權值為負數(shù)的情況,還沒驗證負數(shù)的情況,目前是按照權值為正數(shù)實現(xiàn)的,之后考慮完善。 

同時這是針對單源點求最短路徑,如果求全圖各頂點的最短路徑,只需要遍歷頂點然后使用Dijkstra算法,這樣算上Dijkstra算法本身的時間復雜度,總的復雜度會是O(n^3)。

/**
 * Dijkstra算法:單源最短路徑
 * 思路:
 * 1. 將頂點分為兩部分:已經(jīng)知道當前最短路徑的頂點集合Q和無法到達頂點集合R。
 * 2. 定義一個距離數(shù)組(distance)記錄源點到各頂點的距離,下標表示頂點,元素值為距離。源點(start)到自身的距離為0,源點無法到達的頂點的距離就是一個大數(shù)(比如Infinity)。
 * 3. 以距離數(shù)組中值為非Infinity的頂點V為中轉跳點,假設V跳轉至頂點W的距離加上頂點V至源點的距離還小于頂點W至源點的距離,那么就可以更新頂點W至源點的距離。即下面distance[V] + matrix[V][W] < distance[W],那么distance[W] = distance[V] + matrix[V][W]。
 * 4. 重復上一步驟,即遍歷距離數(shù)組,同時無法到達頂點集合R為空。
 *
 * @param matrix 鄰接矩陣,表示圖
 * @param start 起點
 *
 *
 *
 * 如果求全圖各頂點作為源點的全部最短路徑,則遍歷使用Dijkstra算法即可,不過時間復雜度就變成O(n^3)了
 * */
function Dijkstra(matrix, start = 0) {
  const rows = matrix.length,//rows和cols一樣,其實就是頂點個數(shù)
    cols = matrix[0].length;
 
  if(rows !== cols || start >= rows) return new Error("鄰接矩陣錯誤或者源點錯誤");
 
  //初始化distance
  const distance = new Array(rows).fill(Infinity);
  distance[start] = 0;
 
  for(let i = 0; i < rows; i++) {
    //達到不了的頂點不能作為中轉跳點
    if(distance[i] < Infinity) {
      for(let j = 0; j < cols; j++) {
        //比如通過比較distance[i] + matrix[i][j]和distance[j]的大小來決定是否更新distance[j]。
        if(matrix[i][j] + distance[i] < distance[j]) {
          distance[j] = matrix[i][j] + distance[i];
        }
      }
      console.log(distance);
    }
  }
  return distance;
}
 
/**
 * 鄰接矩陣
 * 值為頂點與頂點之間邊的權值,0表示無自環(huán),一個大數(shù)表示無邊(比如10000)
 * */
const MAX_INTEGER = Infinity;//沒有邊或者有向圖中無法到達
const MIN_INTEGER = 0;//沒有自環(huán)
 
const matrix= [
  [MIN_INTEGER, 9, 2, MAX_INTEGER, 6],
  [9, MIN_INTEGER, 3, MAX_INTEGER, MAX_INTEGER],
  [2, 3, MIN_INTEGER, 5, MAX_INTEGER],
  [MAX_INTEGER, MAX_INTEGER, 5, MIN_INTEGER, 1],
  [6, MAX_INTEGER, MAX_INTEGER, 1, MIN_INTEGER]
];
 
 
console.log(Dijkstra(matrix, 0));//[ 0, 5, 2, 7, 6 ]

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • javascript計時器編寫過程與實現(xiàn)方法

    javascript計時器編寫過程與實現(xiàn)方法

    這篇文章主要為大家詳細介紹了javascript計時器編寫過程與實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 使用JavaScript平移和縮放圖像的示例代碼

    使用JavaScript平移和縮放圖像的示例代碼

    平移和縮放是查看圖像時常用的功能,我們可以放大圖像以查看更多細節(jié),進行圖像編輯,Dynamsoft Document Viewer是一個用于此目的的SDK,它為文檔圖像提供了一組查看器,在本文中,我們將演示如何使用它來平移和縮放圖像,需要的朋友可以參考下
    2024-08-08
  • 測量JavaScript函數(shù)的性能各種方式對比

    測量JavaScript函數(shù)的性能各種方式對比

    這篇文章主要介紹了測量JavaScript函數(shù)的性能各種方式對比,對性能感興趣的同學,可以多實驗一下
    2021-04-04
  • javascript 實現(xiàn)劃詞標記劃詞搜索功能

    javascript 實現(xiàn)劃詞標記劃詞搜索功能

    在頁面中加上這串代碼就行了,同時還有搜索功能。
    2009-10-10
  • JavaScript動畫函數(shù)封裝詳解

    JavaScript動畫函數(shù)封裝詳解

    動畫的原理是通過定時器setInterval() 不斷移動盒子位置。但是如果同時有好幾個元素都需要添加動畫呢?我們就可以考慮將其封裝成一個簡單的動畫函數(shù)。本文將為大家介紹如何進行封裝,需要的可以參考一下
    2021-12-12
  • 關于js函數(shù)解釋(包括內嵌,對象等)

    關于js函數(shù)解釋(包括內嵌,對象等)

    下面小編就為大家?guī)硪黄P于js函數(shù)解釋(包括內嵌,對象等) 。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • js加密解密字符串可自定義密碼因子

    js加密解密字符串可自定義密碼因子

    這篇文章主要為大家演示下js加密解密字符串可以自定義密碼因子,需要的朋友可以參考下
    2014-05-05
  • 前端傳參的三種方式實戰(zhàn)案例

    前端傳參的三種方式實戰(zhàn)案例

    近期公司采用前后端分離的方式開發(fā)系統(tǒng),面臨前后端傳值方式的統(tǒng)一約定,該篇文章針對幾種傳值方式做了匯總,這篇文章主要給大家介紹了關于前端傳參的三種方式,需要的朋友可以參考下
    2024-08-08
  • JavaScript替換當前頁面的方法

    JavaScript替換當前頁面的方法

    這篇文章主要介紹了JavaScript替換當前頁面的方法,涉及javascript中replace方法的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • javascript 事件處理示例分享

    javascript 事件處理示例分享

    這篇文章主要介紹了javascript 事件處理示例分享,需要的朋友可以參考下
    2014-12-12

最新評論

瓦房店市| 公安县| 高唐县| 茂名市| 古浪县| 梁山县| 喀喇| 搜索| 屏东市| 道真| 温宿县| 阿鲁科尔沁旗| 琼结县| 会理县| 乐业县| 桂阳县| 阳朔县| 镇坪县| 临清市| 娄烦县| 泸水县| 桐柏县| 汾阳市| 富蕴县| 囊谦县| 盐池县| 临海市| 阳城县| 洞口县| 育儿| 邹城市| 泰州市| 丽江市| 无为县| 阿瓦提县| 凤山县| 屏东市| 通河县| 株洲县| 洪泽县| 团风县|