雜湊表基本常識 必知必會 理論篇

2021-10-05 17:49:20 字數 2306 閱讀 3082

本博文源於浙江大學《資料結構》。雜湊(hashing)是一種重要的查詢方法。它的基本思想是:以資料物件的關鍵字key為自變數,通過乙個確定的函式關係h,計算出對應的函式值h(key),把這個值解釋為資料物件的儲存位址,並按此存放,即「儲存位置=h(key)」。

在查詢資料物件時,由函式h對給定值key計算出位址,將key與該位址單元中資料物件關鍵字進行比較,確定查詢是否成功。因此,雜湊法又稱為「關鍵字-位址轉換法」。雜湊方法中使用的計算函式稱為雜湊函式(也稱雜湊函式),按這個思想構造的表稱為雜湊表,所以它是一種儲存方法。

一般情況下,設雜湊表空間大小為m,填入表中的元素個數是n,則稱α=n/m為雜湊表的裝填因子,例如大小為17,元素為11,裝填因子為0.65.實用時,常見雜湊表大小設計使得α=0.5~0.8為宜。

對映到同一雜湊位址上的關鍵字稱為同義詞

乙個「好」的雜湊函式一般應考慮下列兩個因素:

這種方法的核心就是利用數字的隨即部分產生雜湊值

這種的方法核心是將ascii碼字元與雜湊表長取mod,衝突比較明顯,比如:tea與eat 單詞換換位置,雜湊值卻相同。

若忽略空格符不計,則前3位所有可能的不同組合有26^3=17 576種,似乎tablesize=10 007是個不錯的選擇,但是英文單詞也是有規則,最多3 000種變換,裝填因子過小,也是浪費。因此,雖然很容易計算,但是當雜湊錶太大的時候,這個函式還是不合適的。

這種方法將所有的字元進行移位做雜湊,很容易產生前幾位溢位。一般用這種方法時,是不使用整個字串,而是從中選擇若干有代表性的字元進行對映。比如字串長度大小大於12的時候,僅選取奇數字置上的字元來實現雜湊函式。

而di的選取又有如下幾種方案

在做插入的時候,最尷尬的就是30,與11取模等於8,也就是把這個位置,因為29存的是時候與7產生衝突,所以存在本應30村的地方,後面不斷發生衝突,最後30只能跑到1中。真的非常扎心,這種線性探測會帶來一定的麻煩。可能會出現很多元素在相鄰的雜湊位址上「堆積」起來的現象,會大大降低查詢效率。解決這種問題的方法是,可採用其他探測法。

使用平方探測,研究學者已經給出乙個強大的理論保證,也就是:如果雜湊表長度tablesize是某個4k+3(k是正整數)形式的素數時,平方探測法就可以探查到整個雜湊表空間。

採用雙雜湊探測法會增加每次探測的乘法和除法運算,但其期望的探測次數比較少,這使得它在理論上很有吸引力。

英文名(rehashing),這個我好像在侯捷老師stl立面講到過,這個方法就是解決裝填因子過大的情況,解決的方法是加倍擴大雜湊表,這樣α可以減小一半,這個過程叫做再雜湊。這種需要擴充可能會出現實時系統的停頓,因此如果一定要實時那就需要「分離鏈結法」

雜湊表主要涉及在查詢上面,避免衝突是他要解決的,衡量效能也從這裡分析,影響產生衝突多少有以下三個因素:

當裝填因子α<0.5的時候,各種探測法的期望探測次數都不大,也比較接近。

隨著α的增大,線性探測法的期望探測次數增加較快,不成功查詢和插入查詢的期望探測次數比成功的期望探測次數要大。因此合理的最大裝入因子α應該不超過0.85

MySQL 基本操作必知必會

一下對mysql操作的介紹以安裝mysql後內建的world資料庫為例 使用某個資料庫 應該首先輸入 use show tables 可以顯示當前使用的資料庫的表名 show columns from 顯示表 中的列 用select關鍵字進行資料檢索 一下例子解釋如何檢索單個列 多個列和全部列 使用...

SQL必知必會 聯結表

sql必知必會 讀書筆記 1.關係表 將這些資料與產品資訊分開儲存的理由市 關鍵是,相同的資料出現多次決不是一件好事,這是關聯式資料庫設計的基礎。關係表的設計就是要把資訊分解成多個表,一類資料乙個表。各表通過共同的值互相關聯 所以才叫關係資料框 所以建立兩個表 乙個儲存 商資訊,另乙個儲存產品資訊。...

MongoDB必知必會 Shell基本操作

mongo help 幫助資訊 nodb shell 1.啟動服務 mongod 2.連線mongodb shell 本地連線localhost 預設埠27017 mongo 指定埠號 mongo port 28000 遠端連線 mongo host 或者mongo host port 或者mong...