前言
隨著現代社會的發展,信息的形式和數量正在迅猛增長。其中很大一部分是圖像,圖像可以把事物生動地呈現在我們面前,讓我們更直觀地接受信息。同時,計算機已經作為一種人們普遍使用的工具為人們的生產生活服務。
圖像處理概況
圖像處理,是對圖像進行分析、加工、和處理,使其滿足視覺、心理以及其他要求的技術。圖像處理是信號處理在圖像域上的一個應用。目前大多數的圖像是以數字形式存儲,因而圖像處理很多情況下指數字圖像處理。本文接下來將簡單粗略介紹下數字圖像處理領域中的經典算法。
圖算法領域10大經典算法
基本遍歷
一、深度優先搜索
深度優先搜索算法思想
深度優先遍歷圖的方法(一種遞歸的定義)是,假定給定圖G的初始狀態是所有頂點均未被訪問過,在G中任選一個頂點i作為遍歷的初始點,則深度優先搜索遞歸調用包含以下操作:
(1)訪問搜索到的未被訪問的鄰接點;
(2)將此頂點標記為已訪問節點;
(3)搜索該頂點的未被訪問的鄰接點,若該鄰接點存在,則從此鄰接點開始進行同樣的訪問和搜索。
深度優先搜索算法實現:
1. 使用棧來實現。相關算法實現總結為:
(1) 將初始節點壓棧。
(2) While(棧非空) {
(3) 取出棧頂點,暫時存儲這個節點node_t信息。
(4) 訪問該節點,并且標示已訪問。
(5) 將棧頂元素出站。
(6) For(遍歷node_t的相鄰的未訪問過的節點){
(7) 將其入棧。
}
}
注意事項:一定要先將該訪問節點出棧后,再將其鄰接的未訪問的節點入棧。切記不要,之前我的經歷,如果沒有鄰接點就出棧,否則就不出站,但是標記了該節點為訪問節點的。
2. 使用遞歸來實現。相關算法實現總結為:
(1) DFS(初始節點)
(2) Function DFS(一個節點) {
(3) 訪問該節點,并且標示已訪問。
(4) For(遍歷該節點的相鄰的未訪問過的節點) {
(5) 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*搜索算法
附:
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。
此類算法,日后闡述。
完。
評論
查看更多