1. 程式人生 > >雜湊表與一致性雜湊

雜湊表與一致性雜湊

雜湊表定義

散列表(Hash table,也叫雜湊表),是根據關鍵碼值(Key value)而直接進行訪問的資料結構。它通過把關鍵碼對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式(雜湊函式),存放記錄的陣列叫做散列表。

優缺點

雜湊表可以提供快速的操作。第一次接觸雜湊表時,它的優點多得讓人難以置信。不論雜湊表中有多少資料,插入和刪除只需要接近0(1)的時間級(由於碰撞衝突的存在,實際時間大於這個值)。在計算機程式中,如果需要在一秒種內查詢上千條記錄通常使用雜湊表(例如拼寫檢查器)。雜湊表的速度明顯比樹快,樹的操作通常需要O(N)的時間級。雜湊表不僅速度快,程式設計實現也相對容易。
當然,雜湊表也有一些缺點。它通常是基於陣列的,陣列建立後難於擴充套件。所以雜湊表被基本填滿時,效能下降得非常嚴重,所以必須要清楚表中將要儲存多少資料(或者準備好定期地把資料轉移到更大的雜湊表中,這是個費時的過程)。而且,也沒有一種簡便的方法可以以任何一種順序〔例如從小到大)遍歷表中的資料項。
綜上,如果不需要有序遍歷資料,井且可以提前預測資料量的大小。那麼雜湊表在速度和易用性方面是無與倫比的。

雜湊查詢

使用雜湊查詢有兩個步驟:

1. 使用雜湊函式將被查詢的鍵轉換為陣列的索引。在理想的情況下,不同的鍵會被轉換為不同的索引值,但是在有些情況下我們需要處理多個鍵被雜湊到同一個索引值的情況。所以雜湊查詢的第二個步驟就是處理衝突。

2. 處理雜湊碰撞衝突。有很多處理雜湊碰撞衝突的方法,下文介紹。

雜湊表是一個在時間和空間上作出權衡的經典例子。如果沒有記憶體限制,那麼可以直接將鍵作為陣列的索引。那麼所有的查詢時間複雜度為O(1);如果沒有時間限制,那麼我們可以使用無序陣列並進行順序查詢,這樣只需要很少的記憶體。雜湊表使用了適度的時間和空間來在這兩個極端之間找到了平衡。只需要根據實際情況,調整雜湊函式即可在時間和空間上做出取捨。

雜湊函式

在雜湊表中,記錄在表中的位置和其關鍵字之間存在著一種確定的關係。這樣我們就能知道所查關鍵字在表中的位置,從而直接通過下標找到記錄。

1.雜湊函式是一個映象,即:將關鍵字的集合對映到某個地址集合上,它的設定很靈活,只要這個地址集合的大小不超出允許範圍即可;

2.由於雜湊函式是一個壓縮映象,因此,在一般情況下,很容易產生“衝突”現象,即: key1!=key2,而  f  (key1) = f(key2)。

3.只能儘量減少衝突而不能完全避免衝突,這是因為通常關鍵字集合比較大,其元素包括所有可能的關鍵字, 而地址集合的元素僅為雜湊表中的地址值。在構造這種特殊的“查詢表” 時,除了需要選擇一個“好”(儘可能少產生衝突)的雜湊函式之外;還需要找到一 種“處理衝突” 的方法。

雜湊函式構造方法

雜湊函式能使對一個數據序列的訪問過程更加迅速有效,通過雜湊函式,資料元素將被更快地定位。一個好的雜湊函式一般應該考慮下列因素:

1.計算簡單,以便提高轉換速度。

2.關鍵詞對應的地址空間分佈均勻,以儘量減少衝突。

(當然也要考慮空間限制)

常見的雜湊函式:

1.   直接定址法

取關鍵字或者關鍵字的某個線性函式值作為雜湊地址,即H(Key)=Key或者H(Key)=a*Key+b(a,b為整數),這種雜湊函式也叫做自身函式.如果H(Key)的雜湊地址上已經有值了,那麼就往下一個位置找,直到找到H(Key)的位置沒有值了就把元素放進去。

例:有一個人口統計表,記錄了從不同年齡的人口數目,其中年齡作為關鍵字,雜湊函式取關鍵字本身。很顯然,當需要查詢某一年齡的人數時,直接查詢相應的項即可。稍微複雜一點,如果我們要統計的是1990後出生的人口數,那麼我們對出生年份這個關鍵字可以用年份減去1990來作為地址。這種雜湊函式簡單,並且對於不同的關鍵字不會產生衝突,但可以看出這是一種較為特殊的雜湊函式,實際生活中,關鍵字的元素很少是連續的。用該方法產生的雜湊表會造成空間大量的浪費,因此這種方法適應性並不強。


2.   數字分析法

分析一組資料,比如一組員工的出生年月,這時我們發現出生年月的前幾位數字一般都相同,因此,出現衝突的概率就會很大,但是我們發現年月日的後幾位表示月份和具體日期的數字差別很大,如果利用後面的幾位數字來構造雜湊地址,則衝突的機率則會明顯降低.因此數字分析法就是找出數字的規律,儘可能利用這些資料來構造衝突機率較低的雜湊地址。這就要求能預先估計出全體關鍵字的每一位上各種數字出現的頻度。


3.   平方取中法

取關鍵字平方後的中間幾位作為雜湊地址。因為這種方法的原理是通過取平方擴大差別,平方值的中間幾位和這個數的每一位都相關,則對不同的關鍵字得到的雜湊函式值不易產生衝突,由此產生的雜湊地址也較為均勻該方法適用於關鍵字中的每一位都有某些數字重複出現頻度很高的現象。


4.   摺疊法

摺疊法是將關鍵字分割成位數相同的幾部分,最後一部分位數可以不同,然後取這幾部分的疊加和(注意:疊加和時去除進位)作為雜湊地址.數位疊加可以有移位疊加和間界疊加兩種方法.移位疊加是將分割後的每一部分的最低位對齊,然後相加;間界疊加是從一端向另一端沿分割界來回摺疊,然後對齊相加。該方法適用於關鍵字特別多的情況。


5.   隨機數法

選擇一個隨機數,作為雜湊地址,通常用於關鍵字長度不同的場合。此時,H(key)=random(key)。

6.   除留餘數法

取關鍵字被某個不大於散列表表長m的數p除後所得的餘數為雜湊地址.即H(Key)=Key MOD p,p<=m.不僅可以對關鍵字直接取模,也可在摺疊、平方取中等運算之後取模。對p的選擇很重要,一般取素數或m,若p選得不好,則很容易產生衝突。


實際造表時,採用何種構造雜湊函式的方法取決於很多因素。另外,雜湊函式也遠遠不止上面的這幾種,只要合理考慮下面這幾個因素的,理論上都可以作為雜湊函式:

l 計算雜湊函式所需時間 (簡單)。

l 關鍵字的長度。

l 雜湊表大小。

l 關鍵分佈情況。

l 記錄查詢頻率

雜湊衝突

通過構造效能良好的雜湊函式,可以減少衝突,但一般不可能完全避免衝突,因此解決衝突是雜湊法的另一個關鍵問題。建立雜湊表和查詢雜湊表都會遇到衝突,兩種情況下解決衝突的方法應該一致。下面以建立雜湊表為例,說明解決衝突的方法。

1.開放定址法

這種方法也稱再雜湊法,其基本思想是:當關鍵字key的雜湊地址p=H(key)出現衝突時,以p為基礎,產生另一個雜湊地址p1,如果p1仍然衝突,再以p為基礎,產生另一個雜湊地址p2,…,直到找出一個不衝突的雜湊地址pi ,將相應元素存入其中。這種方法有一個通用的再雜湊函式形式:Hi=(H(key)+di)%m   i=1,2,…,m-1,其中H(key)為雜湊函式,m 為表長,di稱為增量序列,i為碰撞次數。增量序列的取值方式不同,相應的再雜湊方式也不同。主要有以下幾種:

(1) 線性探測再雜湊

di=1,2,3,…,m-1

這種方法的特點是:衝突發生時,順序查看錶中下一單元,直到找出一個空單元或查遍全表。

(2)二次探測再雜湊

 di=12-1222-22k2-k2    ( k<=m/2 )

這種方法的特點是:衝突發生時,在表的左右進行跳躍式探測,比較靈活。

(3)偽隨機探測再雜湊

di=偽隨機數序列。

在實際程式中應預先用隨機數發生器產生一個隨機序列,將此序列作為依次探測的步長。這樣就能使不同的關鍵字具有不同的探測次序,從而可以避免或減少聚集。

線性探測再雜湊的優點是:只要雜湊表不滿,就一定能找到一個不衝突的雜湊地址,而二次探測再雜湊和偽隨機探測再雜湊則不一定。線性探測再雜湊容易產生“二次聚集”,即在處理同義詞的衝突時又導致非同義詞的衝突。

其實除了上面的幾種方法,開放定址法還有很多變種,不過都是對di有不同的表示方法。(如雙雜湊探測法:di=i*h2(k))

2.再雜湊法

這種方法是同時構造多個不同的雜湊函式:Hi=RHi(key),i=1,2,3,…,n。

當雜湊地址H1=RH1(key)發生衝突時,再計算H2=RH2(key)……,直到衝突不再產生。這種方法不易產生聚集,但增加了計算時間。

 3.鏈地址法(拉鍊法)

這種方法的基本思想是將所有雜湊地址相同的元素構成一個稱為同義詞鏈的單鏈表,並將單鏈表的頭指標存在雜湊表中,因而查詢、插入和刪除主要在同義詞鏈中進行。若選定的散列表長度為m,則可將散列表定義為一個由m個頭指標組成的指標陣列T[0..m-1]。凡是雜湊地址為i的結點,均插入到以T[i]為頭指標的單鏈表中。T中各分量的初值均應為空指標。鏈地址法適用於經常進行插入和刪除的情況。

拉鍊法的優點

與開放定址法相比,拉鍊法有如下幾個優點:

(1)拉鍊法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;

(2)由於拉鍊法中各連結串列上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;

(3)開放定址法為減少衝突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鍊法中理論上可取α≥1,且結點較大時,拉鍊法中增加的指標域可忽略不計,因此節省空間;(散列表的裝填因子定義為:α= 填入表中的元素個數 / 散列表的長度)

注:HashMap預設裝填因子是0.75。

(4)在用拉鍊法構造的散列表中,刪除結點的操作易於實現。只要簡單地刪去連結串列上相應的結點即可。而對開放定址法構造的散列表,刪除結點不能簡單地將被刪結點的空間置為空,否則將截斷在它之後填入散列表的同義詞結點的查詢路徑。這是因為各種開放定址法中,空地址單元都被理解沒有查詢到元素。 因此在用開放定址法處理衝突的散列表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。

拉鍊法的缺點

拉鍊法的缺點是:指標需要額外的空間,故當結點規模較小時,開放定址法較為節省空間,此時將節省的指標空間用來擴大散列表的規模,可使裝填因子變小,這又減少了開放定址法中的衝突,從而提高平均查詢速度。

4、建立公共溢位區

這種方法的基本思想是:將雜湊表分為基本表和溢位表兩部分,凡是和基本表發生衝突的元素,一律填入溢位表(在這個方法裡面是把元素分開兩個表來儲存)。

Java中的equals和hashCode

首先,Java中equals方法和hashCode方法都是Object類中就有的,所以每個物件都是有這兩個方法的,有時候我們需要實現特定需求,可能要重寫這兩個方法。Object類中,equals其實就是比較地址是否相等,而hashCode就是雜湊函式的實現,是native方法,實現邏輯與JVM有關,有些JVM是直接返回物件的儲存地址,但是大多時候並不是這樣,只能說可能和儲存地址有一定關聯。equals和hashCode共同作用,有效支撐了基於雜湊機制的集合類。

由於兩者經常被重寫,這裡說一些重寫的原則。

equals重寫約定

自反性:  x.equals(x) 一定是true。

對null:  x.equals(null) 一定是false。

對稱性:  x.equals(y)和y.equals(x)結果一致。

傳遞性:x.equals(y), 並且y.equals(z),那麼x.equals(z)。

一致性:對於任何非null的引用值x和y,只要equals的比較操作在物件中所用的資訊沒有被修改,多次呼叫x.equals(y)返回結果一致;因此,equals方法裡面不應該依賴任何不可靠的資源。

hashCode重寫約定

在某個執行時期間,只要物件的變化不會影響equals方法的決策結果,那麼,在這個期間,無論呼叫多少次hashCode,都必須返回同一個雜湊碼。

通過equals呼叫返回true的2個物件的hashCode一定一樣。

通過equasl返回false的2個物件的雜湊碼不需要不同,也就是他們的hashCode方法的返回值允許出現相同的情況。

總結一句話:等價的(呼叫equals返回true)物件必須產生相同的雜湊碼。不等價的物件,不要求產生的雜湊碼不相同。

注:關於hashCode的約定,參考雜湊表的定義,就變得很好理解。因為要同時兼顧時間空間,所以允許一定的雜湊衝突,但必須保證等價物件的雜湊值相等(當然雜湊函式還是要儘量減少衝突的)。

為了更好地遵從上面的約定,可以如此規範:重寫了euqls方法的物件必須同時重寫hashCode方法。

雜湊加密演算法

現代通常所說的雜湊演算法,應該區別於雜湊表的建構函式演算法(因為雜湊演算法在此基礎上增加了額外的含義),並廣泛用於密碼學等領域。

密碼學裡面有一類演算法叫做雜湊雜湊演算法,也稱作雜湊演算法、摘要演算法,通常用於對一段資訊的取樣。當你給它一段資訊(message)時,可以用特定演算法生成一段資訊摘要(message digest),通常摘要的長度更短。摘要(digest)可以表示這段資訊的某種特徵——就如同指紋一樣,所以這個特徵也叫做指紋(fingerprint)、校驗。

理想情況下,雜湊演算法應該有四個重要特性(這裡是密碼學中的雜湊演算法):

不可逆:不能從摘要生成其原始資訊

無衝突:不同的資訊具備不同的摘要

易計算:對任意資訊容易計算其摘要

特徵化:資訊修改後其摘要一定變化

實際上,前兩個特性基本無法絕對實現。以流行的MD5舉例,既無法避免彩虹表的存在,也早在2004年就實現了碰撞。截至2015年,這些演算法的生存狀況如圖:


一致性雜湊

一致性雜湊演算法(consistent hashing) ,主要用於釋出式快取中。在一些高速發展的web系統中,傳統的雜湊函式,如hash取模法,存在明顯缺陷。隨著系統訪問壓力的增長,快取系統不得不通過增加機器節點的方式提高叢集的相應速度和資料承載量。增加機器意味著,如果按照hash取模的方式,在增加機器節點的這一時刻,大量的快取不能命中,快取資料需要重新建立,甚至是整體遷移,這一瞬間會給DB帶來極高的系統負載。

判定雜湊演算法好壞的四個定義:

1、平衡性(Balance):平衡性是指雜湊的結果能夠儘可能分佈到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。

2、單調性(Monotonicity):單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的結果應能夠保證原有已分配的內容可以被對映到原有的或者新的緩衝中去,而不會被對映到舊的緩衝集合中的其他緩衝區。

3、分散性(Spread):在分散式環境中,終端有可能看不到所有的緩衝,而是隻能看到其中的一部分。當終端希望通過雜湊過程將內容對映到緩衝上時,由於不同終端所見的緩衝範圍有可能不同,從而導致雜湊的結果不一致,最終的結果是相同的內容被不同的終端對映到不同的緩衝區中。這種情況顯然是應該避免的,因為它導致相同內容被儲存到不同緩衝中去,降低了系統儲存的效率。分散性的定義就是上述情況發生的嚴重程度。好的雜湊演算法應能夠儘量避免不一致的情況發生,也就是儘量降低分散性。

4、負載(Load):負載問題實際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內容對映到不同的緩衝區中,那麼對於一個特定的緩衝區而言,也可能被不同的使用者對映為不同的內容。與分散性一樣,這種情況也是應當避免的,因此好的雜湊演算法應能夠儘量降低緩衝的負荷。

在分散式叢集中,對機器的新增刪除,或者機器故障後自動脫離叢集這些操作是分散式叢集管理最基本的功能。如果採用常用的hash取模演算法,那麼在有機器新增或者刪除後,很多原有的資料就無法找到了,這樣嚴重的違反了單調性原則。接下來主要說明一下一致性雜湊演算法是如何設計的。

以SpyMemcached的ketama演算法來說,思路是這樣的:

環形Hash空間 按照一定的hash演算法來將對應的key雜湊到一個具有2^32個桶的空間中,即0~(2^32)-1的數字空間中。現在我們可以將這些數字頭尾相連,想象成一個閉合的環形。                                                                         
把資料通過一定的hash演算法處理後對映到環上
現在我們將object1、object2、object3、object4四個物件通過特定的Hash函式計算出對應的key值,然後雜湊到Hash環上。
Hash(object1) = key1;
Hash(object2) = key2;
Hash(object3) = key3;
Hash(object4) = key4;
                                                          
將機器通過hash演算法對映到環上 通過使用與物件儲存一樣的Hash演算法將機器也對映到環中(一般情況下對機器的hash計算是採用機器的IP或者機器唯一的別名作為輸入值),然後以順時針的方向計算,將所有物件儲存到離自己最近的機器中。假設現在有NODE1,NODE2,NODE3三臺機器,通過Hash演算法得到對應的KEY值,對映到環中。
Hash(NODE1) = KEY1;
Hash(NODE2) = KEY2;
Hash(NODE3) = KEY3;
                                                            
通過上圖可以看出物件與機器處於同一雜湊空間中,這樣按順時針轉動object1儲存到了NODE1中,object3儲存到了NODE2中,object2、object4儲存到了NODE3中。在這樣的部署環境中,hash環是不會變更的,因此,通過算出物件的hash值就能快速的定位到對應的機器中,這樣就能找到物件真正的儲存位置了。

機器的刪除與新增 普通hash求餘演算法最為不妥的地方就是在有機器的新增或者刪除之後會照成大量的物件儲存位置失效,這樣就大大的不滿足單調性了。下面來分析一下一致性雜湊演算法是如何處理的。 1. 節點(機器)的刪除 以上面的分佈為例,如果NODE2出現故障被刪除了,那麼按照順時針遷移的方法,object3將會被遷移到NODE3中,這樣僅僅是object3的對映位置發生了變化,其它的物件沒有任何的改動。如下圖:                                                              
2. 節點(機器)的新增  如果往叢集中新增一個新的節點NODE4,通過對應的雜湊演算法得到KEY4,並對映到環中,如下圖:                                                              
    通過按順時針遷移的規則,那麼object2被遷移到了NODE4中,其它物件還保持這原有的儲存位置。通過對節點的新增和刪除的分析,一致性雜湊演算法在保持了單調性的同時,還是資料的遷移達到了最小,這樣的演算法對分散式叢集來說是非常合適的,避免了大量資料遷移,減小了伺服器的的壓力。

平衡性 根據上面的圖解分析,一致性雜湊演算法滿足了單調性和負載均衡的特性以及一般hash演算法的分散性,但這還並不能當做其被廣泛應用的原由,因為還缺少了平衡性。下面將分析一致性雜湊演算法是如何滿足平衡性的。hash演算法本身是不保證平衡的,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖),object1儲存到了NODE1中,而object2、object3、object4都儲存到了NODE3中,這樣就照成了非常不平衡的狀態。在一致性雜湊演算法中,為了儘可能的滿足平衡性,其引入了虛擬節點。
“虛擬節點”( virtual node )是實際節點(機器)在 hash 空間的複製品( replica ),實際個節點(機器)對應了若干個“虛擬節點”,這個對應個數也成為“複製個數”,“虛擬節點”在 hash 空間中以hash值排列。 用上文只部署了NODE1和NODE3的情況(NODE2被刪除的圖)為例,之前的物件在機器上的分佈很不均衡,現在我們以2個副本(複製個數)為例,這樣整個hash環中就存在了4個虛擬節點,最後物件對映的關係圖如下:                                                                 
根據上圖可知物件的對映關係:object1->NODE1-1,object2->NODE1-2,object3->NODE3-2,object4->NODE3-1。通過虛擬節點的引入,物件的分佈就比較均衡了。那麼在實際操作中,真正的物件查詢是如何工作的呢?物件從hash到虛擬節點到實際節點的轉換如下圖:                                         
“虛擬節點”的hash計算可以採用對應節點的IP地址加數字字尾的方式。例如假設NODE1的IP地址為192.168.1.100。引入“虛擬節點”前,計算 cacheA的hash值:
Hash(“192.168.1.100”);
引入“虛擬節點”後,計算“虛擬節”點NODE1-1和NODE1-2的hash值:
Hash(“192.168.1.100#1”); // NODE1-1
Hash(“192.168.1.100#2”); // NODE1-2

使用虛擬節點的思想,為每個物理節點(伺服器)在分配100~200個虛擬節點。這樣就能抑制分佈不均勻,最大限度地減小伺服器增減時的快取重新分佈。使用者資料對映在虛擬節點上,就表示使用者資料真正儲存位置是在該虛擬節點代表的實際物理伺服器上。
下圖描述了需要為每臺物理伺服器增加的虛擬節點。x軸表示的是需要為每臺物理伺服器擴充套件的虛擬節點倍數,y軸是實際物理伺服器數。可以看出,當物理伺服器的數量很小時,需要更大的虛擬節點,反之則需要更少的節點,從圖上可以看出,在物理伺服器有10臺時,差不多需要為每臺伺服器增加100~200個虛擬節點才能達到真正的負載均衡。


參考地址:http://baike.baidu.com/

參考地址:http://blog.csdn.net/tanggao1314/article/details/51457585

參考地址:http://blog.csdn.net/qq_21688757/article/details/53861896

參考地址:http://www.linuxidc.com/Linux/2016-01/127239.htm

參考地址:http://blog.csdn.net/cywosp/article/details/23397179

參考地址:http://blog.csdn.net/kongqz/article/details/6695417

相關推薦

一致性

雜湊表定義 散列表(Hash table,也叫雜湊表),是根據關鍵碼值(Key value)而直接進行訪問的資料結構。它通過把關鍵碼對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式(雜湊函式),存放記錄的陣列叫做散列表。 優缺點 雜湊表可以提供快速的

九章演算法筆記 8.堆 Hash & Heap

大綱 cs3k.com 資料結構概述 雜湊表 Hash: a.原理  b.應用 堆 Heap: a.原理    b.應用-優先佇列 Priority Queue  c.替代品-TreeMap   資料結構的兩類問題 cs3k

資料結構之連結串列、陣列

雜湊表 主要描述雜湊表的定義:通過關鍵碼尋找值的資料對映結構,類似於查字典 當存在雜湊衝突時,有兩種常用的方式:開發定址法和鏈地址法 開發定址法通俗的來說就是判斷該地址是否存資料,沒存就放進去,存了就找下一個地址,依次類推,問題是如果空間不足,無法處理衝突。 鏈地

七、字串(小象)

目錄   雜湊表基礎知識 雜湊表定義 1、字元雜湊 2、雜湊表排序整數 3、拉鍊表解決衝突,構造雜湊表 4、STL map中的常用操作 409、最長迴文串 290、單詞模式 49、字母異位詞分組 3、無重複字元的最長子串(滑動視窗的機制) 1

什麼是?什麼是衝突?hashMap的原理?

雜湊表是基於陣列的一種儲存方式.它主要由雜湊函式和陣列構成。 當要儲存一個數據的時候,首先用一個函式計算資料的地址,然後再將資料存進指定地址位置的數組裡面。這個函式就是雜湊函式,而這個陣列就是雜湊表。 雜湊表的優勢在於:相比於簡單的陣列以及連結串列,它能夠根據元素本身在第

查詢、衝突-面試題

雜湊查詢是面試中常見的問題。本文為自己梳理一下知識點。 對於大多數查詢演算法,其查詢效率取決於查詢過程的比較次數。比如二叉查詢樹,二分查詢。而有一種查詢不需要經過元素間的比較,而直接讓表中資料元素的關鍵字與其在記憶體中的儲存位置之間建立關係,在查詢時直接由

[C++]資料結構:散列表()、函式構造、處理衝突

        關鍵字{12,25, 38, 15, 16, 29, 78, 67, 56, 21, 22, 47 } , 對應後位置是 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}。 不過這種方法很容易產生衝突(如果關鍵字餘數大部分相同)。一般地,散列表長為m, 通常p

二叉樹和的優缺點對比選擇

二叉樹(binary tree)和雜湊表(hash table)都是很基本的資料結構,但是我們要怎麼從兩者之間進行選擇呢?他們的不同是什麼?優缺點分別是什麼? 回答這個問題不是一兩句話可以說清楚的,原因是在不同的情況下,選擇的依據肯定也不同。首先來回顧一下這兩個資料結構: 雜湊表使用hash functi

leetcode 771. 寶石石頭【Easy】【

題目: 給定字串J 代表石頭中寶石的型別,和字串 S代表你擁有的石頭。 S 中每個字元代表了一種你擁有的石頭的型別,你想知道你擁有的石頭中有多少是寶石。 J 中的字母不重複,J 和 S中的所有字元都是字母。字母區分大小寫,

一致性、平衡性虛擬節點

https://blog.csdn.net/baidu_30000217/article/details/53671716 一致性雜湊:本臺伺服器逆時針的下一個為上一臺,順時針的下一個為下一臺,考慮一個n臺伺服器組成的環,每臺伺服器直到遇到上一臺伺服器的物件都歸其負責,如果某臺伺服器需要移除,

一致性--分庫分

首先了解一下什麼是一致性雜湊,這裡推薦一篇部落格: http://blog.csdn.net/cywosp/article/details/23397179/ 分庫分表是目前解決單點資料庫一種比較流行的做法,也相對成熟,但都有一個共同的問題,就是隨著業務的增長,之前的分庫分表容量不夠了

java版資料結構演算法—線性探測

package com.zoujc.hash; /** *雜湊表: 優點:速度快(插入和查詢) * 缺點:基於陣列,不能有序遍歷 * 鍵值對:通過鍵訪問值 * 衝突:不同的關鍵字經過雜湊化得到的陣列下標出現了重複 * 解決衝突:1.開放地址法(線性探測

資料結構算法系列15(下)--散列表()

藉助散列表,實現一個高效的LRU快取淘汰演算法 首先,我們先回顧一下只使用連結串列是怎麼實現一個LRU快取淘汰演算法的。 我們需要維護一個按照訪問時間從小到大有序排列的連結串列結構,當我們需要快取一個數據時,首先我們會在連結串列中查詢是否已經存在該資料,如果存在,則將資料移到連結串列的末

資料結構算法系列15(中)--散列表()

如何設計一個雜湊函式? 1.雜湊函式的設計不能太複雜,否則會消耗很多計算時間,也就影響了散列表的效能。 2.雜湊函式生成的值要儘可能的隨機並且均勻分佈,這樣才能最小化雜湊衝突,即便發生衝突,雜湊到每個槽裡的資料也會比較平均,不會出現某個槽裡資料太多的情況。 裝載因子的選擇 上一節

資料結構算法系列15(上)--散列表()

什麼是散列表 散列表的英文是“Hash Table”,也叫“雜湊表”或者“Hash 表”。他是一種根據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。

Hash:概念基本操作

什麼是Hash Hash就像是一個桶排,那隻不過是把各個元素的數值當做下標進行儲存.其最常用的用途就是用來判重.但是,如何對字串進行判重,不可能一個一個往前超,若n上萬則顯然不可行.我們可以選擇進行Hash,將每一個字串或者大數字進行一定的操作即可進行. 對大整數型別進行Hash 取模法 對於每一個

資料結構演算法25-散列表查詢(

散列表查詢(雜湊表) 我們只需要能過某個函式f,使得儲存位置=f(關鍵字) 那樣我們可以通過查詢關鍵字不需要比較就可獲得需要的記錄的儲存位置。這就是一種新的儲存技術-----雜湊技術。 雜湊技術是在記錄的儲存位置和它的關鍵字之間建立一個確定的對應關係f,使得每個關鍵字key對應一個儲存位

分散式DHT和一致性

分散式雜湊(DHT)兩個key point:每個節點只維護一部分路由;每個節點只儲存一部分資料。從而實現整個網路中的定址和儲存。 DHT只是一個概念,提出了這樣一種網路模型。並且說明它是對分散式儲存很有好處的。但具體怎麼實現,並不是DHT的範疇。一致性雜湊: DHT的一種

Mysql千萬資料級分設計及實現方案(2)附一致性原理解析

首先,接著上篇博文:Mysql千萬資料級分表設計及實現方案已經分析了自增id作分表key和全域性服務id(16位)作分表key進行分表的兩種設計方案。自增id優勢在於簡單,直接雜湊取模即可分表完成。根據

資料結構演算法 的特點

#雜湊表1.雜湊表的查詢效率主要取決於構造雜湊表時選取的雜湊函式和處理衝突的方法。2.在各種查詢方法中,平均査找長度與結點個數n無關的查詢方法是雜湊表查詢法。3.雜湊函式取值是否均勻是評價雜湊函式好壞的標準。4.雜湊儲存方法只能儲存資料元素的值,不能儲存資料元素之間的關係。5