精品午夜福利中文字av_国产成人综合网_av毛片免费观看网站_欧美影视国产综合_野花香视频中文免费观看_亚洲无码要在线视频_又粗又大又用力大交换好大好爽小静_欧美贵妇v办公室高跟鞋_亚洲国产高清a∨网站_免费中文少妇亚洲

知ing

數(shù)據(jù)結(jié)構(gòu)實(shí)用教程(第二版)

徐孝凱 編 / 清華大學(xué)出版社

誰南 上傳

查看本書

3.對(duì)于圖7-25(a)和(b),按下列條件試分別寫出從頂點(diǎn)v0出發(fā)按深度優(yōu)先搜索遍歷得

到的頂點(diǎn)序列和按廣度優(yōu)先搜索遍歷得到的頂點(diǎn)序列。

假定它們均采用鄰接矩陣表示;假定它們均采用鄰接表表示,并且假定每個(gè)頂點(diǎn)鄰接表中的結(jié)點(diǎn)是按頂點(diǎn)序號(hào)從大到小的次序

鏈接的。

解:采用鄰接矩陣表示得到的頂點(diǎn)序列如下表所示:采用鄰接表表示得到的頂點(diǎn)序列如下表所示:畫出最小生成樹并求出它的權(quán);

解:從頂點(diǎn)v0出發(fā),按照普里姆法并入最小生成樹中各邊的次序?qū)懗龈鳁l邊;

解:按照克魯斯卡爾算法并入最小生成樹中各邊的次序?qū)懗龈鳁l邊。

解:

圖 深度優(yōu)先序列 廣度優(yōu)先序列 (a) 0,1,2,8,3,4,5,6,7,9 0,1,4,2,7,3,8,6,5,9 (b) 0,1,2,5,8,4,7,3,6 0,1,3,4,2,6,7,5,8

圖 深度優(yōu)先序列 廣度優(yōu)先序列 (a) 0,4,3,8,9,5,6,7,1,2 0,4,1,3,7,2,8,6,9,5 (b) 0,4,7,5,8,3,6,1,2 0,4,3,1,7,5,6,2,8

4.對(duì)本章第3節(jié)中的dfsl算法做適當(dāng)?shù)男薷?,得到輸出圖的深度做出先生成樹中各條邊的算法。

解:

void dfstree(adjmatrix GA,int i,int n)

{

visited[i]=True;

for(int j=0;j<n;j++)

if(i!=j&&GA[i][j]!=MaxValue&&!visited[j])

{

cout<<'('<<i<<','<<j<<')';

cout<<GA[i][j]<<end1;

dfstree(GA,j,n);

}

}

5.假定采用鄰接矩陣表示,編寫出進(jìn)行深度優(yōu)先遍歷的非遞歸算法。

解:

void dfss(adjmatrix GA,int i,int n)

{

stack s;

Initstack(s);

push(s,i);

while(!StackEmpty(s)){

int k=pos(s);

if(!visited[k]){

cout<<k<<'';

visited[k]=True;

for(int j=0;j<n;j++)

if(k!=j&&GA[k][j]!=MaxValue&&!visited[j])

push(s,j);

}

}

}

6.對(duì)于圖7-26:

(0,1)6,(1,6)4,(6,2)9,(2,3)5,(3,4)10,(0,5)12

(1,6)4,(2,3)5,(0,1)6,(2,6)9,(3,4)10,(0,5)12

7.對(duì)于圖7-27(圖略),試給出一種拓樸序列,若在它的鄰接表存儲(chǔ)結(jié)構(gòu)中,每個(gè)頂點(diǎn)鄰接表中的

邊結(jié)點(diǎn)都是按照終點(diǎn)序號(hào)從大到小鏈接的,則按此給出唯一一種拓樸序列。

解:

唯一一種拓樸序列:1,4,0,2,3,5,7,6,8,9

類別:數(shù)據(jù)結(jié)構(gòu) .

. 第八章查找習(xí) 題 八

一、單選題

1.以順序查找方法從長(zhǎng)度為n的線性表中查找一個(gè)元素時(shí),平均查找長(zhǎng)度為(n+1)/2,時(shí)間復(fù)

雜度為O(n) 。

2.以二分查找方法從長(zhǎng)度為n的線性表中查找一個(gè)元素時(shí),平均查找長(zhǎng)度小于等于

┍log2(n+1)┑ ,時(shí)間復(fù)雜度為O(log2n)。

3.以二分查找方法從長(zhǎng)度為12的有序表中查找一個(gè)元素時(shí),平均查找長(zhǎng)度為37/12。

4.以二分查找方法查找一個(gè)線性表時(shí),此線性表必須是順序存儲(chǔ)的有序表。

5.從有序表(12,18,30,43,56,78,82,95)中依次二分查找43和56元素時(shí),其查找長(zhǎng)度

分別為 1 和 3 。

6.對(duì)于二分查找所對(duì)應(yīng)的判定樹,它即是一棵二叉搜索樹,又是一棵理想平衡樹 。

7.假守對(duì)長(zhǎng)度n=50的有序表進(jìn)行二分查找,則對(duì)應(yīng)的判斷樹高度為6 ,判定樹前5層的結(jié)點(diǎn)數(shù)

為 31 ,最后一層的結(jié)點(diǎn)數(shù)為 19 。

8.在索引表中,每個(gè)索引向至少包含有 索引值 域和 子表開始 域這兩項(xiàng)。

9.假定一個(gè)線性表為(12,23,74,55,63,40,82,36),若按key%3條件進(jìn)行劃分,使得同一

余數(shù)的元素成為一個(gè)子表,則得到的三個(gè)子表分別為(12,63,36)、(55,40,82)和(23,74)。

10.假定一個(gè)線性表為("abcd","baabd","beef","cfg","ahij","bkwte","ccdt","aayb"),

若按照字符串的第一個(gè)字母進(jìn)行劃分,使得同一個(gè)字母被劃分在一個(gè)子表中,則得到的a,b,c

三個(gè)子表的長(zhǎng)度分別為 3 、 3 和 2 。

11.在索引表中,若一個(gè)索引項(xiàng)對(duì)應(yīng)主表中的一條記錄,則稱此索引為 稠密 索引,若對(duì)應(yīng)主

表中若干條記錄,則稱此索引為 稀疏 索引。

12.在稀疏索引表上進(jìn)行二分查找時(shí),若當(dāng)前查找區(qū)間為空,則不是返回-1表示查找失敗,而

是返回該區(qū)間的 下限值(即low值) 。

13.假定長(zhǎng)度n=100的線性表進(jìn)行索引查找,并假定每個(gè)子表的長(zhǎng)度為n1/2,則進(jìn)行索引查找的

平均查找長(zhǎng)度為 11 ,時(shí)間復(fù)雜度為 O(n1/2)。

14.若對(duì)長(zhǎng)度n=1000的線性表進(jìn)行二級(jí)索引存儲(chǔ),每級(jí)索引表中的索引項(xiàng)是下一級(jí)20個(gè)記錄的

索引,則一級(jí)索引表的長(zhǎng)度為 500 ,二級(jí)索引表的長(zhǎng)度為 25 .

15.在線性表的 散列 存儲(chǔ)中,無常找到一個(gè)元素的前驅(qū)或后繼元素.

16.在線性表的 鏈接 存儲(chǔ)中,對(duì)每一個(gè)元素只能采用順序查找.

17.假定對(duì)線性表(38,25,74,52,48)進(jìn)行散列存儲(chǔ),采用H(K)=K%7作為散列函數(shù),若分別采用線

性探查法和鏈接法處理沖突,則對(duì)各自散列表進(jìn)行查找的平均查找長(zhǎng)度分別為 2 和 4/3 .

18.假定要對(duì)長(zhǎng)度n=100的線性表進(jìn)行散列存儲(chǔ),并采用鏈接法處理沖突,則對(duì)于長(zhǎng)度m=20的散列

表,每個(gè)散列地址的單鏈表的長(zhǎng)度分別為 5 .

19.在線性表的散列存儲(chǔ)中,裝填因子α又稱為裝填系數(shù),若用m表示散列表的長(zhǎng)度,n表示待散列存

儲(chǔ)的元素的個(gè)數(shù),則α等于 n/m 。

20.在線性表的散列存儲(chǔ)中,處理沖突有 開放定址法 和 鏈接法 兩種方法。

21.對(duì)于線性表(18,25,63,50,42,32,90)進(jìn)行散列存儲(chǔ)時(shí),若選用H(K)=K%9作為散列函數(shù),則散

列地址為0的元素有 3 個(gè),散列地址為5的元素有 2 個(gè)。

22.對(duì)于一個(gè)含有N個(gè)關(guān)鍵字的m階B_樹,其最小高度為Гlogm(N+1)┐,最大高度為1+︱log︱m/2︱

(N+1/2)︱。

23.已知一棵3階B_樹中含有50個(gè)關(guān)鍵字,則該樹的最小高度為 4 ,最大高度為 5 。

24.在一棵9階的B_樹上中,每個(gè)非樹根結(jié)點(diǎn)的關(guān)鍵字?jǐn)?shù)目最少為 4 個(gè),最多為 8 個(gè)。

25.在一棵m階B_樹上,每個(gè)非樹根結(jié)點(diǎn)的關(guān)健字?jǐn)?shù)目最小為┌m/2┐-1 個(gè),最多為 m-1 個(gè),其子樹

目最小為┌m/2┐,最多為 m 。

26.在一棵B_階樹中,所有葉子結(jié)點(diǎn)都處在 同一層 上,所有葉子結(jié)點(diǎn)中空指針等于所有 關(guān)鍵字 總數(shù)

加1。

27.在對(duì)m階B_樹插入元素的過程中,每向一個(gè)結(jié)點(diǎn)插入一個(gè)索引項(xiàng)(葉子結(jié)點(diǎn)中的索引項(xiàng)為關(guān)鍵字

和空指針)后,若該結(jié)點(diǎn)的索引項(xiàng)數(shù)等于 m 個(gè),則必須把它分裂為 兩 個(gè)結(jié)點(diǎn)。

28.在從m階的B_樹刪除元素的過程中,當(dāng)一個(gè)結(jié)點(diǎn)被刪除掉一個(gè)索引項(xiàng)后,所含索引項(xiàng)等于┌m/2┐

-2個(gè),并且它的左右兄弟結(jié)點(diǎn)中的索引項(xiàng)數(shù)均等于┌m/2┐-1個(gè),則必須進(jìn)行結(jié)點(diǎn)合并。

29.向一棵B_樹插入元素的過程中,若最終引起樹根結(jié)點(diǎn)的分裂,則新樹比原樹的高度 增加1 。

30.從一棵B_樹刪除元素的過程中,若最終引起樹根結(jié)點(diǎn)的合并,則新樹比原樹的高度 減少1 。

二、普通題

2.編寫一個(gè)非遞歸算法,在稀疏有序索引表中二分查找出給定值K所對(duì)應(yīng)的索引項(xiàng),即索引值剛好大于

等于K的索引項(xiàng),返回該索引項(xiàng)的star域的值,若查找失敗則返回-1。

解:

int Binsch(indexlist B,int m,IndexkeyType k)

{

int low=0,hight=m=-1;

while(low<=hight){

int mid=(low+hight)/2;

if(k==B[mid].index)

return B[mid].start);

else if(k<B[mid].index)

hight=mid-1;

else

low=mid+1;

}

if(low<m)return B[low].start;

else return -1;

}

5.假定有一個(gè)100×100的稀疏矩陣,其中1%的元素為非零元素,現(xiàn)要求對(duì)其非零元素進(jìn)行散列存儲(chǔ)

,使之能夠按照元素的行、列值存取矩陣元素(即元素的行、列值聯(lián)合為元素的關(guān)鍵字),試采用除

留余數(shù)法構(gòu)造散列函數(shù)和線性探查法處理沖突,分別寫出散列表和查找散列表的算法。

分析:由題意可知,整個(gè)稀疏矩陣中非零元素的個(gè)數(shù)為100。為了散列存儲(chǔ)這100個(gè)非零元素,需要

使用一個(gè)作為散列的一維數(shù)組,該數(shù)組中元素的類型應(yīng)為:

struct ElemType{

int row;//存儲(chǔ)非零元素的行下標(biāo)

int col;//存儲(chǔ)非零元素的列下標(biāo)

float val;//存儲(chǔ)非零元素值

};

假定用HT[m]表示這個(gè)散列,其中m為散列表的長(zhǎng)度,若取裝填因子為0.8左右,則令m為127為宜

(因?yàn)?27為質(zhì)數(shù))。

按題目要求,需根據(jù)稀疏矩陣元素的行下標(biāo)和列下標(biāo)存取散列表中的元素,所以每個(gè)元素的行下

標(biāo)和列下標(biāo)同時(shí)為元素的關(guān)鍵字。假定用x表示一個(gè)非零元素,按除留余數(shù)法構(gòu)造散列函數(shù),并考慮

盡量讓得到的散列地址分布均勻,所以采用的散列函數(shù)為:

H(x)=(13*x.row+17*x.col)%m

解:

根據(jù)以上分析,建立散列表的算法如下:

int Create(ElemType HT[],int m)

//根據(jù)稀疏矩陣中100個(gè)非零元素建立長(zhǎng)度為m的散列表

{

int i,d,temp;

ElemType x;

for(i=0;i<m;i++)

{//散列表初始化,使關(guān)鍵字域被置為-1,元素值域置為0

HT[i].row=-1;

HT[i].col=-1;

HT[i].val=0;

}

for(i=1;i<=100;i++)

{//每循環(huán)一次從鍵盤上輸入一個(gè)非零元素并插入到散列表中

cout<<i<<":";

cin>>x.row>>x.col>>x.val;//輸入非零元素

d=(13*x.row+17*x.col)%m;//計(jì)算初始散列地址

temp=d;

while(HT[d].val!=0){//線性探查存儲(chǔ)位置,此循環(huán)條件也可用HT[d].row!=-1或

//HT[d].col!=-1來代替

d=(d+1)%m;

if(d==temp)//無插入位置返回0

return 0;

}

HT[d]=x;//非零元素存入下標(biāo)d位置

}

return 1;//全部元素插入成功后返回1

}

在散列表上進(jìn)行查找的算法如下:

int Search(ElemType HT[],int m,int row,int col)

{

//采用與插入時(shí)使用的同一散列函數(shù)計(jì)算散列地址

int d=(13*row+17*col)%m;

//采用線性探查法查找行、列下標(biāo)分別為row和col的元素

while(HT[d].val!=0)

{//此循環(huán)條件也可用HT[d].row!=-1或HT[d].col!=-1代替

if(HT[d].row==row&&HT[d].col==col)

return d;//查找成功后返回元素的下標(biāo)

else

d=(d+1)&m;

if(d==temp) return -1;

}

//查找失敗返回 -1

return -1;

}


查看更多