CHAP9查找[修復的]_第1頁
CHAP9查找[修復的]_第2頁
CHAP9查找[修復的]_第3頁
CHAP9查找[修復的]_第4頁
CHAP9查找[修復的]_第5頁
已閱讀5頁,還剩162頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、121. 查找表和查找查找表和查找(1)查找表)查找表是由是由同一類型同一類型的數據的數據元素元素(或記錄或記錄)構成的構成的集合集合。 由于由于“集合集合”中的數據元素之間中的數據元素之間存在著松散的關系,因此查找表是存在著松散的關系,因此查找表是一種應用靈便的結構。一種應用靈便的結構。查找的基本概念查找的基本概念 3關鍵字:關鍵字:是數據元素(或記錄)中某是數據元素(或記錄)中某個個數據項數據項的值,用以的值,用以標識標識(識別)一(識別)一個數據元素(或記錄)。個數據元素(或記錄)。(2)關鍵字)關鍵字 若此關鍵字可以識別若此關鍵字可以識別唯一的唯一的一個記一個記錄,則稱之為錄,則稱之為

2、“主關鍵字主關鍵字”。4 根據給定的某個值,在查找表中根據給定的某個值,在查找表中確定一個確定一個其關鍵字等于給定值的數據元素或其關鍵字等于給定值的數據元素或(記錄記錄).(3)查找)查找 若查找表中存在這樣一個記錄,則稱若查找表中存在這樣一個記錄,則稱“查找成功查找成功”,查找結果:,查找結果:給出整個記錄給出整個記錄的信息,或指示該記錄在查找表中的位置的信息,或指示該記錄在查找表中的位置; 否則稱否則稱“查找不成功查找不成功”,查找結果:,查找結果:給給出出“空記錄空記錄”或或“空指針空指針”。5 由于查找表中的數據元素之間不存在明由于查找表中的數據元素之間不存在明顯的組織規(guī)律,因此不便于

3、查找。顯的組織規(guī)律,因此不便于查找。 為了提高查找的效率,需要在查找表中為了提高查找的效率,需要在查找表中的元素之間人為地的元素之間人為地 附加某種確定的關系,附加某種確定的關系,換句話說,換句話說,用另外一種結構來表示查找表用另外一種結構來表示查找表。(4)如何進行查找)如何進行查找查找的方法取決于查找表的結構。查找的方法取決于查找表的結構。6(5)查找的操作)查找的操作1)查詢查詢某個某個“特定的特定的”數據元素是否數據元素是否在查找表中;在查找表中;2)檢索檢索某個某個“特定的特定的”數據元素的各數據元素的各種屬性;種屬性;3)在查找表中)在查找表中插入插入一個數據元素;一個數據元素;4

4、)從查找表中)從查找表中刪去刪去某個數據元素。某個數據元素。7僅作僅作查詢查詢和和檢索檢索操作的查找表。操作的查找表。靜態(tài)靜態(tài)查找查找有時在查詢之后,還需要將有時在查詢之后,還需要將“查詢查詢”結結果為果為“不在查找表中不在查找表中”的數據元素的數據元素插入插入到到查找表中;或者,從查找表中查找表中;或者,從查找表中刪除刪除其其“查詢查詢”結果為結果為“在查找表中在查找表中”的數據的數據元素。元素。動態(tài)動態(tài)查找查找2.2.查找的查找的類型類型8 定義:定義:(Average Search Length) 3.3.平均查找長度平均查找長度niiiCPASL1iP為查找第i個記錄的概率iC查找到第

5、i個記錄時,已比較的次數99.1 靜態(tài)靜態(tài)查找查找9.2 動態(tài)動態(tài)查找查找9.3 哈哈希查找希查找109.1 靜靜 態(tài)態(tài) 查查 找找 11typedef struct ElemType *elem; int length; / 表的長度表的長度 SSTable;假設靜態(tài)查找表靜態(tài)查找表的順序存儲結構順序存儲結構:數據元素類型的定義為數據元素類型的定義為: :typedef struct keyType key; / 關鍵字域關鍵字域 / 其它屬性域其它屬性域 ElemType , TElemType ;129.1.1 順序順序查找查找9.1.2 有序有序查找查找9.1.3 索引索引順序順序13

6、 以線性表的順序存儲以線性表的順序存儲結構表示靜態(tài)查找表。結構表示靜態(tài)查找表。鏈表與之類似。鏈表與之類似。9.1.1 順序順序查找查找141. 順序查找的基本思想順序查找的基本思想 從表的一端開始,從表的一端開始,順序掃描線性順序掃描線性表,依次將掃描到的結點關鍵宇和給表,依次將掃描到的結點關鍵宇和給定值定值K相比較。相比較。若當前掃描到的結點若當前掃描到的結點關鍵字與關鍵字與K相等,則查找成功;若掃相等,則查找成功;若掃描結束后,仍未找到關鍵字等于描結束后,仍未找到關鍵字等于K的的結點,則查找失敗。結點,則查找失敗。1521 37 88 19 92 05 64 56 80 75 13 0 1

7、 2 3 4 5 6 7 8 9 10 11 ST.LengthST.elem例如:例如:假設給定值假設給定值 e=64,要求要求 ST.elemk = e, 問問: k = ?kk16int location( SqList L, ElemType& e, Status (*compare)(ElemType, ElemType) k = 1; p = L.elem; while ( k=L.length & !(*compare)(*p+,e) k+; if ( k=1;i-) for(i=ST.length;i=1;i-) if ( ST.elemi.key=keyST.

8、elemi.key=key) return i; return 0; 2.經典順序查找算法經典順序查找算法1821 37 88 19 92 05 64 56 80 75 13 0 1 2 3 4 5 6 7 8 9 10 11 ST.LengthST.elemi21 37 88 19 92 05 64 56 80 75 13 0 1 2 3 4 5 6 7 8 9 10 11 ST.LengthST.elemi60ikey=64key=60i64改進改進(加哨兵加哨兵)19int Search_Seq(SSTable ST, KeyType key) / 在順序表ST中順序查找其關鍵字等于 /

9、 key的數據元素。若找到,則函數值為 / 該元素在表中的位置,否則為0。 ST.elem0.key = key; / “哨兵” for (i=ST.length; ST.elemi.key!=key; -i); / 從后往前找 return i; / 找不到時,i為0 / Search_Seq,不需要每次和長度比較不需要每次和長度比較3.改進順序查找算法改進順序查找算法20在在等概率等概率查找的情況下,查找的情況下, 順序表查找的平均查找長度順序表查找的平均查找長度為:為:對對順序表順序表而言,而言,Ci = n-i+1(i=1n)nPi121111n)i(nnASLnissASL = nP

10、1 +(n-1)P2 + +2Pn-1+Pn4.算法分析算法分析niiiCPASL121 若查找概率無法事先測定,則查若查找概率無法事先測定,則查找過程采取的改進辦法是,找過程采取的改進辦法是,在每次查找在每次查找之后,將剛剛查找到的記錄直接移至表之后,將剛剛查找到的記錄直接移至表尾的位置上。尾的位置上。在在不等概率查找不等概率查找的情況下的情況下,ASLss 在在 PnPn-1P2P1時時取極小值。取極小值。22(1 1)優(yōu)點)優(yōu)點 算法簡單,算法簡單,且對表的結構無任何且對表的結構無任何要求,無論是用順序還是用鏈表來存放要求,無論是用順序還是用鏈表來存放結點,也無論結點之間是否按關鍵字有結

11、點,也無論結點之間是否按關鍵字有序,它都同樣適用。序,它都同樣適用。(2 2)缺點)缺點查找效率低,查找效率低,因此,當因此,當n n較大時不較大時不宜采用順序查找。宜采用順序查找。5.順序查找的優(yōu)缺點順序查找的優(yōu)缺點23 二分查找要求:二分查找要求:線性表是有序表,線性表是有序表,即表中結點按關鍵字有序,并且要用即表中結點按關鍵字有序,并且要用順序存儲結構。順序存儲結構。9.1.2 有序有序查找查找 若以若以有序表有序表表示靜態(tài)查找表,則查表示靜態(tài)查找表,則查找過程可以基于找過程可以基于“折半折半”進行。稱為進行。稱為二分查找或折半查找。二分查找或折半查找。241.二分查找的基本思想二分查找

12、的基本思想設設Rlow.highRlow.high是當前的查找區(qū)間是當前的查找區(qū)間 (1 1)首先確定該區(qū)間的中點位置;)首先確定該區(qū)間的中點位置;mid=(low+high)/2mid=(low+high)/2 (2 2)然后將待查的)然后將待查的K K值與值與Rmid.keyRmid.key比較:比較:若相等,則查找成功并返回此位置,否則若相等,則查找成功并返回此位置,否則須確定新的查找區(qū)間,繼續(xù)二分查找。須確定新的查找區(qū)間,繼續(xù)二分查找。 25若若Rmid.keyKRmid.keyK,則由表的有序性可知則由表的有序性可知Rmid.n.keysRmid.n.keys均大于均大于K K,因此

13、若表中存在關鍵,因此若表中存在關鍵字等于字等于K K的結點,的結點,則該結點必定是在位置則該結點必定是在位置midmid左左邊的子表邊的子表R1.mid-1R1.mid-1中中,故新的查找區(qū)間是左,故新的查找區(qū)間是左子表子表R1.mid-1R1.mid-1。類似地,類似地,若若Rmid.keyKRmid.keyK,則要查找的則要查找的K K必在必在midmid的右子表的右子表Rmid+1.nRmid+1.n中,中,即新的查找區(qū)間即新的查找區(qū)間是右子表是右子表Rmid+1.nRmid+1.n。下一次查找是針對新的。下一次查找是針對新的查找區(qū)間進行的。查找區(qū)間進行的。二分查找的基本思想二分查找的基

14、本思想2605 13 19 21 37 56 64 75 80 88 92 0 1 2 3 4 5 6 7 8 9 10 11 ST.elemST.length例如例如: key=64 的查找過程如下lowhighmidlow mid high midlow 指示查找區(qū)間的下界指示查找區(qū)間的下界; ;high 指示查找區(qū)間的上界指示查找區(qū)間的上界; ;mid = (low+high)/2。27int Search_Bin ( SSTable ST, KeyType key ) low = 1; high = ST.length; / 置區(qū)間初值 while (low = high) mid =

15、 (low + high) / 2; if (EQ (key , ST.elemmid.key) ) return mid; / 找到待查元素 else if ( LT (key , ST.elemmid.key) ) high = mid - 1; / 繼續(xù)在前半區(qū)間進行查找 else low = mid + 1; /繼續(xù)在后半區(qū)間進行查找return 0; / 順序表中不存在待查元素 / Search_Bin2.二分查找的算法二分查找的算法28先看一個具體的情況,假設:先看一個具體的情況,假設:n=113.二分查找判定樹二分查找判定樹63914-11-22-33-44-55-66-77-8

16、8-99-1010-1111-25781011i123456789 10 11Ci1223333444429(1 1)二分查找判定樹的組成及其查找)二分查找判定樹的組成及其查找圓結點即樹中的內部結點。圓結點即樹中的內部結點。樹中圓結點內的數樹中圓結點內的數字表示該結點在有序表中的位置。字表示該結點在有序表中的位置。外部結點:圓結點中的所有空指針均用一個虛外部結點:圓結點中的所有空指針均用一個虛擬的方形結點來取代,即外部結點。擬的方形結點來取代,即外部結點。樹中某結點樹中某結點i i與其左與其左( (右右) )孩子連接的左孩子連接的左( (右右) )分分支上的標記支上的標記“ ”表示:表示:當待

17、查關鍵字當待查關鍵字KRi.keyKRi.key )時,應走左)時,應走左( (右右) )分支到達分支到達i i的左的左( (右右) )孩子,將該孩子的關鍵字進一步和孩子,將該孩子的關鍵字進一步和K K比較。比較。若相等,則查找過程結束返回,否則繼續(xù)將若相等,則查找過程結束返回,否則繼續(xù)將K K與樹中與樹中更下一層的結點比較。更下一層的結點比較。3063914-11-22-33-44-55-66-77-88-99-1010-1111-25781011所經過的內部結點為所經過的內部結點為6 6、9 9、1010,最后到達方形結,最后到達方形結點點9-109-10,其比較次數為,其比較次數為3 3

18、。例如:查找例如:查找k85,31假設假設 n=2h-1 并且查找概率相等并且查找概率相等則則 在在n50時,可得近似結果時,可得近似結果 (2)二分查找的平均查找長度)二分查找的平均查找長度 一般情況下,表長為一般情況下,表長為 n 的折半查找的的折半查找的判定樹的深度和含有判定樹的深度和含有 n 個結點的完全二叉?zhèn)€結點的完全二叉樹的深度樹的深度h相同。相同。1) 1(log12112111nnnjnCnASLhjjniibs1) 1(log2nASLbs324.二分查找的優(yōu)點和缺點二分查找的優(yōu)點和缺點雖然雖然二分查找的效率高二分查找的效率高,但是要將表按關但是要將表按關鍵字排序。鍵字排序。

19、而排序本身是一種很費時的運算。而排序本身是一種很費時的運算。既使采用高效率的排序方法也要花費既使采用高效率的排序方法也要花費O(nlgn)的的時間。時間。二分查找只適用順序存儲結構。二分查找只適用順序存儲結構。為保持表為保持表的有序性,在順序結構里插入和刪除都必須移的有序性,在順序結構里插入和刪除都必須移動大量的結點。因此,動大量的結點。因此,二分查找特別適用于那二分查找特別適用于那種一經建立就很少改動、而又經常需要查找的種一經建立就很少改動、而又經常需要查找的線性表。線性表。339.1.3索引查找索引查找(分塊查找分塊查找)1.分塊分塊查找查找分塊有序的線性表分塊有序的線性表+索引表索引表兩

20、部分組成。兩部分組成。012345678910 11 12 1317 08 21 19 14 31 33 22 25 40 52 61 78 4621 040 578 10順序表順序表索引表索引表索引順序表的特點:索引順序表的特點:塊內無序塊內無序,塊間有序。塊間有序。342.索引查找的思想索引查找的思想(1)由索引確定記錄所在區(qū)間)由索引確定記錄所在區(qū)間索引表是有序表,可采用索引表是有序表,可采用二分查找二分查找或或順序查找順序查找,以確定待查的結點在哪一,以確定待查的結點在哪一塊。塊。(2)在確定的區(qū)間內進行查找)在確定的區(qū)間內進行查找由于塊內無序,只能用順序查找。由于塊內無序,只能用順序

21、查找。 351 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1822 12 13 8 9 20 33 42 44 38 24 48 60 58 74 57 86 5322 48 861 7 13索引表索引表查查38例如:例如:查查7036索引順序查找的平均查找長度索引順序查找的平均查找長度 = 查找查找“索引索引”的平均查找長度的平均查找長度 + 查找查找“順序表順序表”的平均查找長度的平均查找長度3.3.算法分析算法分析37ASLbs =Lb+Lw 其中:其中:Lb索引查找長度,索引查找長度,Lw塊中查找長度,塊中查找長度,每塊含每塊含s個記錄,個記錄,B

22、=n/s 1s)sn(2121s21bjs1jb1ASLs1ib1jbs2) 1(log2ssnASLbs(2)用折半查找確定所在的塊)用折半查找確定所在的塊(1)用順序查找確定所在的塊)用順序查找確定所在的塊38【例例】若表中有若表中有1000010000個結點,則應把它分成個結點,則應把它分成100100個塊,每塊中含個塊,每塊中含100100個結點。分別計算順序個結點。分別計算順序查找、二分查找和索引查找的平均查找長度。查找、二分查找和索引查找的平均查找長度。(2)二分查找)二分查找(1)順序查找)順序查找ASL=(n+1)/2=5001ASL=log2(n+1)-1=14(3)索引查找

23、)索引查找ASL2=log2(n/s+1)+s/2=57ASL1=(n/s+s)/2+1=10139查找方法比較查找方法比較ASL最大最大最小最小兩者之間兩者之間表結構表結構有序表有序表.無序表無序表 有序表有序表分塊有序表分塊有序表存儲結構存儲結構順序結構順序結構線性鏈表線性鏈表順序結構順序結構順序結構順序結構線性鏈表線性鏈表順序查找順序查找折半查找折半查找 分塊查找分塊查找409.2 動動 態(tài)態(tài) 查查 找找 419.2.1 二叉排序樹(二叉查找樹)二叉排序樹(二叉查找樹)9.2.2 平衡二叉樹平衡二叉樹429.2.1 二叉排序樹二叉排序樹(二叉查找樹)(二叉查找樹)1定義定義4查找算法查找

24、算法5插入算法插入算法6刪除算法刪除算法7查找性能的分析查找性能的分析2特點特點3存儲結構存儲結構43(1)若它的左子樹不空,則)若它的左子樹不空,則左子樹上左子樹上 所有所有結點的值結點的值均小于均小于根結點的值;根結點的值;1 1定義定義 二叉排序樹二叉排序樹或者是一棵空樹;或者或者是一棵空樹;或者是具有如下特性的二叉樹:是具有如下特性的二叉樹:(3)它的左、右子樹)它的左、右子樹也都也都分別分別是二叉是二叉 排序樹排序樹。(2)若它的右子樹不空,則)若它的右子樹不空,則右子樹上右子樹上 所有所有結點的值結點的值均大于均大于根結點的值;根結點的值;445030802090108540352

25、52388例如例如:是二叉排序樹。是二叉排序樹。66不不452 2、二叉排序樹的特點、二叉排序樹的特點(1 1) 二叉排序樹中任一結點二叉排序樹中任一結點x x,其左,其左( (右右) )子樹子樹中任一結點中任一結點y(y(若存在若存在) )的關鍵字必小的關鍵字必小( (大大) )于于x x的關的關鍵字。鍵字。(2 2) 二叉排序樹中,各結點關鍵字是惟一的。二叉排序樹中,各結點關鍵字是惟一的。(3 3) 按中序遍歷該樹所得到的按中序遍歷該樹所得到的中序序列是一個中序序列是一個遞增有序序列遞增有序序列。503080209010854035252388463.3.二叉排序樹的存儲結構二叉排序樹的存

26、儲結構typedef struct BiTNode / 結點結構結點結構 TElemType data; struct BiTNode *lchild, *rchild; / 左右孩子指針 BiTNode, *BiTree;474二叉排序樹的查找算法二叉排序樹的查找算法1)若給定值)若給定值等于等于根結點的關鍵字,則查根結點的關鍵字,則查找成功;找成功;2)若給定值)若給定值小于小于根結點的關鍵字,則繼根結點的關鍵字,則繼續(xù)在左子樹上進行查找;續(xù)在左子樹上進行查找;3)若給定值)若給定值大于大于根結點的關鍵字,則繼根結點的關鍵字,則繼續(xù)在右子樹上進行查找。續(xù)在右子樹上進行查找。否則否則若二叉排

27、序樹若二叉排序樹為空為空,則查找不成功;,則查找不成功;4850308020908540358832例如例如:二叉排序樹二叉排序樹查找關鍵字查找關鍵字= 50 ,505035 ,503040355090 ,50809095 49從上述查找過程可見,從上述查找過程可見,在查找過程中,生成了一條在查找過程中,生成了一條查找路徑查找路徑: 從根結點出發(fā),沿著左分支或右分支從根結點出發(fā),沿著左分支或右分支逐層向下直至關鍵字等于給定值的結點逐層向下直至關鍵字等于給定值的結點;或者或者 從根結點出發(fā),沿著左分支或右分支從根結點出發(fā),沿著左分支或右分支逐層向下直至指針指向空樹為止。逐層向下直至指針指向空樹為

28、止。 查找成功查找成功 查找不成功查找不成功50Status SearchBST (BiTree T, KeyType key, BiTree f, BiTree &p ) / 在根指針在根指針 T 所指二叉排序樹中遞歸地查找其所指二叉排序樹中遞歸地查找其 / 關鍵字等于關鍵字等于 key 的數據元素,若的數據元素,若查找成功查找成功, / 則返回指針則返回指針 p 指向該數據元素的結點,并返回指向該數據元素的結點,并返回 / 函數值為函數值為 TRUE; / SearchBST 否則表明否則表明查找不成功查找不成功,返回,返回 / 指針指針 p 指向查找路徑上訪問的最后一個結點,指向

29、查找路徑上訪問的最后一個結點, / 并返回函數值為并返回函數值為FALSE, 指針指針 f 指向當前訪問指向當前訪問 / 的結點的雙親,其初始調用值為的結點的雙親,其初始調用值為NULL遞歸算法描述如下:遞歸算法描述如下:51if (!T)else if ( EQ(key, T-data.key) ) else if ( LT(key, T-data.key) ) else p = f; return FALSE; / 查找不成功查找不成功 p = T; return TRUE; / 查找成功SearchBST (T-lchild, key, T, p ); / 在左子樹中繼續(xù)查找Search

30、BST (T-rchild, key, T, p ); / 在右子樹中繼續(xù)查找5230201040352523fT設設 key = 48fTfT22pfTfTTTTfffp53非遞歸算法描述如下:非遞歸算法描述如下:Status Search_BST (BiTree T, KeyType key, BiTree &p ) / 在根指針在根指針 T 所指二叉排序樹中查找其所指二叉排序樹中查找其 / 關鍵字等于關鍵字等于 key 的數據元素,若的數據元素,若查找成功查找成功, / 則返回指針則返回指針 p 指向該數據元素的結點,并返回指向該數據元素的結點,并返回 / 函數值為函數值為 TR

31、UE; / Search_BST 否則表明否則表明查找不成功查找不成功,返回,返回 / 指針指針 p 指向查找路徑上訪問的最后一個結點,指向查找路徑上訪問的最后一個結點, / 并返回函數值為并返回函數值為FALSE54P=T;While( p) if ( EQ(key, p-data.key) ) return TRUE; / 查找成功查找成功else if ( LT(key, p-data.key) ) p=p-lchild; / 在左子樹中繼續(xù)查找在左子樹中繼續(xù)查找 else p=p-rchild; / 在右子樹中繼續(xù)查找在右子樹中繼續(xù)查找/end whilereturn FALSE; /

32、查找不成功查找不成功55 根據動態(tài)查找表的定義,根據動態(tài)查找表的定義,“插入插入”操作在查找不成功時才進行操作在查找不成功時才進行; ;5 5二叉排序樹的插入算法二叉排序樹的插入算法 若二叉排序樹為空樹,則新插入的若二叉排序樹為空樹,則新插入的結點為新的根結點;否則,結點為新的根結點;否則,新插入新插入的結點必為一個新的葉子結點,的結點必為一個新的葉子結點,其其插入位置由查找過程得到。插入位置由查找過程得到。56Status Insert BST(BiTree &T, ElemType e ) / 當二叉排序樹中不存在關鍵字等于當二叉排序樹中不存在關鍵字等于 e.key 的的 / 數據

33、元素時,插入元素值為數據元素時,插入元素值為 e 的結點,并返的結點,并返 / 回回 TRUE; 否則,不進行插入并返回否則,不進行插入并返回FALSE if (!SearchBST ( T, e.key, NULL, p ) else return FALSE; / Insert BST 57s = new BiTNode; / 為新結點分配空間s-data = e; s-lchild = s-rchild = NULL; if ( !p ) T = s; / 插入 s 為新的根結點else if ( LT(e.key, p-data.key) ) p-lchild = s; / 插入 *s

34、 為 *p 的左孩子else p-rchild = s; / 插入 *s 為 *p 的右孩子return TRUE; / 插入成功58(1)被刪除的結點被刪除的結點是葉子是葉子;(2)被刪除的結點被刪除的結點只有左子樹只有左子樹或者或者只有右子樹只有右子樹;(3)被刪除的結點被刪除的結點既有左子樹,也有右子樹既有左子樹,也有右子樹。6二叉排序樹的刪除算法二叉排序樹的刪除算法可分可分三種情況三種情況討論:討論:和插入相反,刪除在查找成功之后進行,和插入相反,刪除在查找成功之后進行,并且要求在刪除二叉排序樹上某個結點之并且要求在刪除二叉排序樹上某個結點之后,仍然保持二叉排序樹的特性。后,仍然保持二

35、叉排序樹的特性。5950308020908540358832(1)被刪除的結點是)被刪除的結點是葉子結點葉子結點例如例如:被刪關鍵字被刪關鍵字 = 2088其雙親結點中相應指針域的值改為其雙親結點中相應指針域的值改為“空空”6050308020908540358832(2)被刪除的結點被刪除的結點只有左子樹只有左子樹或者只有右子樹只有右子樹 其雙親結點的相應指針域的值改為其雙親結點的相應指針域的值改為 “指向被刪除結點的左子樹或右子樹指向被刪除結點的左子樹或右子樹”。被刪關鍵字被刪關鍵字 = 40806150308020908540358832(3)被刪除的結點)被刪除的結點既有左子樹,也有右

36、子樹既有左子樹,也有右子樹4040以其前驅替代之,然以其前驅替代之,然后再刪除該前驅結點后再刪除該前驅結點被刪結點被刪結點前驅結點前驅結點被刪關鍵字被刪關鍵字 = 5062Status DeleteBST (BiTree &T, KeyType key ) / 若二叉排序樹若二叉排序樹 T 中存在其關鍵字等于中存在其關鍵字等于 key 的的 / 數據元素,則刪除該數據元素結點,并返回數據元素,則刪除該數據元素結點,并返回 / 函數值函數值 TRUE,否則返回函數值,否則返回函數值 FALSE if (!T) return FALSE; / 不存在關鍵字等于key的數據元素 else /

37、 DeleteBST算法描述如下:算法描述如下: 63if ( EQ (key, T-data.key) ) / 找到關鍵字等于key的數據元素else if ( LT (key, T-data.key) ) else Delete (T); return TRUE; DeleteBST ( T-lchild, key ); / 繼續(xù)在左子樹中進行查找DeleteBST ( T-rchild, key ); / 繼續(xù)在右子樹中進行查找64void Delete ( BiTree &p ) / 從二叉排序樹中刪除結點 p, / 并重接它的左子樹或右子樹 if (!p-rchild) el

38、se if (!p-lchild) else / Delete其中刪除操作刪除操作過程如下所描述: 65 / 右子樹為空樹則只需重接它的左子樹右子樹為空樹則只需重接它的左子樹q = p; p = p-lchild; delete(q);pp66/ 左子樹為空樹只需重接它的右子樹左子樹為空樹只需重接它的右子樹q = p; p = p-rchild; delete(q);pp67q = p; s = p-lchild;while (s-rchild) q = s; s = s-rchild; / s 指向被刪結點的前驅/ 左右子樹均不空左右子樹均不空p-data = s-data;if (q !=

39、 p ) q-rchild = s-lchild; /s有右子樹else q-lchild = s-lchild;/s無右子樹 / 重接*q的左子樹delete(s);pqs687查找性能的分析查找性能的分析 對于每一棵特定的二叉排序樹,對于每一棵特定的二叉排序樹,均可按照平均查找長度的定義來求它均可按照平均查找長度的定義來求它的的 ASL 值,顯然,由值相同的值,顯然,由值相同的 n 個關個關鍵字,構造所得的不同形態(tài)的各棵二鍵字,構造所得的不同形態(tài)的各棵二叉排序樹的平均查找長叉排序樹的平均查找長 度的值不同,度的值不同,甚至可能差別很大。甚至可能差別很大。69由關鍵字序列由關鍵字序列 3,1

40、,2,5,4構造而得的二叉排序樹構造而得的二叉排序樹由關鍵字序列由關鍵字序列 1,2,3,4,5構造而得的二叉排序樹,構造而得的二叉排序樹,例如:例如:2134535412ASL =(1+2+3+4+5)/ 5 = 3ASL =(1+2+3+2+3)/ 5 = 2.270 下面討論平均情況下面討論平均情況: 不失一般性,假設長度為不失一般性,假設長度為 n 的序列中有的序列中有 k 個關鍵字個關鍵字小于小于第一個關鍵字,則必有第一個關鍵字,則必有 n-k-1 個關鍵字個關鍵字大于大于第一個關鍵字第一個關鍵字,由它構造的二由它構造的二叉排序樹叉排序樹n-k-1k的平均查找長度是的平均查找長度是

41、n 和和 k 的函數的函數P(n, k) ( 0 k n-1 )71 假設假設 n 個關鍵字可能出現的個關鍵字可能出現的 n! 種排列種排列的可能性相同,則含的可能性相同,則含 n 個關鍵字的二叉?zhèn)€關鍵字的二叉排序樹的平均查找長度排序樹的平均查找長度10),(1)(nkknPnnPASL在在等概率等概率查找的情況下,查找的情況下,CnnnnPlog12)(729.2.2平衡二叉樹平衡二叉樹1. “平衡二叉樹平衡二叉樹”2. 失衡的類型及調整方法失衡的類型及調整方法3. “平衡二叉樹平衡二叉樹”的插入的插入4. “平衡二叉樹平衡二叉樹”查找性能分析查找性能分析731.平衡二叉樹平衡二叉樹(AVL

42、樹樹)定義:平衡二叉樹又稱定義:平衡二叉樹又稱AVL樹,是二叉排序樹,是二叉排序樹的另一種形式。它或者是一棵空樹,或者樹的另一種形式。它或者是一棵空樹,或者是具有下列性質的二叉樹:是具有下列性質的二叉樹:它的左子樹和右它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值不超過深度之差的絕對值不超過1。1RLhh結點的平衡因子:結點的平衡因子: 該結點的左子樹高度減去它的右子樹高度。即:該結點的左子樹高度減去它的右子樹高度。即:74例如例如:548254821是平衡樹是平衡樹不是平衡樹不是平衡樹失去平衡的最小子樹失去平衡的最小子樹75平衡二叉

43、樹存儲結構平衡二叉樹存儲結構Typedef struct BSTNodeElemTypedata;intbf; /平衡因子平衡因子 struct BSTNode *lchild,*rchild;BSTNode,*BSTree;762.失衡的類型及調整方法失衡的類型及調整方法 (1)失衡的類型)失衡的類型54242586774265894258678LL型型:定義失去平衡的最小子樹根節(jié)點定義失去平衡的最小子樹根節(jié)點為為a,則該類不平衡可歸納為,在,則該類不平衡可歸納為,在a的左子的左子樹根節(jié)點的左子樹上插入導致的不平衡可樹根節(jié)點的左子樹上插入導致的不平衡可使用單向右旋平衡處理,可以記為使用單向右

44、旋平衡處理,可以記為左左左左-右右。(2 2)失衡的類型及調整方法)失衡的類型及調整方法5410543102543000右旋右旋79可歸納為可歸納為LLLL型型- -右旋右旋2ABBLBRh-1h1ARh-10h-1ABBLBRh-1hAR0在單向右旋平衡處理后在單向右旋平衡處理后BF(B)BF(B)由由1 1變變?yōu)闉? 0,BF(A)BF(A)由由2 2變?yōu)樽優(yōu)? 0。80RR型型:在在a的右子樹根節(jié)點的右子樹上的右子樹根節(jié)點的右子樹上插入導致的不平衡可使用單向左旋平衡處插入導致的不平衡可使用單向左旋平衡處理,可以記為理,可以記為右右右右-左左。左旋左旋43580-10-1435819000

45、0-143581900-1-2-281可歸納為可歸納為RRRR型型- -左旋左旋在單向左旋平衡處理后在單向左旋平衡處理后BF(B)BF(B)由由-1-1變?yōu)樽優(yōu)? 0,BF(A)BF(A)由由-2-2變?yōu)樽優(yōu)? 0。ABBRBLh-1h-1-2ALh-1ABBRALh-1h0BLh-1082LR型型:在在3的左子樹根節(jié)點的左子樹根節(jié)點1的右子樹上的右子樹上插入節(jié)點插入節(jié)點2導致不平衡,可使用雙向旋轉:導致不平衡,可使用雙向旋轉:先使其子樹左旋再整棵樹右旋,可記為左先使其子樹左旋再整棵樹右旋,可記為左右右-左右。左右。先左旋先左旋458190003211-12045819000321211045

46、8190003002010后右旋后右旋83可歸納為可歸納為LRLR型型在雙向旋轉平衡處理后在雙向旋轉平衡處理后BF(A)BF(A)由由2 2變?yōu)樽優(yōu)?1-1,BF(B)BF(B)由由-1-1變?yōu)樽優(yōu)? 0,BF(C)BF(C)由由1 1變?yōu)樽優(yōu)? 0。CACLARh-1h-12CRh-21BBL-1h-1BLh-1CLh-1B0C0CRh-2AARh-1-184RL型:型:在在19的右子樹根節(jié)的右子樹根節(jié)點點25的左子樹上插入節(jié)點的左子樹上插入節(jié)點23導致不平衡,導致不平衡,可使用雙向旋可使用雙向旋轉:先使其子樹右旋再整棵轉:先使其子樹右旋再整棵樹左旋,可記為右左樹左旋,可記為右左-右左。右左

47、。先右旋先右旋后左旋后左旋45819-2-2030-2201025231045819-2-2030-220102325-10458230-1030201025190085可歸納為可歸納為RLRL型型在雙向旋轉平衡處理后在雙向旋轉平衡處理后BF(A)BF(A)由由-2-2變?yōu)樽優(yōu)? 0,BF(B)BF(B)由由1 1變?yōu)樽優(yōu)?1,BF(C)-1,BF(C)由由1 1變?yōu)樽優(yōu)? 0。ABRh-1-2CCLh-1CRh-21BAL1h-1ALh-1CLh-1A0C0CRh-2BBR-186旋轉操作特點旋轉操作特點(1)(1)對不平衡的最小子樹操作。對不平衡的最小子樹操作。(2)(2)旋轉后子樹根節(jié)點

48、平衡因子為旋轉后子樹根節(jié)點平衡因子為0 0。(3)(3)旋轉后子樹深度不變故不影響全旋轉后子樹深度不變故不影響全樹,也不影響插入路徑上所有祖先結樹,也不影響插入路徑上所有祖先結點的平衡度。點的平衡度。87例如例如:依次插入的關鍵字為依次插入的關鍵字為5, 4, 2, 8, 6, 95424258665842向右旋轉向右旋轉一次一次先向右旋轉先向右旋轉再向左旋轉再向左旋轉88426589642895向左旋轉一次向左旋轉一次繼續(xù)插入關鍵字繼續(xù)插入關鍵字 9893.3.平衡二叉樹插入算法思想平衡二叉樹插入算法思想(1)(1)若是空樹,插入節(jié)點作為根節(jié)點,樹若是空樹,插入節(jié)點作為根節(jié)點,樹深度加深度加

49、1 1。(2)(2)插入節(jié)點插入節(jié)點keykey值等于根節(jié)點值等于根節(jié)點keykey值,則值,則不插入。不插入。(3)(3)插入節(jié)點插入節(jié)點keykey值小于根節(jié)點值小于根節(jié)點keykey值,插值,插入在左子樹上,左子樹深加入在左子樹上,左子樹深加1 1并且:并且:90插入在左子樹上情況插入在左子樹上情況1 1左子樹深度左子樹深度 右子樹深度右子樹深度LLLL型型插入前若根節(jié)點平衡因子為插入前若根節(jié)點平衡因子為1,1,插入后其插入后其左子樹的平衡因子為左子樹的平衡因子為1 1(左左),則單(左左),則單向右旋,旋轉后根節(jié)點和右子樹的平衡向右旋,旋轉后根節(jié)點和右子樹的平衡因子改為因子改為0 0,

50、樹深不變。,樹深不變。ABBLBRh-1h12ARh-1ABBLBRh-1h0ARh-1093插入在左子樹上的情況插入在左子樹上的情況4 4左子樹深度左子樹深度 右子樹深度右子樹深度LRLR型型插入前若根節(jié)點平衡因子為插入前若根節(jié)點平衡因子為1,1,插入后左子樹的插入后左子樹的平衡因子為平衡因子為-1-1(左右),則先左旋再右旋,旋(左右),則先左旋再右旋,旋轉后根節(jié)點和其左子樹的平衡因子改為轉后根節(jié)點和其左子樹的平衡因子改為0 0,右,右子樹的平衡因子改為子樹的平衡因子改為-1,-1,樹深不變。樹深不變。CACLARh-1h-12CRh-21BBL-1h-1BLh-1CLh-1B0C0CRh

51、-2AARh-1-194(4)(4)插入節(jié)點插入節(jié)點keykey值大于根節(jié)點值大于根節(jié)點keykey值,值,插入在右子樹上,方法類似第插入在右子樹上,方法類似第3 3步。步。95 在平衡樹上進行查找的過程和二叉在平衡樹上進行查找的過程和二叉排序樹相同,因此,排序樹相同,因此,查找過程中和給定查找過程中和給定值進行比較的關鍵字的個數不超過平衡值進行比較的關鍵字的個數不超過平衡 樹的深度。樹的深度。.平衡二叉樹的查找性能分析平衡二叉樹的查找性能分析 問:含問:含 n 個關鍵字的二叉平衡樹個關鍵字的二叉平衡樹可能達到的最大深度是多少?可能達到的最大深度是多少?96n = 0空樹空樹最大深度為最大深度

52、為 0n = 1最大深度為最大深度為 1n = 2最大深度為最大深度為 2n = 4最大深度為最大深度為 3n = 7最大深度為最大深度為 4先看幾個具體情況:97反過來問,深度為深度為 h 的二叉平衡樹平衡樹中所含結點的最小值含結點的最小值 Nh 是多少?h = 0N0 = 0h = 1h = 2h = 3一般情況下,一般情況下,N1 = 1N2 = 2N3 = 4Nh = Nh-1 + Nh-2 + 1利用歸納法可證得,利用歸納法可證得, Nh = Fh+2 - 1Fh+2 h/ 5 其中:其中: = (1+ 5 )/298 因此,在二叉平衡樹上進行查找時,因此,在二叉平衡樹上進行查找時,

53、查找過程中和給定值進行比較的關鍵字查找過程中和給定值進行比較的關鍵字的個數和的個數和 log(n) 相當相當。 由此推得,深度為由此推得,深度為 h 的二叉平衡樹的二叉平衡樹中所含結點的最小值中所含結點的最小值 Nh = h+2/5 - 1 反之,含有反之,含有 n 個結點的二叉平衡樹能個結點的二叉平衡樹能達到的最大深度達到的最大深度 hn = log ( 5 (n+1) - 2 999.2.3、 B - 樹樹1定義定義2查找查找3插入插入4刪除刪除5查找性能的分析查找性能的分析100(1)樹中每個結點至多有樹中每個結點至多有m棵子樹;棵子樹;(2)若根結點不是葉結點,則至少有兩棵子若根結點不

54、是葉結點,則至少有兩棵子樹;樹;(3)除根之外的所有非終端結點至少有除根之外的所有非終端結點至少有 m/2 棵子樹;棵子樹;m m階階B-B-樹或為空樹樹或為空樹, ,或為滿足下列特性或為滿足下列特性m m叉樹叉樹1B-樹的定義樹的定義101(4)(4)所有非終端結點中包含下列信息:所有非終端結點中包含下列信息:(n,A0,K1,A1,K2,A2,(n,A0,K1,A1,K2,A2,Kn,An),Kn,An)其中:其中:KiKi為關鍵字,且均自小至大有序排為關鍵字,且均自小至大有序排列,即:列,即:K1 K2 K1 K2 Kn Kn ; Ai Ai為指向子樹根結點的指針,且指針為指向子樹根結點

55、的指針,且指針Ai-1Ai-1所指子樹上所有關鍵字均小于所指子樹上所有關鍵字均小于Ki Ki ; An An 所指子樹上所有關鍵字均大于所指子樹上所有關鍵字均大于Kn Kn ;(5 5)樹中所有葉子結點均不帶信息,且在)樹中所有葉子結點均不帶信息,且在樹中的同一層次上。樹中的同一層次上。102例如:例如:4階階B-樹樹 root 50 15 71 84 3 8 20 26 43 56 62 78 89 96103 從根結點出發(fā),從根結點出發(fā),沿指針搜索結點沿指針搜索結點和和在在結點內進行順序(或折半)查找結點內進行順序(或折半)查找 兩個過程兩個過程交叉進行。交叉進行。2.查找查找 若若查找成

56、功查找成功,則返回指向被查關鍵字所,則返回指向被查關鍵字所在在結點的指針結點的指針和和關鍵字在結點中的位置關鍵字在結點中的位置;若若查找不成功查找不成功,則返回插入位置,則返回插入位置。104例如:查找例如:查找78,26,60 root 50 15 71 84 3 8 20 26 43 56 62 78 89 96105在查找不成功之后,需進行插入。在查找不成功之后,需進行插入。顯然,顯然,關鍵字插入的位置必定在最下關鍵字插入的位置必定在最下層的非葉結點層的非葉結點,有下列幾種情況:,有下列幾種情況:3插入插入(1)插入后,該結點的關鍵字個數插入后,該結點的關鍵字個數nm, 不修改指針不修改

57、指針; ; 例如例如106(2)插入后,該結點的關鍵字個數插入后,該結點的關鍵字個數 n=m, 則則需進行需進行“結點分裂結點分裂”,令,令 s = m/2 , 在原結點中保留在原結點中保留 (A0,K1,。,。, Ks-1,As-1);); 建新結點建新結點 (As,Ks+1,。,。 ,Kn,An);); 將(將(Ks,p)插入雙親結點)插入雙親結點;例如例如(3)若雙親為空,則若雙親為空,則建新的根結點建新的根結點。 例如例如107例如例如:下列為下列為 3 階階B-樹樹50 20 40 80 插入關鍵字插入關鍵字 = 60, 60 80 90, 60 80 90 90 50 80 60

58、30 40 20 30 50 808030 50108節(jié)點分裂的一般規(guī)律:節(jié)點分裂的一般規(guī)律:假設假設p p節(jié)點中已有節(jié)點中已有m-1m-1個關鍵字,當插入一個關鍵字,當插入一個關鍵字之后,節(jié)點中信息為:個關鍵字之后,節(jié)點中信息為: m,Am,A0 0,(K,(K1 1,A,A1 1),(K),(K2 2,A,A2 2),),(K,(Km m,A,Am m) )其中其中K Ki i K Ki+1i+1 ,1 1imim。 以中間關鍵字為界以中間關鍵字為界, ,把結點一分為二把結點一分為二為兩個結點,并把中間的關鍵字向上插入為兩個結點,并把中間的關鍵字向上插入到父結點上,若父結點已滿,用通樣的方

59、到父結點上,若父結點已滿,用通樣的方法繼續(xù)分裂結點。法繼續(xù)分裂結點。109 和插入的考慮相反,首先必須找到待刪和插入的考慮相反,首先必須找到待刪關鍵字所在結點,并且要求刪除之后,結關鍵字所在結點,并且要求刪除之后,結點中點中關鍵字的個數不能小于關鍵字的個數不能小于 m/2 -1,否則,否則,要從其左要從其左(或右或右)兄弟結點兄弟結點“借調借調”關鍵字,關鍵字,若其左和右兄弟結點均無關鍵字可借若其左和右兄弟結點均無關鍵字可借(結結點中只有最少量的關鍵字點中只有最少量的關鍵字),則必須進行結則必須進行結點的點的“合并合并”。4刪除刪除110如在如在3 3階階B-B-樹中依次刪除關鍵字樹中依次刪除

60、關鍵字12,5012,50,5353,3737,分為三種情況,分為三種情況45abt24b53 90e3 12c37d50f61 70g100h3階階B-樹樹11145abt24b53 90e3 c37d50f61 70g100h(1)(1)被刪關鍵字被刪關鍵字(12)(12)所在節(jié)點所在節(jié)點(c)(c)中的關鍵中的關鍵字數目不小于字數目不小于 m/2m/2 -1-1,則只須從該節(jié)點,則只須從該節(jié)點(c)(c)中刪去該關鍵字中刪去該關鍵字(12)(12)和相應指針,和相應指針,樹的其他部分不變。樹的其他部分不變。刪除關鍵字刪除關鍵字121212112(2 2)被刪關鍵字)被刪關鍵字(50)(50)所在節(jié)點所在節(jié)點(f)(f)中的關鍵字數中的關鍵

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論