第8章查找技術(shù)_第1頁
第8章查找技術(shù)_第2頁
第8章查找技術(shù)_第3頁
第8章查找技術(shù)_第4頁
第8章查找技術(shù)_第5頁
已閱讀5頁,還剩112頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

數(shù)據(jù)結(jié)構(gòu)與算法作者:胡明王紅梅出版社:電子工業(yè)出版社郵箱:wanghm@第8章查找技術(shù)本章的主要內(nèi)容是:查找的基本概念線性表的查找技術(shù)樹表的查找技術(shù)散列表的查找技術(shù)查找的基本概念關(guān)鍵碼:可以標(biāo)識一個記錄的某個數(shù)據(jù)項。鍵值:關(guān)鍵碼的值。主關(guān)鍵碼:可以唯一地標(biāo)識一個記錄的關(guān)鍵碼。

次關(guān)鍵碼:不能唯一地標(biāo)識一個記錄的關(guān)鍵碼。8.1概述50女李爽000525女齊梅000447女劉楠000325男張亮000238男王剛0001年齡性別姓名職工號1972.92003.71979.92003.71990.4工作時間查找的基本概念查找

:在具有相同類型的記錄構(gòu)成的集合中找出滿足給定條件的記錄。

給定的查找條件可能是多種多樣的,為便于討論,把查找條件限制為“匹配”,即查找關(guān)鍵碼等于給定值的記錄。

8.1概述查找的結(jié)果:若在查找集合中找到了與給定值相匹配的記錄,則稱查找成功;否則,稱查找失敗。

靜態(tài)查找:不涉及插入和刪除操作的查找。動態(tài)查找:涉及插入和刪除操作的查找。

8.1概述查找的基本概念靜態(tài)查找適用于:查找集合一經(jīng)生成,便只對其進行查找,而不進行插入和刪除操作,或經(jīng)過一段時間的查找之后,集中地進行插入和刪除等修改操作;動態(tài)查找適用于:查找與插入和刪除操作在同一個階段進行,例如當(dāng)查找成功時,要刪除查找到的記錄,當(dāng)查找不成功時,要插入被查找的記錄。8.1概述查找的基本概念查找結(jié)構(gòu):面向查找操作的數(shù)據(jù)結(jié)構(gòu),即查找基于的數(shù)據(jù)結(jié)構(gòu)。查找結(jié)構(gòu)

查找方法

集合中元素之間不存在明顯的組織規(guī)律,不便查找。集合

線性表

樹表

散列表

本章討論的查找結(jié)構(gòu):線性表:適用于靜態(tài)查找,主要采用順序查找技術(shù)和折半查找技術(shù)。樹表:適用于動態(tài)查找,主要采用二叉排序樹的查找技術(shù)。散列表:靜態(tài)查找和動態(tài)查找均適用,主要采用散列技術(shù)。

8.1概述查找結(jié)構(gòu):面向查找操作的數(shù)據(jù)結(jié)構(gòu),即查找基于的數(shù)據(jù)結(jié)構(gòu)。查找的基本概念查找算法的性能

查找算法時間性能通過關(guān)鍵碼的比較次數(shù)來度量。8.1概述關(guān)鍵碼的比較次數(shù)與哪些因素有關(guān)呢?平均查找長度:將查找算法進行的關(guān)鍵碼的比較次數(shù)的數(shù)學(xué)期望值定義為平均查找長度,即:其中:n:問題規(guī)模,查找集合中的記錄個數(shù);

pi:查找第i個記錄的概率;ci:查找第i個記錄所需的關(guān)鍵碼的比較次數(shù)。ASL?==niiicp1查找算法的性能

查找算法時間性能通過關(guān)鍵碼的比較次數(shù)來度量。8.1概述關(guān)鍵碼的比較次數(shù)與哪些因素有關(guān)呢?平均查找長度:將查找算法進行的關(guān)鍵碼的比較次數(shù)的數(shù)學(xué)期望值定義為平均查找長度,即:ASL?==niiicp1ci取決于算法;pi與算法無關(guān),取決于具體應(yīng)用。如果pi是已知的,則平均查找長度只是問題規(guī)模的函數(shù)。順序查找(線性查找)基本思想:從線性表的一端向另一端逐個將關(guān)鍵碼與給定值進行比較,若相等,則查找成功,給出該記錄在表中的位置;若整個表檢測完仍未找到與給定值相等的關(guān)鍵碼,則查找失敗,給出失敗信息。

101524612354098550123456789i8.2線性表的查找技術(shù)例:查找k=35iii順序查找(線性查找)8.2線性表的查找技術(shù)intSeqSearch1(intr[],intn,intk)//數(shù)組r[1]~r[n]存放查找集合{i=n;while(i>0&&r[i]!=k)i--;returni;}基本思想:設(shè)置“哨兵”。哨兵就是待查值,將它放在查找方向的盡頭處,免去了在查找過程中每一次比較后都要判斷查找位置是否越界,從而提高查找速度。

8.2線性表的查找技術(shù)改進的順序查找101524612354098550123456789i例:查找k=35iii哨兵35查找方向基本思想:設(shè)置“哨兵”。哨兵就是待查值,將它放在查找方向的盡頭處,免去了在查找過程中每一次比較后都要判斷查找位置是否越界,從而提高查找速度。

8.2線性表的查找技術(shù)改進的順序查找101524612354098550123456789i例:查找k=25ii25查找方向iiiiiiiintSeqSearch2(intr[],intn,intk)//數(shù)組r[1]~r[n]存放查找集合{r[0]=k;i=n;while(r[i]!=k)i--;returni;}8.2線性表的查找技術(shù)改進的順序查找

ASL==?=niicp1?+-=niiinp1)1(i=(n+1)/2=O(n)平均查找長度較大,特別是當(dāng)待查找集合中元素較多時,查找效率較低。8.2線性表的查找技術(shù)順序查找的缺點:對表中記錄的存儲沒有任何要求,順序存儲和鏈接存儲均可;對表中記錄的有序性也沒有要求,無論記錄是否按關(guān)鍵碼有序均可。順序查找的優(yōu)點:算法簡單而且使用面廣。折半查找使用條件:線性表中的記錄必須按關(guān)鍵碼有序;必須采用順序存儲?;舅枷耄涸谟行虮碇校≈虚g記錄作為比較對象,若給定值與中間記錄的關(guān)鍵碼相等,則查找成功;若給定值小于中間記錄的關(guān)鍵碼,則在中間記錄的左半?yún)^(qū)繼續(xù)查找;若給定值大于中間記錄的關(guān)鍵碼,則在中間記錄的右半?yún)^(qū)繼續(xù)查找。不斷重復(fù)上述過程,直到查找成功,或所查找的區(qū)域無記錄,查找失敗。8.2線性表的查找技術(shù)折半查找的基本思想8.2線性表的查找技術(shù)

[r1………rmid-1]rmid[rmid+1………rn]如果k<rmid如果k>rmid查找左半?yún)^(qū)查找右半?yún)^(qū)k(mid=(1+n)/2)例:查找值為14的記錄的過程:

012345678910111213

7141821232931353842464952low=1high=13mid=7

high=6mid=3

high=2

mid=1

31>1418>147<14low=2mid=2

14=148.2線性表的查找技術(shù)例:查找值為22的記錄的過程:

012345678910111213

7141821232931353842464952low=1high=13mid=7

high=6mid=3

high=4

mid=5

31>2218<2223>22low=4mid=4

21<228.2線性表的查找技術(shù)low=5low>highintBinSearch1(intr[],intn,intk){//數(shù)組r[1]~r[n]存放查找集合low=1;high=n;while(low<=high){mid=(low+high)/2;if(k<r[mid])high=mid-1;elseif(k>r[mid])low=mid+1;elsereturnmid;}return0;}8.2線性表的查找技術(shù)折半查找——非遞歸算法intBinSearch2(intr[],intlow,inthigh,intk){//數(shù)組r[1]~r[n]存放查找集合if(low>high)return0;

else{mid=(low+high)/2;if(k<r[mid])returnBinSearch2(r,low,mid-1,k);elseif(k>r[mid])returnBinSearch2(r,mid+1,high,k);elsereturnmid;}}8.2線性表的查找技術(shù)折半查找——遞歸算法折半查找判定樹

判定樹:折半查找的過程可以用二叉樹來描述,樹中的每個結(jié)點對應(yīng)有序表中的一個記錄,結(jié)點的值為該記錄在表中的位置。通常稱這個描述折半查找過程的二叉樹為折半查找判定樹,簡稱判定樹。8.2線性表的查找技術(shù)⑴當(dāng)n=0時,折半查找判定樹為空;⑵當(dāng)n>0時,折半查找判定樹的根結(jié)點是有序表中序號為mid=(n+1)/2的記錄,根結(jié)點的左子樹是與有序表r[1]~r[mid-1]相對應(yīng)的折半查找判定樹,根結(jié)點的右子樹是與r[mid+1]~r[n]相對應(yīng)的折半查找判定樹。

8.2線性表的查找技術(shù)判定樹的構(gòu)造方法8.2線性表的查找技術(shù)-11-22-33-44-510-1111-9-108-97-85-66-7內(nèi)部結(jié)點外部結(jié)點3691011784512判定樹的構(gòu)造方法具有n個結(jié)點的折半查找判定樹的深度為

查找成功:在表中查找任一記錄的過程,即是折半查找判定樹中從根結(jié)點到該記錄結(jié)點的路徑,和給定值的比較次數(shù)等于該記錄結(jié)點在樹中的層數(shù)。查找不成功:查找失敗的過程就是走了一條從根結(jié)點到外部結(jié)點的路徑,和給定值進行的關(guān)鍵碼的比較次數(shù)等于該路徑上內(nèi)部結(jié)點的個數(shù)。8.2線性表的查找技術(shù)。??1log2+n折半查找性能分析

分塊查找35…20…8…52…40…61…65…88…76…第1塊文件關(guān)鍵碼其他數(shù)據(jù)項第2塊第3塊353613883索引表最大值塊長塊首地址有序8.2線性表的查找技術(shù)分塊查找(也稱為索引順序查找),分兩步進行:⑴在索引表中確定待查關(guān)鍵碼所在的塊;⑵在相應(yīng)塊中查找待查關(guān)鍵碼。索引表查找順序查找折半查找塊內(nèi)查找——順序查找分塊查找8.2線性表的查找技術(shù)設(shè)有n個記錄的文件分為m個塊,每個塊均為t個記錄,則n=m×t。設(shè)Lb為查找索引表確定關(guān)鍵碼所在塊的平均查找長度,Lw為在塊內(nèi)查找關(guān)鍵碼的平均查找長度,則分塊查找的平均查找長度為:

ASL=Lb+Lw若采用順序查找對索引表進行查找,則分塊查找的平均查找長度為:

ASL=Lb+Lw=當(dāng)t取時,ASL取最小值+1。nn分塊查找8.2線性表的查找技術(shù)二叉排序樹二叉排序樹(也稱二叉查找樹):或者是一棵空的二叉樹,或者是具有下列性質(zhì)的二叉樹:⑴若它的左子樹不空,則左子樹上所有結(jié)點的值均小于根結(jié)點的值;⑵若它的右子樹不空,則右子樹上所有結(jié)點的值均大于根結(jié)點的值;⑶它的左右子樹也都是二叉排序樹。8.3樹表的查找技術(shù)二叉排序樹的定義采用的是遞歸方法。二叉排序樹非二叉排序樹二叉排序樹8.3樹表的查找技術(shù)6390554258104567837063605582581045678370中序遍歷二叉排序樹可以得到一個按關(guān)鍵碼有序的序列二叉排序樹的存儲結(jié)構(gòu)以二叉鏈表形式存儲,類聲明如下:classBiSortTree{

public:BiSortTree(inta[],intn);~BiSortTree();voidInsertBST(BiNode<int>*root,BiNode<int>*s);voidDeleteBST(BiNode<int>*p,BiNode<int>*f);BiNode<int>*SearchBST(BiNode<int>*root,intk);private:

BiNode*root;};8.3樹表的查找技術(shù)二叉排序樹的插入分析:若二叉排序樹為空樹,則新插入的結(jié)點為新的根結(jié)點;否則,新插入的結(jié)點必為一個新的葉子結(jié)點,其插入位置由查找過程得到。8.3樹表的查找技術(shù)voidInsertBST(BiNode*root,BiNode*s);例:插入值為98的結(jié)點8.3樹表的查找技術(shù)6355905870985563root∧9058∧∧70∧∧98∧∧sroot∧voidInsertBST(BiNode*root,BiNode*s){if(root==NULL)root=s;elseif(s->data<root->data)InsertBST(root->lchild,s);elseInsertBST(root->rchild,s);}8.3樹表的查找技術(shù)二叉排序樹的插入算法二叉排序樹的構(gòu)造從空的二叉排序樹開始,依次插入一個個結(jié)點。例:關(guān)鍵碼集合為{63,90,70,55,58},二叉排序樹的構(gòu)造過程為:

8.3樹表的查找技術(shù)6355905870BiNode*Creat(intr[],intn){for(i=0;i<n;i++){s=(BiNode*)malloc(sizeof(BiNode));s->data=r[i];s->lchild=s->rchild=NULL;InsertBST(root,s);}returnroot;}8.3樹表的查找技術(shù)二叉排序樹的構(gòu)造算法一個無序序列可以通過構(gòu)造一棵二叉排序樹而變成一個有序序列;每次插入的新結(jié)點都是二叉排序樹上新的葉子結(jié)點;找到插入位置后,不必移動其它結(jié)點,僅需修改某個結(jié)點的指針;在左子樹/右子樹的查找過程與在整棵樹上查找過程相同;新插入的結(jié)點沒有破壞原有結(jié)點之間的關(guān)系。小結(jié):8.3樹表的查找技術(shù)二叉排序樹的刪除在二叉排序樹上刪除某個結(jié)點之后,仍然保持二叉排序樹的特性。分三種情況討論:被刪除的結(jié)點是葉子;被刪除的結(jié)點只有左子樹或者只有右子樹;被刪除的結(jié)點既有左子樹,也有右子樹。8.3樹表的查找技術(shù)情況1——被刪除的結(jié)點是葉子結(jié)點8.3樹表的查找技術(shù)50302080908588403532503020809085403532操作:將雙親結(jié)點中相應(yīng)指針域的值改為空。情況2——被刪除的結(jié)點只有左子樹或者只有右子樹操作:將雙親結(jié)點的相應(yīng)指針域的值指向被刪除結(jié)點的左子樹(或右子樹)。8.3樹表的查找技術(shù)50302080908588403532503020908588403532情況3——被刪除的結(jié)點既有左子樹也有右子樹操作:以其左子樹中的最大值結(jié)點(或右子樹中的最小值結(jié)點)替代之,然后再刪除該結(jié)點。8.3樹表的查找技術(shù)503020809085884035324030208090858835321.若結(jié)點p是葉子,則直接刪除結(jié)點p;2.若結(jié)點p只有左子樹,則只需重接p的左子樹;若結(jié)點p只有右子樹,則只需重接p的右子樹;3.若結(jié)點p的左右子樹均不空,則3.1查找結(jié)點p的右子樹上的最左下結(jié)點s及其雙親結(jié)點par;3.2將結(jié)點s數(shù)據(jù)域替換到被刪結(jié)點p的數(shù)據(jù)域;3.3若結(jié)點p的右孩子無左子樹,則將s的右子樹接到par的右子樹上;否則,將s的右子樹接到結(jié)點par的左子樹上;3.4刪除結(jié)點s;8.3樹表的查找技術(shù)二叉排序樹的刪除算法——偽代碼二叉排序樹的查找在二叉排序樹中查找給定值k的過程是:

⑴若root是空樹,則查找失敗;⑵若k=root->data,則查找成功;否則⑶若k<root->data,則在root的左子樹上查找;否則⑷在root的右子樹上查找。上述過程一直持續(xù)到k被找到或者待查找的子樹為空,如果待查找的子樹為空,則查找失敗。二叉排序樹的查找效率在于只需查找二個子樹之一。8.3樹表的查找技術(shù)例:在二叉排序樹中查找關(guān)鍵字值為35,95的過程:8.3樹表的查找技術(shù)50302080908588403532二叉排序樹的查找50302080908588403532BiNode*SearchBST(BiNode*root,intk){if(root==NULL)

returnNULL;elseif(root->data==k)

returnroot;elseif(k<root->data)

returnSearchBST(root->lchild,k);elsereturnSearchBST(root->rchild,k);}8.3樹表的查找技術(shù)二叉排序樹的查找二叉排序樹的查找性能分析由序列{3,1,2,5,4}得到二叉排序樹:由序列{1,2,3,4,5}得到二叉排序樹:ASL=(1+2+3+4+5)/5=3ASL=(1+2+3+2+3)/5=2.2二叉排序樹的查找性能取決于二叉排序樹的形狀,在O(log2n)和O(n)之間。

8.3樹表的查找技術(shù)1234531254平衡二叉樹:或者是一棵空的二叉排序樹,或者是具有下列性質(zhì)的二叉排序樹:⑴根結(jié)點的左子樹和右子樹的深度最多相差1;⑵

根結(jié)點的左子樹和右子樹也都是平衡二叉樹。

平衡因子:結(jié)點的平衡因子是該結(jié)點的左子樹的深度與右子樹的深度之差。

平衡二叉樹8.3樹表的查找技術(shù)548254821是平衡樹非平衡樹8.3散列表的查找技術(shù)平衡二叉樹在平衡樹中,結(jié)點的平衡因子可以是1,0,-1。結(jié)點的平衡因子=HL-HR最小不平衡子樹:在平衡二叉樹的構(gòu)造過程中,以距離插入結(jié)點最近的、且平衡因子的絕對值大于1的結(jié)點為根的子樹。

8.3樹表的查找技術(shù)542814平衡二叉樹構(gòu)造平衡二叉樹的基本思想:每插入一個結(jié)點,(1)從插入結(jié)點開始向上計算各結(jié)點的平衡因子,如果某結(jié)點平衡因子的絕對值超過1,則說明插入操作破壞了二叉排序樹的平衡性,需要進行平衡調(diào)整;否則繼續(xù)執(zhí)行插入操作。(2)如果二叉排序樹不平衡,則找出最小不平衡子樹的根結(jié)點,根據(jù)新插入結(jié)點與最小不平衡子樹根結(jié)點之間的關(guān)系判斷調(diào)整類型。(3)根據(jù)調(diào)整類型進行相應(yīng)的調(diào)整,使之成為新的平衡子樹。8.3樹表的查找技術(shù)平衡二叉樹例:設(shè)序列{20,35,40,15,30,25},構(gòu)造平衡樹。2035408.3樹表的查找技術(shù)352040153025例:設(shè)序列{20,35,40,15,30,25},構(gòu)造平衡樹。8.3樹表的查找技術(shù)352040153025202515354030354030202515設(shè)結(jié)點A為最小不平衡子樹的根結(jié)點,對該子樹進行平衡調(diào)整歸納起來有以下四種情況:1.LL型2.RR型3.LR型4.RL型8.3樹表的查找技術(shù)平衡二叉樹插入前插入后,調(diào)整前調(diào)整后8.3樹表的查找技術(shù)平衡二叉樹——LL型A1BLhBRh0ARhBh2BLhBRh1ARABXh+1BLhARBRh00BAX旋轉(zhuǎn):扁擔(dān)原理;沖突:旋轉(zhuǎn)優(yōu)先61→2例:LL型

8.3樹表的查找技術(shù)108791291012876平衡二叉樹——RR型8.3樹表的查找技術(shù)插入前插入后,調(diào)整前調(diào)整后A-1BLhBRh0ALhBXA-2BLhBRh0ALhBBALhBLh0BRh+1AX0插入后,調(diào)整前先順時針旋轉(zhuǎn)

再逆時針旋轉(zhuǎn)8.3樹表的查找技術(shù)平衡二叉樹——LR型A2CLh-1BLh-1ARhBCCRh-1XXACLh-1CBCRh-1ARhBLhARhCACRh-1BCLh-1X0-10BLh插入后,調(diào)整前先順時針旋轉(zhuǎn)

再逆時針旋轉(zhuǎn)8.3樹表的查找技術(shù)平衡二叉樹——RL型XACLh-1BRhCBCRh-1ALhA-2CLh-1BRh1ALhBCCRh-1XBRhCBCRh-1AALhCLh-1X001課堂練習(xí):設(shè)有關(guān)鍵碼序列{5,4,2,8,6,9},構(gòu)造平衡樹5428.3樹表的查找技術(shù)LL型42586864256842585642課堂練習(xí):設(shè)有關(guān)鍵碼序列{5,4,2,8,6,9},構(gòu)造平衡樹8.3樹表的查找技術(shù)RL型旋轉(zhuǎn)1次RL型旋轉(zhuǎn)2次856429RR型8465298.3樹表的查找技術(shù)課堂練習(xí):設(shè)有關(guān)鍵碼序列{5,4,2,8,6,9},構(gòu)造平衡樹所有非終端結(jié)點都包含以下數(shù)據(jù):(n,A0,K1,A1,K2,…,Kn,An)其中,n(m/2

1≤n≤m

1)為關(guān)鍵碼的個數(shù);Ki(1≤i≤n)為關(guān)鍵碼,且Ki<Ki+1(1≤i≤n-1);Ai(0≤i≤n)為指向子樹根結(jié)點的指針,且指針Ai所指子樹中所有結(jié)點的關(guān)鍵碼均小于Ki+1大于Ki。B樹的定義8.3樹表的查找技術(shù)1181

111

271

393475364199FFFFFFFFFFFF243781

35B樹示例葉子結(jié)點查找失敗的結(jié)點終端結(jié)點在同一層上外結(jié)點指針包含其子女結(jié)點的塊號8.3樹表的查找技術(shù)18331223304810152021243145475052B樹——查找操作2118<21<3321<23比較次數(shù)不超過樹的深度。8.3樹表的查找技術(shù)B樹——插入操作新記錄將插入到相應(yīng)的葉子結(jié)點中。18331223304810152021243145475052葉子結(jié)點只包含1個記錄插入新記錄

148.3樹表的查找技術(shù)B樹——插入操作新記錄將插入到相應(yīng)的葉子結(jié)點中。葉子結(jié)點只包含1個記錄插入新記錄

18331223304815202124314547505210148.3樹表的查找技術(shù)B樹——插入操作新記錄將插入到相應(yīng)的葉子結(jié)點中。18331223304810152021243145475052葉子結(jié)點只包含2個記錄插入新記錄,分裂-提升

558.3樹表的查找技術(shù)B樹——插入操作新記錄將插入到相應(yīng)的葉子結(jié)點中。1833122330481015202124314547505255葉子結(jié)點只包含2個記錄插入新記錄,分裂-提升

插入8.3樹表的查找技術(shù)B樹——插入操作新記錄將插入到相應(yīng)的葉子結(jié)點中。1833122330481015202124314547葉子結(jié)點只包含2個記錄插入新記錄,分裂-提升

分裂5055528.3樹表的查找技術(shù)B樹——插入操作新記錄將插入到相應(yīng)的葉子結(jié)點中。18331223301015202124314547葉子結(jié)點只包含2個記錄插入新記錄,分裂-提升

提升505548528.3樹表的查找技術(shù)18331223304810152021243145475052B樹——刪除操作情況1:從包含2個記錄的葉子結(jié)點刪除1個記錄。解決方法:直接刪除這個記錄。8.3樹表的查找技術(shù)1833122330481015243145475052B樹——刪除操作情況1:從包含2個記錄的葉子結(jié)點刪除1個記錄。解決方法:直接刪除這個記錄。218.3樹表的查找技術(shù)18331223304810152021243145475052B樹——刪除操作情況2:從包含1個記錄的葉子結(jié)點中刪除這個記錄。解決方法:向兄弟結(jié)點借一個記錄,同時修改雙親結(jié)點的記錄。8.3樹表的查找技術(shù)183312213048101520233145475052B樹——刪除操作情況2:從包含1個記錄的葉子結(jié)點中刪除這個記錄。解決方法:向兄弟結(jié)點借一個記錄,同時修改雙親結(jié)點的記錄。8.3樹表的查找技術(shù)183312213048101520233145475052B樹——刪除操作情況2:從包含1個記錄的葉子結(jié)點中刪除這個記錄。解決方法:兄弟結(jié)點不夠借,需要合并相鄰結(jié)點,并影響雙親結(jié)點。8.3樹表的查找技術(shù)1833122021481015303145475052B樹——刪除操作情況2:從包含1個記錄的葉子結(jié)點中刪除這個記錄。解決方法:兄弟結(jié)點不夠借,需要合并相鄰結(jié)點,并影響雙親結(jié)點。8.3樹表的查找技術(shù)1833122021481015303145475052B樹——刪除操作情況2:從包含1個記錄的葉子結(jié)點中刪除這個記錄。解決方法:兄弟結(jié)點不夠借,需要合并相鄰結(jié)點,并影響雙親結(jié)點。8.3樹表的查找技術(shù)202148333145475052B樹——刪除操作情況2:從包含1個記錄的葉子結(jié)點中刪除這個記錄。10121830解決方法:兄弟結(jié)點不夠借,需要合并相鄰結(jié)點,并影響雙親結(jié)點。8.3樹表的查找技術(shù)48333045475052B樹——刪除操作情況2:從包含1個記錄的葉子結(jié)點中刪除這個記錄。解決方法:兄弟結(jié)點不夠借,需要合并相鄰結(jié)點,并影響雙親結(jié)點,這可能減少樹的高度。25208.3樹表的查找技術(shù)B樹——刪除操作情況2:從包含1個記錄的葉子結(jié)點中刪除這個記錄。解決方法:兄弟結(jié)點不夠借,需要合并相鄰結(jié)點,并影響雙親結(jié)點,這可能減少樹的高度。4547505233482025B樹的優(yōu)點:能夠以相對較低的代價保持樹高平衡。8.3樹表的查找技術(shù)B樹——刪除操作情況3:從內(nèi)部結(jié)點刪除一個記錄。解決方法:將被刪除記錄用右邊子樹中的最小關(guān)鍵碼Y代替(Y一定在某個葉子結(jié)點中),然后再刪除Y。183312233048101520212431454750528.3樹表的查找技術(shù)B樹——刪除操作情況3:從內(nèi)部結(jié)點刪除一個記錄。解決方法:將被刪除記錄用右邊子樹中的最小關(guān)鍵碼Y代替(Y一定在某個葉子結(jié)點中),然后再刪除Y。2033122330481015212431454750528.3樹表的查找技術(shù)B+樹的定義m階B+樹是滿足下列特性的樹:⑴含有m個關(guān)鍵碼,每一個關(guān)鍵碼對應(yīng)一棵子樹。⑵關(guān)鍵碼Ki是它所對應(yīng)的子樹的根結(jié)點中的最大(或最?。╆P(guān)鍵碼。⑶所有終端結(jié)點中包含了全部關(guān)鍵碼信息,以及指向關(guān)鍵碼記錄的指針。⑷

所有終端結(jié)點按關(guān)鍵碼的大小鏈在一起,形成單鏈表,并設(shè)置頭指針。

8.3樹表的查找技術(shù)LB+樹示例509020506080901216202630505560627080828690內(nèi)部結(jié)點只存儲關(guān)鍵碼終端結(jié)點存儲記錄引導(dǎo)查找8.3樹表的查找技術(shù)8.4散列表的查找技術(shù)順序查找、折半查找、二叉排序樹查找等。這些查找技術(shù)都是通過一系列的給定值與關(guān)鍵碼的比較,查找效率依賴于查找過程中進行的給定值與關(guān)鍵碼的比較次數(shù)。查找操作要完成什么任務(wù)?待查值k確定k在存儲結(jié)構(gòu)中的位置我們學(xué)過哪些查找技術(shù)?這些查找技術(shù)的共性?在存儲位置和關(guān)鍵碼之間建立一個確定的對應(yīng)關(guān)系能否不用比較,通過關(guān)鍵碼直接確定存儲位置?概述散列的基本思想:在記錄的存儲地址和它的關(guān)鍵碼之間建立一個確定的對應(yīng)關(guān)系。這樣,不經(jīng)過比較,一次讀取就能得到所查元素的查找方法。關(guān)鍵碼集合kiriH(ki)…………H8.4散列表的查找技術(shù)散列表:采用散列技術(shù)將記錄存儲在一塊連續(xù)的存儲空間中,這塊連續(xù)的存儲空間稱為散列表。概述關(guān)鍵碼集合kiriH(ki)…………H散列表數(shù)組8.4散列表的查找技術(shù)散列函數(shù):將關(guān)鍵碼映射為散列表中適當(dāng)存儲位置的函數(shù)。概述散列表關(guān)鍵碼集合kiriH(ki)…………H散列函數(shù)數(shù)組8.4散列表的查找技術(shù)散列地址:由散列函數(shù)所得的存儲地址。概述散列表關(guān)鍵碼集合kiriH(ki)…………H散列函數(shù)散列地址下標(biāo)數(shù)組8.4散列表的查找技術(shù)概述散列技術(shù)僅僅是一種查找技術(shù)嗎?散列既是一種查找技術(shù),也是一種存儲技術(shù)。散列只是通過記錄的關(guān)鍵碼定位該記錄,沒有完整地表達記錄之間的邏輯關(guān)系,所以,散列主要是面向查找的存儲結(jié)構(gòu)。散列是一種完整的存儲結(jié)構(gòu)嗎?8.4散列表的查找技術(shù)散列技術(shù)一般不適用于允許多個記錄有同樣關(guān)鍵碼的情況。散列方法也不適用于范圍查找,換言之,在散列表中,我們不可能找到最大或最小關(guān)鍵碼的記錄,也不可能找到在某一范圍內(nèi)的記錄。概述散列技術(shù)適合于哪種類型的查找?散列技術(shù)最適合回答的問題是:如果有的話,哪個記錄的關(guān)鍵碼等于待查值。8.4散列表的查找技術(shù)散列技術(shù)的關(guān)鍵問題:⑴散列函數(shù)的設(shè)計。如何設(shè)計一個簡單、均勻、存儲利用率高的散列函數(shù)。⑵沖突的處理。如何采取合適的處理沖突方法來解決沖突。概述8.4散列表的查找技術(shù)沖突:對于兩個不同關(guān)鍵碼ki≠kj,有H(ki)=H(kj),即兩個不同的記錄需要存放在同一個存儲位置,ki和kj相對于H稱做同義詞。

概述關(guān)鍵碼集合kiri…………H(ki)kjH(kj)8.4散列表的查找技術(shù)散列函數(shù)設(shè)計散列函數(shù)一般應(yīng)遵循以下原則:⑴計算簡單。散列函數(shù)不應(yīng)該有很大的計算量,否則會降低查找效率。⑵函數(shù)值即散列地址分布均勻。函數(shù)值要盡量均勻散布在地址空間,這樣才能保證存儲空間的有效利用并減少沖突。8.4散列表的查找技術(shù)散列函數(shù)——直接定址法散列函數(shù)是關(guān)鍵碼的線性函數(shù),即:H(key)=a

key+b(a,b為常數(shù))例:關(guān)鍵碼集合為{10,30,50,70,80,90},選取的散列函數(shù)為H(key)=key/10,則散列表為:0123456789103050708090適用情況?事先知道關(guān)鍵碼,關(guān)鍵碼集合不是很大且連續(xù)性較好。8.4散列表的查找技術(shù)散列函數(shù)為:H(key)=keymodp

散列函數(shù)——除留余數(shù)法1470147014散列地址56494235282114關(guān)鍵碼如何選取合適的p,產(chǎn)生較少同義詞?例:p=21=3×78.4散列表的查找技術(shù)散列函數(shù)——除留余數(shù)法一般情況下,選p為小于或等于表長(最好接近表長)的最小素數(shù)或不包含小于20質(zhì)因子的合數(shù)。

除留余數(shù)法是一種最簡單、也是最常用的構(gòu)造散列函數(shù)的方法,并且不要求事先知道關(guān)鍵碼的分布。適用情況?8.4散列表的查找技術(shù)根據(jù)關(guān)鍵碼在各個位上的分布情況,選取分布比較均勻的若干位組成散列地址。

例:關(guān)鍵碼為8位十進制數(shù),散列地址為2位十進制數(shù)81346

5

3

281372

2

4281387

4

2281301

3

6781322

8

1781338

9

67①②③④⑤⑥⑦⑧散列函數(shù)——數(shù)字分析法8.4散列表的查找技術(shù)適用情況:能預(yù)先估計出全部關(guān)鍵碼的每一位上各種數(shù)字出現(xiàn)的頻度,不同的關(guān)鍵碼集合需要重新分析。散列函數(shù)——數(shù)字分析法8.4散列表的查找技術(shù)對關(guān)鍵碼平方后,按散列表大小,取中間的若干位作為散列地址(平方后截?。?。散列函數(shù)——平方取中法事先不知道關(guān)鍵碼的分布且關(guān)鍵碼的位數(shù)不是很大。適用情況:例:散列地址為2位,則關(guān)鍵碼123的散列地址為:(1234)2=15227568.4散列表的查找技術(shù)將關(guān)鍵碼從左到右分割成位數(shù)相等的幾部分,將這幾部分疊加求和,取后幾位作為散列地址。散列函數(shù)——折疊法例:設(shè)關(guān)鍵碼為25346358705,散列地址為三位。

253463587

+05───1308

移位疊加

253364587+50───1254

間界疊加適用情況:關(guān)鍵碼位數(shù)很多,事先不知道關(guān)鍵碼的分布。8.4散列表的查找技術(shù)處理沖突的方法——開放定址法由關(guān)鍵碼得到的散列地址一旦產(chǎn)生了沖突,就去尋找下一個空的散列地址,并將記錄存入。如何尋找下一個空的散列地址?(1)線性探測法(2)二次探測法(3)隨機探測法8.4散列表的查找技術(shù)線性探測法當(dāng)發(fā)生沖突時,從沖突位置的下一個位置起,依次尋找空的散列地址。

對于鍵值key,設(shè)H(key)=d,閉散列表的長度為m,則發(fā)生沖突時,尋找下一個散列地址的公式為:

Hi=(H(key)+di)%m

(di=1,2,…,m-1)

用開放定址法處理沖突得到的散列表叫閉散列表。8.4散列表的查找技術(shù)例:關(guān)鍵碼集合為{47,7,29,11,16,92,22,8,3},散列表表長為11,散列函數(shù)為H(key)=keymod11,用線性探測法處理沖突,則散列表為:47729111692292222883333堆積:在處理沖突的過程中出現(xiàn)的非同義詞之間對同一個散列地址爭奪的現(xiàn)象。線性探測法0123456789108.4散列表的查找技術(shù)在線性探測法構(gòu)造的散列表中查找算法——偽代碼1.計算散列地址j;2.若ht[j]等于k,則查找成功,返回記錄在散列表中的下標(biāo);否則執(zhí)行第3步;3.若ht[j]為空或整個散列表探測一遍,則查找失敗,轉(zhuǎn)4;否則,j指向下一單元,轉(zhuǎn)2;4.若整個散列表探測一遍,則表滿,拋出溢出異常;否則,將待查值插入;8.4散列表的查找技術(shù)intHashSearch1(intht[],intm,intk){j=H(k);//計算散列地址if(ht[j]==k)returnj;//沒有發(fā)生沖突,比較一次查找成功elseif(ht[j]==Empty){ht[j]=k;return0;}//查找不成功,插入i=(j+1)%m;//設(shè)置探測的起始下標(biāo)while(ht[i]!=Empty&&i!=j){if(ht[i]==k)returni;//發(fā)生沖突,比較若干次查找成功elsei=(i+1)%m;//向后探測一個位置}if(i==j){printf("溢出");exit(-1);}else{ht[i]=k;return0;}//查找不成功,插入}在線性探測法構(gòu)造的散列表中查找算法8.4散列表的查找技術(shù)二次探測法當(dāng)發(fā)生沖突時,尋找下一個散列地址的公式為:Hi=(H(ke

溫馨提示

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

最新文檔

評論

0/150

提交評論