圖演算法領域10大經典演算法

來源:互聯網
上載者:User
圖演算法領域10大經典演算法

                圖演算法領域10大經典演算法

作者:July   二零一一年二月十四日。
參考:
維基百科、本BLOG 內經典演算法研究系列10篇文章。

博主說明:
1、本文囊括了圖演算法領域中的全部20個重要演算法,並從中甄選出了此十大演算法。
2、此十大演算法的評選是以我個人之見而選,其它雖未囊括於10之內,但都在本文中有所提到。
-------------------------------------------

第一章、基本遍曆
一、深度優先搜尋
二、廣度優先搜尋
此圖遍曆中最基本的倆種演算法,BFS,DFS,入選本圖演算法十大演算法,自是無可爭議。
因為,這倆種搜尋演算法,應用實為廣泛而重要。

關於此BFS、DFS演算法,更多,請參考:
經典演算法研究系列:四、教你通透徹底理解:BFS和DFS優先搜尋演算法
http://blog.csdn.net/v_JULY_v/archive/2011/01/01/6111353.aspx

三、A*搜尋演算法
DFS和BFS在展開子結點時均屬於盲目型搜尋,也就是說,
它不會選擇哪個結點在下一次搜尋中更優而去跳轉到該結點進行下一步的搜尋。
在運氣不好的情形中,均需要試探完整個解集空間, 顯然,只能適用於問題規模不大的搜尋問題中。

A*演算法,作為啟發學習法演算法中很重要的一種,被廣泛應用在最優路徑求解和一些策略設計的問題中。
而A*演算法最為核心的部分,就在於它的一個估值函數的設計上:
    f(n)=g(n)+h(n)
其中f(n)是每個可能試探點的估值,它有兩部分組成:
一部分,為g(n),它表示從起始搜尋點到當前點的代價(通常用某結點在搜尋樹中的深度來表示)。
一部分,即h(n),它表示啟發學習法搜尋中最為重要的一部分,即當前結點到目標結點的估值。

更多,請參考:
經典演算法研究系列:一、A*搜尋演算法
http://blog.csdn.net/v_JULY_v/archive/2010/12/23/6093380.aspx

附:
Flood Fill
LeeMaRS、wtzyb4446:
圖形學中Flood Fill是滿水法填充,是用來填充地區的。
就好比在一個地方一直到水,水會往四周滿延開,直到高地阻擋。

Flood Fill就是從一個點開始往四周尋找相同的點填充,直到有不同的點為止。
我們用的Flood Fill和這個差不多原理,就是BFS的一種形式.

假設在(i,j)滴好大一滴紅墨水,然後水開始漫開,向它的上下左右染色,也就是(i-1,j),(i+1,j),(i,j-1),(i,j+1)這四個點.然後在分別再從這四個點開始向周圍染色...直到碰到某種邊界為止.

把這個轉化為BFS的思想,就是隊列中初始元素是(i,j),然後把(i,j)擴充狀態,得到(i-1,j),(i+1,j),(i,j-1),(i,j+1)這四個狀態,排入佇列.把(i,j)出列,繼續擴充下一個結點...如此

第二章、最短路徑演算法
四、Dijkstra
Dijkstra 演算法,又叫迪科斯徹演算法(Dijkstra),
演算法解決的是有向圖中單個源點到其他頂點的最短路徑問題。

此Dijkstra 演算法已在本BLOG內倆篇文章中,有所具體闡述,請參見:
I、經典演算法研究系列:二、Dijkstra 演算法初探
http://blog.csdn.net/v_JULY_v/archive/2010/12/24/6096981.aspx
II、經典演算法研究系列:二之續、徹底理解Dijkstra演算法
http://blog.csdn.net/v_JULY_v/archive/2011/02/13/6182419.aspx

五、Bellman-Ford
Bellman-Ford:
求單源最短路,可以判斷有無負權迴路(若有,則不存在最短路),
時效性較好,時間複雜度O(VE)。

附:
SPFA:
是Bellman-Ford的隊列最佳化,時效性相對好,時間複雜度O(kE)。(k<<V)。

六、Floyd-Warshall
Floyd-Warshall:求多源、無負權邊的最短路。用矩陣記錄圖。時效性較差,時間複雜度O(V^3)。此演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題。

更多,請參考:
幾個最短路徑演算法比較:
http://blog.csdn.net/v_JULY_v/archive/2011/02/12/6181485.aspx

附:Kneser圖
Kneser圖是與圖的分數染色有關的演算法。
給定正整數a,b,a≥2b,Kneser圖Ka:b是以如下方式定義的一個圖:
其頂點是從給定的a個元素的集合中選出的b個元素構成的子集,兩頂點間有邊若且唯若這兩個頂點為不交的集合。

第三章、最小產生樹
七、Prim
八、Kruskal
此最小(權值)產生樹的倆種演算法,日後,會在本BLOG內 具體而深入闡述。

第四章、圖匹配
九、匈牙利演算法 
匈牙利演算法是眾多用於解決線性任務分配問題的演算法之一,是用來解決二分圖最大匹配問題的經典演算法,可以在多項式時間內解決問題,由匈牙利數學家Jack Edmonds於1965年提出。
這個演算法,比較生疏,下面,稍微闡述下:

I、匈牙利演算法應用問題的描述:
設G=(V,E)是一個無向圖。如頂點集V可分區為兩個互不相交的子集V1,V2之並,並且圖中每條邊依附的兩個頂點都分屬於這兩個不同的子集。則稱圖G為二分圖。二分圖也可記為G=(V1,V2,E)。

給定一個二分圖G,在G的一個子圖M中,M的邊集{E}中的任意兩條邊都不依附於同一個頂點,則稱M是一個匹配。 選擇這樣的子集中邊數最大的子集稱為圖的最大匹配問題(maximal matching problem)

如果一個匹配中,圖中的每個頂點都和圖中某條邊相關聯,則稱此匹配為完全符合,也稱作完備,完美匹配。

II、演算法描述
求最大匹配的一種顯而易見的演算法是:先找出全部匹配,然後保留匹配數最多的。但是這個演算法的時間複雜度為邊數的指數級函數。因此,需要尋求一種更加高效的演算法。

下面介紹用增廣路求最大匹配的方法(稱作匈牙利演算法,匈牙利數學家Edmonds於1965年提出)。
增廣路的定義(也稱增廣軌或交錯軌):
若P是圖G中一條連通兩個未匹配頂點的路徑,並且屬於M的邊和不屬於M的邊(即已匹配和待匹配的邊)在P上交替出現,則稱P為相對於M的一條增廣路徑。

由增廣路的定義可以推出下述三個結論:
1-P的路徑長度必定為奇數,第一條邊和最後一條邊都不屬於M。
2-將M和P進行異或操作(去同存異)可以得到一個更大的匹配M’。
3-M為G的最大匹配若且唯若不存在M的增廣路徑。

演算法輪廓:
(1)置M為空白
(2)找出一條增廣路徑P,通過異或操作獲得更大的匹配M’代替M
(3)重複(2)操作直到找不出增廣路徑為止

III、時間複雜度與空間複雜度
時間複雜度
鄰接矩陣:最壞為O(n^3)      鄰接表:O(mn)   
空間複雜度:
鄰接矩陣:O(n^2)            鄰接表:O(m+n)

附:
Edmonds's matching

第五章、強連通分支演算法與網路流
十、Ford-Fulkerson
最大流量演算法(Ford-Fulkerson Algorithm),
也叫做貝爾曼-福特演算法,被用於作為一個距離向量路由協議例如RIP, BGP, ISO IDRP, NOVELL IPX的演算法。

附:Edmonds-Karp、Dinic、Push-relabel、maximum flow

強連通分支演算法:
Kosaraju、 Gabow、 Tarjan。
此類演算法,日後闡述。
完。

本人July對本部落格所有任何文章、內容和資料享有著作權。
轉載務必註明作者本人及出處,並通知本人。July、二零一一年二月十四日。

                圖演算法領域10大經典演算法

作者:July   二零一一年二月十四日。
參考:
維基百科、本BLOG 內經典演算法研究系列10篇文章。

博主說明:
1、本文囊括了圖演算法領域中的全部20個重要演算法,並從中甄選出了此十大演算法。
2、此十大演算法的評選是以我個人之見而選,其它雖未囊括於10之內,但都在本文中有所提到。
-------------------------------------------

第一章、基本遍曆
一、深度優先搜尋
二、廣度優先搜尋
此圖遍曆中最基本的倆種演算法,BFS,DFS,入選本圖演算法十大演算法,自是無可爭議。
因為,這倆種搜尋演算法,應用實為廣泛而重要。

關於此BFS、DFS演算法,更多,請參考:
經典演算法研究系列:四、教你通透徹底理解:BFS和DFS優先搜尋演算法
http://blog.csdn.net/v_JULY_v/archive/2011/01/01/6111353.aspx

三、A*搜尋演算法
DFS和BFS在展開子結點時均屬於盲目型搜尋,也就是說,
它不會選擇哪個結點在下一次搜尋中更優而去跳轉到該結點進行下一步的搜尋。
在運氣不好的情形中,均需要試探完整個解集空間, 顯然,只能適用於問題規模不大的搜尋問題中。

A*演算法,作為啟發學習法演算法中很重要的一種,被廣泛應用在最優路徑求解和一些策略設計的問題中。
而A*演算法最為核心的部分,就在於它的一個估值函數的設計上:
    f(n)=g(n)+h(n)
其中f(n)是每個可能試探點的估值,它有兩部分組成:
一部分,為g(n),它表示從起始搜尋點到當前點的代價(通常用某結點在搜尋樹中的深度來表示)。
一部分,即h(n),它表示啟發學習法搜尋中最為重要的一部分,即當前結點到目標結點的估值。

更多,請參考:
經典演算法研究系列:一、A*搜尋演算法
http://blog.csdn.net/v_JULY_v/archive/2010/12/23/6093380.aspx

附:
Flood Fill
LeeMaRS、wtzyb4446:
圖形學中Flood Fill是滿水法填充,是用來填充地區的。
就好比在一個地方一直到水,水會往四周滿延開,直到高地阻擋。

Flood Fill就是從一個點開始往四周尋找相同的點填充,直到有不同的點為止。
我們用的Flood Fill和這個差不多原理,就是BFS的一種形式.

假設在(i,j)滴好大一滴紅墨水,然後水開始漫開,向它的上下左右染色,也就是(i-1,j),(i+1,j),(i,j-1),(i,j+1)這四個點.然後在分別再從這四個點開始向周圍染色...直到碰到某種邊界為止.

把這個轉化為BFS的思想,就是隊列中初始元素是(i,j),然後把(i,j)擴充狀態,得到(i-1,j),(i+1,j),(i,j-1),(i,j+1)這四個狀態,排入佇列.把(i,j)出列,繼續擴充下一個結點...如此

第二章、最短路徑演算法
四、Dijkstra
Dijkstra 演算法,又叫迪科斯徹演算法(Dijkstra),
演算法解決的是有向圖中單個源點到其他頂點的最短路徑問題。

此Dijkstra 演算法已在本BLOG內倆篇文章中,有所具體闡述,請參見:
I、經典演算法研究系列:二、Dijkstra 演算法初探
http://blog.csdn.net/v_JULY_v/archive/2010/12/24/6096981.aspx
II、經典演算法研究系列:二之續、徹底理解Dijkstra演算法
http://blog.csdn.net/v_JULY_v/archive/2011/02/13/6182419.aspx

五、Bellman-Ford
Bellman-Ford:
求單源最短路,可以判斷有無負權迴路(若有,則不存在最短路),
時效性較好,時間複雜度O(VE)。

附:
SPFA:
是Bellman-Ford的隊列最佳化,時效性相對好,時間複雜度O(kE)。(k<<V)。

六、Floyd-Warshall
Floyd-Warshall:求多源、無負權邊的最短路。用矩陣記錄圖。時效性較差,時間複雜度O(V^3)。此演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題。

更多,請參考:
幾個最短路徑演算法比較:
http://blog.csdn.net/v_JULY_v/archive/2011/02/12/6181485.aspx

附:Kneser圖
Kneser圖是與圖的分數染色有關的演算法。
給定正整數a,b,a≥2b,Kneser圖Ka:b是以如下方式定義的一個圖:
其頂點是從給定的a個元素的集合中選出的b個元素構成的子集,兩頂點間有邊若且唯若這兩個頂點為不交的集合。

第三章、最小產生樹
七、Prim
八、Kruskal
此最小(權值)產生樹的倆種演算法,日後,會在本BLOG內 具體而深入闡述。

第四章、圖匹配
九、匈牙利演算法 
匈牙利演算法是眾多用於解決線性任務分配問題的演算法之一,是用來解決二分圖最大匹配問題的經典演算法,可以在多項式時間內解決問題,由匈牙利數學家Jack Edmonds於1965年提出。
這個演算法,比較生疏,下面,稍微闡述下:

I、匈牙利演算法應用問題的描述:
設G=(V,E)是一個無向圖。如頂點集V可分區為兩個互不相交的子集V1,V2之並,並且圖中每條邊依附的兩個頂點都分屬於這兩個不同的子集。則稱圖G為二分圖。二分圖也可記為G=(V1,V2,E)。

給定一個二分圖G,在G的一個子圖M中,M的邊集{E}中的任意兩條邊都不依附於同一個頂點,則稱M是一個匹配。 選擇這樣的子集中邊數最大的子集稱為圖的最大匹配問題(maximal matching problem)

如果一個匹配中,圖中的每個頂點都和圖中某條邊相關聯,則稱此匹配為完全符合,也稱作完備,完美匹配。

II、演算法描述
求最大匹配的一種顯而易見的演算法是:先找出全部匹配,然後保留匹配數最多的。但是這個演算法的時間複雜度為邊數的指數級函數。因此,需要尋求一種更加高效的演算法。

下面介紹用增廣路求最大匹配的方法(稱作匈牙利演算法,匈牙利數學家Edmonds於1965年提出)。
增廣路的定義(也稱增廣軌或交錯軌):
若P是圖G中一條連通兩個未匹配頂點的路徑,並且屬於M的邊和不屬於M的邊(即已匹配和待匹配的邊)在P上交替出現,則稱P為相對於M的一條增廣路徑。

由增廣路的定義可以推出下述三個結論:
1-P的路徑長度必定為奇數,第一條邊和最後一條邊都不屬於M。
2-將M和P進行異或操作(去同存異)可以得到一個更大的匹配M’。
3-M為G的最大匹配若且唯若不存在M的增廣路徑。

演算法輪廓:
(1)置M為空白
(2)找出一條增廣路徑P,通過異或操作獲得更大的匹配M’代替M
(3)重複(2)操作直到找不出增廣路徑為止

III、時間複雜度與空間複雜度
時間複雜度
鄰接矩陣:最壞為O(n^3)      鄰接表:O(mn)   
空間複雜度:
鄰接矩陣:O(n^2)            鄰接表:O(m+n)

附:
Edmonds's matching

第五章、強連通分支演算法與網路流
十、Ford-Fulkerson
最大流量演算法(Ford-Fulkerson Algorithm),
也叫做貝爾曼-福特演算法,被用於作為一個距離向量路由協議例如RIP, BGP, ISO IDRP, NOVELL IPX的演算法。

附:Edmonds-Karp、Dinic、Push-relabel、maximum flow

強連通分支演算法:
Kosaraju、 Gabow、 Tarjan。
此類演算法,日後闡述。
完。

本人July對本部落格所有任何文章、內容和資料享有著作權。
轉載務必註明作者本人及出處,並通知本人。July、二零一一年二月十四日。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.