參考自:
(談談 hash table)
雜湊表是一種資料結構,實現key-value的快速訪問。之前說過陣列可以實現快速隨機訪問,所以雜湊表肯定會使用到陣列。在這裡,我們把每乙個陣列的單元叫做乙個bucket(桶)。雜湊表的大小最好是素數。
雜湊表是乙個在時間和空間上做出權衡的經典例子。如果沒有記憶體限制,那麼可以直接將鍵作為陣列的索引。那麼所有的查詢時間複雜度為o(1);如果沒有時間限制,那麼我們可以使用無序陣列並進行順序查詢,這樣只需要很少的記憶體。雜湊表使用了適度的時間和空間來在這兩個極端之間找到了平衡。只需要調整雜湊函式演算法即可在時間和空間上做出取捨。
雜湊函式
雜湊函式的作用就是將key對映到乙個儲存位址。所以構造乙個雜湊表我們得先構造雜湊函式。 如果乙個key雜湊後對應位址中已經存放了值了,這種情況我們叫做雜湊衝突(hash collisions)。 如果存在乙個雜湊函式,使得每乙個輸入都能對應到唯一的乙個儲存單元中(沒有衝突),那麼這樣的雜湊函式我們可以叫它完美雜湊函式(perfect hash function,簡稱phf)。 但為了雜湊函式簡單,執行速度快,往往不會使用完美雜湊函式。所以衝突肯定會存在的,為了減少衝突,我們希望雜湊函式的結果均勻的分布在位址單元的空間中。這樣可以有效的減少衝突。
裝填因子load factor = 雜湊表的實際元素數目(n) / 雜湊表的容量(m) ,其值越大,雜湊表衝突的概率越大,越接近0,那麼雜湊表的空間就越浪費。
衝突解決
既然衝突不可避免,那麼我們就必須對衝突進行解決(總不能把之前的內容覆蓋掉把), 解決衝突的方式主要分兩類:
開放定址法(open addressing)這種方法就是在計算乙個key的雜湊的時候,發現目標位址已經有值了,即發生衝突了,這個時候通過相應的函式在此位址後面的位址去找,直到沒有衝突為止。這個方法常用的有線性探測( f(i) = i ),二次探測( f(i) = i ^ 2),再雜湊。 這種解決方法有個不好的地方就是,當發生衝突之後,會在之後的位址空間中找乙個放進去,這樣就有可能後來出現乙個key雜湊出來的結果也正好是它放進去的這個位址空間,這樣就會出現非同義詞的兩個key發生衝突。開放定址法下,標準的刪除操作不能被施行,因為相應的單元可能已經引起過衝突,元素繞過它存在了別處。因此開放定址法下我們需要使用懶惰刪除,雖然在這種情況下並不存在真正意義上的懶惰。
分離鏈結法(separate chaining)鏈結法是通過陣列和鍊錶組合而成的。當發生衝突的時候只要將其加到對應的鍊錶中即可。
與開放定址法相比,鏈結法有如下幾個優點:
①鏈結法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;
②由於鏈結法中各煉表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;
③開放定址法為減少衝突,要求裝填因子α較小(0.5左右),故當結點規模較大時會浪費很多空間。而鏈結法中可取α≥1,且結點較大時,鏈結法中增加的指標域可忽略不計,因此節省空間;
④在用鏈結法構造的雜湊表中,刪除結點的操作易於實現。只要簡單地刪去鍊錶上相應的結點即可。而對開放位址法構造的雜湊表,刪除結點不能簡單地將被刪結點的空間置為空,否則將截斷在它之後填人雜湊表的同義詞結點的查詢路徑。這是因為各種開放位址法中,空位址單元(即開放位址)都是查詢失敗的條件。因此在用開放位址法處理衝突的雜湊表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。
當然鏈結法也有其缺點:新增新資料時需要分配空間,出現額外時間花費。
各種查詢演算法的最壞和平均條件下各種操作的時間複雜度如下圖:
資料結構與演算法 演算法 演算法和資料結構
資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...
資料結構 資料結構與演算法01
1 求一組整數中的最大值。演算法 基本操作是 比較兩個數的大小 模型 仔細想想 你並不知道這個整數到底是多大?整數過大你該怎麼去表示?2 足協的資料庫管理的程式 演算法 需要管理的專案?如何管理?使用者介面?模型 3 資料與資料結構 資料 所有能被輸入到計算機中,並被計算機處理的符號的集合計算機操作...
資料結構 資料結構與演算法02
1 演算法設計的原則 設計演算法時,通常應考慮達到以下目標 1,正確性 2,可讀性 3,健壯性 4,高效率與低儲存量需求 1,正確性 規格說明 四個層次 a,程式中不含語法錯誤 b,程式對於幾組輸入資料能夠得出滿足要求的結果 c,程式對精心選擇的 典型 苛刻切帶有刁難性的幾組輸入資料能夠得出滿足要求...