小白專場 FileTransfer

2021-07-25 03:45:53 字數 2847 閱讀 5969

題目的**是給定了一些計算機,一邊需要在不同的計算機之間連線網線,另一邊還要可以檢查兩台計算機之間是否已經連線好了,可以進行檔案的傳輸了,也就是檢查兩個元素是否已經在同乙個集合中了,所以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...