1. 程式人生 > >資料結構 索引結構與雜湊

資料結構 索引結構與雜湊

知識要點:

線性索引結構、倒排表、靜態搜尋樹的結構和特點;

B樹的結構;(B-樹,B+樹

雜湊的實現原理和各種操作的實現演算法。(Hash表,平均查詢長度(成功、失敗)

1.雜湊函式和雜湊地址:記錄存取位置P和關鍵字Key之間的對應關係,有P=Function(Key),這個對應關係Function稱為雜湊函式

通過此函式得出的P稱為雜湊地址。

2.散列表:一個有限的連續的地址空間。(通常採用以為陣列存取,此時的雜湊地址對應的就是陣列的下標,陣列內

儲存的值就是關鍵字Key。)

3.衝突和同義詞:由於雜湊函式的缺陷不同的關鍵字Key可能對應到同一雜湊地址上,這種現象稱為衝突。發生衝突的關鍵字互

稱為當前雜湊函式Function的同義詞。(雜湊函式的缺陷引發衝突,發生衝突的關鍵詞互為同義詞

☆雜湊函式的構造方法:(數字分析法、平方取中法、摺疊法、除留餘數法)

常用的就是除留餘數法,Function(Key)=Key%p

Key為所要儲存的關鍵字、p為一個不大於散列表長度的數,一幫情況下p取不大於表長的最大質數

優點:保證了關鍵字所對應的雜湊地址一定在散列表所對應的地址空間中。

☆衝突的處理方法:(開放地址法:線性探測法、二次探測法、偽隨機探測法;鏈地址法)

開放地址法:以空間為代價,散列表大小固定

函式原型:Function(Key)=(Function(Key)+d)%m,Key為關鍵字、m為散列表長、d為遞增量

當d=1時--》線性探測法,當d=1,-1,4,-4,...k*k,-k*k(k<=m/2)時--》二次探測法,當d=偽隨機數時--》偽隨機探測法

二次聚集(堆積)處理同義詞衝突過程中有增添了非同義詞衝突。處理衝突時的方法缺陷引起了聚集現象

鏈地址法:散列表動態增長(不會發生二次聚集現象

思想把具有相同雜湊地址的關鍵字放在同一個連結串列中。m個雜湊地址對應著m個單鏈表。

☆☆☆散列表查詢效能的分析以及平均查詢長度:

查詢的影響因素(雜湊函式、處理衝突的方法、散列表的填裝因子)

1.填裝因子A的定義(散列表裝滿的程度):

  A=已填充的記錄數/散列表長度,A越小發生衝突的可能性就越小、A越大發生衝突的可能性就越大。

(記憶)不同處理衝突方法的平均查詢長度:平均查詢長度的大小與記錄個數n無關,雜湊列表的填裝因子有關。

線性探測法:增量為1;成功:1/2 (1+1/(1-A))            失敗:1/2 (1+1/(1-A)^2)

二次探測法:增量正負交替,按照平方進行;成功:-1/A ln(1-A)                 失敗:1/(1-A)

鏈地址法:無增量,在同一鏈式地址下面;成功:1+A/2               失敗:A+e^-A

在已知平均查詢成功長度和查詢表的儲存元素個數可以求出散列表長度

2.平均查詢長度:(在查詢概率相同的情況下)

查詢成功:

查詢成功平均比較次數=各個關鍵字的比較次數之和/關鍵字個數,

ASL(success)=1/n(C1+C2+.....+Cn) Cn為查詢到第n個記錄所需要進行比較的次數,n為表中記錄個數。

查詢失敗:

查詢失敗對應的兩種情況。1)查詢單元為空NULL。2)按照處理衝突的方法探測一遍之後仍未找到。

假設雜湊函式取值的個數為r,則0--r-1相當於有r個查詢失敗的入口,從每個入口進入到失敗為止,其關鍵字的比較次數

就是與該入口對應的查詢失敗的查詢長度。

ASL(default)=1/r(C1+C2+.....+Cr) Cr為雜湊函式取值為r時查詢失敗比較次數,r為雜湊函式取值個數。

例題:使用雜湊函式H(key)-key%11,將資料{1,13,12,34,38,33,27,22}加入散列表中,

採用線性探測法(增長因子d為1):

下標 0 1 2 3 4 5 6 7 8 9 10
雜湊值 33 1 13 12 34 38 27 22
比較次數 1 1 1 3 4 1 2 8

查詢成功的平均比較次數:(1*4+3+4+2+8)/8=21/8;

查詢失敗的比較次數:(3+(2+9)*4)/11=47/11;(雜湊地址空間內的元素查詢)

B-樹定義:要麼為空樹、要麼為滿足下列性質的m叉樹;

                  1)樹中至多每個結點有m個子樹;

                  2)如果根結點不是葉子結點,則根結點至少有兩顆子樹;

                  3)除了根結點以外的其他非終端結點至少有m/2上取整顆子樹;

                  4)所有的葉子結點必然在同一層次上,而且不攜帶有資訊,通常稱為失敗結點;

                  5)所有非終端結點至多有m-1個關鍵字;

性質:平衡(所有葉子結點均在同一層次上)、有序(結點內部關鍵字大小有序)、多路(m叉樹);

總結:m叉樹,每個結點最多有m-1個關鍵字;至少有m/2上取整-1個關鍵字;

          (結點數k,(m/2)-1<=k<=m-1

           樹的最大分支數(關鍵字的個數+1)決定了該樹的階數;

B-樹的查詢類似於分塊查詢和順序查詢:查詢順序從根結點開始,由上至下查詢關鍵字所在結點的位置,在每個結點內部

採用順序查詢的方式查詢關鍵字,如果查到葉子結點則表明查詢失敗。

B-樹的插入:(由上到下查詢插入結點位置)

在最底層某個非終端結點新增一個關鍵字,如果插入後此結點關鍵字個數小於等於m-1則插入成功;

如果大於m-1則將此結點以中間關鍵字為界限一分為二,並將中間關鍵字移入雙親結點上,如果雙親結點已滿,

則按照同樣的方法進行分裂;

B-樹的刪除:1)被刪關鍵字所在結點內關鍵字數目不小於m/2上取整,則直接去掉與其對應的指標即可(直接刪除)

                      2)被刪關鍵字所在結點關鍵字數目等於m/2上取整減1,而與其相鄰的右(左)兄弟結點中的關鍵字個數

                            大於m/2上取整減1,則將其兄弟結點中的最大(最小)的關鍵字上移至雙親結點中,而將雙親節點中

                            而將雙親結點中大於(小於)且緊靠該上移關鍵字的關鍵字下移至被刪關鍵字所在的結點位置。

                      3)被刪關鍵字所在結點和其相鄰兄弟結點的關鍵字數目均小於m/2上取整減1。假設該結點有左右兄弟,

                            且其右兄弟結點地址由雙親結點中的指標P所指,則在刪除關鍵字之後,它所在結點中剩餘關鍵字

                            和指標,加上雙親結點中的關鍵字K一起合併到,P所指的兄弟結點中去(若沒有右兄弟,則合併到左兄弟中) 

B-樹的應用:磁碟管理系統的目錄管理、資料庫系統中的索引組織管理;

B+樹的定義:1)有n顆子樹結點含有n個關鍵字;

                       2)所有葉子結點中包含了全部關鍵字資訊,以及指向含這些關鍵字記錄的指標,且葉子結點本身

                             關鍵字的大小自小而大順序連線;

                       3)非終端結點可以看成索引部分,結點中僅含有其子樹(根結點)中最大(最小)的關鍵字;