C 中關於List T 和HashSet T 應用的效率問題?

時間 2021-06-01 23:14:21

1樓:叔本華.com

如果用鍊表,最壞情形是兩個相等元素都在表末尾,每次查詢O(n)時間,n次查詢,為O(n^2);

如果用雜湊表,最壞情形是最後兩次插入的是相同元素,需要n次插入,為O(n)

2樓:Elendil Zheng

我覺得一般碼農不懂圖啊這種資料結構還算正常。。。。雜湊錶鏈表都搞不清楚就有點兒。。。

你看每個.net物件都有個gethashcode方法把我開闢一塊兒記憶體區域乙個string物件叫test 假設他gethashcode返回是123 那麼他記憶體位址就是123,contain的時候直奔123這個位址去了當然快

如果是list 然後這個list裡面有test1,test2,test3,test4.。。。一堆字串運氣不好你的test字串在最後然後你要contain(test)就只能從頭到尾遍歷過來。。。自然慢了。。。

3樓:騰飛

由此可以看出資料結構還是很重要的,熟悉的人看來,這些都是很正的了。

理解下陣列,鍊表,樹,雜湊,圖等常見資料結構的原理了記憶體布局,就會很清晰的知道什麼時候該用什麼了

4樓:LambdaCalc

這道題我是用C語言做的,我的做法是先排序,若陣列中包含相等元素,則必然存在a[i] = a[i + 1]這種情況,這樣的話就好判斷了,這樣的複雜度是O(nlogn),如果單純地用鍊表複雜度O(n^2)。

5樓:布客飛龍

如果拆開來看,List裡面是線序集,HashSet裡面是雜湊表。

與Dictionary相比,List可以看成下標到值的對映,HashSet可以看成值自己到自己的對映。判斷乙個值是否存在,前者相當於是用值去找下標,要遍歷一遍容器;後者相當於用對映前的值去找對映後的值,只需要計算出來值的hash,然後直接訪問就好了。

6樓:Ivony

簡單說,乙個時間複雜度O(1),乙個時間複雜度O(n)。

而且HashSet無序不重,和List完全不同。

判斷乙個陣列是否包含重複元素,其實只需要乙個個新增到HashSet,然後檢查Add方法的返回值就可以了:

var set = new HashSet();

foreach( var i in array )

if ( set.Add( i ) == false )

return true;

return false;

當然不考慮效率的花式玩法很多,但都比乙個個去Contains要效能好:

return array.Length != array.Distinct().Count();

return array.GroupBy( i => i ).Any( g => g.Count() > 1 );

7樓:Oahzir

這是two sum那道題吧。

很明顯用了hash table來儲存資料,是為了用O(n)的space來換取O(n)的時間,也就是查詢元素的時間是O(1)。

你這樣用List,contains查詢時間還是O(n)。

跟你直接寫個for loop用brute force有什麼區別呢?

8樓:

個人理解,和List相比,HashSet是沒有Value的 Dictionary,相似的問題:.net - What is the difference between HashSet and List?

關於C中的符號 ?

時夢 int p 4 array 這裡 p是指向陣列的指標,所以在使用時要加兩個 如果想要把p定義為陣列應該用 int p 4 array 此時可以直接用 p 1 2 效果等價於 p 1 2 ps 有一點需要注意的是 在C和C 裡,對指標變數的宣告 和 都是識別符號的一部分 我曾經在這裡暈了好久 屠...

關於C語言裡setvbuf和setbuf的疑問?

PJHubs 其實,不單單只是檔案的使用,而是說與緩衝池打交道的場景下都有必要去使用,當然,這是充分不必要條件。尤其你是要把 東西 從外部儲存器中移交給程式使用,當你這段程式多次反覆的呼叫後,系統會將其放入cache 高速緩衝儲存器 中,為啥要放呢?這個場景就跟題主問的問題類似了。之所以要先把檔案先...

關於c 類中的this問題,成員函式過載

薛丁格的貓 我覺得你可能有一點沒搞清楚 this應為Screen const,為一常量指標,所指位址不能改變 位址確實是不可變的,但是指標指向的內容並不是常量,this表示的是指標指向的內容,應該是可以修改的。你可以從這一方面理解一下。 C primer這附近似乎是表述有誤 By default,t...