




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)結(jié)構(gòu)課程的內(nèi)容6.1線性查找表6.2二叉搜索樹的查找性能6.3AVL樹6.4哈希表6.8模式匹配第6章查找6.1基本概念——若表中存在特定元素,稱查找成功,應(yīng)輸出該記錄;——否則,稱查找不成功(也應(yīng)輸出失敗標(biāo)志或失敗位置)——由同一類型的數(shù)據(jù)元素(或記錄)構(gòu)成的集合。——查詢(Searching)特定元素是否在表中?!徊檎遥桓淖兗蟽?nèi)的數(shù)據(jù)元素?!炔檎?,又改變(增減)集合內(nèi)的數(shù)據(jù)元素?!刂心硞€(gè)數(shù)據(jù)項(xiàng)的值,可用來識(shí)別一個(gè)記錄(預(yù)先確定的記錄的某種標(biāo)志)
——可以唯一標(biāo)識(shí)一個(gè)元素的關(guān)鍵字例如“學(xué)號(hào)”例如“女”——識(shí)別若干元素的關(guān)鍵字查找表查找查找成功查找不成功靜態(tài)查找動(dòng)態(tài)查找關(guān)鍵字主關(guān)鍵字次關(guān)鍵字明確:查找的過程就是將給定的K值與文件中各元素的關(guān)鍵字項(xiàng)進(jìn)行比較的過程。所以用比較次數(shù)的平均值來評(píng)估算法的優(yōu)劣。稱為平均查找長(zhǎng)度(ASL:averagesearchlength)。其中:n是文件記錄個(gè)數(shù);Pi是查找第i個(gè)記錄的查找概率(通常取等概率,即Pi=1/n);Ci是找到第i個(gè)記錄時(shí)所經(jīng)歷的比較次數(shù)。統(tǒng)計(jì)意義上的數(shù)學(xué)期望值物理意義:假設(shè)每一元素被查找的概率相同,則查找每一元素所需的比較次數(shù)之總和再取平均,即為ASL。如何評(píng)估查找方法的優(yōu)劣?一、順序查找(Linearsearch,又稱線性查找)(1)順序表的機(jī)內(nèi)存儲(chǔ)結(jié)構(gòu):StructNodetype{Keytypekey;elemtypedata;}typedefstruct{
structNodetypelist[Maxsize];
intlength;
}Seqlist;順序查找:即用逐一比較的辦法順序查找關(guān)鍵字,這顯然是最直接的辦法。
對(duì)順序結(jié)構(gòu)如何線性查找?對(duì)單鏈表結(jié)構(gòu)如何線性查找?函數(shù)雖未給出,但也很容易編寫;只要知道頭指針head就可以“順藤摸瓜”;對(duì)非線性樹結(jié)構(gòu)如何順序查找?可借助各種遍歷操作!(2)算法的實(shí)現(xiàn):技巧:把待查關(guān)鍵字key存入表頭或表尾(俗稱“哨兵”),這樣可以加快執(zhí)行速度。例:若將待查找的特定值key存入順序表的首部(如0號(hào)單元),則順序查找的實(shí)現(xiàn)方案為:從后向前逐個(gè)比較!intSearch_Seq(SeqlistST,KeyTypekey){
//在順序表ST中,查找關(guān)鍵字與key相同的元素;若成功,返回其位置信息,否則返回0
ST.list[0].key=key;
//設(shè)立哨兵,可免去查找過程中每一步都要檢測(cè)是否查找完畢。當(dāng)n>1000時(shí),查找時(shí)間將減少一半。
for(i=ST.length;ST.list[i].key!=key;--i);
//不要用for(i=n;i>0;--i)或for(i=1;i<=n;i++)
returni;
//若到達(dá)0號(hào)單元才結(jié)束循環(huán),說明不成功,返回0值(i=0)。成功時(shí)則返回找到的那個(gè)元素的位置i。}
——返回特殊標(biāo)志,例如返回空記錄或空指針。前例中設(shè)立了“哨兵”,就是將關(guān)鍵字送入末地址ST.list[0].key使之結(jié)束并返回i=0。討論②
查找效率怎樣計(jì)算?——用平均查找長(zhǎng)度ASL衡量。討論①
查不到怎么辦?討論③如何計(jì)算ASL?分析:查找第1個(gè)元素所需的比較次數(shù)為n;查找第2個(gè)元素所需的比較次數(shù)為n-1;……查找第n個(gè)元素所需的比較次數(shù)為1;總計(jì)全部比較次數(shù)為:1+2+…+n=(1+n)n/2未考慮查找不成功的情況:查找哨兵所需的比較次數(shù)為n+1這是查找成功的情況若求某一個(gè)元素的平均查找次數(shù),還應(yīng)當(dāng)除以n(等概率),即:ASL=(1+n)/2,時(shí)間效率為O(n)二、折半查找(又稱二分查找或?qū)Ψ植檎遥﹥?yōu)點(diǎn):算法簡(jiǎn)單,且對(duì)順序結(jié)構(gòu)或鏈表結(jié)構(gòu)均適用。缺點(diǎn):
ASL太長(zhǎng),時(shí)間效率太低。這是一種容易想到的查找方法。先給數(shù)據(jù)排序(例如按升序排好),形成有序表,然后再將key與正中元素相比,若key小,則縮小至左半部?jī)?nèi)查找;再取其中值比較,每次縮小1/2的范圍,直到查找成功或失敗為止。對(duì)順序表結(jié)構(gòu)如何編程實(shí)現(xiàn)折半查找算法?
——見下頁(yè)之例
對(duì)單鏈表結(jié)構(gòu)如何折半查找?
——無(wú)法實(shí)現(xiàn)!因全部元素的定位只能從頭指針head開始對(duì)非線性(樹)結(jié)構(gòu)如何折半查找?
——可借助二叉排序樹來查找(屬動(dòng)態(tài)查找表形式)。
如何改進(jìn)?討論④順序查找的特點(diǎn):②運(yùn)算步驟:(1)low=1,high=11,mid=6,待查范圍是[1,11];(2)若ST.list[mid].key<key,說明key[mid+1,high],則令:low=mid+1;重算mid=(low+high)/2;.(3)若ST.list[mid].key>
key,說明key[low,mid-1],則令:high=mid–1;重算mid;(4)若ST.list[mid].key=key,說明查找成功,元素序號(hào)=mid;結(jié)束條件:(1)查找成功:ST.list[mid].key=key(2)查找不成功:high≤low
(意即區(qū)間長(zhǎng)度小于0)解:①先設(shè)定3個(gè)輔助標(biāo)志:
low,high,mid,折半查找舉例:Low指向待查元素所在區(qū)間的下界high指向待查元素所在區(qū)間的上界mid指向待查元素所在區(qū)間的中間位置已知如下11個(gè)元素的有序表:
(0513192137566475808892),請(qǐng)查找關(guān)鍵字為21
和85的數(shù)據(jù)元素。顯然有:mid=(low+high)/2討論①若關(guān)鍵字不在表中,怎樣得知和停止?——典型標(biāo)志是:當(dāng)查找范圍的上界≤下界時(shí)停止查找。討論②二分查找的效率(ASL)1次比較就查找成功的元素有1個(gè)(20),即中間值;2次比較就查找成功的元素有2個(gè)(21),即1/4處(或3/4)處;3次比較就查找成功的元素有4個(gè)(22),即1/8處(或3/8)處…4次比較就查找成功的元素有8個(gè)(23),即1/16處(或3/16)處………則第m次比較時(shí)查找成功的元素會(huì)有(2m-1)個(gè);為方便起見,假設(shè)表中全部n個(gè)元素=2m-1個(gè),此時(shí)就不討論第m次比較后還有剩余元素的情況了。全部比較總次數(shù)為1×20+2×21+3×22+4×23…+m×2m—1
=推導(dǎo)過程平均每個(gè)數(shù)據(jù)的查找時(shí)間還要除以n,所以:課堂練習(xí)(多項(xiàng)選擇):A.采用鏈?zhǔn)酱尜A結(jié)構(gòu) B.記錄的長(zhǎng)度≤128C.采用順序存貯結(jié)構(gòu)D.記錄按關(guān)鍵字遞增有序√√使用折半查找算法時(shí),要求被查文件:查找過程可用二叉樹描述:每個(gè)記錄用一個(gè)結(jié)點(diǎn)表示;結(jié)點(diǎn)中值為該記錄在表中位置,這個(gè)描述查找過程的二叉樹稱為判定樹。n個(gè)元素的表的折半查找的判定樹是唯一的,即:判定樹由表中元素個(gè)數(shù)決定。
找到有序表中任一記錄的過程就是:走了一條從根結(jié)點(diǎn)到與該記錄相應(yīng)的結(jié)點(diǎn)的路徑。
比較的關(guān)鍵字個(gè)數(shù):為該結(jié)點(diǎn)在判定樹上的層次數(shù)。
查找成功時(shí)比較的關(guān)鍵字個(gè)數(shù)最多不超過樹的深度d:d=log2n+1
若所有結(jié)點(diǎn)的空指針域設(shè)置為一個(gè)指向一個(gè)方形結(jié)點(diǎn)的指針,稱方形結(jié)點(diǎn)為判定樹的外部結(jié)點(diǎn);對(duì)應(yīng)的,圓形結(jié)點(diǎn)為內(nèi)部結(jié)點(diǎn)。
查找不成功的過程就是走了一條從根結(jié)點(diǎn)到外部結(jié)點(diǎn)的路徑。折半查找效率分析法三、分塊查找(索引順序查找)這是一種順序查找的另一種改進(jìn)方法。先讓數(shù)據(jù)分塊有序,即分成若干子表,要求每個(gè)子表中的數(shù)值(用關(guān)鍵字更準(zhǔn)確)都比后一塊中數(shù)值?。ǖ颖韮?nèi)部未必有序)。然后將各子表中的最大關(guān)鍵字構(gòu)成一個(gè)索引表,表中還要包含每個(gè)子表的起始地址(即頭指針)。索引表最大關(guān)鍵字起始地址2212138920334244382448605874498653第1塊第2塊第3塊224886例:2248861713特點(diǎn):塊間有序,塊內(nèi)無(wú)序查找步驟分兩步進(jìn)行:①對(duì)索引表使用折半查找法(因?yàn)樗饕硎怯行虮恚?;②確定了待查關(guān)鍵字所在的子表后,在子表內(nèi)采用順序查找法(因?yàn)楦髯颖韮?nèi)部是無(wú)序表);查找效率:ASL=Lb+Lw對(duì)索引表查找的ASL對(duì)塊內(nèi)查找的ASLS為每塊內(nèi)部的記錄個(gè)數(shù),n/s即塊的數(shù)目例如當(dāng)n=9,s=3時(shí),ASLbs=3.5,而折半法為3.1,順序法為55.實(shí)現(xiàn)程序下面函數(shù)以二分法查找塊,以順序法查找分塊內(nèi)的方法,實(shí)現(xiàn)了線性表的分塊查找。其中參數(shù)a為順序存儲(chǔ)的線性表,idx為索引表,v為要查找的給定值,m為總塊數(shù)。
typedefstruct{intkey;intstart;intlen;}IDX;
intblk_search(a,idx,v,m)IDXidx[];inta[],v,m;{intlow=0,high=m-1,mid,i,h;while(low<=high){mid=(low+high)/2;if(v<idx[mid].key)high=mid-1;elseif(v>idx[mid].keylow=mid+1;
else
{low=mid;break;}}
if(low>=m)return(-1);i=idx[low].start;h=i+idx[low].len;while(i<h&&a[i]!=v)i++;if(a[i]!=v)i=-l;return(i);}
特點(diǎn):一、二叉排序樹的定義二、二叉排序樹的插入與刪除三、二叉排序樹的查找分析6.2二叉搜索樹的查找性能表結(jié)構(gòu)在查找過程中動(dòng)態(tài)生成。要求:對(duì)于給定值key,若表中存在其關(guān)鍵字等于key的記錄,則查找成功返回;否則插入關(guān)鍵字等于key的記錄。典型的動(dòng)態(tài)表———二叉排序樹二叉排序樹查找的算法實(shí)現(xiàn)遞歸函數(shù)
intBSTsearch(BitreeT,elemtypex){Bitnode*p;if(!T)return0;
else
{if(T->data==x)return1;elseif(x<(T->data))
BSTsearch(T->lchild,x);
else
BSTsearch(T->rchild,x);
}}二叉排序樹插入的算法實(shí)現(xiàn)遞歸函數(shù)
voidBSTinsert(BitreeT,elemtypex){Bitnode*p;p=(Bitnode*)malloc(sizeof(Bitnode));p->data=x;p->lchild=p->rchild=NULL;if(!T)T=p;elseif(x<T->data)BSTinsert(T->lchild,x);elseBSTinsert(T->rchild,x);
}1)二叉排序樹上查找某關(guān)鍵字等于給定值的結(jié)點(diǎn)過程,其實(shí)就是走了一條從根到該結(jié)點(diǎn)的路徑。
比較的關(guān)鍵字次數(shù)=此結(jié)點(diǎn)的層次數(shù);
最多的比較次數(shù)=樹的深度(或高度),即log2n+12)一棵二叉排序樹的平均查找長(zhǎng)度為:二叉排序樹的查找分析其中:ni是每層結(jié)點(diǎn)個(gè)數(shù);
Ci是結(jié)點(diǎn)所在層次數(shù);m為樹深。最壞情況:即插入的n個(gè)元素從一開始就有序,
——變成單支樹的形態(tài)!此時(shí)樹的深度為n;ASL=(n+1)/2此時(shí)查找效率與順序查找情況相同。最好情況:即:與折半查找中的判定樹相同(形態(tài)比較均衡)3)對(duì)有n個(gè)關(guān)鍵字的二叉排序樹的平均查找長(zhǎng)度:設(shè)每種樹態(tài)出現(xiàn)概率相同,查找每個(gè)關(guān)鍵字也是等概率的。則ASL求解過程可推導(dǎo)。
樹的深度為:log2n+1;ASL=log2(n+1)–1;與折半查找相同。結(jié)論:二叉排序樹的ASL≤2(1+1/n)lnn一般情況:(與logn同階)問題:如何提高二叉排序樹的查找效率?
盡量讓二叉樹的形狀均衡平衡二叉樹6.3平衡二叉樹平衡二叉樹又稱AVL樹,它是具有如下性質(zhì)的二叉樹:為了方便起見,給每個(gè)結(jié)點(diǎn)附加一個(gè)數(shù)字,給出該結(jié)點(diǎn)左子樹與右子樹的高度差。這個(gè)數(shù)字稱為結(jié)點(diǎn)的平衡因子balance。這樣,可以得到AVL樹的其它性質(zhì):即|左子樹深度-右子樹深度|≤1左、右子樹是平衡二叉樹;所有結(jié)點(diǎn)的左、右子樹深度之差的絕對(duì)值≤1例:判斷下列二叉樹是否AVL樹?任一結(jié)點(diǎn)的平衡因子只能?。?1、0或
1;如果樹中任意一個(gè)結(jié)點(diǎn)的平衡因子的絕對(duì)值大于1,則這棵二叉樹就失去平衡,不再是AVL樹;對(duì)于一棵有n個(gè)結(jié)點(diǎn)的AVL樹,其高度保持在O(log2n)數(shù)量級(jí),ASL也保持在O(log2n)量級(jí)。2-100011-10001-1如果在一棵AVL樹中插入一個(gè)新結(jié)點(diǎn),就有可能造成失衡,此時(shí)必須重新調(diào)整樹的結(jié)構(gòu),使之恢復(fù)平衡。我們稱調(diào)整平衡過程為平衡旋轉(zhuǎn)。現(xiàn)分別介紹這四種平衡旋轉(zhuǎn)。平衡旋轉(zhuǎn)可以歸納為四類:
LL平衡旋轉(zhuǎn)
RR平衡旋轉(zhuǎn)
LR平衡旋轉(zhuǎn)
RL平衡旋轉(zhuǎn)若在A的左子樹的左子樹上插入結(jié)點(diǎn),使A的平衡因子從1增加至2,需要進(jìn)行一次順時(shí)針旋轉(zhuǎn)。(以B為旋轉(zhuǎn)軸)ABCABC若在A的右子樹的右子樹上插入結(jié)點(diǎn),使A的平衡因子從-1增加至-2,需要進(jìn)行一次逆時(shí)針旋轉(zhuǎn)。(以B為旋轉(zhuǎn)軸)2)RR平衡旋轉(zhuǎn):ABCABC1)LL平衡旋轉(zhuǎn):若在A的右子樹的左子樹上插入結(jié)點(diǎn),使A的平衡因子從-1增加至-2,需要先進(jìn)行順時(shí)針旋轉(zhuǎn),再逆時(shí)針旋轉(zhuǎn)。(以插入的結(jié)點(diǎn)C為旋轉(zhuǎn)軸)4)RL平衡旋轉(zhuǎn):ABCABCABC若在A的左子樹的右子樹上插入結(jié)點(diǎn),使A的平衡因子從1增加至2,需要先進(jìn)行逆時(shí)針旋轉(zhuǎn),再順時(shí)針旋轉(zhuǎn)。(以插入的結(jié)點(diǎn)C為旋轉(zhuǎn)軸)ABCABCABC3)LR平衡旋轉(zhuǎn):這種調(diào)整規(guī)則可以保證二叉排序樹的次序不變013037024例:請(qǐng)將下面序列構(gòu)成一棵平衡二叉排序樹:
(13,24,37,90,53)013037-113024-124-213需要RR平衡旋轉(zhuǎn)(繞B逆轉(zhuǎn),B為根)090-124-137053190-237需要RL平衡旋轉(zhuǎn)(繞C先順后逆)037090053037090053
練習(xí)(1)輸入關(guān)鍵字序列為
{16,3,7,11,9,26,18,14,15}試構(gòu)成一棵平衡二叉排序樹3-1187001111615026149給出序列{5,8,9,2,6,4,7,1,3}呢?6.6哈希查找表一、哈希表的概念二、哈希函數(shù)的構(gòu)造方法三、沖突處理方法四、哈希表的查找及分析前面介紹的所有查找都是基于待查關(guān)鍵字與表中元素進(jìn)行比較而實(shí)現(xiàn)的查找方法,查找的效率依賴于查找過程中所進(jìn)行的比較次數(shù)。理想的情況是希望不經(jīng)過任何比較,一次便能得到所查記錄。哈希表它既是一種查找方法,又是一種存貯方法哈希表:即散列存儲(chǔ)結(jié)構(gòu)。
散列法存儲(chǔ)的基本思想:建立關(guān)鍵字值與其存儲(chǔ)位置的對(duì)應(yīng)關(guān)系,或者說,由關(guān)鍵碼的值決定數(shù)據(jù)的存儲(chǔ)地址。優(yōu)點(diǎn):查找速度極快(O(1)),查找效率與元素個(gè)數(shù)n無(wú)關(guān)!例1:若將學(xué)生信息按如下方式存入計(jì)算機(jī),如:將2001011810201的所有信息存入V[01]單元;將2001011810202的所有信息存入V[02]單元;……將2001011810231的所有信息存入V[31]單元。欲查找學(xué)號(hào)為2001011810216的信息,便可直接訪問V[16]!一、哈希表的概念
有數(shù)據(jù)元素序列(14,23,39,9,25,11),若規(guī)定每個(gè)元素k的存儲(chǔ)地址H(k)=k,請(qǐng)畫出存儲(chǔ)結(jié)構(gòu)圖。(注:H(k)=k稱為散列函數(shù))例2:解:根據(jù)散列函數(shù)H(k)=k,可知元素14應(yīng)當(dāng)存入地址為14的單元,元素23應(yīng)當(dāng)存入地址為23的單元,……,對(duì)應(yīng)散列存儲(chǔ)表(哈希表)如下:討論:如何進(jìn)行散列查找?根據(jù)存儲(chǔ)時(shí)用到的散列函數(shù)H(k)表達(dá)式,迅即可查到結(jié)果!例如,查找key=9,則訪問H(9)=9號(hào)地址,若內(nèi)容為9則成功;若查不到,應(yīng)當(dāng)設(shè)法返回一個(gè)特殊值,例如空指針或空記錄。
地址…9…11…14…232425…39…內(nèi)點(diǎn):空間效率低!選取某個(gè)函數(shù),依該函數(shù)按關(guān)鍵字計(jì)算元素的存儲(chǔ)位置,并按此存放;查找時(shí),由同一個(gè)函數(shù)對(duì)給定值k計(jì)算地址,將k與地址單元中元素關(guān)鍵碼進(jìn)行比較,確定查找是否成功??赡軐⒉煌年P(guān)鍵碼映射到同一個(gè)哈希地址上,這種現(xiàn)象稱為沖突。若干術(shù)語(yǔ)哈希方法(雜湊法)哈希函數(shù)(雜湊函數(shù))哈希表(雜湊表)沖突哈希方法中使用的轉(zhuǎn)換函數(shù)稱為哈希函數(shù)(雜湊函數(shù))按上述思想構(gòu)造的表稱為哈希表(雜湊表)
有6個(gè)元素的關(guān)鍵碼分別為:(14,23,39,9,25,11)。選取關(guān)鍵碼與元素位置間的函數(shù)為H(k)=kmod7通過哈希函數(shù)對(duì)6個(gè)元素建立哈希表:253923914沖突現(xiàn)象舉例:6個(gè)元素用7個(gè)地址應(yīng)該足夠!H(14)=14%7=011H(25)=25%7=4H(11)=11%7=4有沖突!0123456所以,哈希方法必須解決以下兩個(gè)問題:1)構(gòu)造好的哈希函數(shù)(a)所選函數(shù)盡可能簡(jiǎn)單,以便提高轉(zhuǎn)換速度;(b)所選函數(shù)對(duì)關(guān)鍵碼計(jì)算出的地址,應(yīng)在哈希地址集中大致均勻分布,以減少空間浪費(fèi)。2)制定一個(gè)好的解決沖突的方案查找時(shí),如果從哈希函數(shù)計(jì)算出的地址中查不到關(guān)鍵碼,則應(yīng)當(dāng)依據(jù)解決沖突的規(guī)則,有規(guī)律地查詢其它相關(guān)單元。在哈希查找方法中,沖突是不可能避免的,只能盡可能減少。二、哈希函數(shù)的構(gòu)造方法常用的哈希函數(shù)構(gòu)造方法有:直接定址法除留余數(shù)法乘余取整法數(shù)字分析法平方取中法折疊法隨機(jī)數(shù)法要求一:n個(gè)數(shù)據(jù)原僅占用n個(gè)地址,雖然散列查找是以空間換時(shí)間,但仍希望散列的地址空間盡量小。要求二:無(wú)論用什么方法存儲(chǔ),目的都是盡量均勻地存放元素,以避免沖突。Hash(key)=a·key+b(a、b為常數(shù))優(yōu)點(diǎn):以關(guān)鍵碼key的某個(gè)線性函數(shù)值為哈希地址,不會(huì)產(chǎn)生沖突.缺點(diǎn):要占用連續(xù)地址空間,空間效率低。例:關(guān)鍵碼集合為{100,300,500,700,800,900},選取哈希函數(shù)為Hash(key)=key/100,則存儲(chǔ)結(jié)構(gòu)(哈希表)如下:01234567899008007005003001001、直接定址法Hash(key)=B*(A*keymod1)
(A、B均為常數(shù),且0<A<1,B為整數(shù))特點(diǎn):以關(guān)鍵碼key乘以A,取其小數(shù)部分,然后再放大B倍并取整,作為哈希地址。Hash(key)=keymodp(p是一個(gè)整數(shù))特點(diǎn):以關(guān)鍵碼除以p的余數(shù)作為哈希地址。關(guān)鍵:如何選取合適的p?技巧:若設(shè)計(jì)的哈希表長(zhǎng)為m,則一般取p≤m且為質(zhì)數(shù)(也可以是不包含小于20質(zhì)因子的合數(shù))。3、乘余取整法2、除留余數(shù)法(A*keymod1)就是取A*key的小數(shù)部分例:欲以學(xué)號(hào)最后兩位作為地址,則哈希函數(shù)應(yīng)為:
H(k)=100*(0.01*k%1)其實(shí)也可以用法2實(shí)現(xiàn):H(k)=k%100特點(diǎn):某關(guān)鍵字的某幾位組合成哈希地址。所選的位應(yīng)當(dāng)是:各種符號(hào)在該位上出現(xiàn)的頻率大致相同。34705243491487348269634852703486305349805834796713473919例:有一組(例如80個(gè))關(guān)鍵碼,其樣式如下:4、數(shù)字分析法討論:①第1、2位均是“3和4”,第3位也只有“7、8、9”,因此,這幾位不能用,余下四位分布較均勻,可作為哈希地址選用。位號(hào):①②③④⑤⑥⑦②若哈希地址取兩位(因元素僅80個(gè)),則可取這四位中的任意兩位組合成哈希地址,也可以取其中兩位與其它兩位疊加求和后,取低兩位作哈希地址。特點(diǎn):對(duì)關(guān)鍵碼平方后,按哈希表大小,取中間的若干位作為哈希地址。理由:因?yàn)橹虚g幾位與數(shù)據(jù)的每一位都相關(guān)。例:2589的平方值為6702921,可以取中間的029為地址。6、折疊法特點(diǎn):將關(guān)鍵碼自左到右分成位數(shù)相等的幾部分(最后一部分位數(shù)可以短些),然后將這幾部分疊加求和,并按哈希表表長(zhǎng),取后幾位作為哈希地址。適用于:每一位上各符號(hào)出現(xiàn)概率大致相同的情況。法1:移位法──將各部分的最后一位對(duì)齊相加。法2:間界疊加法──從一端向另一端沿分割界來回折疊后,最后一位對(duì)齊相加。例:元素42751896,用法1:427+518+96=1041用法2:42751896—>724+518+69=13115、平方取中法7、隨機(jī)數(shù)法Hash(key)=random(key)(random為偽隨機(jī)函數(shù))適用于:關(guān)鍵字長(zhǎng)度不等的情況。造表和查找都很方便。①執(zhí)行速度(即計(jì)算哈希函數(shù)所需時(shí)間);②關(guān)鍵字的長(zhǎng)度;③哈希表的大?。虎荜P(guān)鍵字的分布情況;⑤查找頻率。小結(jié):構(gòu)造哈希函數(shù)的原則:三、沖突處理方法常見的沖突處理方法有:開放定址法(開地址法)鏈地址法(拉鏈法)再哈希法(雙哈希函數(shù)法)建立一個(gè)公共溢出區(qū)1、開放定址法(開地址法)設(shè)計(jì)思路:有沖突時(shí)就去尋找下一個(gè)空的哈希地址,只要哈希表足夠大,空的哈希地址總能找到,并將數(shù)據(jù)元素存入。具體實(shí)現(xiàn):Hi=(Hash(key)+di)modm(1≤i<m)其中:Hash(key)為哈希函數(shù)
m為哈希表長(zhǎng)度
di
為增量序列1,2,…m-1,且di=i1.線性探測(cè)法含義:一旦沖突,就找附近(下一個(gè))空地址存入。關(guān)鍵碼集為{47,7,29,11,16,92,22,8,3},設(shè):哈希表表長(zhǎng)為m=11;哈希函數(shù)為Hash(key)=keymod11;擬用線性探測(cè)法處理沖突。建哈希表如下:解釋:①47、7(以及11、16、92)均是由哈希函數(shù)得到的沒有沖突的哈希地址;012345678910477△▲△△例:291116922283②Hash(29)=7,哈希地址有沖突,需尋找下一個(gè)空的哈希地址:由H1=(Hash(29)+1)mod11=8,哈希地址8為空,因此將29存入。③另外,22、8、3同樣在哈希地址上有沖突,也是由H1找到空的哈希地址的。其中3還連續(xù)移動(dòng)了兩次(二次聚集)線性探測(cè)法的優(yōu)點(diǎn):只要哈希表未被填滿,保證能找到一個(gè)空地址單元存放有沖突的元素;線性探測(cè)法的缺點(diǎn):可能使第i個(gè)哈希地址的同義詞存入第i+1個(gè)哈希地址,這樣本應(yīng)存入第i+1個(gè)哈希地址的元素變成了第i+2個(gè)哈希地址的同義詞,……,因此,可能出現(xiàn)很多元素在相鄰的哈希地址上“堆積”起來,大大降低了查找效率。解決方案:可采用二次探測(cè)法或偽隨機(jī)探測(cè)法,以改善“堆積”問題。討論:仍舉上例,改用二次探測(cè)法處理沖突,建表如下:012345678910112234792167298△▲△△注:只有3這個(gè)關(guān)鍵碼的沖突處理與上例不同,Hash(3)=3,哈希地址上沖突,由H1=(Hash(3)+12)mod11=4,仍然沖突;H2=(Hash(3)-12)mod11=2,找到空的哈希地址,存入。2.二次探測(cè)法Hi=(Hash(key)±di)modm其中:Hash(key)為哈希函數(shù)
m為哈希表長(zhǎng)度,m要求是某個(gè)4k+3的質(zhì)數(shù);
di為增量序列
12,-12,22,-22,…,q2
3.若di=偽隨機(jī)序列,就稱為偽隨機(jī)探測(cè)法2、鏈地址法(拉鏈法)基本思想:將具有相同哈希地址的記錄鏈成一個(gè)單鏈表,m個(gè)哈希地址就設(shè)m個(gè)單鏈表,然后用一個(gè)數(shù)組將m個(gè)單鏈表的表頭指針存儲(chǔ)起來,形成一個(gè)動(dòng)態(tài)的結(jié)構(gòu)。設(shè){47,7,29,11,16,92,22,8,3,50,37,89}的哈希函數(shù)為:Hash(key)=keymod11,用拉鏈法處理沖突,則建表如右圖所示。
例:
01234567891022118934737922971650810注:有沖突的元素可以插在表尾,也可以插在表頭3、再哈希法(雙哈希函數(shù)法)Hi=RHi(key)i=1,2,…,kRHi均是不同的哈希函數(shù),當(dāng)產(chǎn)生沖突時(shí)就計(jì)算另一個(gè)哈希函數(shù),直到?jīng)_突不再發(fā)生。優(yōu)點(diǎn):不易產(chǎn)生聚集;缺點(diǎn):增加了計(jì)算時(shí)間。4.建立一個(gè)公共溢出區(qū)思路:除設(shè)立哈?;颈硗?,另設(shè)立一個(gè)溢出向量表。 所有關(guān)鍵
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 婦產(chǎn)科護(hù)理學(xué)??荚囶}含參考答案
- 2025年甘肅機(jī)電職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)參考答案
- 科技展覽的互動(dòng)式營(yíng)銷實(shí)踐
- 科技前沿太陽(yáng)能電池的研發(fā)與商業(yè)化應(yīng)用
- 2025年鶴壁能源化工職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)1套
- 2025年浙江省建筑安全員-B證考試題庫(kù)及答案
- 2025年嘉興南湖學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)1套
- 關(guān)于改造合同范本
- 第一單元+小專題+光照?qǐng)D的類型及判讀導(dǎo)學(xué)案 高二地理魯教版(2019)選擇性必修1
- 計(jì)算機(jī)輔助設(shè)計(jì)-機(jī)械A(chǔ)utoCAD繪圖知到智慧樹章節(jié)測(cè)試課后答案2024年秋浙江廣廈建設(shè)職業(yè)技術(shù)大學(xué)
- 血管“斑塊”的風(fēng)險(xiǎn)課件
- mks spectra介紹殘余氣體分析儀
- 腹腔鏡下闌尾切除術(shù)護(hù)理課件
- 《抖音生活服務(wù)服務(wù)商合作手冊(cè)》
- 語(yǔ)文教學(xué)設(shè)計(jì)(教案目標(biāo))
- 中山大學(xué)抬頭信紙中山大學(xué)橫式便箋紙推薦信模板a
- 無(wú)形資產(chǎn)評(píng)估完整版課件
- 市場(chǎng)營(yíng)銷學(xué)課后習(xí)題與答案
- 常暗之廂(7規(guī)則-簡(jiǎn)體修正)
- 制冷系統(tǒng)方案的設(shè)計(jì)pptx課件
- 修心七要原文
評(píng)論
0/150
提交評(píng)論