算法與數(shù)據(jù)結構查找_第1頁
算法與數(shù)據(jù)結構查找_第2頁
算法與數(shù)據(jù)結構查找_第3頁
算法與數(shù)據(jù)結構查找_第4頁
算法與數(shù)據(jù)結構查找_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

關于算法與數(shù)據(jù)結構查找BUPTSCSTBUPT8.1基本概念與術語查找表同一類型的記錄(數(shù)據(jù)元素)的集合。查找指定某個值,在查找表中確定是否存在一個記錄,該記錄的關鍵字等于給定值。關鍵字記錄(數(shù)據(jù)元素)中的某個數(shù)據(jù)項的值。

主關鍵字該關鍵字可以唯一地標識一個記錄。

次關鍵字該關鍵字不能唯一標識一個記錄。靜態(tài)查找表對查找表的查找僅是以查詢?yōu)槟康模桓膭硬檎冶碇械臄?shù)據(jù)。動態(tài)查找表在查找的過程中同時插入不存在的記錄,或刪除某個已存在的記錄。查找成功查找表中存在滿足查找條件的記錄。查找不成功查找表中不存在滿足查找條件的記錄。第2頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT內(nèi)查找整個查找過程都在內(nèi)存中進行。外查找在查找過程中需要訪問外存。平均查找長度ASL——查找方法時效的度量為確定記錄在查找表中的位置,需將關鍵字和給定值比較次數(shù)的期望值。查找成功時的ASL計算方法:

n:記錄的個數(shù)

pi:查找第i個記錄的概率,

(不特別聲明時認為等概率pi=1/n)ci:找到第i個記錄所需的比較次數(shù)約定:無特殊說明,一般默認關鍵字的類型為整型第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[程序設計技巧]

設置監(jiān)視哨,提高算法效率。[性能分析]空間:一個輔助空間。時間:

1)查找成功時的平均查找長度設表中各記錄查找概率相等

ASLs(n)=(1+2+...+n)/n=(n+1)/22)查找不成功時的平均查找長度ASLf=n+1[算法特點]算法簡單,對表結構無任何要求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判定樹(描述查找過程的二叉樹)外結點內(nèi)結點><=第8頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT1.具有12個關鍵字的有序表,在等概率情況下,折半查找的平均查找長度()

A.3.1B.4C.2.5D.5

2.折半查找的時間復雜度為()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)中,用二分(折半)法查找關鍵碼值20,需做的關鍵字比較次數(shù)為____.

在有序表A[1..12]中,采用二分查找算法查等于A[12]的元素,所比較的元素下標依次為__________。ADD46,9,11,12第9頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT8.4靜態(tài)樹表的查找[問題出發(fā)點]

討論有序表中各記錄查找概率不等時,查找成功時的ASLs。

12345

關鍵字1519364267

查找概率0.10.20.10.40.2

折半查找高概率為根

+折半

ASLs=2.3ASLs=1.8363151192424675424192675151363第10頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[靜態(tài)最優(yōu)查找樹]定義:查找性能最佳的判定樹。性質(zhì):帶權內(nèi)路徑長度之和PH為最小值。

PH=與ASLs成正比

其中n:二叉樹上結點的個數(shù)(有序表長度)hi:第i個結點在二叉樹上的層次數(shù)

wi=cpi:c為某個常量;

pi:第i個結點的查找概率最優(yōu)查找體現(xiàn)的原則:

1)最先訪問的結點應是訪問概率最大的結點;

2)每次訪問應使結點兩邊尚未訪問的結點的被訪概率之和盡可能相等。第11頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[次優(yōu)查找樹的構造方法]PH值近似為最小比靜態(tài)最優(yōu)查找樹易于構造,時間開銷少已知按關鍵字有(升)序的記錄序列:

(rl,rl+1,...,ri-1,ri,ri+1,...,rh-1,rh)1)選取記錄ri作為根結點:計算所有

pi(lih)

找出最小

pi的對應的i;若相鄰關鍵字的權值大,則確定為權值大的關鍵字對應的i第12頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT簡化計算

pi的方法:設定累計權值和swi=

pi=|(swh-swi)-(swi-1-swl-1)|=|(swh+swl-1)-swi-swi-1|

設sw-1=02)ri的左子樹:(rl,rl+1,...,ri-1)構造的次優(yōu)查找樹3)ri的右子樹:(ri+1,...,rh-1,rh)構造的次優(yōu)查找樹第13頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT設有一組數(shù)據(jù)black,blue,green,purple,red,white,yellow,它們的查找概率分別為0.10,0.08,0.12,0.05,0.20,0.25,0.20。試以它們的查找概率為權值,構造一棵次優(yōu)查找樹,并計算其查找成功的平均查找長度。關鍵字blackbluegreenpurpleredwhiteyellow

權值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分塊查找[索引表的構造]

索引表index[0..b-1]

最大關鍵字值224286

起始地址048

主表r[0..n-1](分塊有序/有序)

key12221382833384286765063

其它項

01234567891011[分塊查找步驟]1)折半或者順序查找索引表,確定所在塊2)在已確定的塊中順序查找/折半查找第15頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT設b為索引表長度,s為塊中記錄個數(shù)順序查找索引表+順序查找被確定的塊

ASLbs=

當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)若其左子樹非空,則左子樹上所有結點的值均小于根結點的值;

2)若其右子樹非空,則右子樹上所有結點的值均大于等于根結點的值;

3)其左右子樹本身又各是一棵二叉排序樹[性質(zhì)]

中序遍歷一棵二叉排序樹,將得到一個以關鍵字遞增排列的有序序列452453122890判別給定二叉樹是否為二叉排序樹的算法如何實現(xiàn)??(用二叉鏈表存儲)第18頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT方法1:根據(jù)二叉排序樹中序遍歷所得結點值為增序的性質(zhì),在遍歷中將當前遍歷結點與其前驅(qū)結點值比較,即可得出結論。void

JudgeBST(BTreet,intflag){//全局指針pre,初值為NULL;調(diào)用時變量flag=TRUE

if(t!=NULL&&flag){JudgeBST(t->lc,flag);//中序遍歷左子樹

if(pre==NULL)pre=t;//中序的第一個結點不判斷

else

if(pre->data<t->data)pre=t;//前驅(qū)指針指向當前結點

elseflag=FLASE;//不是完全二叉樹

JudgeBST(t->rc,flag);//中序遍歷右子樹

}}第19頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT方法2:照定義,二叉排序樹的左右子樹都是二叉排序樹,根結點的值大于左子樹中所有值而小于右子樹中所有值,即根結點大于左子樹的最大值而小于右子樹的最小值。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

查找步驟:若根結點的關鍵字值等于查找的關鍵字,成功。 否則,若小于根結點的關鍵字值,查其左子樹。 若大于根結點的關鍵字值,查其右子樹。在左右子樹上的操作類似。第21頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPTBitreeSearchBST(BiTreeT,KeyTypekey)//在二叉分類樹查找關鍵字之值為key的結點,找到返回該結//點的地址,否則返回空。T為根結點的指針。{

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í)行查找算法,找出被插結點的父親結點。判斷被插結點是其父親結點的左、右兒子。將被插結點作為葉子結點插入。若二叉樹為空。則首先單獨生成根結點。注意:新插入的結點總是葉子結點。[3.生成][算法步驟]反復執(zhí)行以下操作a.讀入一個記錄,設其關鍵字為K;b.調(diào)用查找算法,確定插入位置;c.調(diào)用插入算法,實施插入結點的操作;第23頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT例:將序列122、99、250、110、300、280作為二叉排序樹的結點的關鍵字值,生成二叉排序樹。12212299122250991222501109912225030011099第24頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[4.刪除]依據(jù)被刪除結點p的不同情況分析:1.p是葉子結點:修改其雙親指針即可2.p只有左孩子:用p的左子樹代替以p為根的子樹p只有右孩子:用p的右子樹代替以p為根的子樹3.p有兩個孩子:找到p的中序后繼(或前趨)結點q,q的數(shù)據(jù)復制給p,刪除只有右子(或左子)/無孩子的q第25頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT例:(1)(2)(2)(3)5320901050869541241528891304539878992第26頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPTvoidDelete(BSTreeT,keytypeX)//在二叉排序樹T上,刪除為X的結點。

{BSTreef,p=T;while(p&&p->key!=X)//查找值為X的結點

if(p->key>X){f=p;p=p->lc;}//f為p的雙親

else{f=p;p=p->rc;}if(p==NULL){printf(“無關鍵字為X的結點\n”);exit(0);}if(p->lc==NULL)//被刪結點無左子樹

if(f->lc==p)f->lc=p->rc;//將被刪結點的右子樹接到其雙親上

elsef->rc=p->rc;else{//被刪結點有左子樹

q=p;s=p->lc;

while(s->rc!=NULL){//查左子樹中最右下的結點(中序最后結點)

q=s;s=s->rc;}p->key=s->key;//結點值用其左子樹最右下的結點的值代替

if(q==p)p->lc=s->lc;//被刪結點左子樹的根結點無右子女

elseq->rc=s->lc;//s是被刪結點左子樹中序序列最后一個結點

free(s);}}第27頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[4.性能分析]給定樹的形態(tài),等概率查找成功時的ASL=ci/n最差(單支樹):(n+1)/2最好(類似折半查找的判定樹):log2(n+1)-1隨機:1+4log2n關鍵字有序出現(xiàn)時,構造出“退化”的二叉排序樹,樹深為n,各種操作代價O(n)。避免方法:采用平衡二叉樹第28頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT8.7平衡二叉樹(AVL樹)[1.定義]平衡二叉樹或者是空樹,或者是滿足如下性質(zhì)的二叉排序樹:

1)它的左、右子樹的高度之差的絕對值不超過1;

2)其左右子樹本身又各是一棵平衡二叉樹。二叉樹上結點的平衡因子:該結點的左子樹高度減去右子樹的高度。平衡二叉樹非平衡二叉樹302010252235383020353233001-10-1100-12-2平衡二叉樹:每個結點的平衡因子都為+1、-1、0的二叉排序樹。第29頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[2.結點的存儲結構]lcbfkeyotherinforclc:左孩子指針

rc:右孩子指針

bf:平衡因子

key:記錄的關鍵字

otherinfo:記錄的其它數(shù)據(jù)成分第30頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[4.在平衡二叉樹上的操作][查找]查找方法同二叉排序樹。[插入]插入新結點之后仍應保持平衡二叉樹的性質(zhì)不變。[例]平衡二叉樹的生成過程15001525-1-2-1000000-1-1001-2-20000-11525353525152515359015253590651525653590第31頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[調(diào)整范圍的確定]

插入結點后,找到離插入結點最近且平衡因子絕對值超過1的祖先結點(危機節(jié)點),則以該危機節(jié)點為根的子樹將是可能不平衡的最小子樹,可將重新平衡的范圍局限于這棵子樹。[調(diào)整的類型]LL型-表示新插入結點在危機結點的左子的左子樹上LR型-表示新插入結點在危機結點的左子的右子樹上RL型-表示新插入結點在危機結點的右子的左子樹上RR型-表示新插入結點在危機結點的右子的右子樹上第32頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[調(diào)整的方法]LL型平衡旋轉——一次順時針旋轉AB+1h-10+2+1hh-1h-1LL型調(diào)整BLBRARBA0h0h-1h-1BLBRAR危機結點調(diào)整前:高度為h+1

中序序列:ABBLBRAR調(diào)整后:高度為h+1

中序序列:ABBLBR注意:調(diào)整后平衡因子為0ABAR第33頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPTLR型平衡旋轉——一次逆時針旋轉+一次順時針旋轉AB+1h-10+2-1h-1LR型調(diào)整BLAR危機結點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型平衡旋轉——一次逆時針旋轉+一次順時針旋轉AB+1h-10+2-1h-1LR型調(diào)整BLAR危機結點調(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型平衡旋轉——一次逆時針旋轉+一次順時針旋轉AB+10+2-1LR型調(diào)整危機結點調(diào)整前:高度為2中序序列:CBC0ABCA新插入結點ABC調(diào)整后:高度為2中序序列:ca0b00情形C第36頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPTRR型平衡旋轉——一次逆時針旋轉AB-1h-10-2-1hh-1h-1RR型調(diào)整BLBRALBA0h0h-1h-1BLAL危機結點調(diào)整前:高度為h+1

中序序列:BAALBLBR調(diào)整后:高度為h+1

中序序列:注意:調(diào)整后平衡因子為0ABBRBAALBLBR第37頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPTRL型平衡旋轉——一次順時針旋轉+一次逆時針旋轉AALCRCLBRALCRCLBRALCLBRCRBCABCACB-100h-1h-2h-1h-211(-1)00(1)-1(0)危機結點第38頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[刪除](思路同插入)將刪除結點q轉化為q最多有一個孩子的情形,即若q有兩個孩子,則以其中序前驅(qū)/后繼結點r取代它,刪除r;若樹的平衡性被破壞,利用單一/雙重旋轉恢復。[性能]定理:一個具有n個結點的平衡二叉樹形,其高度h為

log2(n+1)h1.4404log2(n+2)-0.328

結論:最壞情況下,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ù)太多。如:當文件的記錄個數(shù)為100,000時,要找到給定關鍵字的記錄,需訪問外存17次(log100,000),太長了!502510751535609020304055708095索引文件數(shù)據(jù)文件文件頭,可常駐內(nèi)存文件訪問示意圖:索引文件存在內(nèi)存、數(shù)據(jù)文件存在盤上第41頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[B-樹]B-樹是一種平衡的多路查找樹。應用于文件系統(tǒng)。1.定義一棵m階B-樹,或為空樹,或為滿足下列特性的m叉樹:

1、樹中每個結點最多有

m

棵子樹;

2、若根結點不是葉子結點,則最少有兩棵子樹;

3、除根之外的所有非終端結點最少有

m/2

棵子樹;

4、所有非終端結點包含(n,A0,K1,A1,K2,…,Kn,An)信息數(shù)據(jù);其中n為結點中關鍵字個數(shù),Ai為指向子樹的指針,Ki為關鍵字。

5、所有葉子結點在同一層上,且不帶信息。第42頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT例如:m=4階B_樹。除根結點和葉子結點之外,每個結點的兒子個數(shù)至少為m/2=2個;結點的關鍵字個數(shù)至少為1。該B_樹的深度為4。葉子結點都在第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-樹結點結構(n,A0,K1,A1,K2,A2,...,Kn,An)n:關鍵字的個數(shù)A0:<K1

的結點的地址(指在該B_樹中)K1:關鍵字A2:>K1

且<K2

的結點的地址(指在該B_樹中)其余類推………An:>Kn

的結點的地址(指在該B_樹中)K1<=K2<=…...<=Kn第44頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT127階B-樹中每個結點最多有____個關鍵字;除根結點外所有非終端結點至少有____棵子樹;65階B+樹中除根結點外所有結點至少有____個關鍵字;最多有____棵子樹。高度為5(除葉子層之外)的三階B-樹至少有____個結點。31126643365思考:高度為h的m階B-樹(除葉子層)至少有多少個結點?第45頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT3.B-樹查找過程類似于二叉樹的查找。如查找關鍵字為KEY的記錄。

從根開始查找,如果Ki=KEY則查找成功。若Ki<KEY<Ki+1;查找Ai

指向的結點若KEY<K1;查找A0

指向的結點若KEY>Kn;查找An指向的結點若找到葉子,則查找失敗。第46頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT設關鍵字的總數(shù)為N,求m階B_樹的最大層次L。層次 結點數(shù) 關鍵字的個數(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設N=1000,000且m=256,則L<=3;最多3次訪問外存可找到所有的記錄。第47頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT4.B-樹插入過程1、確定插入位置,將結點插入到第L層(注意:第L+1層為葉子結點)2、找到插入位置,將關鍵字和其它信息按序插入。3、若被插入結點的關鍵字個數(shù)>m-1,則該結點滿。必須分裂成兩個結點。否則不滿結束。如結點原為:

(m-1,A0,K1,A1,K2,A2,…Km-1,Am-1)插入一個關鍵字之后變?yōu)椋?m,A0,K1,A1,K2,A2,…Km,Am)該結點以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)生成新結點p’,將原結點的后半部分復制過去。若分裂一直進行到根結點,樹可能長高一層。(Km/2,p’

)數(shù)據(jù)項插入上層結點之中PP’第48頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT例:3階B_樹的插入key=73,127243024,3045,7053902610039506185345,70539026100395061851230324457053902610039506185127303245390261003950618512745707插入第49頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT5.B-樹刪除過程1、查找具有給定鍵值的關鍵字Ki

2、如果在第L層,可直接刪除(注意:第L+1層為葉子結點),轉4。3、否則,則首先生成“替身”。用該關鍵字的右邊子樹中的最左面的結點的關鍵字取代。然后,刪除第L層上的該關鍵字。4、從第L層開始進行刪除。

A、不動:若刪除關鍵字值的那個結點的關鍵字的個數(shù)仍處于

m/2

-1和m-1之間。則結束。

B、借:若刪除關鍵字值的那個結點的關鍵字的個數(shù)原為

m/2

-1。而它們左\右兄弟結點的關鍵字個數(shù)>

m/2

-1;則借一關鍵字過來,結束。

C、并:若該結點的左\右兄弟結點的關鍵字的個數(shù)為

m/2

-1;則執(zhí)行合并結點的操作。如結點原為:(………….(Ki,Ai),(Ki+1,Ai+1),………….)

(A0’,(K1’,A1’)………)

(A0’’,(K1’’,A1’’)………)

……K1………第L層:找到了被刪結點的替身。第50頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT例如:3階B_樹的刪除操作。324455390371005061,70被刪關鍵字324456190371005370借:向被刪結點方向旋轉假定再刪除該關鍵字32445903710061,703,24459010061,703,24459010061,70并并并并:和父結點的一個關鍵字、及兄弟合并。有可能進行到根,使B_樹的深度降低一層!假定再刪除該關鍵字第51頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[B+樹]B+樹是一種B-樹的變形樹。應用于索引順序文件系統(tǒng)。1.m階B+

樹與B-

樹的不同之處1)有n棵子樹的結點中有n個關鍵字;2)非葉結點可以看成是索引部分索引集Ai

:第i個子結點的指針Ki

:第i個子結點的最大(或最?。╆P鍵字3)所有葉子結點中包含了全部關鍵字的信息及指向這些關鍵字記錄的指針,且葉子結點以關鍵字大小自小至大順序鏈接;數(shù)據(jù)集第52頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[結點結構]非葉結點(A1,K1,...,Ai,Ki,...,An,Kn)索引集Ai

:第i個子結點的指針Ki

:第i個子結點的最大(或最小)關鍵字葉結點全部關鍵字及指向關鍵字記錄的指針數(shù)據(jù)集2153344047586727985390961052851323336785210513221141324階B+樹rootsqt第53頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT2.B+樹上的基本運算1)查找方式1:從根結點開始,利用索引集結構,向下查找直到葉子結點方式2:從最小關鍵字開始,沿葉結點數(shù)據(jù)集的鏈結構順序查找2)插入

僅在葉子結點上進行,關鍵字個數(shù)大于m則分裂3)刪除也僅在葉子結點上進行,關鍵字個數(shù)小于

m/2時,需進行合并第54頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT8.8哈希表[哈希表的基本思想]

在記錄的存儲地址和它的關鍵字之間建立一個確定的對應關系;這樣,理想狀態(tài)不經(jīng)過比較,一次存取就能得到所查元素。[術語]

哈希表一個有限的連續(xù)的地址空間,用以容納按哈希地址存儲的記錄。

哈希函數(shù)記錄的存儲位置與它的關鍵字之間存在的一種對應關系。Loc(ri)=H(keyi)

沖突對于keyikeyj,ij,出現(xiàn)的H(keyi)=H(keyj)的現(xiàn)象。第55頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT

同義詞在同一地址出現(xiàn)沖突的各關鍵字。

哈希(散列)地址根據(jù)設定的哈希函數(shù)H(key)和處理沖突的方法確定的記錄的存儲位置。

裝填因子表中填入的記錄數(shù)n和哈希表表長m之比。

=n/m[設計哈希表的過程]1)明確哈希表的地址空間范圍。即確定哈希函數(shù)的值域。

2)選擇合理的哈希函數(shù)。該函數(shù)要保證所有可能的記錄的哈希地址均在指定的值域內(nèi),并使沖突的可能性盡量小。

3)設定處理沖突的方法。哈希表bb+(m-1)L第56頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[哈希函數(shù)的基本構造方法]構造原則:算法簡單,運算量?。痪鶆蚍植?,減少沖突。[1.直接定址法]H(key)=a*key+ba、b為常數(shù)e.g:令:a、b為1,有兩個關鍵字k1,k2值為10、1000;選10、1000作為存放地址。特點:計算簡單,沖突最少。[2.數(shù)字分析法/基數(shù)轉換法]取關鍵字在某種進制下的若干數(shù)位作為哈希地址。e.g:key=236076基數(shù)為10,看成是13進制的。則:(236075)13=841547;選取4154作為散列地址(假設表長m=10000)。第57頁,共70頁,2024年2月25日,星期天BUPTSCSTBUPT[3.平方取中法]取關鍵字平方后的中間幾位作為哈希地址。e.g:(4731)2=22382361;選取82(假設m=100)。[4.隨機數(shù)法]

H(key)=random(key)特點:較適于關鍵字長度不等時的情況。[5.折疊法]

將關鍵字分割成位數(shù)相同的幾部分(最后一部分的位數(shù)可以不同),然后取這幾部分的疊加和(舍去進位)作為哈希地址。e.g:key=381,412,975選取768或570作為散列地址(假設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ù)的理由:設key值都為奇數(shù),選p為偶數(shù);則H(key)=keyMODp,結果為奇數(shù), 一半單元被浪費掉。設key值都為5的倍數(shù),選p為95;則H(key)=keyMODp,結果為: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假定的關鍵字序列為:17、60、29、38……;它們的散列過程為:H(17)=6H(60)=5H(29)=7H(38)=5012345678910Hashing表1760293838當散列38時發(fā)生沖突,同60爭奪第5個單元解決辦法:探測下一個 空單元Hi=(H(key)+di)MOD11其中:di為1、2……10沖突:

初級沖突:不同關鍵字值的結點得到同一個散列地址。二次聚集:同不同散列地址的結點爭奪同一個單元。結果:沖突加劇,最壞時可能達到O(n)級代價。思考:假定有k個關鍵字互為同義詞,若用線性探測再散列法把這k個關鍵字存入散列表中,至少要進行多少次探測?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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論