8. 資料結構高階八雜湊表相關概念
「作家當然必須掙錢才能生活,寫作,但是他決不應該為了掙錢而生活,寫作。
-- 馬克思」
前些筆記學習了二叉樹相關。現在我們來看下雜湊表。這篇先來看下雜湊表的相關概念
雜湊表(hashtable)也叫雜湊表,是根據關鍵碼值(key value)而直接進行訪問的資料結構。它通過把關鍵碼值對映到雜湊表中的乙個位置來訪問記錄,以加快查詢的速度。這個對映函式就做雜湊函式,存放記錄的陣列叫做雜湊表。
以資料中每個元素的關鍵字k為自變數,通過雜湊函式h(k)計算出函式值,以該函式值作為一塊連續儲存空間的的單元位址,將該元素儲存到函式值對應的單元中。
雜湊表查詢的時間複雜度
雜湊表儲存的是鍵值對,其查詢的時間複雜度與元素數量多少無關,雜湊表在查詢元素時是通過計算雜湊碼值來定位元素的位置從而直接訪問元素的,因此,雜湊表查詢的時間複雜度為o(1)。
上面這個例子討論的雜湊表是一種理想的情形,即每乙個關鍵字對應乙個唯一的位址。但是有可能出現這樣的情形,兩個不同的關鍵字有可能對應同乙個記憶體位址,即兩個記錄的關鍵值不等,但它們的雜湊函式的值相同,這樣,將導致後放的關鍵字無法存貯,我們把這種現象叫做衝突(collision)。在雜湊存貯中,衝突是很難避免的,除非構造出的雜湊函式為線性函式。雜湊函式選得比較差,則發生衝突的可能性越大。我們把相互發生衝突的關鍵字互稱為「同義詞」。
可表示為h(k)=a.k+b,其中a、b均為常數。
這種方法計算特別簡單,並且不會發生衝突,但當關鍵字分布不連續時,會出現很多空閒單元,將造成大量存貯單元的浪費
對關鍵字序列進行分析,取那些位上數字變化多的、頻率大的作為雜湊函式位址
取關鍵字平方後的中間幾位為雜湊函式位址。這是一種比較常用的雜湊函式構造方法,但在選定雜湊函式時不一定知道關鍵字的全部資訊,取其中哪幾位也不一定合適,而乙個數平方後的中間幾位數和數的每一位都相關,因此,可以使用隨機分布的關鍵字得到雜湊函式位址。
將關鍵字分割成位數相同的幾部分(最後一部分的位數可以不同),然後取這幾部分的疊加和(捨去進製)作為雜湊函式位址,稱為摺疊法。
例如,假設關鍵字為某人身份證號碼430104681015355,則可以用4位為一組進行疊加,即有5355+8101+1046+430=14932,捨去高位,則有h(430104681015355)=4932為該身份證關鍵字的雜湊函式位址。
該方法是用關鍵字序列中的關鍵字k除以乙個整數p所得餘數作為雜湊函式的位址,即
除留餘數法計算簡單,適用範圍廣,是一種最常使用的方法。這種方法的關鍵是選取較理想的p值,使得每乙個關鍵字通過該函式轉換後對映到雜湊空間上任一位址的概率都相等,從而盡可能減少發生衝突的可能性。一般情形下,p 取為乙個素數較理想,並且要求裝填因子α最好是在0.6∽0.9之間,所以p 最好取1.1n∽1.7n之間的乙個素數較好,其中n為雜湊表中待裝元素個數。
選擇乙個隨機函式,取關鍵值的隨機函式值為它的雜湊位址,即 h(key)=random(key)
random()不能是一般的隨機函式,固定的引數必須返回確定的值。
由於雜湊存貯中選取的雜湊函式不是線性函式,將大的關鍵值的取值空間對映到小的位址空間中,故不可避免地會產生衝突,下面給出常見的解決衝突方法。
開放定址法就是從發生衝突的那個單元開始,按照一定的次序,從雜湊表中找出乙個空閒的儲存單元,把發生衝突的待插入關鍵字儲存到該單元中,從而解決衝突的發生。在雜湊表未滿時,處理衝突需要的「下乙個」空位址在雜湊表中解決。
資料結構 線性表相關
1.佇列 queue 是只允許在一端進行插入,而在另一端進行刪除的運算受限的線性表 2.棧 stack 在電腦科學中是限定僅在棧頂進行插入或刪除操作的線性表。3.鍊錶 linked list 是一種常見的基礎資料結構,是一種線性表,是一種物理儲存單元上非連續 非順序的儲存結構。雙向鍊錶也叫雙鏈表 是...
資料結構 順序表相關操作
project sequence list 資料結構 順序表 creatlist sqlist l,int n 引數 順序表l,順序表長度n 功能 建立長度為的順序表 時間複雜度 o n initlist sqlist l 引數 順序表l 功能 初始化 時間複雜度 o 1 insertlist sq...
資料結構 順序表相關演算法
1 include 2 include 3 4 define list init size 100 5 define listincrement 10 6 define overflow 2 7 define ok 1 8 define error 0 9 typedef int elemtype ...