数据结构知识点重点
A—熟練掌握 B—理解 C—了解
第一章:緒論
包括數據的邏輯結構、數據的存儲結構和數據的相關運算。C
四類數據組織結構:集合、線性表、樹形、圖狀結構 C
數據的存儲方式:順序存儲和鏈式存儲。B
2.算法和分析
算法的特征、時間復雜度的分析和常見的時間復雜度增長率排序、空間復雜度 B
本章重點:分析算法時間復雜度
例1. 下面關于算法說法錯誤的是( )
A.算法最終必須由計算機程序實現
B.為解決某問題的算法同為該問題編寫的程序含義是相同的
C. 算法的可行性是指指令不能有二義性 D. 以上幾個都是錯誤的
D
例2. 以下那一個術語與數據的存儲結構無關?( )
A.棧 B. 哈希表 C. 線索樹 D. 雙向鏈表
A.
例3.. 求下段程序的時間復雜度:
void mergesort(int i, int j){
int m;
if(i!=j){
m=(i+j)/2;
mergesort(i,m);
mergesort(m+1,j);
merge(i,j,m);}
}
其中mergesort()用于對數組a[n]歸并排序,調用方式為mergesort(0,n-1);,merge()用于兩個有序子序列的合并,是非遞歸函數,時間復雜度為 。
解:分析得到的時間復雜度的遞歸關系:
為merge()所需的時間,設為cn(c為常量)。因此
令 ,有
有
第二章:線性表
1.線性表的基本運算:…… C
2.線性表的順序存儲(利用靜態數組或動態內存分配)。 相應的表示與操作 A
3.線性表的鏈式存儲。相應的表示與操作。包括循環鏈表、雙向鏈表。 A
4.順序存儲與鏈式存儲的比較:基于時間的考慮–分別適用于靜態的和動態的操作:比如靜態查找和插入刪除);基于空間的考慮-- ……. B
這也適用于后面用兩種方式存儲的其他數據結構。
★本章重點:很熟悉順序表,單鏈表、雙鏈表,循環鏈表的基本操作;并學會在各種鏈表上進行一些算法設計(與基本操作類似的操作或組合),請仔細復習。
例4.假設有兩個按元素值遞增次序排列的線性表,均以單鏈表形式存儲。請編寫算法將這兩個單鏈表歸并為一個按元素值遞減次序排列的單鏈表,并要求利用原來兩個單鏈表的結點存放歸并后的單鏈表。
[題目分析]因為兩鏈表已按元素值遞增次序排列,將其合并時,均從第一個結點起進行比較,將小的鏈入鏈表中,同時后移鏈表工作指針。該問題要求結果鏈表按元素值遞減次序排列。故在合并的同時,將鏈表結點逆置。
void Union(LinkList la, LinkList lb)
∥la,lb分別是帶頭結點的兩個單鏈表的頭指針,鏈表中的元素值按遞增序排列,本算法將兩鏈表合并成一個按元素值遞減次序排列的單鏈表。
{ pa=la->next; pb=lb->next;∥pa,pb分別是鏈表la和lb的工作指針
la->next=null; ∥la作結果鏈表的頭指針,先將結果鏈表初始化為空。
while(pa!=null && pb!=null) ∥當兩鏈表未訪問結束
if(pa->data<=pb->data)
{ q=pa->next; ∥將pa 的后繼結點暫存于q。
pa->next=la->next; ∥將pa結點鏈于結果表中,同時逆置。
la->next=pa;
pa=q; ∥恢復pa為當前待比較結點。
}
else{
q=pb->next;∥ 將pb 的后繼結點暫存于q。
pb->next=la->next; ∥將pb結點鏈于結果表中,同時逆置。
la->next=pb;
pb=q; ∥恢復pb為當前待比較結點。
}
while(pa!=null) ∥將la表的剩余部分鏈入結果表,并逆置。
{q=pa->next; pa->next=la->next; la->next=pa; pa=q; }
while(pb!=null)
{q =pb->next; pb->next=la->next; la->next=pb; pb=q; }
}∥算法Union結束。
注意:
(1)此處q用作暫存后繼結點,操作后pa或pb還回原指向位置;這與我們原來不改變pa或pb的指向,增加一個q=pa或pb作為摘取結點進行添加操作起到的作用一樣。
(2) 此處要完成逆序插入操作故用頭插法(基于頭指針la或lb),注意尾插法(附設一個尾指針,基于該指針插入)的可完成順序插入。(注意:逆序另一種方式也要掌握!)
練習:
練習題2 編程1——6
7.判斷帶頭結點雙向循環鏈表L是否對稱相等.
8. 設計一個算法判斷單鏈表(帶頭結點)是否是遞增的(注意比排序算法應該簡單,鏈表排序也要會實現)
9. 設計一個算法判斷有序表A是否是有序表B的子集(即表A中的元素在B中)。(思考:如果遞歸程序怎么寫?)
第三章:棧與隊列
1.兩種特殊線性表:分別有后進先出、先進先出的特性。 B
2.棧的順序表示與實現(利用靜態數組或動態內存分配) A
注意棧頂指針的初始位置不同,進出棧,棧空棧滿的實現語句有差別!
舉例:
若定義
typedef struct {
SElemType *base;
SElemType top;
int stacksize;//當前棧能使用的最大容量
} SqStack;
SqStack s;
top的初始值指向棧底,即top=base;
棧空條件:s. top ==s. base 此時不能出棧
棧滿條件:s.top-s.base>=s.stacksize
進棧操作:s.top++=e; 或s.top=e; s.top++;
退棧操作:e=–s.top; 或s.top–; e=*s.top
若定義:
typedef struct {
SElemType base[MAXSIZE];
int top;
}SqStack;
SqStack s;
top的初始值為0時:
棧空條件:s. top ==0 此時不能出棧
棧滿條件:s.top >= MAXSIZE
進棧操作:s.base[s.top++]=e;
退棧操作:e=s.base[–s.top]
top的初始值為-1時:
棧空條件:s. top == -1 此時不能出棧
棧滿條件:s.top >= MAXSIZE-1
進棧操作:s.base[++s.top]=e;
退棧操作:e=s.base[s.top–]
3.棧的鏈式表示與實現 B (對比順序棧,實質不帶頭結點的鏈表在頭指針處插入和刪除)
4.隊列的順序表示與實現—循環隊列 A
設兩個指針:Q.front 指向隊列頭元素;Q.rear 指向隊列尾元素的下一個位置
注意隊中若Q.rear 指向隊列尾元素,進出隊,實現語句有差別!
初始狀態(空隊列):Q.front = Q.rear=0
隊頭指針進1: Q.front = (Q.front + 1)% MAXSIZE
隊尾指針進1: Q.rear = (Q.rear + 1)% MAXSIZE;
隊列初始化: Q.front = Q.rear = 0;
隊空條件: Q.front == Q.rear;
隊滿條件:(Q.rear + 1) % MAXSIZE == Q.front
隊列長度:(Q.rear-Q.front+MAXSIZE)%MAXSIZE
6.隊列的鏈式表示與實現 B
本章重點:順序棧的初始條件、操作,循環隊列的初始條件、操作
本章難點:棧的設計與使用,隊列的設計與使用(主要結合后面樹和圖中的應用復習)
例5.鏈棧與順序棧比起來優勢在于 。
沒有預設容量的限制
例6.計算算術表達式的值時,可用兩個棧作輔助工具。對于給出的一個表達式,從左向右掃描它的字符,并將操作數放入棧S1中,運算符放入棧S2中,但每次掃描到運算符時,要把它同S2的棧頂運算符進行優先級比較,當掃描到的運算符的優先級不高于棧頂運算符的優先級時,取出棧S1的棧頂和次棧頂的兩個元素,以及棧S2的棧頂運算符進行運算將結果放入棧S1中(得到的結果依次用T1、T2等表示)。為方便比較,假設棧S2的初始棧頂為?(?運算符的優先級低于加、減、乘、除中任何一種運算)。現假設要計算表達式: A-BC/D+E/F。寫出棧S1和S2的變化過程。
步驟 棧S1 棧S2 輸入的算術表達式(按字符讀入)
初始 ? A-BC/D+E/F?
1 A ? A-BC/D+E/F?
2 A ?- -BC/D+E/F?
3 AB ?- BC/D+E/F?
4 AB ?- C/D+E/F?
5 ABC ?- C/D+E/F?
6 AT1(注:T1=B*C) ?-/ /D+E/F?
7 AT1D ?-/ D+E/F?
8 AT2(注:T2=T1/D)
T3 (注:T3=A-T2) ?-
?+ +E/F?
9 T3E ?+ E/F?
10 T3E ?+/ /F?
11 T3EF ?+/ F?
12 T3T4(注:T4=E/F)
T5(注:T5= T3+ T4) ?+
? ?
例7.將兩個棧存入數組V[1…m]應如何安排最好?這時棧空、棧滿的條件是什么?,入棧和出棧的操作是什么?
分析:為了增加內存空間的利用率和減少溢出的可能性,由兩個棧共享一片連續的空間時,應將兩棧的棧底分別設在內存空間的兩端,這樣只有當兩棧頂指針相鄰(即值之差的絕對值為1時才產生溢出。
設棧S1和棧S2共享向量V[1…m],初始時,棧S1的棧頂指針top0=0,棧S2的棧頂指針top1=m+1,當top0=0為棧S1空,top1=m+1為棧S2空;當top0=0并且top1=m+1時為兩棧全空。當top1-top0=1時為棧滿。
入棧核心操作 S1: V[++top0]=x1; S2: V[–top1]=x2
出棧核心操作 S1: x1=V[top0–]; S2: x2=V[top1++]
例8.如果用一個循環數組base[0…MAX-1]表示隊列時,該隊列只有一個隊列頭指針front,不設隊列尾指針rear,而改置計數器count用以記錄隊列中結點的個數。
(1)編寫實現隊列的三個基本運算:判空、入隊、出隊
(2)隊列中能容納元素的最多個數是多少
typedef struct
{ ElemType base[MAX];
int front,count; //front是指向隊頭元素針,count是隊列中元素個數。
}CQueue; //定義類型標識符。
(1)判空:int Empty(CQueue q) //q是CQueue類型的變量
{if(q.count0) return(1);
else return(0); //空隊列
}
入隊: int EnQueue(CQueue q,ElemType x)
{if(q.countMAX){printf(“隊滿\n”);exit(0); }
q.base[(q.front+q.count)%MAX]=x; //x入隊
q.count++; return(1); //隊列中元素個數增加1,入隊成功。
}
出隊: int DelQueue(CQueue q, ElemType &x)
{if (q.count==0){printf(“隊空\n”);return(0);}
x=q.base[q.front];
q.front=(q.front+1)%MAX; //計算新的隊頭指針
q.count–;
return(1);
}
(2) 隊列中能容納的元素的個數為MAX。
第四章:串
1.串的基本概念 C
2.串的順序表示與實現(兩種存儲方式) A 特別的模式匹配算法之KMP算法 B
本章重點:串的定長順序存儲和堆分配存儲、掌握一些常規的串操作(自己會用和會編寫)
本章難點:串的模式匹配快速算法(KMP)
例9. 串的定長順序存儲缺點在于存在 情況。
截斷
例10.已知u=‘xyxyxyxxyxy’;t=‘xxy’;
ASSIGN(s,u);
ASSIGN(v,SUBSTR(s,INDEX(s,t),LEN(t)+1));
ASSIGN(m,‘ww’)
求REPLACE(s,v,m)= ________。
‘xyxyxywwy’
例11.14.設字符串S=‘aabaabaabaac’,P=‘aabaac’
(1)給出S和P的next值和nextval值;
(2)若S作主串,P作模式串,試給出利用BF算法和KMP算法的匹配過程。
.(1)(1)p的next與nextval值分別為012123和002003。
(2)利用BF算法的匹配過程:
第一趟匹配: aabaabaabaac
aabaac(i=6,j=6)
第二趟匹配: aabaabaabaac
aa(i=3,j=2)
第三趟匹配: aabaabaabaac
a(i=3,j=1)
第四趟匹配: aabaabaabaac
aabaac(i=9,j=6)
第五趟匹配: aabaabaabaac
aa(i=6,j=2)
第六趟匹配: aabaabaabaac
a(i=6,j=1)
第七趟匹配: aabaabaabaac
利用KMP算法的匹配過程:
第一趟匹配:aabaabaabaac
aabaac(i=6,j=6,nextval(j)=3)
第二趟匹配:aabaabaabaac
(aa)baac (i=9,j=6)
第三趟匹配:aabaabaabaac
(成功) (aa)baac(i=13,j=7)
例12.一般串定位函數Index(S,T,pos), 設S的串長為n,T的串長為m,則最壞時間復雜度 ;而改進的Index_KMP(S,T,pos) 時間復雜度為 。
第五章:數組和廣義表
1.數組的存儲結構:以行為主序、以列為主序的地址映像函數 B
2矩陣的壓縮存儲:
(1)特殊陣:包括對稱陣、三角陣、帶狀陣(利用其特性壓縮存儲到一維數組)B
(2)稀疏陣 利用的是三元組順序表來表示 B 用十字鏈表表示C(本次考試不做要求)
3.廣義表定義與存儲表示 B (本次考試不做要求)
本章重點:地址映像函數的計算(包括數組和特殊矩陣)
例13.已知n階下三角矩陣A(即當i<j時,有aij=0),按照壓縮存儲的思想,可以將其主對角線以下所有元素(包括主對角線上元素 )依次存放于一維數組B中,請寫出從第一列開始采用列序為主序分配方式時在B中確定元素aij的存放位置的公式。
答:n階下三角矩陣元素A[i][j](1<=i,j<=n,i>=j)。第1列有n個元素,第j列有n-j+1個元素,第1列到第j-1列是等腰梯形,元素數為(n+(n-j+2)(j-1)/2,而aij在第j列上的位置是為i-j+1。所以n階下三角矩陣A按列存儲,其元素aij在一維數組B中的存儲位置k與i和j的關系為:
k=(n+(n-(j-1)+1)(j-1)/2+(i-j+1)=(2n-j)(j-1)/2+i
第六章:二叉樹與樹
1.二叉樹的定義和性質: B
幾個特殊的二叉樹:滿二叉樹、完全二叉樹、二叉排序樹、平衡二叉樹 B
2.二叉樹的順序存儲: C
3.二叉樹的鏈式存儲: 用二叉鏈表表示與實現 A
4.二叉樹的遍歷:先(中、后)序遍歷及應用,相應遞歸算法和非遞歸算法 A
5.線索化二叉樹(利用二叉鏈表n+1空指針域來存放某遍歷下指向該結點的直接前驅或直接后繼,使得蘊含更多信息) B
6.二叉樹的應用:算術表達式,霍夫曼樹(最優二叉樹),判定樹 B
7.樹的定義和存儲表示:…… B
8.樹和森林和二叉樹的轉換 B
9.樹與森林的遍歷 B
★本章重點:很熟悉二叉樹(在二叉鏈表表示下)的基本操作的遞歸算法和遍歷的非遞歸算法,請仔細復習。
本章難點:二叉樹(含排序樹、平衡樹)的遞歸算法和非遞歸算法。
線索化二叉樹及相應操作,重在理解,不考編程!
例14.引入二叉線索樹的目的是( )
A.將非線性序列轉化成某種線性序列;加快查找結點的前驅或后繼的速度
B.為了能在二叉樹中方便的進行插入與刪除
C.為了能方便的找到雙親 D.使二叉樹的遍歷結果唯一
A
例15.二叉鏈表在線索化后,仍不能有效求解的問題是( )。
A.前(先)序線索二叉樹中求前(先)序后繼 B.中序線索二叉樹中求中序后繼
C.中序線索二叉樹中求中序前驅 D.后序線索二叉樹中求后序后繼
D
例16.在平衡二叉樹中插入一個結點后造成了不平衡,設最低的不平衡結點為A,并已知A的左孩子的平衡因子為-1右孩子的平衡因子為0,則應作( ) 型調整以使其平衡。(平衡因子=左子樹深度-右子樹深度)
A. LL (單向右旋) B. LR (先左后右雙向旋轉)
C. RL (先右后左雙向旋轉) D. RR (單向左旋)
B
例17.一棵非空的二叉樹其先序序列和后序序列正好相反,畫出這棵二叉樹的形狀。
先序序列是“根左右” 后序序列是“左右根”,可見對任意結點,若至多只有左子女或至多只有右子女,均可使前序序列與后序序列相反,圖示如下:
例18:已知二叉樹結點結構如下:
用C語言表示
typedef struct BiNode{
ElemType data;
struct BiNode *lchild,*rchild;
int val;
}BiNode,*BiTree;
其中val域表示該結點的子孫(含孩子結點)的個數。開始時,val域值均為0,T為指向某二叉樹根結點的指針。請寫算法填寫該二叉樹中每個結點的val域。
遞歸算法如下:
int writeVal(BiNode *root)
{if(rootNULL) root->val=0;
else if(root->lchildNULL&&root->rchild==NULL)
root->val=1;
else
root->val=writeVal(root->lchild)+writeVal(root->rchild);
return root->val;
}
例19.編寫一個算法,將指針S所指的結點插入到根結點指針為T的二叉排序樹中,若已存在則不再插入返回0;否則返回1。(遞歸的算法見教材)
int Insert_BST( BiTree &T, BiTNode S )
{ BiTree p, q; //p指向當前訪問的結點
if(!T) T=S;
else { p=T;
while ( p )
{ q = p; //q指向p結點的雙親結點
if (S->data.key < p->data.key) p = p->lchild;
else if(S->data.key > p->data.key) p = p->rchild;
else p=NULL;
}
if (S->data.key == q->data.key) return 0;
if (S->data.key < q->data.key) q->lchild = S;
else q->rchild = S;
}
return 1;
}
例20.編寫一個算法,計算平衡二叉樹中所有結點的平衡因子
解:計算一個結點*bt的bf的值遞歸模型如下:
f(bt): bt->bf 不存在 當btNULL
f(bt): bt->bf=0 當 bt->lchildNULL&&bt->rchild=NULL
f(bt): bt->bf=bt的右子樹的高度-左子樹的高度 其它情況
可選用先序的方式統計出各個結點的平衡因子
如何求高度呢?遞歸模型如下:
f(bt): 0 不存在 當btNULL
f(bt): 1 當 bt->lchildNULL&&bt->rchild=NULL
f(bt): bt的左子樹和右子樹的高度的最大值+1 其它情況
int Height(BSTNode *bt){//求樹的高度
int max1,max2;
if(btNULL) return 0;
else if(bt->lchildNULL&&bt->rchild=NULL) return 1;
else{
max1=Height(bt->lchild);
max2=Height(bt->rchild);
return max1>max2?max1+1:max2+1;
}
}
void Countbf(BSTNode *&bt){ //求所有結點的bf
if(bt!=NULL){
if(bt->lchildNULL&&bt->rchild=NULL){
bf->bf=0;
}
else{
Countbf(bt->lchild);
Countbf(bt->rchild);
bt->bf= Height(bt->rchild)-Height(bt->lchild);
}
}
}
實質上可以將上面求bf和求高度合二為一。
int Countbf1(BSTNode *&bt){//求所有結點的bf,返回對應結點高度值
int max1,max2;
if(btNULL) return 0;
if(bt->lchild==NULL&&bt->rchild=NULL){
bf->bf=0;
return1;
}
else{
max1=Height(bt->lchild);
max2=Height(bt->rchild);
bt->bf= max2-max1;
return max1>max2?max1+1:max2+1;
}
}
例21. 設給出一段報文: CAST CAST SAT AT A TASA;字符集合是 { C, A, S, T },各個字符出現的頻度(次數)是 W={ 2, 7, 4, 5 };試設計赫夫曼編碼,畫出赫夫曼樹。若給每個字符以等長編碼A : 00 T : 10 C : 01 S : 11;試說明赫夫曼編碼比此方案的優越之處。(編碼最短)
解答見ppt
練習
1.設計一個算法,刪除該二叉樹,釋放所有結點
2.設計一算法判斷二叉鏈表存儲的二叉樹是否結構對稱(左右子樹結點結構對稱相同)
3.試寫出復制一棵二叉樹的算法。二叉樹采用標準鏈接結構。
4.習題六 編程 (除打星號的部分)
5. 設計一個算法,尋找二叉樹中滿足特定數值x的第一個結點(相應的變形:尋找最小值,尋找父結點,尋找兄弟)
6. 設計一個算法,統計二叉樹中滿足特定數值x結點的個數(相應的變形:統計度為0,1,2的結點)
第七章 圖
1.圖的定義、基本概念: B
2.圖的存儲方式:鄰接矩陣和鄰接表 A
3.圖的遍歷 深度優先和廣度優先 A
4.圖的連通性和生成樹 B 帶權圖的最小生成樹及算法 B
5.圖的最短路徑問題 B
6.拓撲排序、AOE網中的關鍵路徑 B
本章重點:熟悉鄰接矩陣和鄰接表的表示方法,學會編寫遍歷算法深度優先和廣度優先遍歷算法以及一些遍歷算法的應用。請仔細復習。
本章難點:圖的一些算法(如最小生成樹、最短路徑、關鍵路徑;這部分重在理解算法思想和設計過程)
例22.將鄰接矩陣g裝換為鄰接表G (鄰接表的表示方法)
void MatToList(MGragh g,ALGLink &G){
int i,j, N=g.n;//N表示頂點數
ArcNode p;
G=(ALGraph)malloc(sizeof(ALGraph));
for(i=0;i<N;i++){//給鄰接表中所有頂點的賦值并使其指針域置空
G->vertices[i].data=g.vexs[i];
G->vertices[i].firstedge=NULL;
}
for(i=0;i<N;i++)/對鄰接陣掃描每一行的每一列/
for(j=N-1;j>=0;j–)//對第i個頂點進行建立鏈表(由后向前添加)
if(g.edges[i][j]!=0){
p=(ArcNode *)malloc(sizeof(ArcNode));//新建結點
p->adjvex=j;
p->info=g.edges[i][j];//存放邊的權值
p->next=G->vertices[i].firstedge;//前插
G->vertices[i].firstedge=p;
}
G->n=N; G->e=g.e;
}
例23.試利用深度優先遍歷DFS判斷該圖(在鄰接表存儲下)是否是連通的,若是連通的返回1,若是不連通的返回圖的連通分量個數,空圖則返回0。(圖的遍歷)
int visted[MAXNUM]; //全局數組
void DFS (ALGraph* G, int i){/*以Vi為出發點對鄰接表圖進行DFS */
ArcNode p;
printf(“visit data:%d\n”,G->vertices[i].data);//訪問頂點Vi
visited[i]=1; //標記Vi已訪問,標志為1
p= G->vertices[i].firstarc; //取Vi邊表的頭指針
while§ { //依次搜索Vi的鄰接點Vj,
if (!visited[p->adjvex]) //若Vj尚未訪問,則以Vj為出發點向縱深搜索
DFS (G,p->adjvex);
p=p->next;
}
}
/判斷無向圖是否連通,若連通返回1/
int Connects(ALGraphG){
int i,flag=1; //flag為標記是否連通
for (i=0;ivexnum;i++)
visited[i]=0 ; //標志向量visted[]初始化,標志為0
DFS(g,0);
for (i=0;ivexnum;i++)
if (visited[i]==0) { //還有vi未訪問過,修改標記flag量
flag=0;break;
}
return flag; }
例24.下面是求連通網的最小生成樹的prim算法:集合VT,ET分別放頂點和邊,初始為( 1 ),下面步驟重復n-1次: a:( 2 );b:( 3 );最后:( 4 )。
(1).A.VT,ET為空 B.VT為所有頂點,ET為空
C.VT為網中任意一點,ET為空 D.VT為空,ET為網中所有邊
(2).A. 選i屬于VT,j不屬于VT,且(i,j)上的權最小
B.選i屬于VT,j不屬于VT,且(i,j)上的權最大
C.選i不屬于VT,j不屬于VT,且(i,j)上的權最小
D.選i不屬于VT,j不屬于VT,且(i,j)上的權最大
(3).A.頂點i加入VT,(i,j)加入ET B. 頂點j加入VT,(i,j)加入ET
C. 頂點j加入VT,(i,j)從ET中刪去 D.頂點i,j加入VT,(i,j)加入ET
(4).A.ET 中為最小生成樹 B.不在ET中的邊構成最小生成樹
C.ET中有n-1條邊時為生成樹,否則無解 D.ET中無回路時,為生成樹,否則無解
C A B A
例25.P182 算法 7.12(思考: 用鄰接矩陣存儲怎么實現?)
練習
1.假設有向圖以鄰接表存儲,計算Vi頂點的出度和入度。
2.在有向無環圖中,試利用深度優先遍歷DFS求出一個拓撲排序序列。
提示:由某點出發進行深度優先遍歷,退出DFS函數調用時記錄此時頂點序號,最先退出DFS函數的頂點是拓撲序列中的最后一個頂點,依次下去……得到一個逆向拓撲有序序列;再將此頂點序號反向輸出即可。
3. 設計一個深度優先搜索算法,以判斷用鄰接表方式存儲的有向圖中是否存在由頂點Vi到頂點Vj(i≠j)的路徑。
第八章 查找
基本概念 C
靜態查找表中常用的方法:順序查找、折半查找、分塊查找(分別適用于一般、有序、分塊有序的表) 相應算法和性能分析 A
動態查找表:二叉排序樹的建立、查找、刪除;A 二叉平衡樹 B
哈希表:哈希函數的構造和沖突處理方法 B
本章重點:查找樹的建立和查找(含靜態折半查找、動態查找樹)、哈希函數和沖突方法
本章難點:二叉排序樹刪除;平衡排序樹的插入
例26.在有序表A[1…12]中,采用二分查找算法查等于A[12]的元素,所比較的元素下標依次為________。
6,9,11,12
例27.設散列表為HT [0…12],即表的大小為m=13。現采用雙散列法解決沖突。散列函數和再散列函數分別為:
H0(key)=key % 13; 注:%是求余數運算(=mod)
Hi=(Hi-1+REV(key+1)%11+1) % 13; i=1,2,3,…,m-1
其中,函數REV(x)表示顛倒10進制數x的各位,如REV(37)=73,REV(7)=7等。若插入的關鍵碼序列為(2,8,31,20,19,18,53,27)。
(1)試畫出插入這8個關鍵碼后的散列表;(2)計算搜索成功的平均搜索長度ASL。
(1)
散列地址 0 1 2 3 4 5 6 7 8 9 10 11 12
關鍵字 27 53 2 31 19 20 8 18
比較次數 3 1 1 1 1 1 1 2
(2)ASLsuss =11/8
第九章 內排序
穩定/不穩定排序,內排序和外排序 C
插入排序方法:直接插入排序、折半插入排序、希爾插入排序 算法與性能分析 A
交換排序方法:冒泡排序、快速排序 A
選擇排序方法:簡單選擇排序、堆排序 A
二路歸并排序、基數排序 B
排序方法 平均時間 最壞情況 輔助空間 穩定性 不穩定排序舉例
直接插入排序 O(n2) O(n2) O(1) 穩定
折半插入排序 O(n2) O(n2) O(1) 穩定
二路插入排序 O(n2) O(n2) O(n) 穩定 本次考試不要求
表插入排序 O(n2) O(n2) O(1) 穩定 本次考試不要求
起泡排序 O(n2) O(n2) O(1) 穩定
直接選擇排序 O(n2) O(n2) O(1) 不穩定 2,2’,1
希爾排序 O(n1.3) O(n1.3) O(1) 不穩定 3,2,2’,1(d=2,d=1)
快速排序 O(nlog2n) O(n2) O(log2n) 不穩定 2,2’,1
堆排序 O(nlog2n) O(nlog2n) O(1) 不穩定 2,1,1’(極大堆)
2-路歸并排序 O(nlog2n) O(nlog2n) O(n) 穩定
基數排序 O ( d*(rd+n) ) O ( d*(rd+n) ) O (rd ) 穩定
本章重點:各種排序方法的實現、性能比較與選擇
例28. 某內排序方法的穩定性是指( )。
A.該排序算法不允許有相同的關鍵字記錄 B.該排序算法允許有相同的關鍵字記錄
C.平均時間為0(n log n)的排序方法 D.以上都不對
B
例29. 對序列{15,9,7,8,20,-1,4}進行排序,進行一趟后數據的排列變為{4,9,-1,8,20,7,15};則采用的是( )排序。
A. 選擇 B. 快速 C. 希爾 D. 冒泡
若上題的數據經一趟排序后的排列為{9,15,7,8,20,-1,4},則采用的是( )排序。
A.選擇 B. 堆 C. 直接插入 D. 冒泡
C C
例30. 有一組數據(15,9,7,8,20,-1,7,4) 用快速排序的劃分方法進行一趟劃分后數據的排序為 ( )(按遞增序)。
A.下面的B,C,D都不對。 B.9,7,8,4,-1,7,15,20
C.20,15,8,9,7,-1,4,7 D. 9,4,7,8,7,-1,15,20
A
說明: 請針對性的仔細看書和ppt的內容;另外一些經典算法的時間復雜度分析應該不要忽略。
A類 在所有的題型中體現(要求:熟練掌握);
B類 在選擇、填空、簡答中體現(要求:理解);
C類 在選擇、填空中體現(要求:了解)。
總結
- 上一篇: JavaScript图标移动小案例
- 下一篇: 案例介绍 犹他州交通规划网络地图中心