版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
卷
煙
料
福
W出
小
普就
費
。
查找的概念
查找表是由同一類型的數(shù)據(jù)元素(或記錄)
構(gòu)成的集合,由于“集合”中的數(shù)據(jù)元素之
間存在著松散的關(guān)系,因此查找表是一種
應(yīng)用靈便的數(shù)據(jù)結(jié)構(gòu)。對查找表的操作:
■查詢某個“特定的”數(shù)據(jù)元素是否在查找表中;
■檢索某個“特定的”數(shù)據(jù)元素的各種屬性;
■在查找表中插入一個數(shù)據(jù)元素;
■從查找表中刪去某個數(shù)據(jù)元素
查找表的分類:
靜態(tài)查找表
僅作查詢和檢索操作的查找表。
動態(tài)查找表
在查找過程中同時插入查找表中不存在的
數(shù)據(jù)元素,或者從查找表中刪除已存在的某個
數(shù)據(jù)元素,此類表為動態(tài)查找表。
關(guān)鍵字
是數(shù)據(jù)元素(或記錄)中某個數(shù)據(jù)項
的值,用以標(biāo)識(識別)一個數(shù)據(jù)元素
(或記錄)。若此關(guān)鍵字可以識別唯一的
一個記錄,則稱之謂“主關(guān)鍵字”。若此
關(guān)鍵字能識別若干記錄,則稱之謂“次關(guān)
鍵字”。
查找
根據(jù)給定的某個值,在查找表中確定一個其關(guān)
鍵字等于給定值的數(shù)據(jù)元素或(記錄)。
若查找表中存在這樣一個記錄,則稱“查
找成功”,查找結(jié)果:給出整個記錄的信
息,或指示該記錄在查找表中的位置;
否則稱“查找不成功”,查找結(jié)果:給
出
“空記錄”或“空指針”。
如何進行查找?
查找的方法取決于查找表的結(jié)構(gòu)。
由于查找表中的數(shù)據(jù)元素之間不存在明顯的組
織規(guī)律,因此不便于查找。
為了提高查找的效率,需要在查找表中的
元素之間人為地附加某種確定的關(guān)系,換句
話說,用另外一種結(jié)構(gòu)來表示查找表。
查找方法評價
?查找速度
?占用存儲空間多少
?算法本身復(fù)雜程度
?平均查找長度ASL(AverageSearchLength):
為確定記錄在表中的位置,需和給定值進行比
較的關(guān)鍵字的個數(shù)的期望值叫查找算法的?
n
對含有〃個記錄的表,ASL=£pc.
n
其中:P,為查找表中第,個元素的概率,Epj=T
Z=1
為找到表中第個元素所需比較次數(shù)
c.I2
磬態(tài)查找表
抽象數(shù)據(jù)類型靜態(tài)查找表的定義:
ADTStaticSearchTable{
數(shù)據(jù)對象D:D是具有相同特性的
數(shù)據(jù)元素的集合。每
個數(shù)據(jù)元素含有類型
相同的關(guān)鍵字,可唯
一標(biāo)識數(shù)據(jù)元素。
數(shù)據(jù)關(guān)系R:數(shù)據(jù)元素同屬一個集合。
基本操作P:
Create(&ST,n);//構(gòu)造一個含n個數(shù)據(jù)
元素的靜態(tài)查找表ST。
Destroy(&ST);〃銷毀表ST。
Search(ST,key);//查找ST中其關(guān)鍵字等
于kval的數(shù)據(jù)元素。
//按某種次序?qū)?/p>
Traverse(ST5Visit());
ST的每個元素調(diào)用函數(shù)
Visit。一次且僅一次,
}ADTStaticSearchTable
■順序表的查找
以順序表表示靜態(tài)查找表)則Search函數(shù)可
用順序查找來實現(xiàn)。其順序存儲結(jié)構(gòu)如下:
typedefstruct{
ElemType*elem;〃數(shù)據(jù)元素存儲空間基址,建表時
按實際長度分配,o號單元留空
intlength;//表的長度
}SSTable;
查找過程:從表的一端開始逐個進行記
錄的關(guān)鍵字和給定值的比較。
例如:
Ottt
???
O111
比較次數(shù):比較次數(shù)=5
查找第n個元素:1
查找第ml個元素:2
查找第1個元素:n
查找第i個元素:n+1-i
查找失?。簄+1
算法描述:
intSearch_Seq(SSTableST,
KeyTypekval){
//在順序表ST中順序查找其關(guān)鍵字等于
〃key的數(shù)據(jù)元素。若找到,則函數(shù)值為
〃該元素在表中的位置,否則為0。
ST.elem[0].key=kval;〃設(shè)置“哨兵”
for(i=ST.length;ST.elem[i].key!=kval;-i);
//從后往前找
returni;〃找不到時,i為o
}//SearchSeq
順序查找性能分析
查找算法的平均查找長度(AverageSearchLength):
為確定記錄在查找表中的位置,需和給定值
進行比較的關(guān)鍵字個數(shù)的期望值。
n
ASL=VPC
其中:n為表長士’’
匕為查找表中第i個記錄的概率z戶,=i
Z=1
Ci為找到該記錄時,曾和給定值比較過的
關(guān)鍵字的個數(shù)
對順序表而言)Cj=n-i+1
ASL=nPi+(n-l)P2++2Pn/+Pn
1
在等概率查找的情況下,p=-
i
n
順序表查找的平均查找長度為:
1〃n+1
ASLS,=-z僅一,+i)=—
ni=\2
在不等概率查找的情況下,ASL§s在
pn>pnl>…>P2>P1
時取極小值。表中記錄按查找概率由小到
達重新排列,以提高查找效率。
若查找概率無法事先測定,則查找過
程采取的改進辦法是,在每次查找之后,
將剛剛查找到的記錄直接移至表尾的位置
上。
■有序表的查找
順序表的查找算法簡單,但平均查找長
度較大,不適用于表長較大的查找表。
若以有序表表示靜態(tài)查找表,則查找過
程可以基于“折半”進行。
折半查找
查找過程:每次將待查記錄所在區(qū)間縮小一半。
適用條件:采用順序存儲結(jié)構(gòu)的有序表。
折半查找算法實現(xiàn)
1.設(shè)表長為n,low、high和mid分別指向待查
元素所在區(qū)間的上界、下界和中點,k為給定
值。
2.初始時,令
low=l,high=n5mid=L(low+high)/2j
讓k與mid指向的記展比較
若k==r[mid].key)查找成功
若k〈r[mid].key)則high=mid-l
若k>r[mid].key)則low=mid+l
3.重復(fù)上述操作)直至low>high時)查找失
敗。
high指示查找區(qū)間的上界;
mid=(low+high)/2o
IOMmidhigh
1234567891011
513192137566475808892
mid
當(dāng)下界low大于上界high時,則說明表中
沒有關(guān)鍵字等于Key的元素,查找不成功。
折半查找算法
intSearchBin(SSTableST,KeyTypekval){
low=1;high=ST.length;〃置區(qū)間初履
while(low<=high){
mid=(low+high)/2;
if(kval==ST.elem[mid].key)
returnmid;//找至j待查元素
elseif(kval<ST.elem[mid].key))
high=mid-1;//繼續(xù)虛前*區(qū)間進行查找
elselow=mid+1;〃繼續(xù)在后半?yún)^(qū)間進行查找
)
return0;//順序表中不存在待查元素
}//SearchBin
折半查找的性能分析
?判定樹:描述查找過程的二叉樹。
?有n個結(jié)點的判定樹的深度為I_log2n」+1
?折半查找法伊查找噸程中進行的為較洋數(shù)界多
不超過Ltogdj±d_______I______________
先看一個有11個元素的表的例子:0=11
*
11234567891011
Ci34234134234
假設(shè)有序表的長度11=2咄1(反之h=log2(n+l)),
則描述折半查找的判定樹是深度為h的滿二叉樹。
樹中層次為1的結(jié)點有1個,層次為2的結(jié)點有2
個,層次為h的結(jié)點有2個。假設(shè)表中每個記
錄的查找概率相等
則查找成功時折半查找的平均查找長度
1〃1n+I
ASLD=S/一_/VIC.——=-------10g2(〃+1)T
n
在n>50時,可得近似結(jié)果
ASLbs穴bg2(〃+1)-1
可見,
?折半查找的效率比順序查找高。
?折半查找只能適用于有序表,并且以順序存
儲結(jié)構(gòu)存儲。
順序表和有序表的比較
順序表有序表
表的特性無序有序
存儲結(jié)構(gòu)順序或鏈?zhǔn)巾樞?/p>
插刪操作易于進行需移動元素
ASL的值大小
■索引順序表
在建立順序表的同時,建立一個索引項,包括兩
項:關(guān)鍵字項和指針項。索引表按關(guān)鍵字有序,
表則為分塊有序
順序表
索弓I順序表=索引+順序表
索引順序查找
又稱分塊查找
查找過程:將表分成幾塊,塊內(nèi)無序,塊間有序;
一先確定待查記錄所在塊,再在塊內(nèi)查找
適用條件:分塊有序表
算法實現(xiàn):
用數(shù)組存放待查記錄,每個數(shù)據(jù)元素至少含有
關(guān)鍵字域
建立索引表,每個索引表結(jié)點含有最大關(guān)鍵
字底和指向本塊第一個結(jié)點的指針
例如
索引表
224886
1713
1234567189101112131415161718
22I12I13I819I20I33I42I44I38I24I48I60I58I74I57I86I53
分塊查找方法評價
ASLb,sb=L+wL
其中:Lf----查找索引表確定所在塊的平均查找長度
-----在塊中查找元素的平均查找長度
LW
若將表長為〃的表平均分成6塊,每塊含s個記錄,并設(shè)
表中每個記錄的查找概率相等,則:
h
1]s
(1)用順序查找確定所在塊:ASL6=―2j+i
bj=is(=1
b+1s+11n
=-----+------=—(一+5)+1
222s
Yls
(2)用折半查找確定所在塊:ASLhs?log2(-+1)+-
s2
查找方法比較
順序查找折半查找分塊查找
ASL最大最小兩者之間
表結(jié)構(gòu)有序表、無序表有序表分塊有序表
存儲結(jié)構(gòu)順序存儲結(jié)構(gòu)順序存儲結(jié)構(gòu)順序存儲結(jié)構(gòu)
線性鏈表線性鏈表
幾種查找表的特性
查找插入刪除
無序順序表O(n)0(1)0(n)
無序線性鏈表O(n)0(1)。⑴
有序順序表O(logn)0(n)0(n)
有序線性鏈表0(n)0(1)0(1)
靜態(tài)查找樹表O(logn)O(nlogn)O(nlogn)
結(jié)論:
?從查找性能看,最好情況能達O(logn),
此時要求表有序;
?從插入和刪除的性能看,最好情況能達
0(1),此時要求存儲結(jié)構(gòu)是鏈表。
動態(tài)查找表
動態(tài)查找表的特點:表結(jié)構(gòu)本身是在查找過程中動
態(tài)生成。若表中存在其關(guān)鍵字等于給定值key的記
錄,表明查找成功;否則插入關(guān)鍵字等于key的記錄。
抽象數(shù)據(jù)類型動態(tài)查找表的定義:
ADTDynamicSearchTable{
數(shù)據(jù)對象D:D是具有相同特性的數(shù)據(jù)元素的
集合。
每個數(shù)據(jù)元素含有類型相同的
關(guān)鍵字,可唯一標(biāo)識數(shù)據(jù)元素。
數(shù)據(jù)關(guān)季R,數(shù)據(jù)元素同屬一'個集合o
基本操作:
InitDSTable(&DT)〃構(gòu)造一個空的動態(tài)查找表DT。
DestroyDSTable(&DT)//銷毀動態(tài)查找表DT。
SearchDSTable(DT,key);〃查找DT中與關(guān)鍵字
key等值的元素。
InsertDSTable(&DT,e);//若DT中不存在其關(guān)鍵
字等于的數(shù)據(jù)元素,貝插入到
e.keyUeDTO
DeleteDSTable(&T,key);//刪除DT中關(guān)鍵字等于
key的數(shù)據(jù)元素。
TraverseDSTable(DT,Visit。);//按某種次序?qū)?/p>
DT的每個結(jié)點調(diào)用函數(shù)Visit。一次且至多一次。
}ADTDynamicSearchTable
next
二叉排序樹(二叉查找樹)
定義
二叉排序樹或者是一棵空樹;或者
是具有如下特性的二叉樹:
若它的左子樹不空,則左子樹上所
有結(jié)點的值均小于根結(jié)點的值;
若它的右子樹不空,則右子樹上所
有結(jié)點的值均大于根結(jié)點的值;
它的左、右子樹也都分別是二叉排
序樹。,
不是二叉排序樹。
二叉排序樹的存儲結(jié)構(gòu)
以二叉鏈表形式存儲
typedefstructBiTNode{〃結(jié)點結(jié)構(gòu)
TElemTypedata;
structBiTNode*lchild,^rchild;//左
右指針
}BiTNode,*BiTree;
二叉排序樹的查找算法
若二叉排序樹為空,則查找不成功;
否則
1)若給定值等于根結(jié)點的關(guān)鍵字,則查找
成功;
2)若給定值小于根結(jié)點的關(guān)鍵字,則繼續(xù)
在左子樹上進行查找;
3)若給定值大于根結(jié)點的關(guān)鍵字,則繼續(xù)
在右子樹上進行查找。
等于50,35,90,95
StatusSearchBST(BiTreeT,KeyTypekval,BiTreef,
BiTree&p){
if(!T)
{p=f;returnFALSE;}//查找不成功
elseif(EQ(kval,T->data.key))
{p=T;returnTRUE;}〃查找成功
elseif(LT(kval,T->data.key))
returnSearchBST(T->lchild,kval,T,p);〃在
左子樹中繼續(xù)查找
else
returnSearchBST(T->rchild,kval,T,p);
〃在右子樹中繼續(xù)查找
}//SearchBST
二叉排序樹的插入算法
?根據(jù)動態(tài)查找表的定義,“插入”操作在
查找不成功時才進行;
?若二叉排序樹為空樹,則新插入的結(jié)點為
新的根結(jié)點;否則,新插入的結(jié)點必為一
個新的葉子結(jié)點,其插入位置由查找過程
得到。
StatusInsertBST(BiTree&T,ElemTypee){
if(!SearchBST(T,e.key,NULL,p))
{s=newBiTNode;〃為新結(jié)點分配空間
s->data=e;
s->lchild=s->rchild=NULL;
if(!p)T=s;//插入s為新的根結(jié)點
elseif(LT(e.key,p->data.key))
p->lchild=s;//插入*s為*p的左孩子
elsep->rchild=s;//插入*s為*p的右孩子
returnTRUE;//插入成功
)
elsereturnFALSE;
}//InsertBST
結(jié)論
?一個無序序列可以通過構(gòu)造一棵二叉排序樹
二而變最一個有序序列
?每次插入的新結(jié)點都是二叉排序樹上新的葉
子結(jié)點
?插入時不必移動其它結(jié)點,僅需修改某個結(jié)
點的指針
二叉排序樹的刪除算法
和插入相反,刪除在查找成功之后進行,并
且要求在刪除二叉排序樹上某個結(jié)點之后,仍
然保持二叉排序樹的特性。
可分三種情況討論:
■被刪除的結(jié)點是葉子;
■被刪除的結(jié)點只有左子樹或者只有右子樹;
■被刪除的結(jié)點既有左子樹,也有右子樹。
被刪除的結(jié)點是葉子結(jié)點,如Key=88
結(jié)果,其雙親結(jié)點中相應(yīng)指針域的值改為空
被刪除的結(jié)點只有左子樹或者只有右子樹如
key=80
結(jié)果,其雙親結(jié)點的相應(yīng)指針域的值改為“指
向被刪除結(jié)點的左子樹或右子樹”。
被刪除的結(jié)點既有左子樹,也有右子樹
如被刪關(guān)鍵字key=50
結(jié)果,以其前驅(qū)替代之,然后再刪除該前驅(qū)結(jié)
點
,[3法
VJStatusDeleteBST(BiTree&T,KeyTypekval){
if(!T)returnFALSE;
//不存在關(guān)鍵字等于kval的數(shù)據(jù)元素
else{if(EQ(kval,T->data.key))
{Delete(T);returnTRUE;}
//找到關(guān)鍵字等于key的數(shù)據(jù)元素
elseif(LT(kval,T->data.key))
returnDeleteBST(T->lchild,kval);
//繼續(xù)在左子樹中進行查找
else
returnDeleteBST(T->rchild,kval);
//繼續(xù)在右子樹中進行查找
}
1//DeleteBST
其中刪除操作過程如下:
voidDelete(BiTree&p){
〃從二叉排序樹中刪除結(jié)點p,
〃并重接它的左子樹或右子樹
if(!p->rchild){}
elseif(!p->lchild){
else(}
}//Delete
右子樹為空樹則只需重接它的左子樹
p;p=p->lchild;delete(q);
左子樹為空樹只需重接它的右子樹
q=p;p=p->rchild;delete(q);
?
左右子樹均不空
q=p;s=p->lchild;
while(s->rchild)
{q=s;s=s->rchild;}
〃s指向被刪結(jié)點的前驅(qū)
p->data=s->data;
if(q!=p)q->rchild=s->lchild;
elseq->lchild=s->lchild;
〃重接*q的左子樹
delete(s);
C
s
二叉排序樹查找性能的分析
對于每一棵特定的二叉排序樹,均可按照
平均查找長度的定義來求它的ASL值,顯然,
由值相同的n個關(guān)鍵字,構(gòu)造所得的不同形態(tài)
的各棵二叉排序樹的平均查找長度的值不同,
甚至可能差別很大。
例如:
由關(guān)鍵字序列L2,3,4,5構(gòu)
造而得的二叉排序樹,
ASL=(1+2+3+4+5)/5
=3
由關(guān)鍵字序列3,L2,5,4構(gòu)造
而得的二叉排序樹
ASL=(1+2+3+2+3)/5②
=2.2
下面討論平均情況:
不失一般性,假設(shè)長度為n的序列中有k個
關(guān)鍵字小于第一個關(guān)鍵字,則必有n-k-1個關(guān)鍵
字大于第一個關(guān)鍵字,由它構(gòu)造的二叉排序樹
的平均查找長度是n和k的函數(shù)
P(n,k)(0<k<n-1)
假設(shè)n個關(guān)鍵字可能出現(xiàn)的n!種排列的可
能性相同,則含n個關(guān)鍵字的二叉排序樹的
平均查找長度
]n—1
4sL=尸(H)=一£P(guān)gk)
nk=a
在等概率查找的情況下,
n]n
尸5,外=£pG=—£Ci
Z=1〃Z=1
——
蟲
蟲
——
——
((I——7X(I7£)+()&X)+Iu
u
蟲
蟲
((I+(I50)(1—7—+(I+()&)+1)——u
「s
H7JRL"
CH+CH+IU—HGH—n—〕d
$i
由此
]n—\(1、
P(H)=一£1+—oXPg+5_k—1)xP{n—k—l))
n左=oIH)
2"-i
=l+'W(kxP(k))
nk=i
可類似于解差分方程,此遞歸方程有解:
72+1
P(n)=2-------logH+C
n
平衡二叉樹
二叉平衡樹是二叉查找樹的另一種形式,其
特點為:樹中每個結(jié)點的左、右子樹深度之差
?上構(gòu)造二叉平衡(查找)樹的方法:
在插入過程中,采用平衡旋轉(zhuǎn)技術(shù)。
例如:依次插入的關(guān)鍵字為5,4,2,8,6,9
繼續(xù)插入關(guān)鍵字9
哈希表
哈希表的相關(guān)定義
哈希函數(shù)的構(gòu)造方法
處理沖突的方法
哈希表的查找
哈希表的插入
哈希查找分析
哈希表的相關(guān)定義
哈希查找
又叫散列查找,利用哈希函數(shù)進行查找的過程。
基本思想:在記錄的存儲地址和它的關(guān)鍵字之間建
立一個確定的對應(yīng)美系;這樣,不經(jīng)過比較,一
次存取就能得到所查元素的查找方法。
哈希函數(shù)
在記錄的關(guān)鍵字與記錄的存儲地址之間建立的一
種對應(yīng)關(guān)系。哈希函數(shù)是一種映象,是從關(guān)鍵字
空間到存儲地址空間的一種映象。
可寫成,addr(ai)=H(ki)
其中:ai是表中的一個元素
addr(ai)是ai的存儲地址
ki是ai的關(guān)鍵字
哈希表
根據(jù)設(shè)定的哈希函數(shù)H(key)和所選中
的處理沖突的方法,將一組關(guān)鍵字映象到
一個有限的、地址連續(xù)的地址集(區(qū)間)上,
并以關(guān)鍵字在地址集中的“象”作為相應(yīng)
記錄在表中的存儲位置,如此構(gòu)造所得的
查找表稱之為“哈希表”。
例30個地區(qū)的各民族人口統(tǒng)計表
從例子可見:
哈希函數(shù)只是一種映象,所以哈希函數(shù)
的設(shè)定很靈活,只要使任何關(guān)鍵字的哈
希函數(shù)值都落在表長允許的范圍之內(nèi)即
可。
沖突:keyl^key2,但
H(keyl)=H(key2)的現(xiàn)象
哈希函數(shù)構(gòu)造的方法
■直接定址法
■數(shù)字分析法
■平方取中法
■折疊法
■除留余數(shù)法
■隨機數(shù)法
直接定址法
哈希函數(shù)為關(guān)鍵字的線性函數(shù)
H(key)=key或者H(key)=axkey+b
此法僅適合于:
地址集合的大小==關(guān)鍵字集合的大小
其中a和b為常數(shù)
數(shù)字分析法
假設(shè)關(guān)鍵字集合中的每個關(guān)鍵字都是由S位數(shù)字組成(Up
112,…,11J,分析關(guān)鍵字集中的全體,并從中提取分布均
勻的若干位或它們的組合作為地址。此法適于能預(yù)先估
計出全體關(guān)鍵字的每一位上各種數(shù)字出現(xiàn)的頻度。
例有80個記錄,關(guān)鍵字為8位十進制數(shù),哈希地址為2位十進制數(shù)
①②③④⑤⑥⑦⑧
81346532—
分析:①只取8
81372242
②只取
813874221
③只取、
8130136734
⑧只取2、7、5
81322817-----
④⑤⑥⑦數(shù)字分布近乎隨機
81338967
所以:?、堍茛蔻呷我鈨晌换騼晌?/p>
8.11.3n68537
與另兩位的疊加作哈希地址
81419355
平方取中法
以關(guān)鍵字的平方值的中間幾位作為存儲地
址。求“關(guān)鍵字的平方值”的目的是“擴大
差別”,同時平方值的中間各位又能受到整
個關(guān)鍵字中各位的影響。
此方法適合于:
關(guān)鍵字中的每一位都有某些數(shù)字重復(fù)出現(xiàn)頻
度很高的現(xiàn)象。
折疊法
將關(guān)鍵字分割成若干部分,然后取它們的疊加和為哈
希地址。兩種疊加處理的方法:
移位疊加:將分割后的幾部分低位對齊相加
間界疊加:從一端沿分割界來回折送,然后對齊相加
此法適于關(guān)鍵字的數(shù)字位數(shù)特別多。
例關(guān)鍵字為:0442205864,哈希地址位數(shù)為4
58645864
42200224
0404
100886092
H(key)=0088H(key)=6092
除留余數(shù)法
設(shè)定哈希函數(shù)為:
H(key)=keyMODp(p<m)
其中,m為表長
p為不大于m的素數(shù)
或是
不含20以下的質(zhì)因子
為什么要對P加限制?
例如:
給定一組關(guān)鍵字為:12,39,18,24,33,21,
若取p=9,則他們對應(yīng)的哈希函數(shù)值將為:
3,3,0,6,6,3
可見,若p中含質(zhì)因子3,則所有含質(zhì)因子3的
關(guān)鍵字均映射到“3的倍數(shù)”的地址上,從而增
加了“沖突”的可能
隨機數(shù)法
設(shè)定哈希函數(shù)為:
H(key)=Random(key)
其中,Random為偽隨機函數(shù)
此法用于對長度不等的關(guān)鍵字構(gòu)造哈希函數(shù)。
選取哈希函數(shù)考慮的因素:
計算哈希函數(shù)所需時間
關(guān)鍵字長度
哈希表長度(哈希地址范圍)
關(guān)鍵字分布情況
記錄的查找頻率
處理沖突的方法
“處理沖突”的實際含義是:
為產(chǎn)生沖突的地址尋找下一個哈希地址。
■開放定址法
■再哈希法
■鏈地址法
開放定址法
為產(chǎn)生沖突的地址H(key)求得一個地址
序列:Ho,H1?H2,Hsl<s<m-l
居=(H(key)+djMODm
其中:i=l,2,…,s
H(key)為哈希函數(shù);m為哈希表長;
4為增量序列,有下列三種取法:
對增量di的三種取法:
1)線性探測再散列
dj=exi最簡單的情況c=l
2)二次探測再散列
4=12,42,22,一22,...,
3)隨機探測再散列
dj是一組偽隨機數(shù)列或者
4=ixH2(key)(又稱雙散列函數(shù)探測)
注意:增量4應(yīng)具有“完備性”
即:產(chǎn)生的Hi均不相同,且所產(chǎn)生的
s(m-l)個居值能覆蓋哈希表中所有
地址。則要求:
長平方探測時的表長m必為形如4j+3
的素數(shù)(如:7,11,19,23,…等);
X隨機探測時的m和4沒有公因子。
例表長為11的哈希表中已填有關(guān)鍵字為17,60,29
的記錄,H(key)=keyMOD11,現(xiàn)有第4個記錄,其關(guān)
鍵字為38,按三種處理沖突的方法,將它填入表中
012345678910
383860172938
(1)H(38)=38MOD11=5沖突
Hl=(5+1)MOD11=6沖突
H2=(5+2)MOD11=7沖突
H3=(5+3)MOD11=8不沖突
(2)H(38)=38MOD11=5沖突
Hl=(5+12)MOD11=6沖突
H2=(5-l2)MOD11=4不沖突
(3)H(38)=38MOD11=5沖突
設(shè)偽隨機數(shù)序列為9,貝I:
Hl=(5+9)MOD11=3不沖突
例如:給定關(guān)鍵字集合構(gòu)造哈希表
{19,01,23,14,55,68,11,82,36)
設(shè)定哈希函數(shù)H(key)=keyMOD11(表長=11)
若采用線性探測再散列處理沖突
012345678910
550123146811823619
112136251
若采用二次探測再散列處理沖突
012345678910
550123143682681911
鏈地址法
將所有哈希地址相同的記錄都鏈接在同一鏈表中。
例:給定關(guān)鍵字{1%01,23,14,55,68,11,82,36)
哈希函數(shù)為H(key)=keyMOD7
014K
136A
21231A|
3A
11A
4
1982A
5
55A4
例已知一組關(guān)鍵字(19,14,23,1,68,20,84,27,55,11JO,79)
哈希函數(shù)為:H(key)=keyMOD13,
用鏈地址法處理沖突
再哈希法
方法:構(gòu)造若干個哈希函數(shù),當(dāng)發(fā)
生沖突時,計算下一個哈希地址,
直到?jīng)_突不再發(fā)生。
即:Hi=Rhj(key)i=l,2,.......k
其中:R%——不同的哈希函數(shù)
特點:計算時間增加
哈希表的查找
哈希查找過程
對于給定值K,
計算哈希地址i=H(K)
若r[i]=NULL則查找不成功
若r[i].key=K則查找成功
否則“求下一地址Hi”,
直至r[Hi]=NULL(查找不成功)
或r[Hi].key=K(查找成功)為止。
開放定址哈希表的存儲結(jié)構(gòu)
inthashsize[]={997,...};
typedefstruct{
ElemType*elem;
intcount;〃當(dāng)前數(shù)據(jù)元素個數(shù)
intsizeindex;
//hashsize[sizeindex]當(dāng)前容量
}HashTable;
#defineSUCCESS1
#defineUNSUCCESS0
#defineDUPLICATE-1
查找算法
StatusSea
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度股份代持與代管合同協(xié)議2篇
- 二零二五年度水利工程監(jiān)測與施工測量服務(wù)合同范本3篇
- 二零二五版新能源設(shè)備搬運安裝合同細則3篇
- 2025年度航空航天器發(fā)動機安裝與測試合同3篇
- 二零二五年度綠色交通設(shè)施招標(biāo)投標(biāo)合同6篇
- 展會參展資格合同(2篇)
- 二零二五版水利工程鋼筋加工與分包合同規(guī)范范本3篇
- 二零二五版室內(nèi)外景觀裝飾一體化合同3篇
- 2025年度文化演出活動承辦合同3篇
- 二零二五版單位職工食堂員工健康體檢承包合同2篇
- 中建集團面試自我介紹
- 《工業(yè)園區(qū)節(jié)水管理規(guī)范》
- 警校生職業(yè)生涯規(guī)劃
- 意識障礙患者的護理診斷及措施
- 2024版《53天天練單元歸類復(fù)習(xí)》3年級語文下冊(統(tǒng)編RJ)附參考答案
- 2025企業(yè)年會盛典
- 215kWh工商業(yè)液冷儲能電池一體柜用戶手冊
- 場地平整施工組織設(shè)計-(3)模板
- 交通設(shè)施設(shè)備供貨及技術(shù)支持方案
- 美容美發(fā)店火災(zāi)應(yīng)急預(yù)案
- 餐車移動食材配送方案
評論
0/150
提交評論