總結A*,Dijkstra,廣度優先搜索,深度優先搜索的復雜度比較


廣度優先搜索(BFS)

1、將頭結點放入隊列Q中

2、while Q!=空

        u出隊

    遍歷u的鄰接表中的每個節點v

    將v插入隊列中

 當使用無向圖的鄰接表時,復雜度為O(V^2)

當使用有向圖的鄰接表時,因為每條邊只訪問一次,不會重復訪問,所以總復雜度為O(V+E)

 

深度優先搜索(DFS)

for each vertex u∈V(G)    //執行時間為O(V)

  DFS(u)

 

DFS內部:

for each v 為u的鄰接點      //執行時間為O(E)

  DFS(v)

 

總執行時間為O(V+E)

 

 

A*搜索

從A開始,遍歷周圍的點,且避開close中以及障礙點,利用f(x) = g(x)+h(x)評價這些點,選取最佳點。並且如果第二次評價某點時,取記錄中該點的f(x)值與現在計算得到的f(x)值更小的,放入到記錄中

算法復雜度:

外循環中每次從open中取出點,共取n次,

內循環:遍歷它的鄰接點n(E),並將這些鄰接點放入open中,對open進行排序,open表大小是O(n)量級的,若用快排就是O(nlogn),內循環總的復雜度為O(n*logn+E)=O(n*logn)

總復雜度為 O(n^2*logn)

 

Dijkstra(旅行商問題,最短距離遍歷所有的城市)

 

 

行2--4的初始化對n個頂點進行,顯然是O(n)
5--6行O(1)
7行n個頂點入隊列O(n)
8行--14行,從8行可以看出進行了n遍循環,每遍在第九行調用一次ExtractMin過程,ExtractMin過程需要搜尋鄰接表,每一次需要搜尋整個數組,所以一次操作時間是O(n);11行到14行對節點u的鄰接表中的邊進行檢查,總共有|E|次(總共.每條邊最多檢查一次),因此是O(E);合起來就是O(E+n*n) = O(n^2);

以上合起來就是O(n)+O(1)+O(n)+O(n^2) == O(n^2)

 

 

算法復雜度:

O(V^2)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM