1. 程式人生 > >數據結構~哈希

數據結構~哈希

相對 對應關系 排序 不能 效率 必須 str 次數 !=

個人學習筆記,僅供自己查閱


哈希表

什麽是哈希表?

  在前面討論的各種結構(線性表、樹等)中,記錄在結構中的相對位置是隨機的,和記錄的關鍵字之間不存在確定的關系,因此,在結構中查找記錄時需進行一系列和關鍵字的比較。這一類查找方法建立在“比較”的基礎上。

  在順序查找時,比較的結果為“=”與“!=”;在折半查找、二叉排序樹查找和B-樹查找時,比較的結果為“<”、“=”和“>” 3種可能。查找的效率依賴於查找過程中所進行的比較次數。

  理想的情況是希望不經過任何比較,一次存取便能得到所查記錄,那就必須在記錄的存儲位置和它的關鍵字之間建立一個確定的對應關系 f,使每個關鍵字和結構中一個唯一的存儲位置相對應。在查找時,只要根據這個對應關系 f 找到給定值K 的像 f(K)。若結構中存在關鍵字和K相等的記錄,則必定在 f(K) 的存儲位置上,由此,不需要進行比較可直接取得所查記錄。在此,我們稱這個對應關系 f 為哈希(Hash)函數,按這個思想建立的表為哈希表。

  • 哈希函數是一個映像,因此哈希函數的設定很靈活,只要使得任何關鍵字由此所得的哈希函數值都落在表長允許範圍之內即可;
  • 對不同的關鍵字可能得到同一哈希地址,即 key1 != key2,而 f(key1) = f(key2),這種現象稱 沖突(collision)。

  在一般情況下,沖突只能盡可能地減少,但不能完全避免。因此,在建造哈希表時不僅要設定一個“好”的哈希函數,而且要設定一種處理沖突的方法。

  根據設定的哈希函數 $H(key)$ 和 處理沖突的方法將一組關鍵字映像到一個有限的連續的地址集(區間)上,並以關鍵字在地址集中的“像” 作為記錄在表中的存儲位置,這種表便稱為哈希表,這一映像過程稱為哈希造表或散列,所得存儲位置稱為哈希地址或散列地址。

數據結構~哈希