數(shù)據(jù)結(jié)構(gòu)ds-07(刪減部分13)_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)ds-07(刪減部分13)_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)ds-07(刪減部分13)_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)ds-07(刪減部分13)_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)ds-07(刪減部分13)_第5頁(yè)
已閱讀5頁(yè),還剩66頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第七章搜索結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)電子教案本章的主要內(nèi)容是:搜索的基本概念線性表的搜索技術(shù)樹(shù)表的搜索技術(shù)散列表的搜索技術(shù)3所謂搜索,就是在數(shù)據(jù)集合中尋找滿(mǎn)足某種條件的數(shù)據(jù)對(duì)象。搜索的結(jié)果通常有兩種可能:搜索成功搜索不成功

搜索(Search)的概念基本概念關(guān)鍵碼:可以標(biāo)識(shí)一個(gè)記錄的某個(gè)數(shù)據(jù)項(xiàng)。鍵值:關(guān)鍵碼的值。主關(guān)鍵碼:可以唯一地標(biāo)識(shí)一個(gè)記錄的關(guān)鍵碼。

次關(guān)鍵碼:不能唯一地標(biāo)識(shí)一個(gè)記錄的關(guān)鍵碼。7.1概述50女李爽000525女齊梅000447女劉楠000325男張亮000238男王剛0001年齡性別姓名職工號(hào)1972.92003.71979.92003.71990.4工作時(shí)間靜態(tài)搜索:不涉及插入和刪除操作的搜索。動(dòng)態(tài)搜索:涉及插入和刪除操作的搜索。

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

查找方法

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

線性表

樹(shù)表

散列表

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

7.1概述基本概念搜索算法的性能

搜索算法時(shí)間性能通過(guò)關(guān)鍵碼的比較次數(shù)來(lái)度量。7.1概述關(guān)鍵碼的比較次數(shù)與哪些因素有關(guān)呢?平均搜索長(zhǎng)度:將搜索算法進(jìn)行的關(guān)鍵碼的比較次數(shù)的數(shù)學(xué)期望值定義為平均搜索長(zhǎng)度,即:其中:n:?jiǎn)栴}規(guī)模,查找集合中的記錄個(gè)數(shù);

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

7.1概述ASL?==niiicp1ci取決于算法;pi與算法無(wú)關(guān),取決于具體應(yīng)用。如果pi是已知的,則平均查找長(zhǎng)度只是問(wèn)題規(guī)模的函數(shù)。在靜態(tài)搜索表中,數(shù)據(jù)元素存放于數(shù)組中,利用數(shù)組元素的下標(biāo)作為數(shù)據(jù)元素的存放地址。搜索算法根據(jù)給定值k,在數(shù)組中進(jìn)行搜索。直到找到k在數(shù)組中的存放位置或可確定在數(shù)組中找不到

k為止。

7.1.1靜態(tài)搜索表11數(shù)據(jù)表與搜索表的類(lèi)定義

#include<iostream.h>#include<assert.h>constintdefaultSize=100;template<classE,classK>classdataList; //數(shù)據(jù)表類(lèi)的前視定義template<classE,classK>classdataNode{ //數(shù)據(jù)表中結(jié)點(diǎn)類(lèi)的定義friendclassdataList<E,K>; private:

Kkey; //關(guān)鍵碼域

E

other; //其他域(視問(wèn)題而定)

//聲明其友元類(lèi)為dataListpublic:12

dataNode(constKx):key(x){} //構(gòu)造函數(shù)

KgetKey()const{returnkey;} //讀取關(guān)鍵碼

voidsetKey(Kx){key=x;} //修改關(guān)鍵碼};template<classE,classK>classdataList{ //數(shù)據(jù)表類(lèi)定義protected:

dataNode<E,K>*Element; //數(shù)據(jù)表存儲(chǔ)數(shù)組

intArraySize,CurrentSize; //數(shù)組最大長(zhǎng)度和當(dāng)前長(zhǎng)度13順序搜索主要用于在線性表中搜索。順序用各元素的關(guān)鍵碼與給定值x進(jìn)行比較技巧:把待查關(guān)鍵字key存入表頭或表尾(俗稱(chēng)“哨兵”),這樣可以加快執(zhí)行速度。7.1.2順序搜索(SequentialSearch)

順序查找(線性查找)基本思想:從線性表的一端向另一端逐個(gè)將關(guān)鍵碼與給定值進(jìn)行比較,若相等,則查找成功,給出該記錄在表中的位置;若整個(gè)表檢測(cè)完仍未找到與給定值相等的關(guān)鍵碼,則查找失敗,給出失敗信息。

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

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

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

ASL==?=niicp1?+-=niiinp1)1(i=(n+1)/2=O(n)平均查找長(zhǎng)度較大,特別是當(dāng)待查找集合中元素較多時(shí),查找效率較低。順序查找的缺點(diǎn):對(duì)表中記錄的存儲(chǔ)沒(méi)有任何要求,順序存儲(chǔ)和鏈接存儲(chǔ)均可;對(duì)表中記錄的有序性也沒(méi)有要求,無(wú)論記錄是否按關(guān)鍵碼有序均可。順序查找的優(yōu)點(diǎn):算法簡(jiǎn)單而且使用面廣。7.1.3基于有序順序表的折半搜索哨兵法當(dāng)N很大時(shí),搜索的效率很低。如果把順序表的元素按其關(guān)鍵碼從小到大排列,則可以采取效率更高的搜索算法。20折半搜索使用條件:線性表中的記錄必須按關(guān)鍵碼有序;必須采用順序存儲(chǔ)?;舅枷耄赫郯胨阉鲿r(shí),先求位于搜索區(qū)間正中的對(duì)象的下標(biāo)mid,用其關(guān)鍵碼與給定值x比較:Element[mid].key==x,搜索成功;

Element[mid].key>x,把搜索區(qū)間縮小到表的前半部分,繼續(xù)折半搜索;

Element[mid].key<x,把搜索區(qū)間縮小到表的后半部分,繼續(xù)折半搜索。例:查找值為14的記錄的過(guò)程:

012345678910111213

7141821232931353842464952low=1high=13mid=7

high=6mid=3

high=2

mid=1

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

14=14例:查找值為22的記錄的過(guò)程:

012345678910111213

7141821232931353842464952low=1high=13mid=7

high=6mid=3

high=4

mid=5

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

21<22low=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;}折半查找——非遞歸算法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;}}折半查找——遞歸算法有序順序表的折半搜索的判定樹(shù)

(10,20,30,40,50,60)1050======30<<<<<<>>>>>>204060(2*1+3*6)/7折半搜索性能分析若設(shè)n=2h-1,則描述折半搜索的判定樹(shù)是高度為h-1的滿(mǎn)二叉樹(shù)。

2h=n+1,h=log2|

(n+1)︱。搜索成功:在表中查找任一記錄的過(guò)程,即是折半查找判定樹(shù)中從根結(jié)點(diǎn)到該記錄結(jié)點(diǎn)的路徑,和給定值的比較次數(shù)等于該記錄結(jié)點(diǎn)在樹(shù)中的層數(shù)。搜索不成功:查找失敗的過(guò)程就是走了一條從根結(jié)點(diǎn)到外部結(jié)點(diǎn)的路徑,和給定值進(jìn)行的關(guān)鍵碼的比較次數(shù)等于該路徑上內(nèi)部結(jié)點(diǎn)的個(gè)數(shù)??梢杂脷w納法證明課堂練習(xí)(多項(xiàng)選擇):A.采用鏈?zhǔn)酱尜A結(jié)構(gòu) B.記錄的長(zhǎng)度≤128C.采用順序存貯結(jié)構(gòu)D.記錄按關(guān)鍵字遞增有序√√使用折半查找算法時(shí),要求被查文件:307.2二叉搜索樹(shù)(BinarySearchTree)定義

二叉搜索樹(shù)或者是一棵空樹(shù),或者是具有下列性質(zhì)的二叉樹(shù):所有結(jié)點(diǎn)的關(guān)鍵碼互不相同。左子樹(shù)(如果非空)上所有結(jié)點(diǎn)的關(guān)鍵碼都小于根結(jié)點(diǎn)的關(guān)鍵碼。右子樹(shù)(如果非空)上所有結(jié)點(diǎn)的關(guān)鍵碼都大于根結(jié)點(diǎn)的關(guān)鍵碼。左子樹(shù)和右子樹(shù)也是二叉搜索樹(shù)。351545504025102030二叉搜索樹(shù)例結(jié)點(diǎn)左子樹(shù)上所有關(guān)鍵碼小于結(jié)點(diǎn)關(guān)鍵碼;右子樹(shù)上所有關(guān)鍵碼大于結(jié)點(diǎn)關(guān)鍵碼;(a)(b)練:下列2種圖形中,哪個(gè)不是二叉搜索樹(shù)?如果對(duì)一棵二叉搜索樹(shù)進(jìn)行中序遍歷,可以按從小到大的順序,將各結(jié)點(diǎn)關(guān)鍵碼排列起來(lái),所以也稱(chēng)二叉搜索樹(shù)為二叉排序樹(shù)。二叉搜索樹(shù)的類(lèi)定義#include<iostream.h>#include<stdlib.h>template<classE,classK>structBSTNode{ //二叉樹(shù)結(jié)點(diǎn)類(lèi)

Edata; //數(shù)據(jù)域

BSTNode<E,K>*left,*right;//左子女和右子女BSTNode(){left=NULL;right=NULL;

}

BSTNode(constEd,BSTNode<E,K>*L=NULL,

BSTNode<E,K>*R=NULL){data=d;left=L;right=R;}~BSTNode(){} //析構(gòu)函數(shù)

voidsetData(Ed){data=d;} //修改

EgetData(){returndata;} //提取

booloperator<(constE&x)

//重載:判小于

{returndata.key<x.key;}

booloperator>(constE&x) //重載:判大于

{returndata.key>x.key;}booloperator==(constE&x) //重載:判等于

{returndata.key==x.key;}};template<classE,classK>classBST{ //二叉搜索樹(shù)類(lèi)定義private:BSTNode<E,K>*root; //根指針

KRefValue; //輸入停止標(biāo)志public:BST(){root=NULL;

} //構(gòu)造函數(shù)

BST(Kvalue); //構(gòu)造函數(shù)

~BST(){}; //析構(gòu)函數(shù)

boolSearch(constKx)const //搜索

{returnSearch(x,root)!=NULL;}

BST<E,K>&operator=(constBST<E,K>&R); //重載:賦值

voidmakeEmpty()

//置空

{makeEmpty(root);root=NULL;}voidPrintTree()const{PrintTree(root);}//輸出

EMin(){returnMin(root)->data;} //求最小

EMax(){returnMax(root)->data;} //求最大

boolInsert(constE&e1)

//插入新元素

{returnInsert(e1,root);}boolRemove(constKx){returnRemove(x,root);} //刪除含x的結(jié)點(diǎn)private:

BSTNode<E,K>* //遞歸:搜索

Search(constKx,BSTNode<E,K>*ptr);voidmakeEmpty(BSTNode<E,K>*&ptr); //遞歸:置空

voidPrintTree(BSTNode<E,K>*ptr)const; //遞歸:打印

BSTNode<E,K>* //遞歸:復(fù)制

Copy(constBSTNode<E,K>*ptr); BSTNode<E,K>*Min(BSTNode<E,K>*ptr);

//遞歸:求最小

BSTNode<E,K>*Max(BSTNode<E,K>*ptr);

//遞歸:求最大

boolInsert(constE&e1,BSTNode<E,K>*&ptr);

//遞歸:插入

boolRemove(constKx,BSTNode<E,K>*&ptr);

//遞歸:刪除};二叉搜索樹(shù)的類(lèi)定義用二叉鏈表作為它的存儲(chǔ)表示,許多操作的實(shí)現(xiàn)與二叉樹(shù)類(lèi)似。二叉搜索樹(shù)的搜索算法在二叉搜索樹(shù)上進(jìn)行搜索,是一個(gè)從根結(jié)點(diǎn)開(kāi)始,遞歸進(jìn)行比較判等的過(guò)程。假設(shè)想要在二叉搜索樹(shù)中搜索關(guān)鍵碼為x

的元素,搜索過(guò)程從根結(jié)點(diǎn)開(kāi)始。如果根指針為NULL,則搜索不成功;否則用給定值

x

與根結(jié)點(diǎn)的關(guān)鍵碼進(jìn)行比較:若給定值等于根結(jié)點(diǎn)關(guān)鍵碼,則搜索成功若小于根結(jié)點(diǎn)的關(guān)鍵碼,則搜索左子樹(shù);否則。遞歸搜索根結(jié)點(diǎn)的右子樹(shù)。搜索45搜索成功搜索28搜索失敗351545504025102030template<classE,classK>BSTNode<E,K>*BST<E,K>::Search(constKx,BSTNode<E,K>*ptr){//私有遞歸函數(shù):在以ptr為根的二叉搜索樹(shù)中搜//索含x的結(jié)點(diǎn)。若找到,則函數(shù)返回該結(jié)點(diǎn)的//地址,否則函數(shù)返回NULL值。

if(ptr==NULL)returnNULL;

elseif(x<ptr->data)returnSearch(x,ptr->left);elseif(x>ptr->data)returnSearch(x,ptr->right);elsereturnptr; //搜索成功};template<classE,classK>BSTNode<E,K>*BST<E,K>::Search(constKx,BSTNode<E,K>*ptr){//非遞歸函數(shù):作為對(duì)比,在當(dāng)前以ptr為根的二//叉搜索樹(shù)中搜索含x的結(jié)點(diǎn)。若找到,則函數(shù)返//回該結(jié)點(diǎn)的地址,否則函數(shù)返回NULL值。

if(ptr==NULL)returnNULL;

BSTNode<E,K>*temp=ptr;while(temp!=NULL){

if(x==temp->data)returntemp;

if(x<temp->data)

temp=temp->left;elsetemp=temp->right;}returnNULL;};搜索過(guò)程是從根結(jié)點(diǎn)開(kāi)始,沿某條路徑自上而下逐層比較判等的過(guò)程。搜索成功,搜索指針將停留在樹(shù)上某個(gè)結(jié)點(diǎn);搜索不成功,搜索指針將走到樹(shù)上某個(gè)結(jié)點(diǎn)的空子樹(shù)。設(shè)樹(shù)的高度為h,最多比較次數(shù)不超過(guò)h。二叉搜索樹(shù)的插入算法為了向二叉搜索樹(shù)中插入一個(gè)新元素,必須先檢查這個(gè)元素是否在樹(shù)中已經(jīng)存在。在插入之前,先使用搜索算法在樹(shù)中檢查要插入元素有還是沒(méi)有。如果搜索成功,說(shuō)明樹(shù)中已經(jīng)有這個(gè)元素,不再插入;如果搜索不成功,說(shuō)明樹(shù)中原來(lái)沒(méi)有關(guān)鍵碼等于給定值的結(jié)點(diǎn),把新元素加到搜索操作停止的地方。35154550402510203028插入新結(jié)點(diǎn)28二叉搜索樹(shù)的插入每次結(jié)點(diǎn)的插入,都要從根結(jié)點(diǎn)出發(fā)搜索插入位置,然后把新結(jié)點(diǎn)作為葉結(jié)點(diǎn)插入。二叉搜索樹(shù)的插入算法template<classE,classK>boolBST<E,K>::Insert(constE&e1,BSTNode<E,K>*&ptr){

if(ptr==NULL){ //新結(jié)點(diǎn)作為葉結(jié)點(diǎn)插入

ptr=newBstNode<E,K>(e1); //創(chuàng)建新結(jié)點(diǎn)

if(ptr==NULL){cerr<<"Outofspace"<<endl;exit(1);} returntrue;}elseif(e1<ptr->data)Insert(e1,ptr->left);

elseif(e1>ptr->data)Insert(e1,ptr->right);

elsereturnfalse; //x已在樹(shù)中,不再插入};利用二叉搜索樹(shù)的插入算法,可以很方便地建立二叉搜索樹(shù)。

輸入數(shù)據(jù)

{53,78,65,17,87,09,81,15}535378537865537865175378658717537865091787537865811787095378651517870981template<classE,classK>BST<E,K>::BST(Kvalue){//輸入一個(gè)元素序列,建立一棵二叉搜索樹(shù)

Ex;

root=NULL;RefValue=value; //置空樹(shù)

cin>>x; //輸入數(shù)據(jù)

while(x.key!=RefValue){ //RefValue是一個(gè)輸入結(jié)束標(biāo)志

Insert(x,root);cin>>x; //插入,再輸入數(shù)據(jù)

}};在二叉排序樹(shù)上刪除某個(gè)結(jié)點(diǎn)之后,仍然保持二叉排序樹(shù)的特性。分三種情況討論:被刪除的結(jié)點(diǎn)是葉子;被刪除的結(jié)點(diǎn)只有左子樹(shù)或者只有右子樹(shù);被刪除的結(jié)點(diǎn)既有左子樹(shù),也有右子樹(shù)。

二叉搜索樹(shù)的刪除情況1——被刪除的結(jié)點(diǎn)是葉子結(jié)點(diǎn)二叉搜索樹(shù)的刪除50302080908588403532503020809085403532操作:將雙親結(jié)點(diǎn)中相應(yīng)指針域的值改為空。情況2——被刪除的結(jié)點(diǎn)只有左子樹(shù)或者只有右子樹(shù)操作:將雙親結(jié)點(diǎn)的相應(yīng)指針域的值指向被刪除結(jié)點(diǎn)的左子樹(shù)(或右子樹(shù))。q=pp=p->lchild(或p=p->rchild);free(q)二叉搜索樹(shù)的刪除50302080908588403532503020908588403532qp8853788117940945刪除78在右子樹(shù)上找中序下第一個(gè)結(jié)點(diǎn)填補(bǔ)2365538188179409452365情況3:被刪結(jié)點(diǎn)左、右子樹(shù)都不為空,以其左子樹(shù)中的最大值結(jié)點(diǎn)(或右子樹(shù)中的最小值結(jié)點(diǎn))替代之,再來(lái)處理這個(gè)結(jié)點(diǎn)的刪除問(wèn)題。情況3——被刪除的結(jié)點(diǎn)既有左子樹(shù)也有右子樹(shù)二叉搜索樹(shù)的刪除50302080908588403532403020809085883532二叉搜索樹(shù)的刪除算法template<classE,classK>boolBST<E,K>::Remove(constKx,

BstNode<E,K>*&ptr){//在以ptr為根的二叉搜索樹(shù)中刪除含x的結(jié)點(diǎn)

BstNode<E,K>*temp;if(ptr!=NULL){if(x<ptr->data)Remove(x,ptr->left);

//在左子樹(shù)中執(zhí)行刪除

elseif(x>ptr->data)Remove(x,ptr->right);

//在右子樹(shù)中執(zhí)行刪除elseif(ptr->left!=NULL&&ptr->right!=NULL)

{//ptr指示關(guān)鍵碼為x的結(jié)點(diǎn),它有兩個(gè)子女

temp=ptr->right;

//到右子樹(shù)搜尋中序下第一個(gè)結(jié)點(diǎn)

while(temp->left!=NULL)temp=temp->left;

ptr->data=temp->data;

//用該結(jié)點(diǎn)數(shù)據(jù)代替根結(jié)點(diǎn)數(shù)據(jù)

Remove(ptr->data,ptr->right);} else{ //ptr指示關(guān)鍵碼為x的結(jié)點(diǎn)有一個(gè)子女

temp=ptr; if(ptr->left==NULL)ptr=ptr->right;elseptr=ptr->left;deletetemp;returntrue;} } returnfalse;};注意在刪除算法參數(shù)表引用型指針參數(shù)的使用。

二叉搜索樹(shù)性能分析對(duì)于有n個(gè)關(guān)鍵碼的集合,其關(guān)鍵碼有n!種不同排列,可構(gòu)成不同二叉搜索樹(shù)有

(棵)

{2,1,3}{1,2,3}{1,3,2}{2,3,1}{3,1,2}{3,2,1}

123111132223323同樣3個(gè)數(shù)據(jù){1,2,3},輸入順序不同,建立起來(lái)的二叉搜索樹(shù)的形態(tài)也不同。這直接影響到二叉搜索樹(shù)的搜索性能。如果輸入序列選得不好,會(huì)建立起一棵單支樹(shù),使得二叉搜索樹(shù)的高度達(dá)到最大。用樹(shù)的搜索效率來(lái)評(píng)價(jià)這些二叉搜索樹(shù)。為此,在二叉搜索樹(shù)中加入外結(jié)點(diǎn),形成判定樹(shù)。外結(jié)點(diǎn)表示失敗結(jié)點(diǎn),內(nèi)結(jié)點(diǎn)表示搜索樹(shù)中已有的數(shù)據(jù)。這樣的判定樹(shù)即為擴(kuò)充的二叉搜索樹(shù)。舉例說(shuō)明。已知關(guān)鍵碼集合

{a1,a2,a3}=

{do,if,to},對(duì)應(yīng)搜索概率p1,p2,p3,在各搜索不成功間隔內(nèi)搜索概率分別為q0,q1,q2,q3??赡艿亩嫠阉鳂?shù)如下所示。doiftodoiftoq0q1p1q2p2q3p3q0q1q2q3p1p2p3(a)(b)判定樹(shù)doiftoq0q1p1q2p2q3p3doiftoq0q1p1q2p2q3p3(d)(c)doiftoq0q1p1q2p2q3p3(e)在判定樹(shù)中

○表示內(nèi)部結(jié)點(diǎn),包含了關(guān)鍵碼集合中的某一個(gè)關(guān)鍵碼;□表示外部結(jié)點(diǎn),代表各關(guān)鍵碼間隔中的不在關(guān)鍵碼集合中的關(guān)鍵碼。一棵判定樹(shù)上的搜索成功的平均搜索長(zhǎng)度ASLsucc可以定義為該樹(shù)所有內(nèi)部結(jié)點(diǎn)上的搜索概率p[i]與搜索該結(jié)點(diǎn)時(shí)所需的關(guān)鍵碼比較次數(shù)c[i](=l[i],即結(jié)點(diǎn)所在層次)乘積之和:設(shè)各關(guān)鍵碼的搜索概率相等:p[i]=1/n搜索不成功的平均搜索長(zhǎng)度ASLunsucc為樹(shù)中所有外部結(jié)點(diǎn)上搜索概率q[j]與到達(dá)外部結(jié)點(diǎn)所需關(guān)鍵碼比較次數(shù)c'[j](=l'[j])乘積之和:設(shè)外部結(jié)點(diǎn)搜索概率相等:q[j]=1/(n+1):設(shè)樹(shù)中所有內(nèi)、外部結(jié)點(diǎn)的搜索概率都相等:

p[i]=1/3,1≤i≤3,q[j]=1/4,0≤

j≤3

圖(a):ASLsucc=1/3*3+1/3*2+1/3*1=6/3,

ASLunsucc=1/4*3*2+1/4*2+1/4*1=9/4。

圖(b):

ASLsucc=1/3*2*2+1/3*1=5/3,

ASLunsucc=1/4*2*4=8/4。圖(c):ASLsucc=1/3*1+1/3*2+1/3*3=6/3,

ASLunsucc=1/4*1+1/4*2+1/4*3*2=9/4。圖(d):ASLsucc=1/3*2+1/3*3+1/3*1=6/3,

ASLunsucc=1/4*2+1/4*3*2+1/4*1=9/4。(1)相等搜索概率的情形

圖(e):ASLsucc=1/3*1+1/3*3+1/3*2=6/3,

ASLunsucc=1/4*1+1/4*3*2+1/4*2=9/4。圖(b)的情形所得的平均搜索長(zhǎng)度最小。一般把平均搜索長(zhǎng)度達(dá)到最小的擴(kuò)充的二叉搜索樹(shù)稱(chēng)作最優(yōu)二叉搜索樹(shù)。在相等搜索概率的情形下,所有內(nèi)部、外部結(jié)點(diǎn)的搜索概率都相等,視它們的權(quán)值都為1。同時(shí),第k層有2k-1個(gè)結(jié)點(diǎn),k=1,2,。則有n個(gè)內(nèi)部結(jié)點(diǎn)的擴(kuò)充二叉搜索樹(shù)的內(nèi)部路徑長(zhǎng)度I至少等于序列

0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,…

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論