




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
關(guān)于算法與數(shù)據(jù)結(jié)構(gòu)查找BUPTSCSTBUPT8.1基本概念與術(shù)語查找表同一類型的記錄(數(shù)據(jù)元素)的集合。查找指定某個值,在查找表中確定是否存在一個記錄,該記錄的關(guān)鍵字等于給定值。關(guān)鍵字記錄(數(shù)據(jù)元素)中的某個數(shù)據(jù)項的值。
主關(guān)鍵字該關(guān)鍵字可以唯一地標識一個記錄。
次關(guān)鍵字該關(guān)鍵字不能唯一標識一個記錄。靜態(tài)查找表對查找表的查找僅是以查詢?yōu)槟康模桓膭硬檎冶碇械臄?shù)據(jù)。動態(tài)查找表在查找的過程中同時插入不存在的記錄,或刪除某個已存在的記錄。查找成功查找表中存在滿足查找條件的記錄。查找不成功查找表中不存在滿足查找條件的記錄。第2頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT內(nèi)查找整個查找過程都在內(nèi)存中進行。外查找在查找過程中需要訪問外存。平均查找長度ASL——查找方法時效的度量為確定記錄在查找表中的位置,需將關(guān)鍵字和給定值比較次數(shù)的期望值。查找成功時的ASL計算方法:
n:記錄的個數(shù)
pi:查找第i個記錄的概率,
(不特別聲明時認為等概率pi=1/n)ci:找到第i個記錄所需的比較次數(shù)約定:無特殊說明,一般默認關(guān)鍵字的類型為整型第3頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT8.2順序表的查找01n-1nr[0..n]a0a1an-1r[n].key=K[算法描述]intseqsearch(int*a,constintn,constintK)
{inti=0;a[n]=K;while(a[i]!=K)i++;returni;}第4頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[程序設(shè)計技巧]
設(shè)置監(jiān)視哨,提高算法效率。[性能分析]空間:一個輔助空間。時間:
1)查找成功時的平均查找長度設(shè)表中各記錄查找概率相等
ASLs(n)=(1+2+...+n)/n=(n+1)/22)查找不成功時的平均查找長度ASLf=n+1[算法特點]算法簡單,對表結(jié)構(gòu)無任何要求n很大=>查找效率較低改進措施:非等概率查找時,可將查找概率高的記錄盡量排在表前部。第5頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT8.3二分查找滿足r[i].keyr[i+1].key,0i<n-1
仍可用順序查找,但在找不到時不需比較到表尾,只需比較到比給定值大的記錄就可終止。[折半(二分)查找法]
1234567891011
0513192137566475808892lowmidhigh=(low+high)/2
K=21lhmK=85
lhm111611161537119454101110109第6頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[算法描述]intbinsearch(intK,intv[],intn){intlow,high,mid;low=1;high=n;while(low<=high){
mid=(low+high)/2;if(K<v[mid])
high=mid-1;elseif(K>v[mid])
low=mid+1;else/*找到了匹配的值*/returnmid;}return-1;/*沒有查到*/}第7頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[性能分析]
h=log2n+1{同完全二叉樹,二叉樹性質(zhì)4}成功查找時的平均查找長度(等概率):
ASLs=
例:ASLS=(1*1+2*2+3*4+4*4)/11=3不成功查找時的查找長度:h-1或h次-13-46-79-101-22-34-55-67-88-910-1111-639147102581112h判定樹(描述查找過程的二叉樹)外結(jié)點內(nèi)結(jié)點><=第8頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT1.具有12個關(guān)鍵字的有序表,在等概率情況下,折半查找的平均查找長度()
A.3.1B.4C.2.5D.5
2.折半查找的時間復(fù)雜度為()A.O(n2)B.O(n)C.O(nlogn)D.O(logn)3.用二分(對半)查找表的元素的速度比用順序法()A.必然快B.必然慢C.相等D.不能確定4.在順序表(8,11,15,19,25,26,30,33,42,48,50)中,用二分(折半)法查找關(guān)鍵碼值20,需做的關(guān)鍵字比較次數(shù)為____.
在有序表A[1..12]中,采用二分查找算法查等于A[12]的元素,所比較的元素下標依次為__________。ADD46,9,11,12第9頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT8.4靜態(tài)樹表的查找[問題出發(fā)點]
討論有序表中各記錄查找概率不等時,查找成功時的ASLs。
12345
關(guān)鍵字1519364267
查找概率0.10.20.10.40.2
折半查找高概率為根
+折半
ASLs=2.3ASLs=1.8363151192424675424192675151363第10頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[靜態(tài)最優(yōu)查找樹]定義:查找性能最佳的判定樹。性質(zhì):帶權(quán)內(nèi)路徑長度之和PH為最小值。
PH=與ASLs成正比
其中n:二叉樹上結(jié)點的個數(shù)(有序表長度)hi:第i個結(jié)點在二叉樹上的層次數(shù)
wi=cpi:c為某個常量;
pi:第i個結(jié)點的查找概率最優(yōu)查找體現(xiàn)的原則:
1)最先訪問的結(jié)點應(yīng)是訪問概率最大的結(jié)點;
2)每次訪問應(yīng)使結(jié)點兩邊尚未訪問的結(jié)點的被訪概率之和盡可能相等。第11頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[次優(yōu)查找樹的構(gòu)造方法]PH值近似為最小比靜態(tài)最優(yōu)查找樹易于構(gòu)造,時間開銷少已知按關(guān)鍵字有(升)序的記錄序列:
(rl,rl+1,...,ri-1,ri,ri+1,...,rh-1,rh)1)選取記錄ri作為根結(jié)點:計算所有
pi(lih)
找出最小
pi的對應(yīng)的i;若相鄰關(guān)鍵字的權(quán)值大,則確定為權(quán)值大的關(guān)鍵字對應(yīng)的i第12頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT簡化計算
pi的方法:設(shè)定累計權(quán)值和swi=
則
pi=|(swh-swi)-(swi-1-swl-1)|=|(swh+swl-1)-swi-swi-1|
設(shè)sw-1=02)ri的左子樹:(rl,rl+1,...,ri-1)構(gòu)造的次優(yōu)查找樹3)ri的右子樹:(ri+1,...,rh-1,rh)構(gòu)造的次優(yōu)查找樹第13頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT設(shè)有一組數(shù)據(jù)black,blue,green,purple,red,white,yellow,它們的查找概率分別為0.10,0.08,0.12,0.05,0.20,0.25,0.20。試以它們的查找概率為權(quán)值,構(gòu)造一棵次優(yōu)查找樹,并計算其查找成功的平均查找長度。關(guān)鍵字blackbluegreenpurpleredwhiteyellow
權(quán)值0.100.080.120.050.200.250.20j1234567SWj0.10.180.300.350.550.801.00△Pj0.90.720.520.350.100.350.80
(根)↑i△Pj0.250.070.130.300.200.25
↑i
↑i△Pj0.050.12
↑i
第14頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT8.5分塊查找[索引表的構(gòu)造]
索引表index[0..b-1]
最大關(guān)鍵字值224286
起始地址048
主表r[0..n-1](分塊有序/有序)
key12221382833384286765063
其它項
01234567891011[分塊查找步驟]1)折半或者順序查找索引表,確定所在塊2)在已確定的塊中順序查找/折半查找第15頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT設(shè)b為索引表長度,s為塊中記錄個數(shù)順序查找索引表+順序查找被確定的塊
ASLbs=
當(dāng)s取時,ASLbs取最小值折半查找索引表+順序查找被確定的塊
ASLbs=[log2(b+1)-1]+(s+1)/2log2(n/s+1)+s/2實用中,各塊大小不一定相等分塊查找效率介于順序查找和折半查找之間第16頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT1.有一個2000項的表,欲采用等分區(qū)間順序查找方法進行查找,則每塊的理想長度是__(1)___,分成__(2)___塊最為理想,平均查找長度是__(3)___。(1)45(2)45(3)46
第17頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT8.6二叉排序樹BST(二叉查找/搜索樹)[定義]
二叉排序樹或者是空樹,或者是滿足如下性質(zhì)的二叉樹:
1)若其左子樹非空,則左子樹上所有結(jié)點的值均小于根結(jié)點的值;
2)若其右子樹非空,則右子樹上所有結(jié)點的值均大于等于根結(jié)點的值;
3)其左右子樹本身又各是一棵二叉排序樹[性質(zhì)]
中序遍歷一棵二叉排序樹,將得到一個以關(guān)鍵字遞增排列的有序序列452453122890判別給定二叉樹是否為二叉排序樹的算法如何實現(xiàn)??(用二叉鏈表存儲)第18頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT方法1:根據(jù)二叉排序樹中序遍歷所得結(jié)點值為增序的性質(zhì),在遍歷中將當(dāng)前遍歷結(jié)點與其前驅(qū)結(jié)點值比較,即可得出結(jié)論。void
JudgeBST(BTreet,intflag){//全局指針pre,初值為NULL;調(diào)用時變量flag=TRUE
if(t!=NULL&&flag){JudgeBST(t->lc,flag);//中序遍歷左子樹
if(pre==NULL)pre=t;//中序的第一個結(jié)點不判斷
else
if(pre->data<t->data)pre=t;//前驅(qū)指針指向當(dāng)前結(jié)點
elseflag=FLASE;//不是完全二叉樹
JudgeBST(t->rc,flag);//中序遍歷右子樹
}}第19頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT方法2:照定義,二叉排序樹的左右子樹都是二叉排序樹,根結(jié)點的值大于左子樹中所有值而小于右子樹中所有值,即根結(jié)點大于左子樹的最大值而小于右子樹的最小值。boolJudgeBST(BTreet){
if(t==NULL)returnTRUE;
if(JudgeBST(t->lc)&&JudgeBST(t->rc)){m=max(t->llink);
n=min(t->rlink);//左子樹中最大值和右子樹中最小值
return(t->data>m&&t->data<n);
}
else
returnFALSE;//不是}intmax(BTreep)//求左子樹的最大值
{if(p==NULL)return-maxint;
//返回機器最小整數(shù)
else{
while(p->rc!=null)p=p->rc;
returnp->data;}}intmin(BTreep)//求右子最小值
{if(p==NULL)returnmaxint;
else{while(p->lc!=NULL)p=p->lc;
returnp->data;}}第20頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[在二叉排序樹上的操作][1.查找][例]K=28K=32bst45241228bst455390241228325390
查找步驟:若根結(jié)點的關(guān)鍵字值等于查找的關(guān)鍵字,成功。 否則,若小于根結(jié)點的關(guān)鍵字值,查其左子樹。 若大于根結(jié)點的關(guān)鍵字值,查其右子樹。在左右子樹上的操作類似。第21頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPTBitreeSearchBST(BiTreeT,KeyTypekey)//在二叉分類樹查找關(guān)鍵字之值為key的結(jié)點,找到返回該結(jié)//點的地址,否則返回空。T為根結(jié)點的指針。{
if((T==NULL)||(key==T->data))
return(T);
elseif(key<T->data.key)
return(SearchBST(T->lc,key));
elsereturn(SearchBST(T->rc,key));}[查找算法]第22頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[2.插入]首先執(zhí)行查找算法,找出被插結(jié)點的父親結(jié)點。判斷被插結(jié)點是其父親結(jié)點的左、右兒子。將被插結(jié)點作為葉子結(jié)點插入。若二叉樹為空。則首先單獨生成根結(jié)點。注意:新插入的結(jié)點總是葉子結(jié)點。[3.生成][算法步驟]反復(fù)執(zhí)行以下操作a.讀入一個記錄,設(shè)其關(guān)鍵字為K;b.調(diào)用查找算法,確定插入位置;c.調(diào)用插入算法,實施插入結(jié)點的操作;第23頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT例:將序列122、99、250、110、300、280作為二叉排序樹的結(jié)點的關(guān)鍵字值,生成二叉排序樹。12212299122250991222501109912225030011099第24頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[4.刪除]依據(jù)被刪除結(jié)點p的不同情況分析:1.p是葉子結(jié)點:修改其雙親指針即可2.p只有左孩子:用p的左子樹代替以p為根的子樹p只有右孩子:用p的右子樹代替以p為根的子樹3.p有兩個孩子:找到p的中序后繼(或前趨)結(jié)點q,q的數(shù)據(jù)復(fù)制給p,刪除只有右子(或左子)/無孩子的q第25頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT例:(1)(2)(2)(3)5320901050869541241528891304539878992第26頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPTvoidDelete(BSTreeT,keytypeX)//在二叉排序樹T上,刪除為X的結(jié)點。
{BSTreef,p=T;while(p&&p->key!=X)//查找值為X的結(jié)點
if(p->key>X){f=p;p=p->lc;}//f為p的雙親
else{f=p;p=p->rc;}if(p==NULL){printf(“無關(guān)鍵字為X的結(jié)點\n”);exit(0);}if(p->lc==NULL)//被刪結(jié)點無左子樹
if(f->lc==p)f->lc=p->rc;//將被刪結(jié)點的右子樹接到其雙親上
elsef->rc=p->rc;else{//被刪結(jié)點有左子樹
q=p;s=p->lc;
while(s->rc!=NULL){//查左子樹中最右下的結(jié)點(中序最后結(jié)點)
q=s;s=s->rc;}p->key=s->key;//結(jié)點值用其左子樹最右下的結(jié)點的值代替
if(q==p)p->lc=s->lc;//被刪結(jié)點左子樹的根結(jié)點無右子女
elseq->rc=s->lc;//s是被刪結(jié)點左子樹中序序列最后一個結(jié)點
free(s);}}第27頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[4.性能分析]給定樹的形態(tài),等概率查找成功時的ASL=ci/n最差(單支樹):(n+1)/2最好(類似折半查找的判定樹):log2(n+1)-1隨機:1+4log2n關(guān)鍵字有序出現(xiàn)時,構(gòu)造出“退化”的二叉排序樹,樹深為n,各種操作代價O(n)。避免方法:采用平衡二叉樹第28頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT8.7平衡二叉樹(AVL樹)[1.定義]平衡二叉樹或者是空樹,或者是滿足如下性質(zhì)的二叉排序樹:
1)它的左、右子樹的高度之差的絕對值不超過1;
2)其左右子樹本身又各是一棵平衡二叉樹。二叉樹上結(jié)點的平衡因子:該結(jié)點的左子樹高度減去右子樹的高度。平衡二叉樹非平衡二叉樹302010252235383020353233001-10-1100-12-2平衡二叉樹:每個結(jié)點的平衡因子都為+1、-1、0的二叉排序樹。第29頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[2.結(jié)點的存儲結(jié)構(gòu)]lcbfkeyotherinforclc:左孩子指針
rc:右孩子指針
bf:平衡因子
key:記錄的關(guān)鍵字
otherinfo:記錄的其它數(shù)據(jù)成分第30頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[4.在平衡二叉樹上的操作][查找]查找方法同二叉排序樹。[插入]插入新結(jié)點之后仍應(yīng)保持平衡二叉樹的性質(zhì)不變。[例]平衡二叉樹的生成過程15001525-1-2-1000000-1-1001-2-20000-11525353525152515359015253590651525653590第31頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[調(diào)整范圍的確定]
插入結(jié)點后,找到離插入結(jié)點最近且平衡因子絕對值超過1的祖先結(jié)點(危機節(jié)點),則以該危機節(jié)點為根的子樹將是可能不平衡的最小子樹,可將重新平衡的范圍局限于這棵子樹。[調(diào)整的類型]LL型-表示新插入結(jié)點在危機結(jié)點的左子的左子樹上LR型-表示新插入結(jié)點在危機結(jié)點的左子的右子樹上RL型-表示新插入結(jié)點在危機結(jié)點的右子的左子樹上RR型-表示新插入結(jié)點在危機結(jié)點的右子的右子樹上第32頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[調(diào)整的方法]LL型平衡旋轉(zhuǎn)——一次順時針旋轉(zhuǎn)AB+1h-10+2+1hh-1h-1LL型調(diào)整BLBRARBA0h0h-1h-1BLBRAR危機結(jié)點調(diào)整前:高度為h+1
中序序列:ABBLBRAR調(diào)整后:高度為h+1
中序序列:ABBLBR注意:調(diào)整后平衡因子為0ABAR第33頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPTLR型平衡旋轉(zhuǎn)——一次逆時針旋轉(zhuǎn)+一次順時針旋轉(zhuǎn)AB+1h-10+2-1h-1LR型調(diào)整BLAR危機結(jié)點CBCCLCRh-2h-2h-10+1CB0h-1BLARACRh-2CLh-1-10ABBLARCCLCR調(diào)整后:高度為h+1
中序序列:ABBLARCCLCRA調(diào)整前:高度為h+1
中序序列:h-1情形A注意:調(diào)整后平衡因子為+1,0,0第34頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPTLR型平衡旋轉(zhuǎn)——一次逆時針旋轉(zhuǎn)+一次順時針旋轉(zhuǎn)AB+1h-10+2-1h-1LR型調(diào)整BLAR危機結(jié)點調(diào)整前:高度為h+1
中序序列:注意:改組后平衡度為+1,0,0CBCCRCLh-1h-2h-20-1CB0h-1BLARACRh-1CLh-2+10ABBLARCCRCL調(diào)整后:高度為h+1
中序序列:AABBLARCCRCL情形B第35頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT注意:調(diào)整后平衡因子為0,0,0LR型平衡旋轉(zhuǎn)——一次逆時針旋轉(zhuǎn)+一次順時針旋轉(zhuǎn)AB+10+2-1LR型調(diào)整危機結(jié)點調(diào)整前:高度為2中序序列:CBC0ABCA新插入結(jié)點ABC調(diào)整后:高度為2中序序列:ca0b00情形C第36頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPTRR型平衡旋轉(zhuǎn)——一次逆時針旋轉(zhuǎn)AB-1h-10-2-1hh-1h-1RR型調(diào)整BLBRALBA0h0h-1h-1BLAL危機結(jié)點調(diào)整前:高度為h+1
中序序列:BAALBLBR調(diào)整后:高度為h+1
中序序列:注意:調(diào)整后平衡因子為0ABBRBAALBLBR第37頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPTRL型平衡旋轉(zhuǎn)——一次順時針旋轉(zhuǎn)+一次逆時針旋轉(zhuǎn)AALCRCLBRALCRCLBRALCLBRCRBCABCACB-100h-1h-2h-1h-211(-1)00(1)-1(0)危機結(jié)點第38頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[刪除](思路同插入)將刪除結(jié)點q轉(zhuǎn)化為q最多有一個孩子的情形,即若q有兩個孩子,則以其中序前驅(qū)/后繼結(jié)點r取代它,刪除r;若樹的平衡性被破壞,利用單一/雙重旋轉(zhuǎn)恢復(fù)。[性能]定理:一個具有n個結(jié)點的平衡二叉樹形,其高度h為
log2(n+1)h1.4404log2(n+2)-0.328
結(jié)論:最壞情況下,AVL樹的高度約為1.44log2n,而完全平衡的二叉樹高度約為log2n,因此AVL樹是接近最優(yōu)的,其平均查找長度與log2n同數(shù)量級。第39頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT8.7B+樹與B-樹[采用B+與B-樹的意義]大量數(shù)據(jù)存放在外存中,由于是海量數(shù)據(jù),不可能一次調(diào)入內(nèi)存。因此,要多次訪問外存,速度慢。所以,主要矛盾變?yōu)闇p少訪外次數(shù)。內(nèi)存第40頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT用用二叉樹組織文件,需訪問外存次數(shù)太多。如:當(dāng)文件的記錄個數(shù)為100,000時,要找到給定關(guān)鍵字的記錄,需訪問外存17次(log100,000),太長了!502510751535609020304055708095索引文件數(shù)據(jù)文件文件頭,可常駐內(nèi)存文件訪問示意圖:索引文件存在內(nèi)存、數(shù)據(jù)文件存在盤上第41頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[B-樹]B-樹是一種平衡的多路查找樹。應(yīng)用于文件系統(tǒng)。1.定義一棵m階B-樹,或為空樹,或為滿足下列特性的m叉樹:
1、樹中每個結(jié)點最多有
m
棵子樹;
2、若根結(jié)點不是葉子結(jié)點,則最少有兩棵子樹;
3、除根之外的所有非終端結(jié)點最少有
m/2
棵子樹;
4、所有非終端結(jié)點包含(n,A0,K1,A1,K2,…,Kn,An)信息數(shù)據(jù);其中n為結(jié)點中關(guān)鍵字個數(shù),Ai為指向子樹的指針,Ki為關(guān)鍵字。
5、所有葉子結(jié)點在同一層上,且不帶信息。第42頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT例如:m=4階B_樹。除根結(jié)點和葉子結(jié)點之外,每個結(jié)點的兒子個數(shù)至少為m/2=2個;結(jié)點的關(guān)鍵字個數(shù)至少為1。該B_樹的深度為4。葉子結(jié)點都在第4層上。1,993,47,58,641,391,271,112,43,781,181,35FFFFFFFFFFFF第1層第2層第3層(L層)第4層(L+1層)m/2~m棵子樹葉第43頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT2.B-樹結(jié)點結(jié)構(gòu)(n,A0,K1,A1,K2,A2,...,Kn,An)n:關(guān)鍵字的個數(shù)A0:<K1
的結(jié)點的地址(指在該B_樹中)K1:關(guān)鍵字A2:>K1
且<K2
的結(jié)點的地址(指在該B_樹中)其余類推………An:>Kn
的結(jié)點的地址(指在該B_樹中)K1<=K2<=…...<=Kn第44頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT127階B-樹中每個結(jié)點最多有____個關(guān)鍵字;除根結(jié)點外所有非終端結(jié)點至少有____棵子樹;65階B+樹中除根結(jié)點外所有結(jié)點至少有____個關(guān)鍵字;最多有____棵子樹。高度為5(除葉子層之外)的三階B-樹至少有____個結(jié)點。31126643365思考:高度為h的m階B-樹(除葉子層)至少有多少個結(jié)點?第45頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT3.B-樹查找過程類似于二叉樹的查找。如查找關(guān)鍵字為KEY的記錄。
從根開始查找,如果Ki=KEY則查找成功。若Ki<KEY<Ki+1;查找Ai
指向的結(jié)點若KEY<K1;查找A0
指向的結(jié)點若KEY>Kn;查找An指向的結(jié)點若找到葉子,則查找失敗。第46頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT設(shè)關(guān)鍵字的總數(shù)為N,求m階B_樹的最大層次L。層次 結(jié)點數(shù) 關(guān)鍵字的個數(shù)(最少)
1 1 12 2 2(
m/2-1
)3 2(
m/2
) 2(
m/2
)(
m/2-1
) 4 2(
m/2
)2 2(
m/2
)2(
m/2-1
)………L 2(
m/2
)L-22(
m/2
)L-2(
m/2-1
)L+1 2(
m/2
)L-1
所以,N=2(
m/2
)L-1-1故:L=log
m/2
((N+1)/2)+1設(shè)N=1000,000且m=256,則L<=3;最多3次訪問外存可找到所有的記錄。第47頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT4.B-樹插入過程1、確定插入位置,將結(jié)點插入到第L層(注意:第L+1層為葉子結(jié)點)2、找到插入位置,將關(guān)鍵字和其它信息按序插入。3、若被插入結(jié)點的關(guān)鍵字個數(shù)>m-1,則該結(jié)點滿。必須分裂成兩個結(jié)點。否則不滿結(jié)束。如結(jié)點原為:
(m-1,A0,K1,A1,K2,A2,…Km-1,Am-1)插入一個關(guān)鍵字之后變?yōu)椋?m,A0,K1,A1,K2,A2,…Km,Am)該結(jié)點以K
m/2
為界,進行分裂:
………...(K
m/2
,p’)…………...(
m/2-1
,A0,(K1,A1)…(K
m/2-1,A
m/2-1)(m-
m/2
,A
m/2
,K
m/2+1…Km,Am)生成新結(jié)點p’,將原結(jié)點的后半部分復(fù)制過去。若分裂一直進行到根結(jié)點,樹可能長高一層。(Km/2,p’
)數(shù)據(jù)項插入上層結(jié)點之中PP’第48頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT例:3階B_樹的插入key=73,127243024,3045,7053902610039506185345,70539026100395061851230324457053902610039506185127303245390261003950618512745707插入第49頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT5.B-樹刪除過程1、查找具有給定鍵值的關(guān)鍵字Ki
2、如果在第L層,可直接刪除(注意:第L+1層為葉子結(jié)點),轉(zhuǎn)4。3、否則,則首先生成“替身”。用該關(guān)鍵字的右邊子樹中的最左面的結(jié)點的關(guān)鍵字取代。然后,刪除第L層上的該關(guān)鍵字。4、從第L層開始進行刪除。
A、不動:若刪除關(guān)鍵字值的那個結(jié)點的關(guān)鍵字的個數(shù)仍處于
m/2
-1和m-1之間。則結(jié)束。
B、借:若刪除關(guān)鍵字值的那個結(jié)點的關(guān)鍵字的個數(shù)原為
m/2
-1。而它們左\右兄弟結(jié)點的關(guān)鍵字個數(shù)>
m/2
-1;則借一關(guān)鍵字過來,結(jié)束。
C、并:若該結(jié)點的左\右兄弟結(jié)點的關(guān)鍵字的個數(shù)為
m/2
-1;則執(zhí)行合并結(jié)點的操作。如結(jié)點原為:(………….(Ki,Ai),(Ki+1,Ai+1),………….)
(A0’,(K1’,A1’)………)
(A0’’,(K1’’,A1’’)………)
……K1………第L層:找到了被刪結(jié)點的替身。第50頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT例如:3階B_樹的刪除操作。324455390371005061,70被刪關(guān)鍵字324456190371005370借:向被刪結(jié)點方向旋轉(zhuǎn)假定再刪除該關(guān)鍵字32445903710061,703,24459010061,703,24459010061,70并并并并:和父結(jié)點的一個關(guān)鍵字、及兄弟合并。有可能進行到根,使B_樹的深度降低一層!假定再刪除該關(guān)鍵字第51頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[B+樹]B+樹是一種B-樹的變形樹。應(yīng)用于索引順序文件系統(tǒng)。1.m階B+
樹與B-
樹的不同之處1)有n棵子樹的結(jié)點中有n個關(guān)鍵字;2)非葉結(jié)點可以看成是索引部分索引集Ai
:第i個子結(jié)點的指針Ki
:第i個子結(jié)點的最大(或最?。╆P(guān)鍵字3)所有葉子結(jié)點中包含了全部關(guān)鍵字的信息及指向這些關(guān)鍵字記錄的指針,且葉子結(jié)點以關(guān)鍵字大小自小至大順序鏈接;數(shù)據(jù)集第52頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[結(jié)點結(jié)構(gòu)]非葉結(jié)點(A1,K1,...,Ai,Ki,...,An,Kn)索引集Ai
:第i個子結(jié)點的指針Ki
:第i個子結(jié)點的最大(或最?。╆P(guān)鍵字葉結(jié)點全部關(guān)鍵字及指向關(guān)鍵字記錄的指針數(shù)據(jù)集2153344047586727985390961052851323336785210513221141324階B+樹rootsqt第53頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT2.B+樹上的基本運算1)查找方式1:從根結(jié)點開始,利用索引集結(jié)構(gòu),向下查找直到葉子結(jié)點方式2:從最小關(guān)鍵字開始,沿葉結(jié)點數(shù)據(jù)集的鏈結(jié)構(gòu)順序查找2)插入
僅在葉子結(jié)點上進行,關(guān)鍵字個數(shù)大于m則分裂3)刪除也僅在葉子結(jié)點上進行,關(guān)鍵字個數(shù)小于
m/2時,需進行合并第54頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT8.8哈希表[哈希表的基本思想]
在記錄的存儲地址和它的關(guān)鍵字之間建立一個確定的對應(yīng)關(guān)系;這樣,理想狀態(tài)不經(jīng)過比較,一次存取就能得到所查元素。[術(shù)語]
哈希表一個有限的連續(xù)的地址空間,用以容納按哈希地址存儲的記錄。
哈希函數(shù)記錄的存儲位置與它的關(guān)鍵字之間存在的一種對應(yīng)關(guān)系。Loc(ri)=H(keyi)
沖突對于keyikeyj,ij,出現(xiàn)的H(keyi)=H(keyj)的現(xiàn)象。第55頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT
同義詞在同一地址出現(xiàn)沖突的各關(guān)鍵字。
哈希(散列)地址根據(jù)設(shè)定的哈希函數(shù)H(key)和處理沖突的方法確定的記錄的存儲位置。
裝填因子表中填入的記錄數(shù)n和哈希表表長m之比。
=n/m[設(shè)計哈希表的過程]1)明確哈希表的地址空間范圍。即確定哈希函數(shù)的值域。
2)選擇合理的哈希函數(shù)。該函數(shù)要保證所有可能的記錄的哈希地址均在指定的值域內(nèi),并使沖突的可能性盡量小。
3)設(shè)定處理沖突的方法。哈希表bb+(m-1)L第56頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[哈希函數(shù)的基本構(gòu)造方法]構(gòu)造原則:算法簡單,運算量小;均勻分布,減少沖突。[1.直接定址法]H(key)=a*key+ba、b為常數(shù)e.g:令:a、b為1,有兩個關(guān)鍵字k1,k2值為10、1000;選10、1000作為存放地址。特點:計算簡單,沖突最少。[2.數(shù)字分析法/基數(shù)轉(zhuǎn)換法]取關(guān)鍵字在某種進制下的若干數(shù)位作為哈希地址。e.g:key=236076基數(shù)為10,看成是13進制的。則:(236075)13=841547;選取4154作為散列地址(假設(shè)表長m=10000)。第57頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[3.平方取中法]取關(guān)鍵字平方后的中間幾位作為哈希地址。e.g:(4731)2=22382361;選取82(假設(shè)m=100)。[4.隨機數(shù)法]
H(key)=random(key)特點:較適于關(guān)鍵字長度不等時的情況。[5.折疊法]
將關(guān)鍵字分割成位數(shù)相同的幾部分(最后一部分的位數(shù)可以不同),然后取這幾部分的疊加和(舍去進位)作為哈希地址。e.g:key=381,412,975選取768或570作為散列地址(假設(shè)m=1000)。38141297517689752143811570++第58頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[6.除留余數(shù)法]H(key)=keyMODp(pm)m:哈希表的表長;p:最好為素數(shù)最常用,余數(shù)總在0~p-1之間。通常p選<m的最大質(zhì)數(shù)如:m=1024,則p=1019。e.g:選取p為質(zhì)數(shù)的理由:設(shè)key值都為奇數(shù),選p為偶數(shù);則H(key)=keyMODp,結(jié)果為奇數(shù), 一半單元被浪費掉。設(shè)key值都為5的倍數(shù),選p為95;則H(key)=keyMODp,結(jié)果為:0、5、10、15、……90奇數(shù)。4/5的單元被浪費掉。第59頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[處理沖突的常用方法][1.開放定址法(空缺編址法)]Hi=(H(key)+di)MODm
0H(key)m-1i=1,2,...,k(km-1)m:哈希表的表長;di:增量序列1)線性探測再散列
di=1,2,...,m-1缺陷:有聚集(堆積)現(xiàn)象—非同義詞地址沖突。第60頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPTe.g:假定采用的hashing函數(shù)為:H(key)=keyMOD11假定的關(guān)鍵字序列為:17、60、29、38……;它們的散列過程為:H(17)=6H(60)=5H(29)=7H(38)=5012345678910Hashing表1760293838當(dāng)散列38時發(fā)生沖突,同60爭奪第5個單元解決辦法:探測下一個 空單元Hi=(H(key)+di)MOD11其中:di為1、2……10沖突:
初級沖突:不同關(guān)鍵字值的結(jié)點得到同一個散列地址。二次聚集:同不同散列地址的結(jié)點爭奪同一個單元。結(jié)果:沖突加劇,最壞時可能達到O(n)級代價。思考:假定有k個關(guān)鍵字互為同義詞,若用線性探測再散列法把這k個關(guān)鍵字存入散列表中,至少要進行多少次探測?k(k+1)/2第61頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT2)二次探測再散列
di=12,-12,22,-22,32,...,k2
km/2缺陷:不易探查到整個散列空間。3)偽隨機探測再散列di=偽隨機數(shù)序列4)雙重散列函數(shù)探查法
di=i*h1(key)0<im-1要求:h1(key)的值與m互素。m為素數(shù)時,h1(key)可取1到m-1之間的任何數(shù),建議:h1(key)=keymod(m-2)+1m為2的方冪時,h1(key)可取1到m-1之間的任何奇數(shù)注意:開放定址法不宜執(zhí)行刪除操作第62頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[2.再哈希法]Hi
=RHi(key)
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖南水利安全員c證考試題庫及答案解析
- 電纜安全題庫及答案解析
- 基礎(chǔ)經(jīng)典誦讀課程校本方案設(shè)計
- 牧業(yè)服務(wù)合同(標準版)
- 母嬰護理技術(shù)問答題庫及答案解析
- 高中語文閱讀教學(xué)理論與實踐探討
- 新能源汽車銷售服務(wù)手冊
- 物料提升機地下室結(jié)構(gòu)加固工程方案
- 安全知識競賽題庫2025及答案解析
- 檢察院改造項目施工進度管理方案
- 2024-2025學(xué)年北京市朝陽區(qū)北京中學(xué)八年級上學(xué)期期中考試物理試題(含答案)
- 中醫(yī)講糖尿病講課
- 中學(xué)生天文知識競賽考試題庫500題(含答案)
- 壁掛爐銷售合同
- 新版醫(yī)務(wù)人員法律法規(guī)知識培訓(xùn)課件
- 創(chuàng)新方法大賽理論知識考核試題題庫及答案
- 2023醫(yī)療質(zhì)量安全核心制度要點釋義(第二版)對比版
- 部編版二年級語文下冊第一單元導(dǎo)學(xué)案
- 設(shè)計公司項目經(jīng)理責(zé)任制評定、管理辦法(暫行)
- 2021年秋冬智慧樹知道網(wǎng)課《現(xiàn)代農(nóng)業(yè)創(chuàng)新與鄉(xiāng)村振興戰(zhàn)略》課后章節(jié)測試答案
- 電機車點檢表及點檢標準
評論
0/150
提交評論