計算與資料結構篇 雜湊表 Hash

2021-10-02 05:42:41 字數 1314 閱讀 4352

丟擲問題:word 的這個單詞拼寫檢查功能,雖然很小但卻非常實用。你有沒有想過,這個功能是如何實現的呢?

在初學php的時候,第一次聽說hash table乙個特別模糊的概念,今天我們就來詳細的說說它的結構。

雜湊錶用的是陣列支援按照下標隨機訪問資料的特性,所以雜湊表其實就是陣列的一種擴充套件,由陣列演化而來。可以說,如果沒有陣列,就沒有雜湊表。

array

( [name] => stark張宇

[age] => 30

[aihao] => 爬山

)

這就是典型的雜湊思想。其中,name\age 叫作鍵(key)或者關鍵字。我們把參賽編號轉化為陣列下標的對映方法就叫作雜湊函式(或「hash 函式」「雜湊函式」),而雜湊函式計算得到的值就叫作雜湊值(或「hash 值」「雜湊值」)。

通過這個例子,我們可以總結出這樣的規律:雜湊錶用的就是陣列支援按照下標隨機訪問的時候,時間複雜度是 o(1) 的特性。我們通過雜湊函式把元素的鍵值對映為下標,然後將資料儲存在陣列中對應下標的位置。當我們按照鍵值查詢元素時,我們用同樣的雜湊函式,將鍵值轉化陣列下標,從對應的陣列下標的位置取資料。

再好的雜湊函式也無法避免雜湊衝突。那究竟該如何解決雜湊衝突問題呢?我們常用的雜湊衝突解決方法有兩類,開放定址法(open addressing)和鍊錶法(chaining)。

有了前面這些基本知識儲備,我們來看一下開篇的思考題:word 文件中單詞拼寫檢查功能是如何實現的?

常用的英文單詞有 20 萬個左右,假設單詞的平均長度是 10 個字母,平均乙個單詞占用 10 個位元組的記憶體空間,那 20 萬英文單詞大約佔 2mb 的儲存空間,就算放大 10 倍也就是 20mb。對於現在的計算機來說,這個大小完全可以放在記憶體裡面。所以我們可以用雜湊表來儲存整個英文單詞詞典。

當使用者輸入某個英文單詞時,我們拿使用者輸入的單詞去雜湊表中查詢。如果查到,則說明拼寫正確;如果沒有查到,則說明拼寫可能有誤,給予提示。借助雜湊表這種資料結構,我們就可以輕鬆實現快速判斷是否存在拼寫錯誤。

從資料庫取出的資料都是二維的索引資料,不禁會思考,為什麼雜湊表和煉表經常會一起使用?

雜湊表這種資料結構雖然支援非常高效的資料插入、刪除、查詢操作,但是雜湊表中的資料都是通過雜湊函式打亂之後無規律儲存的。也就說,它無法支援按照某種順序快速地遍歷資料。如果希望按照順序遍歷雜湊表中的資料,那我們需要將雜湊表中的資料拷貝到陣列中,然後排序,再遍歷。

因為雜湊表是動態資料結構,不停地有資料的插入、刪除,所以每當我們希望按順序遍歷雜湊表中的資料的時候,都需要先排序,那效率勢必會很低。為了解決這個問題,我們將雜湊表和煉表(或者跳表)結合在一起使用。

資料結構與演算法 雜湊表(hash)

雜湊表是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。給定表m,存在函式f key 對任意給定的關鍵字值key,代入函式後若能得到包含該關鍵字的記錄在表中的位址...

資料結構之雜湊(hash)表

最近看php陣列底層結構,用到了雜湊表,所以還是老老實實回去看結構,在這裡去總結一下。這裡先說一下雜湊 hash 表的定義 雜湊表是一種根據關鍵碼去尋找值的資料對映結構,該結構通過把關鍵碼對映的位置去尋找存放值的地方,說起來可能感覺有點複雜,我想我舉個例子你就會明白了,最典型的的例子就是字典,大家估...

資料結構與演算法篇 hash

python中dict結構用雜湊表構建,採用開放定址法解決雜湊衝突 1 雜湊函式構造方法 自己選擇某種規則,避免衝突 直接定址法 數字分析法 平方取中法 摺疊法 除留餘數法 除數為質數 2 解決衝突方法 待插入的元素按雜湊函式計算得到的位址已經被占用 開放定址法 線性探測再雜湊,位址不斷加1,2,3...