每日一題6 25

2021-08-21 03:16:29 字數 2088 閱讀 4038

迪傑斯特拉演算法:乙個很神奇的演算法,這一演算法解決了有向加權圖的最短路徑問題,該演算法的條件是該圖所有邊的權值非負,即對於每條邊(u,v),w(u,v)>=0.

演算法中設定了一節點集合s,從源節點r到集合s中節點的最終最短路徑的權均已確定,並設定了最小優先佇列,該佇列包含所有屬於v-s的節點(即這些節點尚未確定最短路徑的權),且以d值為關鍵字排列各節點。

class dijkstra

distancemap.put(edge.to

, math.min(distancemap.get(tonode), distance + edge.weight));

} selectednodes.add(minnode);

minnode = getmindistanceandunselectednode(distancemap, selectednodes);

} return distancemap;

} //獲得最小距離和未被選取的點

public static node getmindistanceandunselectednode(hashmap, integer> distancemap, hashsettouchednodes)

}return minnode;

} public static class noderecord

}public static class nodeheap

public boolean

isempty()

public void

addorupdateorignore(node node, int distance)

if (!isentered(node))

}public noderecord pop()

private void

insertheapify(node node, int index)

}private void

heapify(int index, int size)

swap(smallest, index);

index = smallest;

left = index * 2 + 1;}

}private boolean

isentered(node node)

private boolean

inheap(node node)

private void

swap(int index1, int index2)

}public static hashmap, integer> dijkstra2(node head, int size)

result.put(cur, distance);

} return result;

}}

所有的耗時操作包括:

1.將所有的頂點插入優先順序佇列中,耗時為o(v)

2.從優先順序佇列中提取乙個最小值,耗時為o(v)

3.relax 操作對邊進行d值減少,耗時為o(e);實現優先佇列的方式不同,耗時不同。

使用array,提取最小值,則時間複雜度為o(v),relax對d值進行減少o(1),操作所有的佇列中元素,時間就是o(v*v+e*1)=o(v^2)

使用最小堆,時間複雜度為o(lgv),減少key的花銷o(lgv),操作所有的佇列中的元素,那麼時間複雜度為o(v*lgv+e*lgv)

使用fibonacci堆,提取最小值時間複雜度為o(lgv),減少key的花銷o(1),能達到o(v*lgv+e)

假設綠色的點是源點,如果用這樣長度的繩子將各個節點連線起來,那麼拎起綠色的球,從上往下懸掛,那些繃直的線相加就是源點到各個點的最短距離,比如綠色是源點,到其他點的最短距離分別是7,12,18,22.

需要注意的是,迪傑斯特拉演算法不能處理負權重環問題

迪傑斯特拉演算法不會去看已經處理好的節點,只會處理沒有看到的節點,如果已經處理的節點都是最小的值,在不存在負權值重環的情況下,是不會出現使得路徑變小的情況。

每日一題 1

題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...

每日一題2018 3 21

leetcode 2 模擬十進位制運算考察單鏈表基本操作。題無難點,個人基礎需要提高。definition for singly linked list.struct listnode class solution while p while q if shi val s next null ret...

每日一題2018 3 22

leetcode 03 最長不重複子串 第一反應就是動態規劃。看到了網上的方法一。直接把問題簡化為找兩個重複字元間的最長距離,太巧妙了!class solution if i idx max locs s i i return max ling老師的方法二 仍舊轉化為動態規劃,但是為節省空間不再開個...