程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 什麼是散列表(哈希表)

什麼是散列表(哈希表)

編輯:.NET實例教程
轉載自http://220.181.18.117/longniao/blog/item/db0f2c1f663e0acba686695e.Html
什麼是散列表(哈希表)
2007-12-05 23:32
散列方法不同於順序查找、二分查找、二叉排序樹及B-樹上的查找。它不以關鍵字的比較為基本操作,采用直接尋址技術。在理想情況下,無須任何比較就可以找到待查關鍵字,查找的期望時間為O(1)。

散列表的概念

1、散列表

     設所有可能出現的關鍵字集合記為U(簡稱全集)。實際發生(即實際存儲)的關鍵字集合記為K(|K|比|U|小得多)。
     散列方法是使用函數h將U映射到表T[0..m-1]的下標上(m=O(|U|))。這樣以U中關鍵字為自變量,以h為函數的運算結果就是相應結點的存儲地址。從而達到在O(1)時間內就可完成查找。
其中:
     ① h:U→{0,1,2,…,m-1} ,通常稱h為散列函數(Hash Function)。散列函數h的作用是壓縮待處理的下標范圍,使待處理的|U|個值減少到m個值,從而降低空間開銷。
     ② T為散列表(Hash Table)。
     ③ h(Ki)(Ki∈U)是關鍵字為Ki結點存儲地址(亦稱散列值或散列地址)。
     ④ 將結點按其關鍵字的散列地址存儲到散列表中的過程稱為散列(Hashing)
  

3、散列表的沖突現象
(1)沖突
     兩個不同的關鍵字,由於散列函數值相同,因而被映射到同一表位置上。該現象稱為沖突(Collision)或碰撞。發生沖突的兩個關鍵字稱為該散列函數的同義詞(Synonym)。
 【例】上圖中的k2≠k5,但h(k2)=h(k5),故k2和K5所在的結點的存儲地址相同。

(2)安全避免沖突的條件
     最理想的解決沖突的方法是安全避免沖突。要做到這一點必須滿足兩個條件:
①其一是|U|≤m
②其二是選擇合適的散列函數。
     這只適用於|U|較小,且關鍵字均事先已知的情況,此時經過精心設計散列函數h有可能完全避免沖突。

(3)沖突不可能完全避免
     通常情況下,h是一個壓縮映像。雖然|K|≤m,但|U|>m,故無論怎樣設計h,也不可能完全避免沖突。因此,只能在設計h時盡可能使沖突最少。同時還需要確定解決沖突的方法,使發生沖突的同義詞能夠存儲到表中。

(4)影響沖突的因素
     沖突的頻繁程度除了與h相關外,還與表的填滿程度相關。
     設m和n分別表示表長和表中填人的結點數,則將α=n/m定義為散列表的裝填因子(Load Factor)。α越大,表越滿,沖突的機會也越大。通常取α≤1。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved