C 中雜湊表與List的比較

2022-08-30 01:12:10 字數 3685 閱讀 1896

在c#中,list是順序線性表(非鍊錶),用一組位址連續的儲存單元依次儲存資料元素的線性結構。

雜湊表也叫雜湊表,是一種通過把關鍵碼值對映到表中乙個位置來訪問記錄的資料結構。c#中的雜湊表有hashtable,dictionary,hashtable繼承自map,實現乙個key-value對映的關係。dictionary則是一種泛型雜湊表,不同於hashtable的key無序,dictionary是按照順序儲存的。雜湊表的特點是:1.查詢速度快,2.不能有重複的key。

在c#中,我們例項化list時,如果不指定容量,則內部會生成乙個靜態的空陣列,有新增操作時,例項化為乙個長度為4的陣列,滿了以後,自動擴充為兩倍的容量。

雜湊表也是類似的情況,先預設生成乙個長度為11的雜湊表,滿後,自動新增,而新增規則是內部迴圈素數陣列,稍大於當前的長度,比如15 ,則長度設定為17。在雜湊表建立可分為確定雜湊函式,解決雜湊衝突兩個步驟。

下面進行兩個實驗,實驗一,比較hashtable,dictionary,list三者在不同長度時的建立速度,實驗二比較三者在不同時間時的查詢速度。(實驗**在最後)

硬體:intel core 2 quad cpu @ 2.66ghz,4gb記憶體。

軟體:windows 2008,2010 vs編譯環境。

表1.三者的建立時間

長度\型別

hashtable

dictionary

list

0.001s

0s0s

0s0s

0s0s

0s0s

0.003s

0.005s

0.001s

0.0032s

0.003s

0.002s

0.038s

0.042s

0.002s

0.520s

0.512s

0.015s

1.807s

1.441s

0.042s

3.752s

2.952s

0.087s

4.744s

3.740s

0.102s

表2.三者的查詢時間

長度\型別

hashtable

dictionary

list

0s0s

0s0s

0s0s

0s0s

0s0s

0s0s

0s0s

0.001s

0s0s

0.010s

0s0s

0.009s

0s0s

0.009s

0s0s

0.058s

0s0s

0.077s

實驗二表明:雜湊表的查詢速度幾乎不需要花費時間,這是因為雜湊表在新增一對元素(key-value)時,就已經記錄下value的位置,所以查詢時就會非常的快。雜湊的查詢複雜度o(1),list 的查詢複雜度是o(n)。

雜湊表的高速查詢是空間換時間的典型應用,前期的建立時間隨著數量級的增加而增加,後期的查詢則永遠是o(1)。所以我們得出結論:如果面對海量資料,且需要大量搜尋,那建議使用雜湊表。而當面對小量資料(數量級由伺服器決定)時,使用list更合適。

/* *author: chao 

*date:2012.3.27 

*fun: compare list with hash in c# 

*/  

using system;  

using system.collections.generic;  

using system.linq;  

using system.text;  

using system.collections;  

namespace hash_vs_list  

search:", hash_create_diff, hash_search_diff);  

console.writeline();  

//dict   

console.writeline("dictionary");  

dictionary dict = new dictionary();  

timespan dict_start = new timespan(datetime.now.ticks);  

for (int i = 0; i < max; i++)  

timespan dict_end = new timespan(datetime.now.ticks);  

timespan dict_diff = dict_start.subtract(dict_end).duration();  

string dict_create_diff = dict_diff.totalseconds.tostring();  

//dict search   

dict_start = new timespan(datetime.now.ticks);  

tmp = dict[0];  

dict_end = new timespan(datetime.now.ticks);  

dict_diff = dict_start.subtract(dict_end).duration();  

string dict_search_diff = dict_diff.totalseconds.tostring();  

console.writeline("create: search:", dict_create_diff, dict_search_diff);  

console.writeline();  

//list create   

console.writeline("list");  

timespan list_start = new timespan(datetime.now.ticks);  

list l1 = new list();  

for (int i = 0; i < max; i++)  

l1.add(i);  

timespan list_end = new timespan(datetime.now.ticks);  

timespan list_diff = list_start.subtract(list_end).duration();  

string list_create_diff = list_diff.totalseconds.tostring();  

//list foreach   

list_start = new timespan(datetime.now.ticks);  

foreach (int i in l1)  

list_end = new timespan(datetime.now.ticks);  

list_diff = list_start.subtract(list_end).duration();  

string list_foreach_diff = list_diff.totalseconds.tostring();  

console.writeline("create:,foreach:", list_create_diff, list_foreach_diff);  

console.writeline();  

console.read();  

}  }  

}  

C 中雜湊表與List的比較

在c 中,list是順序線性表 非鍊錶 用一組位址 連續的儲存單元 依次儲存資料元素的線性結構。雜湊表也叫雜湊表,是一種通過把關鍵碼值對映 到表中乙個位置來訪問記錄的資料結構。c 中的雜湊表有hashtable,dictionary,hashtable繼承自map,實現乙個key value對映的關...

list中的比較

一說到list的的確不知道寫些什麼。我覺得別人總結的比我寫的還要好很多。list 元素是有序的 怎麼存的就怎麼取出來,順序不會亂 元素可以重複 角標1上有個3,角標2上也可以有個3 因為該集合體系有索引,arraylist 底層的資料結構使用的是陣列結構 陣列長度是可變的百分之五十延長 特點是查詢很...

雜湊表與雜湊函式 C實現

雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中 乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。給定表m,存在函式f key 對任意給定的關鍵字值key,代入函式後...