做數據結構的課程設計順便總結一下這四大算法,本人小白學生一枚,
如果總結的有什么錯誤,希望能夠告知指正
普里姆算法如圖所示prim
找出最短的邊,再以這條邊構成的整體去尋找與之相鄰的邊,直至連接所有頂點,生成最小生成樹,時間復雜度為O(n2)
克魯斯卡爾算法如圖所示kruskal
克魯斯卡爾算法,假設連通網N=(N,{E}),則令最小生成樹的初始狀態為只有n個頂點而無邊的非連通圖T=(V,{}),圖中每個頂點
自成一個連通分量。在E中選擇代價最小的邊,若該邊依附的定頂點落在T中不同的連通分量上,則將此邊加入到T中,否則社區次邊而選擇
下一條代價最小的邊。依次類推,直至T中所有的頂點都在同一連通分量上為止
迪傑斯特拉算法Dijkstra
迪傑斯特拉算法和普里姆算法有相似的地方但是也有區別,都是貪心算法,但是普里姆算法的源點是任意的
而迪傑斯特拉算法的源點是特定的,他們都是把頂點分成兩個集合
弗洛里德算法floyd
時間復雜度:O(n^3);
弗洛里德算法是求加權圖中兩個頂點之間的最短路路徑,而迪傑斯特拉算法是求一個頂點到所有定點之間的距離
Floyd算法又稱為弗洛伊德算法,插點法,是一種用於尋找給定的加權圖中頂點間最短路徑的算法。
算法過程:1,從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,或者無窮大,如果兩點之間沒有邊相連。
2,對於每一對頂點u和v,看看是否存在一個頂點w使得從u到w再到v比己知的路徑更短。如果是更新它。
Dijkstra(迪傑斯特拉)算法是典型的單源最短路徑算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。
算法步驟如下:
1.初使時令S={V0},T={其余頂點},T中頂點對應的距離值
若存在,d(V0,Vi)為弧上的權值
若不存在,d(V0,Vi)為∝
2.從T中選取一個其距離值為最小的頂點W且不在S中,加入S
3.對T中頂點的距離值進行修改:若加進W作中間頂點,從V0到Vi的
距離值比不加W的路徑要短,則修改此距離值
重復上述步驟2、3,直到S中包含所有頂點,即S=T為止