雜湊表結構 基礎理論知識

2022-07-03 01:21:10 字數 3621 閱讀 6779

基礎理論知識

1. 雜湊表的定義

1. 雜湊表是一種根據關鍵碼去尋找值的資料對映結構,該結構通過關鍵碼對映的位置查詢存放值的位置。

2. 雜湊表的結構其實就是陣列,但神奇的地方是對下標值的轉換,這種轉換我們稱之為雜湊函式,

通過雜湊函式可以獲取到hashcode。

2. 雜湊表的重要性

雜湊表是一種重要的資料結構,幾乎所有的程式語言都直接或者間接的用到雜湊表結構

3. 雜湊表的優點

雜湊表是基於陣列實現的,但是相比於陣列,又有很多的優勢

這些優勢包括:

1. 雜湊表在實現 插入-刪除-查詢 的操作時,效率更高

2. 無論儲存了多少資料,插入和刪除的實際複雜度都接近於常數(即o(1))

實際上只需要幾個機器指令即可

3. 雜湊表的速度比樹還要快,基本是瞬間可以查詢到指定元素

4. 雜湊表相對於樹來說,編碼更簡單

4. 雜湊表的缺點

1. 雜湊表中的資料是無序的,不能以一種固定的方式(如從小到大)來便利其中的元素

2. 通常情況下,雜湊表中的key是不允許重複的,不能用相同的key儲存不同的元素

5. 將字串轉換成數字的方案

雜湊表的實現,需要字母的編碼,編碼方式有很多,常見的是utf-8

1. 字母對應數字的累加(陣列下包括太小,容易出現重複)

2. 冪的連乘(產生的陣列下標太大,占用記憶體空間太多)

3. 雜湊化

6. 雜湊表相關的概念

1. 雜湊化:將大數字轉化成陣列範圍內下標的過程恆指為雜湊化

2. 雜湊函式:通常我們將單詞轉化成大數字,大數字在進行雜湊化的**放在乙個函式中,

這個函式就稱之為雜湊函式

3. 雜湊表:最終將資料哈入到這個陣列,對整個結構的封裝,就稱之為雜湊表。

7. 雜湊表存在下標值重複的問題

案例:想將英文單詞全部對映到乙個表中,通過下標來索引。

實現:1. 通常單詞長度不超過10,因此單詞從:aaaaaaaaaa --> zzzzzzzzzz

2. 通過冪的連乘方式進行編碼,產生下標從:1111111111 --> 28888888886

冪的連乘:

cat: 3*10^2 + 1*10^1 + 20

3. 這個下標空間就太大

4. 因此我們使用取餘操作來壓縮空間,即將所有數除以10(也可以是別的數)取餘。

但研所後還是存在不同單詞計算出來的下標是一樣的情況(即下標重複)

8. 解決雜湊表下標重複的問題

兩種解決方案:

1. 鏈位址法(也叫拉鍊法)

1. 每個資料單元儲存的不是單個資料,而是乙個陣列或者鍊錶

2. 比如是鍊錶,每個資料單元儲存著乙個鍊錶,一旦發現重複,就將重複的元素插入道鍊錶的首部或者尾部

3. 當查詢時,先根據雜湊化的下標值找到響應的資料單元位置,在取出鍊錶,依次查詢尋找的資料

2. 開放位址法

工作方式,就是尋找空白的單元格來新增重複的資料

尋找空白單元格的方法:

1. 線性探測:從查詢到的位置,依次往後查詢

注意點:

1. 插入時,本應插入的位置若不為空,則往後依次查詢,直到找到空位置

2. 提取資料時,從本應提取的位置找,如沒找到,依次往後找,遇到空位置則停止查詢

3. 刪除資料時,被刪除位置應設定為乙個特殊的值(如-1),

這樣能保證提取資料時不發生錯誤

存在的問題:聚集

即在一段空間中,連續的儲存單元均被放置了元素,這樣就使得插入,提

取和刪除資料時,每次都要經過長時間的查詢,嚴重影響插入/查詢/刪除操作的效能

2. 二次探測:

1. 二次探測可以嘗試解決線性探測中存在的聚集問題

2. 二次探測主要的優化就是探測時的步長

3. 線性探測是,步長恒為1,從下標x開始,依次探測x+1, x+2, x+3......

4. 二次探測時,步長優化了,從下標x開始,依次探測x+1^2, x+2^2, x+3^2......

這樣一次性探測很長的距離,就可以避免聚集帶來的問題

存在的問題:

連續插入同乙個位置的資料時,由於累加後的步長相同,會造成遠距離位置的聚集

3. 再雜湊法

1. 再雜湊法還是用來解決聚集問題的

2. 設計一種計算方法,產生一種依賴於關鍵字的探測序列

3. 不同的關鍵字輸入進來時,雖然本應查詢的位置相同,但是由於關鍵字不同

再雜湊時,會產生不同的探測序列(即探測步長不一樣),而消除聚集的問題

4. 再雜湊法的特點就是探測步長依賴於關鍵字,用另乙個雜湊函式對關鍵字再做一次雜湊化

雜湊化的結果作為步長

第二次哈稀的特點:

1. 所使用的的雜湊函式與第一次不同

2. 雜湊結果部位0,不然不會向下查詢

再雜湊函式:

計算機專家已經設計出了乙個工作很好的雜湊函式:

setpsize = constant - (key % constant)

其中,constant是乙個常數,並且是乙個質數,並且小於陣列容量

雜湊化的效率:

1. 如果沒有產生衝突(每次查詢到的位置都是空位置,不需要往下查詢),那麼效率會很高

2. 如果發生衝突,訪問事件就依賴於後來探測的長度

3. 平均探測長度以及訪問時間,取決於填裝因子(loader factor),隨著填裝因子的增大,探測長度會變長

4. 隨著填裝因子的增大,效率會下降,但是開放位址法比鏈位址法下降的更快

注:填裝因子 = 已填資料項 / 雜湊表長度

9. 雜湊函式說明

1. 乙個好的雜湊函式,應該盡可能規定額讓計算變得簡單,計算效率提高

雜湊表的主要有點是速度快,如果速度上滿足不了要求,就達不到設計的初衷

提高計算速度的乙個方法就是在雜湊函式中,盡量少用乘法和除法,因為他們的效能是比較低的

2. 乙個好的雜湊函式應具備的優點

1. 快速的計算   

雜湊表的優勢就是能快速獲取到hashcode,

2. 均勻的分布

優秀的雜湊函式可以將對映到同乙個位置的元素均勻的在雜湊表中分布

10. 優秀的雜湊函式使用到的手段

1. 快速計算:霍納法則

在之前的雜湊值計算時,我們用多項式法: 

如,cats = 3 * 10^3 + 1 * 10^2 + 20 * 10^1 + 17

這種多項式計算法可以歸納為:   

p(n) = a(n)*x^n + a(n-1)*x^(n-1) + a(n-2)*x^(n-2) + ...... + a(1)*x + a(0)

這種計算是,使用了

乘法:n + (n-1) + (n-2) + ... + 1 = n(n-1)/2 次

加法: n次

上述計算可以轉換方法: 霍納法則(在中國也叫秦九韶演算法)

p(n) = a(n)*x^n + a(n-1)*x^(n-1) + a(n-2)*x^(n-2) + ...... + a(1)*x + a(0)

= ((...(((an*x + an-1)x + an-2)x + an-3)...)x + a1)x + a0

轉換後,使用了

乘法: n次

加法: n次

2. 均勻分布

2. 在需要使用常數的地方選擇使用質數

基礎理論知識(五)

1.s,d,f,2f的作用分別是什麼?4分 s 通用佔位符 d 整數型別佔位符 f 小數佔位符 2f 保留兩位小數 2.檔案讀寫的三個基本步驟是什麼?3分 open test.txt w 開啟檔案時,如果檔案不存在會有什麼結果?1分 open test.txt r 開啟檔案時,如果檔案不存在會有什麼...

BGP基礎理論知識

bgp 邊界閘道器路由協議,管理as之間路由傳遞 距離向量型,分布式計算 採用tcp來傳遞路由資訊,埠號179,保障可靠性,但是這樣做了就會喪失鄰居自動發現的功能,只能單播建立鄰居,並且可以非直連建立鄰居關係。bgp設計是用來處理as之間的路由協議重點處理as之間的路由,as之內的路由不作為重點,所...

爬蟲 基礎理論知識(一)

4.所有的目標url全部請求完畢,爬蟲結束 搜尋引擎需要遵守robot協議 搜尋引擎的缺點 b.搜尋引擎搜尋的結果千篇一律,沒有辦法根據特定的使用者,獲取特定的資料 c.搜尋引擎搜尋結果99 並沒用 目的 實現不同的系統互聯之間的資料通訊,實現資料的傳輸 2.表示層 3.會話層 4.傳輸層 5.網路...