JavaScript數(shù)據(jù)結(jié)構(gòu)21—關(guān)鍵路徑算法

關(guān)鍵路徑算法的核心依舊是拓?fù)渑判蛩惴ㄉ婪瓿申P(guān)鍵路徑婆跑,有以下要完成的東西

  1. 最早發(fā)生時(shí)間的數(shù)組
  • 最遲發(fā)生時(shí)間的數(shù)組
  • 若某個(gè)點(diǎn)最早和最遲時(shí)間是一致的废离,則說(shuō)明了:這是一個(gè)關(guān)鍵點(diǎn)缴淋,一定在關(guān)鍵路徑上面旱函。
  • 點(diǎn)1的最早發(fā)生時(shí)間 = 點(diǎn)2的最遲發(fā)生時(shí)間 - 兩點(diǎn)之前權(quán)值响巢,說(shuō)明了兩個(gè)點(diǎn)連線就在關(guān)鍵路徑上面。

關(guān)于最早發(fā)生時(shí)間的計(jì)算

  1. 預(yù)制一個(gè)數(shù)組棒妨,讓每一個(gè)點(diǎn)最早時(shí)間都是0
  • 從關(guān)鍵路徑(用拓?fù)渑判蛩惴ㄋ愠鰜?lái))第一個(gè)點(diǎn)開(kāi)始踪古,找到這個(gè)點(diǎn)的所有連接的其他點(diǎn),找到最小的一個(gè)連接券腔,更新這個(gè)連接對(duì)應(yīng)的端點(diǎn)的最早發(fā)生時(shí)間伏穆;
  • 更新完畢每一個(gè)點(diǎn)

關(guān)于最遲發(fā)生時(shí)間的計(jì)算

  1. 預(yù)制一個(gè)數(shù)組,讓每一個(gè)點(diǎn)最早時(shí)間都是最早發(fā)生時(shí)間中的最大值(也就是數(shù)組中的最后一個(gè))
  • 從關(guān)鍵路徑(用拓?fù)渑判蛩惴ㄋ愠鰜?lái))最后一個(gè)點(diǎn)開(kāi)始纷纫,找到這個(gè)點(diǎn)的所有連接的其他點(diǎn)枕扫,找到最小的一個(gè)連接,更新這個(gè)連接對(duì)應(yīng)的端點(diǎn)的最遲發(fā)生時(shí)間辱魁;
  • 更新完畢每一個(gè)點(diǎn)
//拓?fù)渑判?//頂點(diǎn)
function Vertex(name) {
  this.name =name;
  this.in = 0;
}
Vertex.prototype.setFirstedge = function(edgeNode) {
  this.firstEdge = edgeNode;
  edgeNode.adjVex.in++;
};
Vertex.prototype.setNext = function(edgeNode){
  var temp = this.firstEdge;
  if(!temp){
    this.firstEdge = edgeNode;
    edgeNode.adjVex.in++;
    return;
  }else{
    while(temp){
      var temp1 = temp.next;
      if(!temp1){
        temp.next = edgeNode;
        edgeNode.adjVex.in++;
        break;
      }else{
        temp = temp.next;
      }
    }
  }
}
//邊
function EdgeNode(){
  this.adjVex = arguments[0];
  this.weight = arguments[1] ? arguments[1] : undefined;
}
//圖
function Graph(vertexs,numEdges){
  this.vertexs = vertexs;
  this.numVertexs = this.vertexs.length;
  this.numEdges =numEdges;
}
//需要引入棧進(jìn)行計(jì)算
function Node(data) {
    this.data = data;
}
function Stack(maxSize){
    this.maxSize = maxSize;
    this.top = -1;
    this.data = new Array(maxSize);
}
Stack.prototype.push = function(node){
    if(this.top == this.maxSize-1){
        return 1;
    }
    this.top++;
    this.data[this.top] = node;
    return 0;
}
Stack.prototype.pop = function(){
    if(this.top==-1){
        return 1;
    }
    var r = this.data[this.top];
    this.data[this.top] = undefined;
    this.top--;
    return r;
}
Stack.prototype.ergodic = function(){
  var s = '';
  for (var i = 0; i < this.data.length; i++) {
    if(this.data[i]!=null){
        s += this.data[i]+',';
    }
  }
  if(s.length){
    s = s.substring(0,s.length-1);
  }
  return s;
}
Stack.prototype.length = function(){
  return this.top+1;
}
//拓?fù)湫蛄?Graph.prototype.topologicalSort = function() {
  var top = 0,count = 0;
  var gettop,k;
  var result ='';//結(jié)果
  var stack = new Stack(this.numVertexs);
  var stack2 = new Stack(this.numVertexs);
  var etv = [];
  for (var i = 0; i < this.numVertexs; i++) {
    etv.push(0);
    if(this.vertexs[i].in==0){
      stack.push(i);
    }
  }
  while(stack.length()){
    gettop = stack.pop();
    result += this.vertexs[gettop].name +' ';
    count++;
    stack2.push(gettop);
    for (var e = this.vertexs[gettop].firstEdge; e; e=e.next) {
      k = this.vertexs.indexOf(e.adjVex);
      if(!(--this.vertexs[k].in)){
        stack.push(k);
      }
      if(etv[gettop]+e.weight>etv[k]){
        etv[k] = etv[gettop]+e.weight;
      }
    }
  }
  if(count<this.numVertexs){
    console.info('發(fā)生錯(cuò)誤烟瞧,有環(huán)路存在');
    return false;
  }
  return {
    etv:etv,
    stack:stack2
  };
};
Graph.prototype.criticalPath = function(){
  var topological = this.topologicalSort();
  var etv = topological.etv;//最早發(fā)生時(shí)間
  var stack = topological.stack;
  console.info('可計(jì)算的最早發(fā)生時(shí)間數(shù)組etv:'+etv);
  console.info('拓?fù)湫蛄?'+stack.ergodic());
  var gettop,k;
  var ltv = new Array(this.numVertexs);//最遲發(fā)生時(shí)間
  for (var i = 0; i < this.numVertexs; i++) {
    ltv[i] = etv[this.numVertexs-1];
  }
  while(stack.length()){
    gettop = stack.pop();
    for (var e = this.vertexs[gettop].firstEdge; e; e=e.next) {
      k = this.vertexs.indexOf(e.adjVex);
      if(ltv[k]-e.weight<ltv[gettop]){
        ltv[gettop] = ltv[k] - e.weight;
      }
    }
  }
  for (var j = 0; j < this.numVertexs; j++) {
    for (var e = this.vertexs[j].firstEdge; e; e=e.next) {
      k = this.vertexs.indexOf(e.adjVex);
      if(etv[j]==ltv[k]-e.weight){
        console.info(this.vertexs[j].name+'到'+this.vertexs[k].name+'('+e.weight+')');
      }
    }
  }
}
var v0 = new Vertex('v0');
var v1 = new Vertex('v1');
var v2 = new Vertex('v2');
var v3 = new Vertex('v3');
var v4 = new Vertex('v4');
var v5 = new Vertex('v5');
var v6 = new Vertex('v6');
var v7 = new Vertex('v7');
var v8 = new Vertex('v8');
var v9 = new Vertex('v9');
v0.setNext(new EdgeNode(v2,4));
v0.setNext(new EdgeNode(v1,3));
v1.setNext(new EdgeNode(v4,6));
v1.setNext(new EdgeNode(v3,5));
v2.setNext(new EdgeNode(v5,7));
v2.setNext(new EdgeNode(v3,8));
v3.setNext(new EdgeNode(v4,3));
v4.setNext(new EdgeNode(v7,4));
v4.setNext(new EdgeNode(v6,9));
v5.setNext(new EdgeNode(v7,6));
v6.setNext(new EdgeNode(v9,2));
v7.setNext(new EdgeNode(v8,5));
v8.setNext(new EdgeNode(v9,3));
var g = new Graph([v0,v1,v2,v3,v4,v5,v6,v7,v8,v9],13);
//g.topologicalSort();
g.criticalPath();

輸出

可計(jì)算的最早發(fā)生時(shí)間數(shù)組etv:0,3,4,12,15,11,24,19,24,27
拓?fù)湫蛄?0,1,2,3,4,6,5,7,8,9
v0到v2(4)
v2到v3(8)
v3到v4(3)
v4到v7(4)
v7到v8(5)
v8到v9(3)
[Finished in 0.1s]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诗鸭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子参滴,更是在濱河造成了極大的恐慌强岸,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砾赔,死亡現(xiàn)場(chǎng)離奇詭異蝌箍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)暴心,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門妓盲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人专普,你說(shuō)我怎么就攤上這事悯衬。” “怎么了脆诉?”我有些...
    開(kāi)封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵甚亭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我击胜,道長(zhǎng)亏狰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任偶摔,我火速辦了婚禮暇唾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辰斋。我一直安慰自己策州,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布宫仗。 她就那樣靜靜地躺著够挂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藕夫。 梳的紋絲不亂的頭發(fā)上孽糖,一...
    開(kāi)封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音毅贮,去河邊找鬼办悟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滩褥,可吹牛的內(nèi)容都是我干的病蛉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铺然!你這毒婦竟也來(lái)了俗孝?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤魄健,失蹤者是張志新(化名)和其女友劉穎驹针,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诀艰,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年饮六,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了其垄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卤橄,死狀恐怖绿满,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窟扑,我是刑警寧澤喇颁,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站嚎货,受9級(jí)特大地震影響橘霎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜殖属,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一姐叁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洗显,春花似錦外潜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至玄组,卻和暖如春滔驾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巧勤。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工嵌灰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颅悉。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓沽瞭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親剩瓶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驹溃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 第一章 緒論 什么是數(shù)據(jù)結(jié)構(gòu)城丧? 數(shù)據(jù)結(jié)構(gòu)的定義:數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 第二章...
    SeanCheney閱讀 5,771評(píng)論 0 19
  • 弗洛伊德算法適用于為圖中每一個(gè)頂點(diǎn)求最短路徑豌鹤,思路如下 檢查圖中任何一個(gè) 到 任何另一個(gè)點(diǎn)能否通過(guò)第一個(gè)點(diǎn)降低最短...
    RichardW閱讀 956評(píng)論 0 1
  • 1 序 2016年6月25日夜亡哄,帝都,天下著大雨布疙,拖著行李箱和同學(xué)在校門口照了最后一張合照蚊惯,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,096評(píng)論 0 12
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)灵临,斷路器截型,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 【石話石說(shuō)】在你堅(jiān)持不住的時(shí)候,記得告訴自己儒溉,再堅(jiān)持一下宦焦。無(wú)論心情怎么糟糕,都不要打破生活原有的規(guī)律顿涣,按時(shí)吃飯波闹、按...
    石話石說(shuō)簡(jiǎn)書閱讀 221評(píng)論 0 0