一、hash中的Key和value的區(qū)別
hash中的Key和value本意是鑰匙和值的意思,在應(yīng)用中通常被用作鍵值對,例如在map、json中等。在鍵值對中,key是關(guān)鍵字,value是值,例如:{“firstName”:?“Brett”,?“l(fā)astName”:?“McLaughlin”}。在這個json中,firstName和lastName是key,分別對應(yīng)的value是Brett和McLaughlin。
哈希表基本概念
哈希表(Hash Table):也叫散列表,是根據(jù)關(guān)鍵碼值(Key-Value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu),也就是我們常用到的map。
哈希函數(shù):也稱為是散列函數(shù),是Hash表的映射函數(shù),它可以把任意長度的輸入變換成固定長度的輸出,該輸出就是哈希值。哈希函數(shù)能使對一個數(shù)據(jù)序列的訪問過程變得更加迅速有效,通過哈希函數(shù)數(shù)據(jù)元素能夠被很快的進(jìn)行定位。
若關(guān)鍵字為k,則其值存放在f(k)的存儲位置上。由此,不需比較便可直接取得所查記錄。稱這個對應(yīng)關(guān)系f為哈希函數(shù),按這個思想建立的表為哈希表。
設(shè)所有可能出現(xiàn)的關(guān)鍵字集合記為U(簡稱全集)。實際發(fā)生(即實際存儲)的關(guān)鍵字集合記為K(|K|比|U|小得多)。
散列方法是使用函數(shù)h將U映射到表T[0..m-1]的下標(biāo)上(m=O(|U|))。這樣以U中關(guān)鍵字為自變量,以h為函數(shù)的運算結(jié)果就是相應(yīng)結(jié)點的存儲地址。從而達(dá)到在O(1)時間內(nèi)就可完成查找。
其中:
① h:U→{0,1,2,…,m-1} ,通常稱h為哈希函數(shù)(Hash Function)。哈希函數(shù)h的作用是壓縮待處理的下標(biāo)范圍,使待處理的|U|個值減少到m個值,從而降低空間開銷。
② T為哈希表(Hash Table)。
③ h(Ki)(Ki∈U)是關(guān)鍵字為Ki結(jié)點存儲地址(亦稱散列值或散列地址)。
④ 將結(jié)點按其關(guān)鍵字的哈希地址存儲到哈希表中的過程稱為散列(Hashing)
延伸閱讀:
二、哈希沖突
1)沖突
兩個不同的關(guān)鍵字,由于散列函數(shù)值相同,因而被映射到同一表位置上。該現(xiàn)象稱為沖突(Collision)或碰撞。發(fā)生沖突的兩個關(guān)鍵字稱為該散列函數(shù)的同義詞(Synonym)。
2)安全避免沖突的條件
最理想的解決沖突的方法是安全避免沖突。要做到這一點必須滿足兩個條件:
①其一是|U|≤m
②其二是選擇合適的散列函數(shù)。
這只適用于|U|較小,且關(guān)鍵字均事先已知的情況,此時經(jīng)過精心設(shè)計散列函數(shù)h有可能完全避免沖突。
3)沖突不可能完全避免
通常情況下,h是一個壓縮映像。雖然|K|≤m,但|U|>m,故無論怎樣設(shè)計h,也不可能完全避免沖突。因此,只能在設(shè)計h時盡可能使沖突最少。同時還需要確定解決沖突的方法,使發(fā)生沖突的同義詞能夠存儲到表中。
4)影響沖突的因素
沖突的頻繁程度除了與h相關(guān)外,還與表的填滿程度相關(guān)。
設(shè)m和n分別表示表長和表中填入的結(jié)點數(shù),則將α=n/m定義為散列表的裝填因子(Load Factor)。α越大,表越滿,沖突的機會也越大。通常取α≤1。