哈希表(Hash Table):高效能的鍵值對數據結構
哈希表(Hash Table) 哈希表是一種高效率的數據結構,能夠以接近 O(1) 的時間複雜度進行數據查找、插入和刪除操作。它廣泛應用於數據庫索引、快取系統、符號表等場景,是現代編程中最重要的數據結構之一。 基本原理 哈希表基於「鍵值對」(key-value pair)的概念,它使用一個特殊的函數(哈希函數)將鍵轉換為數組索引,然後將值存儲在該索引位置。 核心組件 哈希函數:將鍵轉換為數組索引的函數 數組:存儲數據的物理結構 衝突解決策略:處理不同鍵產生相同索引的情況 哈希函數 好的哈希函數應當滿足以下特性: 計算速度快 分布均勻,最小化衝突 確定性,相同輸入產生相同輸出 一個簡單的哈希函數示例(針對字符串): int hash(char* key, int table_size) { unsigned int hash_value = 0; while (*key) { hash_value = (hash_value * 31) + *key++; } return hash_value % table_size; } 衝突解決 當兩個不同的鍵產生相同的哈希值(稱為「衝突」)時,我們需要有策略來解決這個問題: 1. 鏈接法(Chaining) 每個數組位置存儲一個鏈表,所有哈希到同一位置的元素都放入這個鏈表中。 [0] -> (key1, value1) -> (key4, value4) [1] -> (key2, value2) [2] -> (key3, value3) -> (key5, value5) -> (key6, value6) 2. 開放尋址法(Open Addressing) 當發生衝突時,查找數組中的另一個位置來存儲元素。常見的方法有: 線性探測:檢查下一個位置,再下一個,依此類推 二次探測:使用二次函數計算探測序列 雙重哈希:使用第二個哈希函數計算步長 哈希表操作的時間複雜度 操作 平均情況 最壞情況 查找 O(1) O(n) 插入 O(1) O(n) 刪除 O(1) O(n) 最壞情況發生在所有鍵都哈希到同一位置時。 ...