1. 程式人生 > >資料結構與演算法總結(六)詞典

資料結構與演算法總結(六)詞典

詞典結構:dict允許多個詞條擁有相同的關鍵碼。詞條為關鍵碼與值的合成結構。

對映結構:map要求不同詞條的關鍵碼互不相同。

例如跳轉表:一種高效的詞典結構,基於列表構造,時間複雜度為O(logn)。就是橫層連結串列代表關鍵碼,縱向列表代表值。一個關鍵碼代表多個一樣的值。

詞典dict操作介面:GET(),PUT(),remove()..

跳轉表:以QUADLIST為基礎,有size(),LEBEL(),PUT,GET,REMOVE.
quadlist為四連表的含義。跳轉表也就是一個連結串列代表層數,每一層也是一個連結串列為quadlist表。
QUADLIST表由quadlistNode節點構成。
quadlistNode節點:有前驅,後繼,上鄰和下鄰四個方向。資料為詞條=關鍵碼和值的構成。
查詢關鍵碼K的操作:
        從頂層quadlist的首節點開始從前往後開始比較其關鍵碼,
        if 不存在後繼,則轉入下一層
        if 存在後繼且後繼的關鍵碼小於目標關鍵碼,則轉向下鄰,下層前進。
        if 存在後繼且後繼的關鍵碼大於目標關鍵碼,則轉向下鄰,下層後退。

散列表:以最基本的向量為底層結構。通過適當的雜湊函式在關鍵碼和向量單元的RANK之間建立對映關係。

雜湊函式構造:桶陣列存放詞條指標。桶陣列容量,詞條容量。
根據關鍵碼可找到桶地址=雜湊函式。
沿關鍵碼對應的桶地址查詢連結串列,找到一致的關鍵碼詞條。

散列表、雜湊函式、衝突排解。

往往直接使用陣列,此時的散列表成為桶陣列。關鍵碼空間到桶陣列地址空間的對映函式為雜湊函式.

hash(key)=rank; A[rank]=value;.根據KEY即可獲得value。

雜湊函式的方法:除餘法- key mod M。MAD法-a*key+b mod M。其中M為素數。偽隨機數法。

衝突排解:多槽位法。每個桶安排多個槽位,可組織為向量或列表。缺點:利用率低。

獨立連法:採用列表實現各子字典。缺點:需要遍歷整個列表查詢資料。

獨立連法:關鍵碼數範圍為R,桶數為M,不同詞條數為N。
R遠大於M,M大於N。
雜湊函式:hash(key)=key % M,M通常為素數。key為整數。

開放定地址策略:線性試探法,平方試探法,再雜湊法等。發現通單元被佔用則試探後一個通單元即可。

線性試探的查詢策略:
1.當前桶單元命中目標關鍵碼,則成功返回。
2.當前通單元非空,但關鍵碼不等,則繼續試探。
3.當前通單元為空,則查詢失敗。
在刪除時會打斷查詢鏈,所以可設定一個標誌位表示該桶儘管為空,但仍是查詢鏈上一員。
確保裝填因子小於0.5,增容量,轉移詞條,釋放原桶陣列。

雜湊碼轉換;關鍵碼經過hashcode()成為雜湊碼,經過hash()成為桶地址。

對於byte,short,int和char可表示為不超過32位整數的資料型別。可直接表示成雜湊碼。

對於字串來說;可用多項式雜湊碼計算。

對long double類的解決辦法為:將高32位和低32位分別看做兩個32位整數,將二者之和作為雜湊碼。
多項式雜湊碼:
            h=0;n=s.length;
            for(i in n):
                h=h<<5;h+=(int)s[i];
                return h;

雜湊應用:桶排序,對於給定範圍內的N個不同的數進行排序。遍歷一遍即可。對於重複的情況即可使用連結串列即可。

桶排序主要是根據關鍵碼進行排序:關鍵碼可比較大小。

1.將關鍵碼視作桶地址,將元素插入散列表中,即可順序遍歷散列表,輸出非空桶中值即可得到排序結果。

2.最終都是要保證元素按照關鍵碼的順序放置在散列表中。每一個key都會對映一個地址,保證key的大小與地址大小一致。最後在遍歷,即可排序。