演算法I IV,連通問題簡單整理

2021-06-08 23:55:53 字數 1893 閱讀 7728

總結:對於n個物件的連通問題,如果要執行m次合併操作,那麼快速查詢演算法將執行至少m*n條指令。

*/bool isconnected_1(int id, int p, int q)

/*當輸入的資料不理想時,快速合併演算法的運算元要遠遠大於m*n/2。幸運的是,

我們對演算法做乙個簡單地修改就可以保證這樣的最壞情況不出現。

具體做法就是在進行合併操作時,不是簡單地將第二棵樹連線到第一棵,

而是對每棵樹保持乙個節點計數,並且總是將小的樹連線到大的樹上。

這一修改需要增加部分**和乙個儲存節點計數的陣列,但它提高了效率。

我們稱這個演算法為"帶權的快速合併演算法"。

總結:在確定n個物件的兩個物件是否連通時,帶權的快速合併演算法將執行至少順著指標走lgn步。

在n個物件m個連線的情況下,帶權的快速合併演算法最多執行m*lgn條指令。

而快速查詢(慢速合併)演算法的大多數情況(快速合併演算法的少數情況)至少要執行m*n/2條指令,

二者形成鮮明對比。可見,使用帶權的快速合併演算法,可以保證在合理的時間內解決大多數實際問題。

*/bool isconnected_3(int id, int p, int q)

; int i, j;

for (i=p; i!=id[i]; i=id[i]) //尋找p所屬集合的根

;for (j=q; j!=id[j]; j=id[j]) //尋找q所屬集合的根

;if (i == j) //已經連通

return true;

if ( sz[i] > sz[j]) //合併p,q,即二者指向同乙個根,並且總是將小的樹連線到大的樹上

else

return false;}/*

下面我們來看是否可以找到能保證線性效能的演算法。這確實是乙個困擾了研究人員許多年的問題。

進一步改進帶權的快速合併演算法的簡單方法很多。理想情況下,我們希望每個節點都直接指向樹的根節點,

但又不希望像快速合併演算法那樣進行大量的修改指標的操作。

我們可以採用使被測節點指向根節點的方法逼近理想情況。這種方法被稱為"路徑壓縮",

具體方法是在進行合併操作時,將所經過的節點的id陣列項指向根節點,即該節點的值與根節點的值相等。

有很多方法可以實現路徑壓縮,我們所採用的演算法被稱為"等分路徑壓縮的快速合併演算法",

它的特點是通過連線時向上跳一步指向下一節點,採取這種壓縮路徑的方法顯然比全路徑壓縮更容易實現。

*/bool isconnected_4(int id, int p, int q) //不帶權的壓縮路徑演算法

bool isconnected_5(int id, int p, int q) //帶權的壓縮路徑演算法

; int i, j;

for (i=p; i!=id[i]; i=id[i]) //尋找p所屬集合的根

id[i] = id[id[i]]; //注意被處理的節點元素向根節點跳了一步,以壓縮路徑

for (j=q; j!=id[j]; j=id[j]) //尋找q所屬集合的根

id[j] = id[id[j]];

if (i == j) //已經連通

return true;

if ( sz[i] > sz[j]) //合併p,q,即二者指向同乙個根,並且總是將小的樹連線到大的樹上

else

return false;}/*

全路徑壓縮是指我們在進行每一次合併演算法時將所經過的節點均指向新數的節點。

*/bool isconnected_6(int id, int p, int q) //不帶權的全路徑壓縮演算法

for (k=q; k!=j; k=t) //合併時將所經過的節點均指向新數的節點

id[i] = j; //合併p,q,即二者指向同乙個根

return false;

}

連通問題演算法

書籍 演算法 c語言實現 快速查詢演算法 void connect int p,q while cin p q 我們把合併操作完成到最後,也就是這是乙個只有兩層的樹。或者我們把合併操作簡化,讓查詢變得麻煩一點 void connect1 int q,p int i,j while cin p q a...

演算法問題整理

svm 問題 參考 利用間隔最大化求得最優分離超平面,解是唯一的,此時分隔超平面所產生的分類結果也是魯棒性最好的,對未知例項的泛化能力也是最強的 為什麼要將求解svm 的原始問題轉換為對偶問題了?為什麼svm要引入核函式 當樣本在原始空間線性不可分時,可將樣本從原始空間對映到乙個更高維的特徵上,使得...

python簡單演算法整理

氣泡排序 def func alist for x in range 1,len alist for i in range 0,len alist x if alist i alist i 1 alist i alist i 1 alist i 1 alist i return alist prin...