陣列
指標鍊錶
模運算(%)
使用雜湊表進行資料儲存,本質上是使用陣列+鍊錶的方式進行儲存。可以這麼理解,陣列中儲存的是乙個個鍊錶的頭指標。
詳細情況會在後面介紹雜湊表構造方式時介紹。
前面講到,雜湊表就是利用陣列和鍊錶進行儲存資料,那什麼樣的陣列+鍊錶可以被稱作雜湊表呢?
雜湊表 = hash函式 + 陣列(+鍊錶)
hash函式的形式
舉乙個簡單的例子,h(key) = key%7,這個函式很容易看懂,就是對輸入的變數取關於7的模。而hash函式就是一系列取模的函式。
hash函式的作用
hash的意譯是雜湊,音譯是雜湊,作用就是對資料進行分類,比如上面的h(key) = key%7 這個函式,就把所有輸入的key分成了7組。
那你可能會想到,如果一組資料中,有兩個資料取模之後的值一樣怎麼辦?這就是我們下面要講的,雜湊值衝突。
什麼是雜湊值衝突?
前面說過了,就不再贅述。
怎麼解決雜湊值衝突?
鍊錶法
所謂鍊錶法,就是在陣列中儲存一條條鍊錶的頭指標,產生雜湊值衝突的時候,就直接新增到鍊錶的末尾就好了。
開放位址法
a. 線性探測法
產生衝突之後,去陣列下乙個位置,看看是不是空的。比如在下標為4的地方衝突了,看看5是不是空的,如果不是,再去看6,直到找到乙個空的位置。
b. 平方探測法
產生衝突之後,第一次去下乙個位置,第二次去向後數22的地方看看是不是空的。還是以 h(key) = key%7 這個函式為例,如果在1產生了衝突,先去2看看,不為空就去5看看,還不為空就去3看看(陣列迴圈)……
c. 雙雜湊
h1(key) = key%7
h2(key) = 5 - (key%5)
h2是只在產生衝突的時候使用,比如乙個資料塊的key是2,儲存這個資料的時候在2這裡產生了衝突,那麼向下找5 - (key%5) = 3個位置,在5這裡看看是不是可以儲存,如果不行,就向下找2*3 = 6個位置,去1這裡……
注意,h2的模要比h1小,並且選的***取模數字一定是質數***
資料結構 雜湊表
1.雜湊表的定義 元素的儲存位置和它的關鍵碼之間建立乙個確定的對應關係h,使得每個關鍵碼key和唯一的儲存位置h key 相對應。在查詢時,根據這個確定的對應關係找到給定值k的對映h k 若查詢集合中存在這個記錄,則必定在h k 的位置上,這種查詢技術稱為雜湊技術。採用雜湊技術將記錄儲存在一塊連續的...
資料結構 雜湊表
雜湊表的定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把 關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的 速度。這個對映函式叫做雜湊函式,存放 記錄的陣列叫做雜湊表。雜湊函式的析構方法 餘數法 取關鍵字被某個不大於雜...
資料結構 雜湊表
3 雜湊函式 數字分析法 根據關鍵碼在各個位上的分布情況,選取分布比較均勻的若干位組成雜湊位址。適用情況 能預先估計出全部關鍵碼的每一位上各種數字出現的頻度,不同的關鍵碼集合需要重新分析。4 雜湊函式 平方取中法 對關鍵碼平方後,按照雜湊表大小,取中間的若干位作為雜湊位址 平方後擷取 適用情況 實現...