題目的**是給定了一些計算機,一邊需要在不同的計算機之間連線網線,另一邊還要可以檢查兩台計算機之間是否已經連線好了,可以進行檔案的傳輸了,也就是檢查兩個元素是否已經在同乙個集合中了,所以filetransfer這道題目是一道非常典型的並查集的問題
根據之前定義的結構,查詢n次的最壞情況界是n^2,其實data這個資料域是可以不要的,例如下圖直接用整形陣列表示集合
之後我們就有了集合的簡化表示
#define maxsize 100
typedef int elementtype;//預設元素可以用非負整數表示
typedef int setname;//預設用根節點的下標作為集合名稱
其中c、i、s表示指令名稱,分別為檢查兩台計算機是否聯通,輸入在兩台計算機之間的連線和結束程式並且返回有幾個連通集
輸入樣例2只有乙個聯通集
#include #include #define maxsize 100
typedef int elementtype;//預設元素可以用非負整數表示
typedef int setname;//預設用根節點的下標作為集合名稱
typedef elementtype settype[maxsize];
//初始化集合
void initialization(settype s,int n) ;
setname find(settype s, elementtype x) ;
void union(settype s, setname root1, setname root2)
//input函式
void input_connection(settype s)
//check函式
void check_connection(settype s)
//檢查聯通集的函式
void check_network(settype s, int n)
if (counter == 1)
printf("the network is connected.\n");
else
printf("there are %d components.\n", counter);
}int main()
} while (in != 's');
system("pause");
return 0;
}
對於輸入樣例1,執行結果是
而對於輸入樣例2的執行結果是
too ****** sometimes *****,就是這種表示方法雖然說簡單,但是有些時候確實是效率比較低,例如提交給oj時會有某些測試點過不去(超時),就是因為union裡的這句話「s[root1]=root2」,而如果將root1和root2交換,則會在另乙個測試點卡住。
如果換為之間的集合表示方法的話效率會進一步降低,有更多的測試點過不去,不難理解因為演算法的複雜度反而變高了嘛
避免把高的樹貼到矮的樹上,最差的情況就變為了乙個單鏈表,複雜度會提高
因此應該吧矮的樹貼到高的樹上,因此我們可以利用負數表示樹高,據此可以把union改為
void union(settype s, setname root1, setname root2)
}
或者是根據樹的規模,把小樹貼到大樹上,對應的**改為
//按規模歸併
void union(settype s, setname root1, setname root2)
else
}
按規模歸併可以和後面的一種方法結合,這兩種方法的最壞情況的樹高是o(logn)
改進find函式進行資料壓縮,改為
setname find(settype s, elementtype x) ;
就是在呼叫find的時候把路徑上每個結點都直接掛在了根節點下面,如下圖所示
在之後找這條路徑上的結點時就會很省時間,另外值得注意的是這個遞迴是個尾遞迴,可以直接轉為迴圈而不是真正的遞迴
根據下面的引理,在現實條件下,其複雜度可以考慮為n
看來資料結構還真的是很重要。。
C String詳解 小白專用
include string string s hello world char temp hello world string s temp string s hello world char temp char s.c str 此處一定要加強制型別轉化,c str 返回的是乙個臨時指標,不能對其...
dom總結(小白專用)
html dom 定義了訪問和操作 html 文件的標準方法。dom 就是document object model,文件物件模型。根據 w3c 的 html dom 標準,html 文件中的所有內容都是節點 整個文件是乙個文件節點 每個 html 元素是元素節點 也就是說網頁的html標籤元素是元...
Redis安裝方法(小白專用)
鄭重宣告 本安裝教程親測成功,且純粹小白級別,如有覺得不專業的,你咬我啊。之前就聽說了redis這個東東,一直都不明覺厲,今天決定裝來玩玩。因為redis的作者認為linux的網路效能已經是大家都有目共睹了,鄙視windows,所以redis的執行環境是在linux下的。所需的軟硬環境 1 linu...