C#中的哈希表是通過System.Collections.Hashtable
類實現的
數組:哈希表的基礎結構是一個數組,用于存儲鍵值對。數組的每個元素稱為“桶”(bucket),用于存儲一個或多個鍵值對。
哈希函數:哈希表使用一個哈希函數將鍵轉換為數組的索引。哈希函數接收一個鍵作為輸入,然后返回一個整數,該整數用作數組的索引。理想情況下,哈希函數應該將不同的鍵映射到不同的索引,以減少沖突。
沖突解決:由于哈希函數可能將不同的鍵映射到相同的索引,因此需要一種方法來解決這些沖突。常見的沖突解決方法有鏈地址法(Chaining)和開放地址法(Open Addressing)。
鏈地址法:在每個桶中存儲一個鏈表,當發生沖突時,將新的鍵值對添加到鏈表中。查找、插入和刪除操作需要在鏈表中進行。
開放地址法:當發生沖突時,使用某種探測方法(如線性探測、二次探測或雙散列)在數組中尋找下一個可用的桶。查找、插入和刪除操作需要在數組中進行。
負載因子:負載因子是哈希表中已占用的桶數與總桶數之比。當負載因子達到一定閾值時,哈希表會自動擴容,以保持性能。
擴容:當哈希表的負載因子達到閾值時,哈希表會創建一個更大的數組,并將所有鍵值對重新插入新數組。這樣可以減少沖突,提高性能。
C#的Hashtable
類使用了鏈地址法和擴容機制來實現哈希表。你可以在System.Collections.Hashtable
的源代碼中查看具體實現。