版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第九章查找重點(diǎn):掌握順序查找、折半查找、二叉排序樹上查找以及散列表上查找的基本思想和算法實(shí)現(xiàn)。難點(diǎn):二叉排序樹的刪除算法及B-樹上的插入和刪除算法。相關(guān)定義----查找表查找表(SearchTable)定義:由同一類型的數(shù)據(jù)元素(或記錄)構(gòu)成的集合。
“集合”中的數(shù)據(jù)元素之間存在著完全松散的關(guān)系查找表是一種非常靈便的數(shù)據(jù)結(jié)構(gòu)操作查詢某個(gè)“特定的”數(shù)據(jù)元素是否在查找表中;檢索某個(gè)“特定的”數(shù)據(jù)元素的各種屬性;相關(guān)定義----查找表及其分類操作在查找表中插入一個(gè)數(shù)據(jù)元素;從查找表中刪去某個(gè)數(shù)據(jù)元素。查找表的分類靜態(tài)查找表:僅作查詢和檢索操作的查找表。動(dòng)態(tài)查找表:在查詢過程中同時(shí)插入查找表中不存在的數(shù)據(jù)元素,或者從查找表中刪除已存在的某個(gè)數(shù)據(jù)元素。相關(guān)定義----關(guān)鍵字關(guān)鍵字定義:是數(shù)據(jù)元素(或記錄)中某個(gè)數(shù)據(jù)項(xiàng)的值,用以標(biāo)識(shí)(識(shí)別)一個(gè)數(shù)據(jù)元素(或記錄)。若此關(guān)鍵字可以唯一地標(biāo)識(shí)一個(gè)記錄,則稱之為主關(guān)鍵字;若此關(guān)鍵字能識(shí)別若干記錄,則稱之為次關(guān)鍵字。相關(guān)定義----查找查找定義:根據(jù)給定的某個(gè)值,在查找表中確定一個(gè)其關(guān)鍵字等于給定值的記錄或數(shù)據(jù)元素。
若查找表中存在這樣一個(gè)記錄,則稱查找是成功的,此時(shí)查找結(jié)果為給出整個(gè)記錄的信息,或指示該記錄在查找表中的位置;
否則稱查找不成功,此時(shí)查找結(jié)果可給出一個(gè)空記錄或空指針。相關(guān)定義----類型定義typedefstruct{KeyTypekey; //關(guān)鍵字域
…… //其它域}ElemType;根據(jù)具體的關(guān)鍵字類型,定義用于比較的、帶參的宏#defineEQ(a,b)((a)==(b))#defineLT(a,b)((a)<(b))#defineLQ(a,b)((a)<=(b))#defineEQ(a,b)(!strcmp((a),(b)))#defineLT(a,b)(strcmp((a),(b))<0)#defineLQ(a,b)(strcmp((a),(b))<=0)原型:externintstrcmp(constchar*s1,constchar*s2);
用法:#include<string.h>功能:比較字符串s1和s2。
說明:當(dāng)s1<s2時(shí),返回值<0當(dāng)s1=s2時(shí),返回值=0當(dāng)s1>s2時(shí),返回值>09.1.1順序查找查找表結(jié)構(gòu):以順序表或線性鏈表表示基本思想:從一端開始向另一端,逐個(gè)進(jìn)行記錄的關(guān)鍵字和給定值的比較,若某個(gè)記錄的關(guān)鍵字和給定值比較相等,則查找成功;反之,若直至另一端,其關(guān)鍵字和給定值比較都不等,則表明表中沒有所查記錄,查找不成功。
查找成功示例:
(34,44,43,12,53,55,73,64,77),key=64
查找不成功示例:
(34,44,43,12,53,55,73,64,77),key=889.1.1順序查找對(duì)順序表的順序查找typedefstruct{ElemType*elem;//數(shù)據(jù)元素存儲(chǔ)空間基址
intlength; //表長(zhǎng)度}SSTable;i01234567891011
513192137566475808892找6464監(jiān)視哨iiii比較次數(shù)=5比較次數(shù):查找第n個(gè)元素:1查找第n-1個(gè)元素:2……….查找第1個(gè)元素:n查找第i個(gè)元素:n+1-i查找失?。簄+1查找過程:從表的一端開始逐個(gè)進(jìn)行記錄的關(guān)鍵字和給定值的比較。例如:9.1.1順序查找9.1.1順序查找對(duì)順序表的順序查找
intSearch_Seq(SSTableST,KeyTypekey)
{
//在順序表ST中順序查找其關(guān)鍵字等于key的數(shù)據(jù)元素。
//若找到,則函數(shù)值為該元素在表中的位置,否則為0。
ST.elem[0].key
=key;
//“哨兵”
//從后往前找
for(i=ST.length;ST.elem[i].key!=key;--i);
returni;
//找不到時(shí),i為0
}//Search_Seq
哨兵的作用:免去查找過程中每一步都要檢測(cè)整個(gè)表是否查找完畢。
上述順序查找表的查找算法簡(jiǎn)單,但平均查找長(zhǎng)度較大,特別不適用于表長(zhǎng)較大的查找表。若以有序表表示靜態(tài)查找表,則查找過程可以基于“折半”進(jìn)行。9.1.2有序表的查找----折半查找1.設(shè)表長(zhǎng)為n,low、high和mid分別指向待查元素所在區(qū)間的下界上界和中點(diǎn),key為給定值。
2.初始時(shí),令
low=1,high=n,mid=(low+high)/2
讓key與mid指向的記錄比較
若key==ST[mid].key,查找成功
若key<ST[mid].key,則high=mid-1
若key>ST[mid].key,則low=mid+1
3.重復(fù)上述操作,直至low>high時(shí),查找失敗。9.1.2有序表的查找-折半查找折半查找(二分查找)查找表結(jié)構(gòu):有序表基本思想:查找區(qū)間逐步縮小(折半)
查找成功示例:
123456789
(12,33,40,45,53,55,64,66,77),key=64
low指示查找區(qū)間的下界;
high指示查找區(qū)間的上界;
mid=(low+high)/2
。9.1.2有序表的查找-折半查找lowhighmidlowlowmidmid9.1.2有序表的查找-折半查找基本思想:查找區(qū)間逐步縮小(折半)
查找不成功示例:
123456789
(12,33,40,45,53,55,64,66,77),key=68lowhighmidlowlowmidmidlowlowmidmidlowlowmidmidhighhigh9.1.2有序表的查找-折半查找intSearch_Bin(SSTableST,KeyTypekey){low=1;high=ST.length;
//置區(qū)間初值
while(low<=high){mid=(low+high)/2;if(EQ(key,ST.elem[mid].key))returnmid;
//找到待查元素
elseif(LT(key,ST.elem[mid].key))high=mid-1;
//繼續(xù)在前半?yún)^(qū)間進(jìn)行查找
elselow=mid+1;
//繼續(xù)在后半?yún)^(qū)間進(jìn)行查找
}return0;
//順序表中不存在待查元素}//Search_Bin9.1.2有序表的查找-折半查找性能分析判定樹:折半查找的查找過程可以用二叉樹描述。n=ST.length=10時(shí),判定樹的形態(tài)為:
52816397410查找成功時(shí)的ASL=該結(jié)點(diǎn)在判定樹中的層次判定樹的形態(tài)與n直接相關(guān),與關(guān)鍵字的取值無關(guān)查找不成功時(shí)練習(xí):畫出對(duì)長(zhǎng)度為12的有序表進(jìn)行折半查找的判定樹9.1.2有序表的查找-折半查找第九章查找9.1順序查找9.2動(dòng)態(tài)查找表9.3哈希表9.2.1二叉排序樹----定義二叉排序樹(二叉查找樹)
BinarySort/SearchTree定義(遞歸):或者是一棵空樹,或者是具有如下特性的二叉樹:若它的左子樹不空,則左子樹上所有結(jié)點(diǎn)的值均小于根結(jié)點(diǎn)的值;若它的右子樹不空,則右子樹上所有結(jié)點(diǎn)的值均大于根結(jié)點(diǎn)的值;它的左、右子樹也分別是二叉排序樹。503080209010854035252388例如:是二叉排序樹。66不9.2.1二叉排序樹----定義通常,取二叉鏈表作為二叉排序樹的存儲(chǔ)結(jié)構(gòu)。typedefstruct
BiTNode
{//結(jié)點(diǎn)結(jié)構(gòu)
TElemTypedata;structBiTNode*lchild,*rchild;
//左右孩子指針}BiTNode,*BiTree;9.2.1二叉排序樹----定義1)若給定值等于根結(jié)點(diǎn)的關(guān)鍵字,則查找成功;2)若給定值小于根結(jié)點(diǎn)的關(guān)鍵字,則繼續(xù)在左子樹上進(jìn)行查找;3)若給定值大于根結(jié)點(diǎn)的關(guān)鍵字,則繼續(xù)在右子樹上進(jìn)行查找。否則若二叉排序樹為空,則查找不成功;9.2.1-二叉排序樹:查找算法50308020908540358832例如:二叉排序樹查找關(guān)鍵字==50,505035,503040355090,50809095,9.2.1-二叉排序樹:查找算法從上述查找過程可見,在查找過程中,生成了一條查找路徑:
從根結(jié)點(diǎn)出發(fā),沿著左分支或右分支逐層向下直至關(guān)鍵字等于給定值的結(jié)點(diǎn);或者
從根結(jié)點(diǎn)出發(fā),沿著左分支或右分支逐層向下直至指針指向空樹為止。
——查找成功——查找不成功9.2.1-二叉排序樹:查找算法9.2.1二叉排序樹----插入二叉排序樹的插入新插入的結(jié)點(diǎn)一定是一個(gè)新添加的葉子結(jié)點(diǎn),并且是查找不成功時(shí)查找路徑上訪問的最后一個(gè)結(jié)點(diǎn)的左孩子或右孩子結(jié)點(diǎn)。示例:從空樹出發(fā),待插的關(guān)鍵字序列為33,44,23,46,12,37334423461237中序遍歷二叉排序樹可得到一個(gè)關(guān)鍵字的有序序列。該例中,中序遍歷結(jié)果為:12,23,33,37,44,46
若從一棵空樹出發(fā),經(jīng)過一系列的查找插入操作之后,可生成一棵二叉樹。且對(duì)其進(jìn)行中序遍歷可得到一個(gè)關(guān)鍵字的有序序列。這說明一個(gè)無序序列可通過構(gòu)造一棵二叉排序樹而變成一棵有序序列。
9.2.1-二叉排序樹:改進(jìn)的查找算法503080209010854035252388中序序列為:1020232530354050808588909.2.1-二叉排序樹:改進(jìn)的查找算法9.2.1二叉排序樹----刪除二叉排序樹的刪除假設(shè)被刪結(jié)點(diǎn)為*p,其雙親結(jié)點(diǎn)為*f,*p為葉子結(jié)點(diǎn):刪去*p,并修改*f的孩子域。*p只有左子樹PL或只有右子樹PR:令PL或PR直接成為*f的子樹334423461237464633442346124544464546459.2.1二叉排序樹----刪除二叉排序樹的刪除*p的左子樹PL和右子樹PR均不為空33442346123744405048353846504833231237403538方法1:PL
接替*p成為*f的子樹,PR成為PL最右下結(jié)點(diǎn)(中序遍歷PL所得序列的最后一個(gè)結(jié)點(diǎn))的右子樹。40這種方法可能會(huì)導(dǎo)致二叉排序樹高度的增長(zhǎng)!本例中高度:564846509.2.1二叉排序樹----刪除二叉排序樹的刪除*p的左子樹PL和右子樹PR均不為空334423461237444050483538332312方法2:與方法1對(duì)稱,PR接替*p成為*f的子樹,PL成為PR最左下結(jié)點(diǎn)(中序遍歷PR所得序列的最前一個(gè)結(jié)點(diǎn))的左子樹。46374035389.2.1二叉排序樹----刪除二叉排序樹的刪除*p的左子樹PL和右子樹PR均不為空方法3、令*p的中序遍歷的直接前驅(qū)替代*p,再?gòu)亩媾判驑渲袆h去它的直接前驅(qū)。這種方法不會(huì)導(dǎo)致二叉排序樹高度的增長(zhǎng)!本例中高度:55刪除時(shí),如何不增長(zhǎng)樹的高度?334423461237444050483538404038383344234612374440504835389.2.1二叉排序樹----刪除二叉排序樹的刪除*p的左子樹PL和右子樹PR均不為空方法4:與方法3對(duì)稱,令*p的中序遍歷的直接后繼替代*p,再?gòu)亩媾判驑渲袆h去它的直接后繼。334423461244504837403538464648504850334423461237444050483538334423461237444050483538334423461237444050483538404038389.2.1二叉排序樹----刪除算法9.2.1二叉排序樹----性能分析二叉排序樹的查找分析與給定值比較的關(guān)鍵字個(gè)數(shù)不超過二叉排序樹的深度示例:從空樹出發(fā),待插的關(guān)鍵字序列為33,44,23,46,12,37334423461237二叉排序樹的形態(tài)與關(guān)鍵字的插入次序直接相關(guān)!如:將上例的關(guān)鍵字插入次序調(diào)整為:
12,23,33,44,37,46122333374446查找成功且各記錄的查找概率相等時(shí)
ASL(a)=(1+2*2+3*3)/6=14/6查找成功且各記錄的查找概率相等時(shí)ASL(b)=(1+2+3+4+5*2)/6=20/69.2.1二叉排序樹----性能分析9.2.1二叉排序樹----性能分析對(duì)給定序列建立二叉排序樹,若左右子樹均勻分布,則其查找過程類似于有序表的折半查找。但若給定序列原本有序,則建立的二叉排序樹就蛻化為單鏈表,其查找效率和順序查找一樣。第九章查找9.1順序查找9.2動(dòng)態(tài)查找表9.3哈希表9.3哈希表9.3.1什么是哈希表9.3.2哈希函數(shù)的構(gòu)造方法9.3.3處理沖突的方法9.3.4哈希表的查找及其分析9.3.1什么是哈希表9.1和9.2節(jié)討論的各查找方法記錄在查找表中的位置和它的關(guān)鍵字之間不存在確定的關(guān)系;查找是建立在比較的基礎(chǔ)上(給定值vs.表中的關(guān)鍵字)查找效率依賴于查找過程中所進(jìn)行的比較次數(shù)如何一次存取便能得到所查記錄?記錄的存儲(chǔ)位置和它的關(guān)鍵字之間建立一個(gè)確定的對(duì)應(yīng)關(guān)系H,以H(key)作為關(guān)鍵字為key的記錄在表中的位置,稱這個(gè)對(duì)應(yīng)關(guān)系H為哈希(Hash)函數(shù)。9.3.1什么是哈希表例:30個(gè)地區(qū)的各民族人口統(tǒng)計(jì)表編號(hào)地區(qū)名總?cè)丝跐h族回族…1北京2上海┆┆以編號(hào)作關(guān)鍵字,構(gòu)造哈希函數(shù):H(key)=keyH(1)=1H(2)=2以地區(qū)名作關(guān)鍵字,取地區(qū)名的第一個(gè)拼音字母的序號(hào)作哈希函數(shù):H(Beijing)=2H(Shanghai)=19H(Shenyang)=199.3.1什么是哈希表哈希函數(shù)是一個(gè)映象,哈希函數(shù)的設(shè)定很靈活,只要使任何關(guān)鍵字的哈希函數(shù)值都落在表長(zhǎng)允許的范圍之內(nèi)即可;沖突:key1≠key2,但H(key1)=H(key2)的現(xiàn)象
具有相同哈希函數(shù)值的關(guān)鍵字稱做同義詞。根據(jù)設(shè)定的哈希函數(shù)
H(key)和所選中的處理沖突的方法,將一組關(guān)鍵字映象到一個(gè)有限的、地址連續(xù)的地址集(區(qū)間)上,并以關(guān)鍵字在地址集中的“象”作為記錄在表中的存儲(chǔ)位置,這種表便稱為哈希表,這一映象過程稱為哈希造表或散列,所得存儲(chǔ)位置稱哈希地址或散列地址。9.3.2哈希函數(shù)的構(gòu)造方法直接定址法哈希函數(shù)為關(guān)鍵字的線性函數(shù),即
H(key)=key或者H(key)=a·key+b此法僅適合于:地址集合的大小==關(guān)鍵字集合的大小,其中a和b為常數(shù);例:解放后出生的人口調(diào)查表H(key)=key-1948地址010203…22…年份194919501951…1970…人數(shù)…………15000…┆9.3.2哈希函數(shù)的構(gòu)造方法數(shù)字分析法關(guān)鍵字是以r為基的數(shù),且哈希表中可能出現(xiàn)的關(guān)鍵字都是事先知道的,則取關(guān)鍵字的若干數(shù)位組成哈希地址。例:有80個(gè)記錄,關(guān)鍵字為8位十進(jìn)制數(shù),哈希地址為2位十進(jìn)制數(shù)8134653281372242813874228130136781322817813389678136853781419355…..分析:只取8只取1只取3、4只取2、7、5數(shù)字分布近乎隨機(jī)所以:取任意兩位,或兩位與另兩位的疊加作哈希地址9.3.2哈希函數(shù)的構(gòu)造方法平方取中法取關(guān)鍵字平方后的中間幾位作為哈希地址求“關(guān)鍵字平方”的目的是“擴(kuò)大差別”,同時(shí)平方值的中間幾位數(shù)和關(guān)鍵字的每一位都相關(guān)。9.3.2哈希函數(shù)的構(gòu)造方法(4)折疊法將關(guān)鍵字分割成位數(shù)相同的幾部分(最后一部分的位數(shù)可以不同),然后取它們的疊加和(舍去進(jìn)位)為哈希地址。移位疊加:將分割后的幾部分低位對(duì)齊相加;間界疊加:從一端沿分割界來回折迭,然后對(duì)齊相加。例:關(guān)鍵字為0442205864,哈希地址分別為586442200410088H(key)=0088移位疊加5864022404
6092H(key)=6092間界疊加9.3.2哈希函數(shù)的構(gòu)造方法除留余數(shù)法H(key)=keyMODp,p≤mp為質(zhì)數(shù)或不包含小于20的質(zhì)因子的合數(shù)
為什么?例:給定一組關(guān)鍵字為:12,39,18,24,33,21,若取p=9,則它們對(duì)應(yīng)的哈希函數(shù)值將為:
3,3,0,6,6,3
可見,若p中含質(zhì)因子3,則所有含質(zhì)因子3的關(guān)鍵字均映射到“3的倍數(shù)”的地址上,從而增加了“沖突”的可能。
注意:p最好選取小于或等于表長(zhǎng)m的最大素?cái)?shù)。如表長(zhǎng)為20,那么p選19,若表長(zhǎng)為25,則p可選23,…。表長(zhǎng)m與模p的關(guān)系可按下表對(duì)應(yīng):
m=8,16,32,64,128,256,512,1024,…
p=7,13,31,61,127,251,503,1019,…9.3.3處理沖突的方法“處理沖突”的實(shí)際含義是:
為產(chǎn)生沖突的地址尋找下一個(gè)哈希地址。處理沖突的方法
開放定址法、鏈地址法、再哈希法、建立公共溢出區(qū)開放定址法為產(chǎn)生沖突的地址H(key)求得一個(gè)地址序列:
H0,H1,H2,…,Hs1≤s≤m-1Hi=(H(key)+di)MODm,其中:i=1,2,…,s H(key)為哈希函數(shù); m為哈希表長(zhǎng); di為增量序列;9.3.3處理沖突的方法開放定址法對(duì)增量di的三種取法:線性探測(cè)再散列
di=c×i,最簡(jiǎn)單的情況c=1平方探測(cè)再散列
di=12,-12,22,-22,…,隨機(jī)探測(cè)再散列
di
是一偽隨機(jī)數(shù)序列二次聚集:在處理同義詞的沖突過程中又添加了非同義詞的沖突,這種現(xiàn)象稱作“二次聚集”。9.3.3處理沖突的方法開放定址法例:給定關(guān)鍵字集合構(gòu)造哈希表
{19,01,23,14,55,68,11,82,36}設(shè)定哈希函數(shù)H(key)=keyMOD11(表長(zhǎng)=11)若采用線性探測(cè)再散列處理沖突若采用二次探測(cè)再散列處理沖突012345678910191011232141551683116822365012345678910191011232141551684113821362二次探測(cè)會(huì)降低“二次聚集”發(fā)生的概率9.3.3處理沖突的方法鏈地址法將所有關(guān)鍵字為同義詞的記錄存儲(chǔ)在同一線性鏈表中例:關(guān)鍵字
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 物理-山東省淄博市2024-2025學(xué)年第一學(xué)期高三期末摸底質(zhì)量檢測(cè)試題和答案
- 小學(xué)一年級(jí)20以內(nèi)數(shù)學(xué)口算練習(xí)題大全
- 廈門第一中學(xué)初中英語(yǔ)八年級(jí)上冊(cè)-Unit-6基礎(chǔ)練習(xí)(培優(yōu)專題)
- 小學(xué)四年級(jí)數(shù)學(xué)乘除法豎式計(jì)算題
- 小學(xué)數(shù)學(xué)六年級(jí)上冊(cè)分?jǐn)?shù)乘除法計(jì)算單元小測(cè)試卷
- 普通高等學(xué)校招生全國(guó)統(tǒng)一考試(湖北卷)語(yǔ)文
- 《工業(yè)的區(qū)位選擇sk》課件
- 廣東省潮州市2023-2024學(xué)年高三上學(xué)期期末教學(xué)質(zhì)量檢測(cè)英語(yǔ)試題
- 環(huán)保企業(yè)保安工作內(nèi)容詳解
- 印刷行業(yè)印刷技術(shù)培訓(xùn)總結(jié)
- 四川省成都市2021-2022學(xué)年物理高一下期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)模擬試題含解析
- 光伏發(fā)電系統(tǒng)租賃合同范本
- 新教科版六年級(jí)上冊(cè)科學(xué)全冊(cè)知識(shí)點(diǎn)(期末總復(fù)習(xí)資料)
- 綠色建筑工程監(jiān)理實(shí)施細(xì)則
- 2024年安全員b證繼續(xù)教育考試
- 科研倫理與學(xué)術(shù)規(guī)范期末考試試題
- T-CPQS C010-2024 鑒賞收藏用潮流玩偶及類似用途產(chǎn)品
- 電商直播帶貨運(yùn)營(yíng)方案(電商直播運(yùn)營(yíng)部門職責(zé)說明與KPI指標(biāo) 電商直播運(yùn)營(yíng)部門KPI績(jī)效考核指標(biāo))
- 110kV變電站專項(xiàng)電氣試驗(yàn)及調(diào)試方案
- 地質(zhì)勘探勞務(wù)分包合同
- 上海市徐匯區(qū)位育中學(xué)六年級(jí)上學(xué)期期末英語(yǔ)試題(含聽力)
評(píng)論
0/150
提交評(píng)論