數據結構試題及答案node
1、單項選擇題算法
(1) 一個算法應該是(B )。shell
A) 程序 B) 問題求解步驟的描述 數組
C) 要知足五個基本屬性 D) A和C網絡
(2) 算法指的是( D )。數據結構
A) 計算機程序 B) 解決問題的計算方法函數
C) 排序算法 D) 解決問題的有限運算序列。性能
(3) 與數據元素自己的形式、內容、相對位置、個數無關的是數據的( B)。this
A) 存儲結構 B) 邏輯結構 C) 算法 D)操做編碼
(4) 從邏輯上能夠把數據結構分爲( C )兩大類。
A) 動態結構、靜態結構 B) 順序結構、鏈式結構
C) 線性結構、非線性結構 D) 初等結構、構造型結構
(5) 下列敘述中正確的是( D )。
A)一個邏輯數據結構只能有一種存儲結構
B)數據的邏輯結構屬於線性結構,存儲結構屬於非線性結構
C)一個邏輯數據結構能夠有多種存儲結構,且各類存儲結構不影響數據處理的效率
D)一個邏輯數據結構能夠有多種存儲結構,且各類存儲結構影響數據處理的效率
(6) 數據的基本單位是( A )
A) 數據項 B) 數據類型 C) 數據元素 D) 數據變量
(7) 下列程序的時間複雜度爲( )
i=0;s=0;
while(s<n)
{ i++;s=s+i;}
A) O() B) O() C) O(n) D) O(n2)
(8) 下列程序段的漸進時間複雜度爲( )。
for( int i=1;i<=n;i++)
for( int j=1;j<= m; j++)
A[i][j] = i*j ;
A)O(m2) B)O(n2) C)O(m*n) D)(m+n)
(9) 程序段以下:
sum=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
sum++;
其中 n爲正整數,則最後一行的語句頻度在最壞狀況下是( C )。
A)O(n) B) O(nlogn) C) O(n3) D) O(n2)
(10) 在下面的程序段中,對x的賦值語句的頻度爲( C )。
for ( i=1; i>=n ; i++)
for ( j=1; j>=n ; j++)
x:=x+1;
A) O(2n) B)O(n) C) O(n2) D) O(log2n)
(11) 程序段 for ( i:=n-1; i<=1; i--)
for ( j:=1; j>=i ; j++)
if (a[j]>a[j+1] )
{ t=a[j]; a[j]= a[j+1]; a[j+1]= t; }
其中 n爲正整數,則最後一行的語句頻度在最壞狀況下是(D )。
A) O(n) B) O(nlogn) C) O(n3) D) O(n2)
(12) 設有一個遞歸算法以下:
int fact(int n)
{ /* 大於等於0 */
if ( n<=0 ) return 1 ;
else return n*fact (n-1) ;
}
則計算fact(n)須要調用該函數的次數爲( B )。
A) n B) n+1 C) n+2 D) n-1
(13) 下述程序段中語句①的頻度是( C )。
s=0;
for(i=1;i<m;i++)
for(j=0;j<=i;j++)
s+=j;
A) B) C) D)
(14) 若某線性表中最經常使用的操做是在最後一個元素以後插入一個元素和刪除第一個元素,則最節省運算時間的存儲方式是( D )。
A)單鏈表 B)僅有頭指針的單循環鏈表
C)雙鏈表 D)僅有尾指針的單循環鏈表
(1) 求循環鏈表中當前結點的後繼和前驅的時間複雜度分別是( C )。
A) O(n)和O(1) B) O(1)和O(1) C) O(1)和O(n) D) O(n)和O(n)
(15) 求單鏈表中當前結點的後繼和前驅的時間複雜度分別是( )。
A) O(n)和O(1) B) O(1)和O(1)
C) O(1)和O(n) D) O(n)和O(n)
(16) 非空的單循環鏈表的頭指針爲head,尾指針爲rear,則下列條件成立的是(A )。
A) rear->next= =head B) rear->next->next= =head
C) head->next= =rear D) head->next->next= =rear
(17) 從一個長度爲n的順序表中刪除第i個元素(1≤i≤n)時,需向前移動的元素的個數是(A )。
A)n-i B)n-i+1 C)n-i-1 D)i
(18) 已知一個有序表爲(13,18,24,35,47,50,62,83,90,115,134),當二分檢索值爲90的元素時,檢索成功需比較的次數是( )。
A)1 B)2 C)3 D)4
(19) 假設以行優先順序存儲三維數組R[6][9][6],其中元素R[0][0][0]的地址爲2100,且每一個元素佔4個存儲單元,則存儲地址爲2836的元素是( )。
A) R[3][3][3] B) R[3][3][4] C) R[4][3][5] D) R[4][3][4]
(20) 設有一個10階的對稱矩陣A,採用壓縮存儲方式以行序爲主序存儲,a00爲第一個元素,其存儲地址爲0,每一個元素佔有1個存儲地址空間,則a45的地址爲( )。
A) 13 B) 35 C) 17 D) 36
(21) 線性表採用鏈式存儲時,節點的存儲的地址( B )。
A) 必須是不連續的 B) 連續與否都可
C) 必須是連續的 D) 和頭節點的存儲地址相連續
(22) 用鏈表表示線性表的優勢是( D )。
A) 便於隨機存取 B) 花費的存儲空間比順序表少
C) 數據元素的物理順序與邏輯順序相同 D) 便於插入與刪除
(23) 鏈表不具備的特色是(B ) 。
A) 插入、刪除不須要移動元素 B) 可隨機訪問任一元素
C) 沒必要事先估計存儲空間 D) 所需空間與線性長度成正比
(24) 在長度爲n的順序表中刪除第i個元素(1≤i≤n)時,元素移動的次數爲( D )。
A) n-i+1 B) i C) i+1 D) n-i
(25) 採用順序搜索方法查找長度爲n的順序表示,搜索成功的平均搜索長度爲( D )。
A) n B) n/2 C) (n-1)/2 D) (n+1)/2
(26) 將長度爲n的單鏈表連接在長度爲m的單鏈表以後的算法的時間複雜度爲( B )。
A) O(1) B) O(n) C) O(m) D) O(m+n)
(27) 若不帶頭結點的單鏈表的頭指針爲head,則該鏈表爲空的斷定條件是( A )。
A) head==NULL B) head->next==NULL C) head!=NULL D) head->next==head
(28) 某線性表中最經常使用的操做是在最後一個元素以後插入一個元素和刪除第一個元素,則採用( D )存儲方式最節省運算時間。
A) 單鏈表 B) 僅有頭指針的單循環鏈表
C) 雙鏈表 D) 僅有尾指針的單循環鏈表
(29) 若容許表達式內多種括號混合嵌套,則爲檢查表達式中括號是否正確配對的算法,一般選用的輔助結構是( A )。
A) 棧 B) 線性表 C) 隊列 D) 二叉排序樹
(30) 順序棧S中top爲棧頂指針,指向棧頂元素所在的位置,elem爲存放棧的數組,則元素e進棧操做的主要語句爲( D )。
A) s.elem[top]=e; s.top=s.top+1; B) s.elem[top+1]=e;s.top=s.top+1;
C) s.top=s.top+1; s.elem[top+1]=e; D) s.top=s.top+1;s.elem[top]=e;
(31) 循環隊列sq中,用數組elem[0··25]存放數據元素,sq.front指示隊頭元素的前一個位置,sq.rear指示隊尾元素的當前位置,設當前sq.front爲20,sq.rear爲12,則當前隊列中的元素個數爲( C )。
A) 8 B) 16 C) 17 D) 18
(32) 鏈式棧與順序棧相比,一個比較明顯的優勢是( B )。
A) 插入操做更加方便 B) 一般不會出現棧滿的狀況
C) 不會出現棧空的狀況 D) 刪除操做更加方便
(33) 一個遞歸的定義能夠用遞歸過程求解,也能夠用非遞歸過程求解,但單從運行時間來看,一般遞歸過程比非遞歸過程( B )。
A) 較快 B) 較慢 C) 相同 D) 不定
(34) 若已知一個棧的入棧序列是1,2,3,4……n,其輸出序列爲p1,p2,p3,……pn,若p1= =n,則pi爲( C )。
A) i B) n= =i C) n-i+1 D) 不肯定
(35) 一個棧的入棧序列是a,b,c,d,e,則棧的不可能的輸出序列是( C ) 。
A) edcba B) decba C) dceab D) abcde
(36) 若進棧序列爲1,2,3,4,5,6,且進棧和出棧能夠穿插進行,則不可能出現的出棧序列是( D )。
A) 2,4,3,1,5,6 B) 3,2,4,1,6,5
C) 4,3,2,1,5,6 D) 2,3,5,1,6,4
(37) 對於棧操做數據的原則是( B )。
A) 先進先出 B) 後進先出 C) 後進後出 D) 不分順序
(38) 棧和隊列的共同點是( C )。
A) 都是先進先出 B) 都是先進後出
C) 只容許在端點處插入和刪除元素 D) 沒有共同點
(39) 一個隊列的入隊序列是1,2,3,4,則隊列的輸出序列是( B )。
A) 4,3,2,1 B) 1,2,3,4 C)1,4,3,2 D) 3,2,4,1
(40) 設數組data[m]做爲循環隊列SQ的存儲空間,front爲隊頭指針,rear爲隊尾指針,則執行出對操做後其頭指針front值爲(D )。
A) front=front+1 B) front=(front+1)%(m-1)
C) front=(front-1)%m D) front=(front+1)%m
(41) 引發循環隊列隊頭位置發生變化的操做是( A )。
A) 出隊 B) 入隊 C) 取隊頭元素 D) 取隊尾元素
(2) 設以數組A[m]存放循環隊列的元素,其頭尾指針分別爲front和rear,則當前隊列中的元素個數爲( A )。
A)(rear-front+m)%m B)rear-front+1 C)(front-rear+m)%m D)(rear-front)%m
(42) 二維數組A[12][18]採用列優先的存儲方法,若每一個元素各佔3個存儲單元,且A[0][0]地址爲150,則元素A[9][7]的地址爲( A )。
A) 429 B) 432 C) 435 D) 438
(43) 設有一個10階的對稱矩陣A[10][10],採用壓縮方式按行將矩陣中下三角部分的元素存入一維數組B[]中,A[0][0]存入B[0]中,則A[8][5]在B[]中( C )位置。
A) 32 B) 33 C) 41 D) 65
(44) 若對n階對稱矩陣A以行序爲主序方式將其下三角形的元素(包括主對角線上全部元素)依次存放於一維數組B[1..(n(n+1))/2]中,則在B中肯定aij(i<j)的位置k的關係爲( A )。
A) i*(i-1)/2+j B) j*(j-1)/2+i C) i*(i+1)/2+j D) j*(j+1)/2+i
(45) 對稀疏矩陣進行壓縮存儲目的是( C )。
A) 便於進行矩陣運算 B) 便於輸入和輸出
C) 節省存儲空間 D) 下降運算的時間複雜度
(46) 對廣義表L=((a,b),(c,d),(e,f))執行操做tail(tail(L))的結果是( B)。
A) (e,f) B) ((e,f)) C) (f) D) ( )
(47) 設廣義表L=((a,b,c)),則L的長度和深度分別爲( C )。
A) 1和1 B) 1和3 C) 1和2 D) 2和3
(48) 樹中全部結點的度之和等於全部結點數加( C )。
A) 0 B)1 C) -1 D) 2
(49) 在一棵具備n個結點的二叉鏈表中,全部結點的空域個數等於( C )。
A) n B) n-1 C) n+1 D) 2*n
(50) 某二叉樹的先序序列和後序序列正好相反,則該二叉樹必定是(B )的二叉樹。
A) 空或只有一個結點 B) 高度等於其節點數
C) 任一結點無左孩子 D) 任一結點無右孩子
(51) 含有10個結點的二叉樹中,度爲0的結點數爲4,則度爲2的結點數爲( )
A)3 B)4 C)5 D)6
(52) 除第一層外,滿二叉樹中每一層結點個數是上一層結點個數的( )
A)1/2倍 B)1倍 C) 2倍 D) 3倍
(53) 對一棵有100個結點的徹底二叉樹按層編號,則編號爲49的結點,它的父結點的編號爲( )
A)24 B)25 C)98 D)99
(54) 能夠唯一地轉化成一棵通常樹的二叉樹的特色是( )
A)根結點無左孩子 B)根結點無右孩子 C)根結點有兩個孩子 D)根結點沒有孩子
(55) 設高度爲h的二叉樹上只有度爲0和度爲2的結點,則此類二叉樹中所包含的結點數至少爲(B )。
A) 2h B) 2h-1 C) 2h+1 D) h+1
(56) 在一棵度爲3的樹中,度爲3的節點個數爲2,度爲2的節點個數爲1,則度爲0的節點個數爲(C )。
A) 4 B) 5 C) 6 D) 7
(57) 設森林F對應的二叉樹爲B,它有m個結點,B的根爲p,p的右子樹結點個數爲n,森林F中第一棵 子樹的結點個數是( A )。
A)m-n B)m-n-1 C) n+1 D) 條件不足,沒法肯定
(58) 將一株有100個節點的徹底二叉樹從上到下,從左到右依次進行編號,根節點的編號爲1,則編號爲49的節點的 左孩子編號爲(A)。
A) 98 B) 89 C) 50 D) 沒有孩子
(59) 下列圖示的順序存儲結構表示的二叉樹是(A )
(60) 樹最適合用來表示( C )。
A) 有序數據元素 B) 無序數據元素
C) 元素之間具備分支層次關係的數據 D) 元素之間無聯繫的數據
(61) 在一個非空二叉樹的中序遍歷序列中,根結點的右邊( A )。
A) 只有右子樹上的全部結點 B) 只有右子樹上的部分結點
C) 只有左子樹的上的部分結點 D) 只有左子樹上的全部結點
(62) 任何一棵二叉樹的葉結點在先序、中序和後序遍歷序列中相對次序( D )。
A) 不發生改變 B) 發生改變 C) 不能肯定 D) 以上都不對
(63) 在有n個葉子結點的哈夫曼樹中,其結點總數爲( D )。
A) 不肯定 B) 2n C) 2n+1 D) 2n-1
(64) 權值爲{1,2,6,8}的四個結點構成的哈夫曼樹的帶權路徑長度是( D )。
A) 18 B) 28 C) 19 D) 29
(65) 對一個滿二叉樹,m個樹葉,k個分枝結點,n個結點,則( D )。
A) n=m+1 B) m+1=2n C) m=k-1 D) n=2k+1
(66) 在含有n個頂點和e條邊的無向圖的鄰接矩陣中,零元素的個數爲( D )。
A) e B) 2e C) n2-e D) n2-2e
(67) 若採用鄰接矩陣翻存儲一個n個頂點的無向圖,則該鄰接矩陣是一個( D )。
A) 上三角矩陣 B) 稀疏矩陣 C) 對角矩陣 D) 對稱矩陣
(68) 在一個圖中,全部頂點的度數之和等於全部邊數的( C )倍。
A) 1/2 B) 1 C) 2 D) 4
(69) 在一個有向圖中,全部頂點的入度之和等於全部頂點的出度之和的( B )倍。
A) 1/2 B) 1 C) 2 D) 4
(70) 對於含n個頂點和e條邊的圖,採用鄰接矩陣表示的空間複雜度爲( )。
A) O(n) B) O(e) C) O(n+e) D) O(n2)
(71) 若是求一個連通圖中以某個頂點爲根的高度最小的生成樹,應採用( )。
A) 深度優先搜索算法 B) 廣度優先搜索算法
C) 求最小生成樹的prim算法 D) 拓撲排序算法
(72) n個頂點的連通圖至少中含有( A )。
A) n-1 B) n C) n+1 D) 0
(73) n個頂點的徹底有向圖中含有( D )。
A) n-1條有向邊 B) n條有向邊 C) n(n-1)/2條有向邊 D) n(n-1)條有向邊
(74) 假設一個有n個頂點和e條弧的有向圖用鄰接表表示,則刪除預某個頂點vi相關的全部弧的時間複雜度是( C )。
A) O(n) B) O(e) C) O(n+e) D) O(n*e)
(75) 在無向圖中定義頂點Vi域Vj之間的路徑爲從Vi到達Vj的一個( A )。
A) 頂點序列 B) 邊序列 C) 權值總和 D) 邊的條數
(76) 無向圖G=(V,E),其中:V={a,b,c,d,e,f}, E={(a,b),(a,e),(a,c),(b,e),(c,f), (f,d),(e,d)},對該圖進行深度優先遍歷,獲得的頂點序列正確的是( D )。
A) a,b,e,c,d,f B) a,c,f,e,b,d C) a,e,b,c,f,d D) a,e,d,f,c,b
(77) 下面哪一方法能夠判斷出一個有向圖是否有環(迴路)B。
A) 求節點的度 B) 拓撲排序 C) 求最短路徑 D) 求關鍵路徑
(78) 圖的廣度優先搜索相似於樹的( B )次序遍歷。
A) 先根 B) 中根 C) 後根 D) 層次
(79) 在圖採用鄰接表存儲時,求最小生成樹的 Prim 算法的時間複雜度爲( B )。
A) O(n) B) O(n+e) C) O(n2) D) O(n3)
(80) 已知有向圖G=(V,E),其中V={V1,V2,V3,V4,V5,V6,V7},E={<V1,V2>,<V1,V3>,<V1,V4>, <V2,V5>,<V3,V5>,<V3,V6>,<V4,V6>,<V5,V7>,<V6,V7>},G的拓撲序列是( A )。
A) V1,V3,V4,V6,V2,V5,V7 B) V1,V3,V2,V6,V4,V5,V7
C) V1,V3,V4,V5,V2,V6,V7 D) V1,V2,V5,V3,V4,V6,V7
(81) 關鍵路徑是事件結點網絡中( A )。
A) 從源點到匯點的最長路徑 B) 從源點到匯點的最短路徑
C) 最長迴路 D) 最短迴路
(82) 有n個結點的有向徹底圖的弧數是( C )。
A) n2 B) 2n C) n(n-1) D) 2n(n+1)
(83) 設圖的鄰接鏈表如題12圖所示,則該圖的邊的數目是( B )。
A) 4 B) 5 C) 10 D) 20
(84) 在一個圖中,全部頂點的度數之和等於圖的邊數的( A )倍。
A) 1/2 B) 1 C) 2 D) 4
(85) 在一個有向圖中,全部頂點的入度之和等於全部頂點的出度之和的( B )倍。
A) 1/2 B) 1 C) 2 D) 4
(86) 有8個結點的無向圖最多有( B )條邊。
A) 14 B) 28 C) 56 D) 112
(87) 有8個結點的無向連通圖最少有( C )條邊。
A) 5 B) 6 C) 7 D) 8
(88) 有8個結點的有向徹底圖有( C )條邊。
A) 14 B) 28 C) 56 D) 112
(89) 用鄰接表表示圖進行廣度優先遍歷時,一般是採用(B )來實現算法的。
A) 棧 B) 隊列 C) 樹 D) 圖
(90) 用鄰接表表示圖進行深度優先遍歷時,一般是採用( A )來實現算法的。
A) 棧 B) 隊列 C) 樹 D) 圖
(91) 已知圖的鄰接矩陣,根據算法思想,則從頂點0出發按深度優先遍歷的結點序列是( C )。
A) 0 2 4 3 1 5 6 B)0 1 3 6 5 4 2 C) 0 4 2 3 1 6 5 D) 0 3 6 1 5 4 2
建議:0 1 3 4 2 5 6
(92) 已知圖的鄰接矩陣同上題8,根據算法,則從頂點0出發,按深度優先遍歷的結點序列是( D )。
A) 0 2 4 3 1 5 6 B) 0 1 3 5 6 4 2 C) 0 4 2 3 1 6 5 D) 0 1 3 4 2 5 6
(93) 已知圖的鄰接矩陣同上題8,根據算法,則從頂點0出發,按廣度優先遍歷的結點序列是( B )。
A) 0 2 4 3 6 5 1 B) 0 1 3 6 4 2 5 C) 0 4 2 3 1 5 6 D) 0 1 3 4 2 5 6
(建議:0 1 2 3 4 5 6)
(94) 已知圖的鄰接矩陣同上題8,根據算法,則從頂點0出發,按廣度優先遍歷的結點序列是( )。
A) 0 2 4 3 1 6 5 B) 0 1 3 5 6 4 2 C) 0 1 2 3 4 6 5 D) 0 1 2 3 4 5 6
(95) 已知圖的鄰接表以下所示,根據算法,則從頂點0出發按深度優先遍歷的結點序列是( D )。
A) 1 3 2 B) 0 2 3 1 C) 0 3 2 1 D) 0 1 2 3
(96) 已知圖的鄰接表以下所示,根據算法,則從頂點0出發按廣度優先遍歷的結點序列是( A )。
A) 0 3 2 1 B) 0 1 2 3 C) 0 1 3 2 D) 0 3 1 2
(97) 深度優先遍歷相似於二叉樹的( A )。
A) 先序遍歷 B) 中序遍歷 C) 後序遍歷 D) 層次遍歷
(98) 廣度優先遍歷相似於二叉樹的( D )。
A) 先序遍歷 B) 中序遍歷 C) 後序遍歷 D) 層次遍歷
(99) 任何一個無向連通圖的最小生成樹( A )。
A) 只有一棵 B) 一棵或多棵 C) 必定有多棵 D) 可能不存在
(注,生成樹不惟一,但最小生成樹惟一,即邊權之和或樹權最小的狀況惟一)
(100) 在分析折半查找的性能時經常加入失敗節點,即外節點,從而造成擴充的二叉樹。若設失敗節點i所在層次爲Li,那麼查找失敗到達失敗點時所作的數據比較次數是(D )。
A) Li+1 B) Li+2 C) Li-1 D) Li
(101) 向一個有127個元素原順序表中插入一個新元素並保存原來順序不變,平均要移動(B )個元素。
A) 8 B) 63.5 C) 63 D) 7
(102) 由同一組關鍵字集合構造的各棵二叉排序樹( B )。
A) 其形態不必定相同,但平均查找長度相同
B) 其形態不必定相同,平均查找長度也不必定相同
C) 其形態均相同,但平均查找長度不必定相同
D) 其形態均相同,平均查找長度也都相同
(103) 衡量查找算法效率的主要標準是( C )。
A) 元素的個數 B) 所需的存儲量 C) 平均查找長度 D) 算法難易程度
(104) 適合對動態查找表進行高效率查找的組織結構是(C )。
A) 有序表 B) 分塊有序表 C) 二叉排序樹 D) 快速排序
(3) 能進行二分查找的線性表,必須以(A )。
A) 順序方式存儲,且元素按關鍵字有序
B) 鏈式方式存儲,且元素按關鍵字有序
C) 順序方式存儲,且元素按關鍵字分塊有序
D) 鏈式方式存儲,且元素按關鍵字分塊有序
(105) 爲使平均查找長度達到最小,當由關鍵字集合{05,11,21,25,37,40,41,62,84}構建二叉排序樹時,第一個插入的關鍵字應爲( )
A) 5 B)37 C) 41 D) 62
(106) 對關鍵字序列(56,23,78,92,88,67,19,34)進行增量爲3的一趟希爾排序的結果爲 ( D )。
A) (19,23,56,34,78,67,88,92) B) 23,56,78,66,88,92,19,34)
C) (19,23,34,56,67,78,88,92) D) (19,23,67,56,34,78,92,88)
(107) 用某種排序方法對關鍵字序列{35,84,21,47,15,27,68,25,20}進行排序時,序列的變化狀況以下:
20,15,21,25,47,27,68,35,84
15,20,21,25,35,27,47,68,84
15,20,21,25,27,35,47,68,84
則採用的方法是(D )。
A) 直接選擇排序 B) 希爾排序 C) 堆排序 D) 快速排序
(108) 一組記錄的排序碼爲(46,79,56,38,40,84),則利用快速排序的方法,以第一個記錄爲基準獲得的第一次劃分結果爲(C )。
A) 38,40,46,56,79,84 B) 40,38,46,79,56,84 C) 40,38,46,56,79,84 D) 40,38,46,84,56,79
(109) 快速排序在最壞狀況下的時間複雜度是( B )
A) O(n2log2n) B) O(n2) C) O(nlog2n) D) O(log2n)
(110) 下列排序算法中不穩定的是( D )。
A) 直接選擇排序 B) 折半插入排序 C) 冒泡排序 D) 快速排序
(111) 對待排序的元素序列進行劃分,將其分爲左、右兩個子序列,再對兩個子序列進行一樣的排序操做,直到子序列爲空或只剩下一個元素爲止。這樣的排序方法是( C )。
A) 直接選擇排序 B) 直接插入排序 C) 快速排序 D) 冒泡排序
(112) 將5個不一樣的數據進行排序,至多須要比較( C )次。
A) 8 B) 9 C) 10 D) 25
(113) 排序算法中,第一趟排序後,任一元素都不能肯定其最終位置的算法是( D )。
A)選擇排序 B)快速排序 C)冒泡排序 D)插入排序
(114) 排序算法中,不穩定的排序是( C )。
A)直接插入排序 B)冒泡排序 C)堆排序 D)選擇排序
(115) 排序方法中,從未排序序列中依次取出元素與已排序序列(初始時爲空)中的元素進行比較,將其放入已排序序列的正確位置上的方法,稱爲( C ).
A) 希爾排序 B) 冒泡排序 C) 插入排序 D) 選擇排序
(116) 從未排序序列中挑選元素,並將其依次插入已排序序列(初始時爲空)的一端的方法,稱爲( D )。
A) 希爾排序 B) 歸併排序 C) 插入排序 D) 選擇排序
(117) 對n個不一樣的排序碼進行冒泡排序,在下列哪一種狀況下比較的次數最多。( B )
A) 從小到大排列好的 B) 從大到小排列好的
C) 元素無序 D) 元素基本有序
(118) 對n個不一樣的排序碼進行冒泡排序,在元素無序的狀況下比較的次數爲( D )。
A) n+1 B) n C) n-1 D) n(n-1)/2
(119) 快速排序在下列哪一種狀況下最易發揮其長處。( C )
A) 被排序的數據中含有多個相同排序碼
B) 被排序的數據已基本有序
C) 被排序的數據徹底無序
D) 被排序的數據中的最大值和最小值相差懸殊
(120) 對有n個記錄的表做快速排序,在最壞狀況下,算法的時間複雜度是( B )。
A) O(n) B) O(n2) C) O(nlog2n) D) O(n3)
(121) 若一組記錄的排序碼爲(46, 79, 56, 38, 40, 84),則利用快速排序的方法,以第一個記錄爲基準獲得的一次劃分結果爲( C )。
A) 38, 40, 46, 56, 79, 84 B) 40, 38, 46 , 79, 56, 84
C) 40, 38,46, 56, 79, 84 D) 40, 38, 46, 84, 56, 79
(122) 下列關鍵字序列中,( D )是堆。
A) 16, 72, 31, 23, 94, 53 B) 94, 23, 31, 72, 16, 53
C) 16, 53, 23, 94,31, 72 D) 16, 23, 53, 31, 94, 72
(123) 堆是一種( B )排序。
A) 插入 B) 選擇 C) 交換 D) 歸併
(124) 堆的形狀是一棵( C )。
A) 二叉排序樹 B) 滿二叉樹 C) 徹底二叉樹 D) 平衡二叉樹
(125) 若一組記錄的排序碼爲(46, 79, 56, 38, 40, 84),則利用堆排序的方法創建的初始堆爲( B )。
A) 79, 46, 56, 38, 40, 84 B) 84, 79, 56, 38, 40, 46
C) 84, 79, 56, 46, 40, 38 D) 84, 56, 79, 40, 46, 38
(126) 下述幾種排序方法中,要求內存最大的是( C )。
A) 插入排序 B) 快速排序 C) 歸併排序 D) 選擇排序
(127) 有一組數據(15,9,7,8,20,-1,7,4),用堆排序的篩選方法創建的初始堆爲( )。
A) -1,4,8,9,20,7,15,7 B) -1,7,15,7,4,8,20,9
C) -1,4,7,8,20,15,7,9 D) A,B,C 均不對。
(128) 51.下列四個序列中,哪個是堆( )。
A) 75,65,30,15,25,45,20,10 B) 75,65,45,10,30,25,20,15
C) 75,45,65,30,15,25,20,10 D) 75,45,65,10,25,30,20,15
(129) 如下序列不是堆的是( )。
A) (100,85,98,77,80,60,82,40,20,10,66) B) (100,98,85,82,80,77,66,60,40,20,10)
C) (10,20,40,60,66,77,80,82,85,98,100) D) (100,85,40,77,80,60,66,98,82,10,20)
(130) 快速排序方法在( )狀況下最不利於發揮其長處。
A) 要排序的數據量太大 B) 要排序的數據中含有多個相同值
C) 要排序的數據個數爲奇數 D) 要排序的數據已基本有序
(131) 對關鍵碼序列28,16,32,12,60,2,5,72 快速排序,從小到大一次劃分結果爲( )。
A) (2,5,12,16)26(60,32,72) B) (5,16,2,12)28(60,32,72)
C) (2,16,12,5)28(60,32,72) D) (5,16,2,12)28(32,60,72)
(132) 對下列關鍵字序列用快速排序法進行排序時,速度最快的情形是( )。
A) {21,25,5,17,9,23,30} B){25,23,30,17,21,5,9}
C) {21,9,17,30,25,23,5} D) {5,9,17,21,23,25,30}
2、填空題
(133) 數據結構是一門研究非數值計算的程序設計問題中計算機的 操做對象 以及它們之間的 關係 和運算等的學科。
(134) 數據結構被形式地定義爲(D, R),其中D是 數據元素 的有限集合,R是D上的 關係 有限集合。
(135) 數據結構包括數據的 邏輯結構 、數據的 存儲結構 和數據的 運算 這三個方面的內容。
(136) 數據結構按邏輯結構可分爲兩大類,它們分別是 線性結構 和 非線性結構 。
(137) 線性結構中元素之間存在一對一關係,樹形結構中元素之間存在一對多關係,圖形結構中元素之間存在多對多關係。
(138) 在線性結構中,第一個結點 沒有 前驅結點,其他每一個結點有且只有 1個前驅結點;最後一個結點 沒有 後續結點,其他每一個結點有且只有1個後續結點。
(139) 在樹形結構中,樹根結點沒有 前驅 結點,其他每一個結點有且只有 1 個前驅結點;葉子結點沒有 後續 結點,其他每一個結點的後續結點數能夠任意多個 。
(140) 在圖形結構中,每一個結點的前驅結點數和後續結點數能夠 任意多個 。
(141) 數據的存儲結構可用四種基本的存儲方法表示,它們分別是順序 、 鏈式 、 索引 和 散列 。
(142) 數據的運算最經常使用的有5種,它們分別是插入 、 刪除、修改、 查找 、排序。
(143) 一個算法的效率可分爲 時間 效率和 空間 效率。
(144) 對於給定的n個元素,能夠構造出的邏輯結構有 集合,線性表,樹,圖 四種。
(145) 順序映象的特色是藉助元素在存儲器中的 相對位置來表示數據元素之間的邏輯關係。非順序映象的特色是藉助是指示元素存儲地址的 指針表示數據元素之間的邏輯關係。任何一個算法的設計取決於選定 邏輯結構,而算法的實現依賴於採用的 存儲結構。
(146) 數據類型是一組___________性質相同的值集合以及定義在這個值集合上的一組操做的總稱。
(147) 數據對象是___________性質相同的數據元素的集合,是數據的一個子集。
(148) 若是操做不改變原邏輯結構的「值」,而只是從中提取某些信息做爲運算結果,則稱該類運算爲 型運算。引用
(149) 算法的 健壯特性是指作爲一個好的算法,當輸入的數據非法時,也能適當地作出正確反應或進行相應的處理,而不會產生一些莫名其妙的輸出結果。
(150) 算法分析不是針對實際執行時間的精確的算出算法執行具體時間的分析,而是針對算法中語句的 執行次數作出估計,從中獲得算法執行時間的信息。
(151) T(n)=O(f(n)),它表示隨問題規模n的增大算法的執行時間的增加率和f(n)的增加率 相同,稱做算法的漸進時間複雜度,簡稱時間複雜度。
(152) 若算法執行時所須要的輔助空間相對於輸入數據量而言是個常數,則稱這個算法爲 原地工做,輔助空間爲O(1)。
(153) 在帶有頭結點的單鏈表中L中,第一個元素結點的指針是 。L->next
(154) 在一個帶頭節點的單循環鏈表中,p指向尾結點的直接前驅,則指向頭結點的指針head可用p表示爲head= 。p->next->next
(155) 設單鏈表的結點結構爲(data,next),next爲指針域,已知指針px指向單鏈表中data爲x的結點,指針py指向data爲y的新結點 , 若將結點y插入結點x以後,則須要執行如下語句: py->next=px->next; px->next=py。
(156) 對於棧操做數據的原則是 。後進先出
(157) 設以數組A[m]存放循環隊列的元素,其頭尾指針分別爲front和rear,則當前隊列中的元素個數爲 。(rear-front+m)%m
(158) 若已知一個棧的入棧序列是1,2,3,4……n,其輸出序列爲p1,p2,p3,……pn,若p1= =n,則pi爲 。n-i+1
(159) 隊列是被限定爲只能在表的一端進行插入運算,在表的另外一端進行刪除運算的線性表。
(160) 一般程序在調用另外一個程序時,都須要使用一個 棧來保存被調用程序內分配的局部變量。形式參數的存儲空間以及返回地址。
(161) 棧下溢是指在___棧空_____時進行出棧操做。
(162) 用P表示入棧操做,D表示出棧操做,若元素入棧的順序爲1234,爲了獲得1342出棧順序,相應的P和D的操做串爲_______ 。PDPPDPDD
(163) 在具備n個單元的循環隊列中,隊滿共有 n-1個元素。
(164) 隊列是被限定爲只能在表的一端進行插入運算,在表的另外一端進行刪除運算的線性表。
(165) 循環隊列的引入,目的是爲了克服_______假溢出。
(166) 所謂稀疏矩陣指的是_______非零元不多(t<<m*n)且分佈沒有規律 。
(167) 在稀疏矩陣表示所對應的三元組線性表中,每一個三元組元素按 行爲主序, 列號爲輔序的次序排列。
(168) 二位數組Am×n按行優先順序存儲在內存中,元素a00地址爲loc(a00),每一個元素在內存中佔d個字節,元素aij的地址計算公式爲loc(aij)=loc(a00)+(i*n+j)*d 。
(169) 去除廣義表LS=(a1,a2,a3,……,an)中第1個元素,由其他元素構成的廣義表稱爲LS的____表尾_____。
(170) 樹內個結點的度 最大值稱爲樹的度。
(171) 一個二叉樹第5層節點最多有 16個。
(172) 已知徹底二叉樹T的第5層只有7個結點,則該樹共有____11____個葉子結點。
(173) 在一棵二叉樹中,度爲零的結點的個數爲N0,度爲2的結點的個數爲N2,則有N0 =______N2+1。
(174) 假設用於通訊的電文由8個字母組成,其頻率分別爲7,19,2,6,32,3,27,10。設計哈夫曼編碼,其中字母的編碼長度最大是 5位。
(175) 一棵具備257個結點的徹底二叉樹,它的深度爲 。 9
(176) 圖的深度優先遍歷序列 不是 唯一的。
(177) 在圖中,任何兩個結點之間均可能存在關係,所以圖的數據元素之間時一種 多對多 的關係。
(178) 在有向圖中,以頂點v爲終點的邊的數目稱爲v的___入度_____。
(179) 一個無向圖有n個頂點,e條邊,則因此頂點的度數之和爲 2e。
(180) 圖有 鄰接矩陣 、 鄰接表 等存儲結構,遍歷圖有 深度優先遍歷 、 廣度優先遍歷 等方法。
(181)
(182) 有向圖G用鄰接表矩陣存儲,其第i行的全部非零元素之和等於頂點i的 。出度
(183) 若是n個頂點的圖是一個環,則它有 棵生成樹。 n (以任意一頂點爲起點,獲得n-1條邊)
(184) n個頂點e條邊的圖,若採用鄰接矩陣存儲,則空間複雜度爲 。O(n2)
(185) n個頂點e條邊的圖,若採用鄰接表存儲,則空間複雜度爲 。O(n+e)
(186) 設有一稀疏圖G,則G採用 鄰接表 存儲較省空間。
(187) 設有一稠密圖G,則G採用 鄰接矩陣 存儲較省空間。
(188) 圖的逆鄰接表存儲結構只適用於 有向 圖。
(189) 已知一個圖的鄰接矩陣表示,刪除全部從第i個頂點出發的方法是 將鄰接矩陣的第i行所有置0 。
(190) 圖的深度優先遍歷序列 不是 唯一的。
(191) n個頂點e條邊的圖採用鄰接矩陣存儲,深度優先遍歷算法的時間複雜度爲 O(n2) ;若採用鄰接表存儲時,該算法的時間複雜度爲 O(n+e) 。
(192) n個頂點e條邊的圖採用鄰接矩陣存儲,廣度優先遍歷算法的時間複雜度爲 O(n2);若採用鄰接表存儲,該算法的時間複雜度爲 O(n+e) 。
(193) 圖的BFS生成樹的樹高比DFS生成樹的樹高 小或相等 。
(194) 用普里姆(Prim)算法求具備n個頂點e條邊的圖的最小生成樹的時間複雜度爲 O(n2);用克魯斯卡爾(Kruskal)算法的時間複雜度是 O(elog2e) 。
(195) 若要求一個稀疏圖G的最小生成樹,最好用 克魯斯卡爾(Kruskal) 算法來求解。
(196) 若要求一個稠密圖G的最小生成樹,最好用 普里姆(Prim) 算法來求解。
(197) 用Dijkstra算法求某一頂點到其他各頂點間的最短路徑是按路徑長度 遞增 的次序來獲得最短路徑的。
(198) 拓撲排序算法是經過重複選擇具備 0 個前驅頂點的過程來完成的。
(199) 在各類查找方法中,平均查找長度與結點個數n無關的查找方法是 散列查找 。
(200) 散列法存儲的基本思想是由 關鍵字的值決定數據的存儲地址。
(201) 大多數排序算法都有兩個基本的操做: 。比較和移動
(202) 因爲查找算法的基本運算是關鍵字之間的比較操做,因此可用 平均查找長度來衡量查找算法的性能。
(203) 查找有靜態查找和動態查找,當查找不成功時動態查找會 將查找關鍵字插入在表中。
(204) 順序查找法中設置監視哨,能夠起到 防止越界的做用。
(205) 假設列表長度爲n,那麼查找第i個數據元素時需進行 n-i+1次比較。
(206) 假設查找每一個數據元素的機率相等,即Pi=1/n,則順序查找算法的平均查找長度爲:
ASL=(n+1)/2。
(207) 折半查找法又稱爲二分法查找法,這種方法要求待查找的列表必須是 按關鍵字大小有序排列的順序表。
(208) 假定將長度爲n的表分紅b塊,且每塊含s個元素,則b=n/s。又假定表中每一個元素的查找機率相等,
(209) 在有序表(12,24,36,48,60,72,84)中二分查找關鍵字72時所需進行的關鍵字比較次數爲 2。
(210) 折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它將依次與表中元素 28,6,12,20 比較大小。
(211) 在各類查找方法中,平均查找長度與結點個數n無關的查找方法是 散列查找。
(212) 散列法存儲的基本思想是由 關鍵字的值 決定數據的存儲地址。
(213) 當關鍵字集合很大時,關鍵字值不一樣的元素可能會映象到哈希表的同一地址上,即 k1≠k2 ,但 H(k1)=H(k2),這種現象稱爲 衝突.
(214) 產生衝突現象的兩個關鍵字稱爲該散列函數的 ____同義詞________ 。
(215) 在散列函數 H(key)=key MOD p 中,p應取 素數。
(216) 設哈希表長m=14, 哈希函數H(key)=key MOD11.表中已有4個結點;addr(15)=4, addr(38)=5, addr(61)=6, addr(84)=7, 其他地址爲空。如用二次探測再散列處理衝突,關鍵字爲49的結點的地址是 。9
(217) 希爾排序是屬於 插入排序的改進方法。
(218) 給出一組關鍵字T=(20,4,34,5,16,33,18,29,2,40,7),要求從下到大進行排序,試給出快速排序(選一個記錄爲樞紐)第一趟排序結果 。7,4,2,85,16,18,20,,29,33,40,34
(219) 大多數排序算法都有兩個基本的操做: 比較和移動 。
(220) 在對一組記錄(54,38,96,23,15,72,60,45,83)進行直接插入排序時,當把第7個記錄60插入到有序表時,爲尋找插入位置至少需比較 次。6。
(221) 在插入和選擇排序中,若初始數據基本正序,則選用插入 ;若初始數據基本反序,則選用 選擇 。
(222) 在堆排序和快速排序中,若初始記錄接近正序或反序,則選用 堆排序 ;若初始記錄基本無序,則最好選用快速排序 。
(223) 對於n個記錄的集合進行冒泡排序,在最壞的狀況下所須要的時間是 O(n2) 。若對其進行快速排序,在最壞的狀況下所須要的時間是 O(n2)
(224)
(225)
(226)
(227)
(228)
(229)
(230)
(231)
(232)
(233)
(234) 對於n個記錄的集合進行歸併排序,所須要的平均時間是 O(nlog2n)
,所須要的附加空間是 O(n) 。
7. 對於n個記錄的表進行2路歸併排序,整個歸併排序需進行┌log2n┐ 趟(遍)。
8. 設要將序列(Q, H, C, Y, P, A, M, S, R, D, F, X)中的關鍵碼按字母序的升序從新排列,則:
冒泡排序一趟掃描的結果是 H C Q P A M S R D F X Y ;
初始步長爲4的希爾(shell)排序一趟的結果是 P A C S Q H F X R D M Y ;
二路歸併排序一趟掃描的結果是 H Q C Y A P M S D R F X;
快速排序一趟掃描的結果是 F H C D P A M Q R S Y X ;
堆排序初始建堆的結果是 A D C R F Q M S Y P H X 。
9. 在堆排序、快速排序和歸併排序中,
若只從存儲空間考慮,則應首先選取 方法,其次選取快速排序方法,最後選取歸併排序方法;
若只從排序結果的穩定性考慮,則應 選取 歸併排序 方法;
若只從平均狀況下最快考慮,則應選取 堆排序、快速排序和歸併排序 方法;
若只從最壞狀況下最快而且要節省內存考慮,則應選取 堆排序 方法。
3、程序填空題
(235) 如下程序的功能是實現帶附加頭結點的單鏈表數據結點逆序鏈接,請填空完善之。
void reverse(pointer h)
/* h爲附加頭結點指針;*/
{ pointer p,q;
p=h->next; h->next=NULL;
while((1)________)
{q=p; p=p->next; q->next=h->next; h->next=(2)________; }
}
(1)p!=null ∥鏈表未到尾就一直做
(2)q ∥將當前結點做爲頭結點後的第一元素結點插入
(236) 下面是用c語言編寫的對不帶頭結點的單鏈表進行就地逆置的算法,該算法用L返回逆置後的鏈表的頭指針,試在空缺處填入適當的語句。
void reverse(linklist &L){
p=null;q=L;
while(q!=null)
{ (1) ; q->next=p;p=q;(2)___ ; }
(3)_____;
}
(1) L=L->next; ∥暫存後繼
(2)q=L; ∥待逆置結點
(3)L=p; ∥頭指針仍爲L
(237) 如下算法的功能是用頭插法創建單鏈表的算法,請填空完善之。
Linklist CreateFromHead( )
{ LinkList L;
Node *s;
char c;
L=(Linklist)malloc(sizeof(Node)); /*爲頭結點分配存儲空間*/
L->next=NULL ;
While( ( c=getchar()) !=’*’ )
{ s=(Node*)malloc(sizeof(Node)); /*爲讀入的字符分配存儲空間*/
s->data=c;
s->next=L->next ;
L->next=s ;
}
return L;
}
(238) 如下算法的功能是尾插法建立鏈表,請填空完善之。
typedef struct Node /*結點類型定義*/
{ char data;
struct Node * next;
} Node, *LinkList; /* LinkList爲結構指針類型*/
Linklist CreateFromTail( ) /*將新增的字符追加到鏈表的末尾*/
{ LinkList L;
Node *r, *s;
char c;
L=(Node * )malloc(sizeof(Node)); /*爲頭結點分配存儲空間*/
L->next=NULL;
r=L; /*r指針指向鏈表的當前表尾,以便於作尾插入,其初值指向頭結點*/
while( ( c=getchar()) !=’$’ ) /*當輸入‘$’時,建表結束*/
{ s=(Node*)malloc(sizeof(Node)); s->data=c;
;r->next=s; r=s;
}
; r->next=NULL /*將最後一個結點的next鏈域置爲空,表示鏈表的結束*/
return L;
} /*CreateFromTail*/
(239) 下列算法在順序表L中依次存放着線性表中的元素,在表中查找與e相等的元素,若 L.elem[i]=e,則找到該元素,並返回i+1,若找不到,則返回「-1」 ,請填空完善之。
int Locate(SeqList L,int e)
{ i=0 ; /*i爲掃描計數器,初值爲0,即從第一個元素開始比較*/
while ((i<=L.last)&&(L.elem[i]!=e) ) i++;
/*順序掃描表,直到找到值爲key的元素,或掃描到表尾而沒找到*/
if ( i<=L.last ) return(i+1); /*若找到值爲e的元素,則返回其序號*/
else return(-1); /*若沒找到,則返回空序號*/
}
(240) 下列算法在順序表L中第i個數據元素以前插入一個元素e。 插入前表長n=L->last+1,i的合法取值範圍是 1≤i≤L->last+2,請填空完善之。
void InsList(SeqList *L, int i, int e)
{ int k;
if((i<1) || (i>L->last+2)) printf(「插入位置i值不合法」);
if(L->last>=maxsize-1) printf(「表已滿沒法插入」);
for(k=L->last;k>=i-1;k--) /*爲插入元素而移動位置*/
L->elem[k+1]=L->elem[k] ;
L->elem[i-1]=e ; /*在C語言數組中,第i個元素的下標爲i-1*/
L->last++ ;
}
(241) 下列算法是在順序表L中刪除第i個數據元素,並用指針參數e返回其值。i的合法取值爲1≤i≤L.last+1,請填空完善之。
int DelList(SeqList *L, int i, int *e)
{ int k;
if((i<1)||(i> L->last+1 )) printf(「刪除位置不合法!」);
*e= L->elem[i-1] ; /* 將刪除的元素存放到e所指向的變量中*/
for(k=i;i<=L->last;k++)
L->elem[k-1]= L->elem[k] ; /*將後面的元素依次前移*/
L->last-- ;
}
4、解答題
(242) 假設以數組seqn[m]存放循環隊列的元素,設變量rear和quelen分別指示循環隊列中隊尾元素的位置和元素的個數。
(1) 寫出隊滿的條件表達式;
(2) 寫出隊空的條件表達式;
(3) 設m=40,rear=13,quelen=19,求隊頭元素的位置;
(4) 寫出通常狀況下隊頭元素位置的表達式。
(1) quelen == m
(2) quelen == 0
(3) ( 13 - 19 + 40 ) % 40 = 34
(4) ( rear - quelen + m ) % m
(243) 已知一棵二叉樹的中序序列爲ABCDEFG,層序序列爲BAFEGCD,請畫出該二叉樹。
B
/ \
A F
/ \
E G
/
C
\
D
(244) 已知一棵二叉樹的前序序列爲ABCDEFGH,中序序列爲CBEDFAGH,請畫出該二叉樹。
A
/ \
B G
/ \ \
C D H
/ \
E F
(245) 已知一棵二叉樹如圖所示。請分別寫出按前序、中序、後序和層次遍歷是獲得的頂點序列。
前序:A,B,D,G,C,E,F,H
中序:D,G,B,A,E,C,H,F
後序:G,D,B,E,H,F,C,A
層次:A,B,C,D,E,F,G,H
(246) 已知一棵二叉樹的前序序列爲:A,B,D,G,J,E,H,C,F,I,K,L中序序列:D,J,G,B,E,H, A,C,K,I,L,F。
(1) 寫出該二叉樹的後序序列;
(2) 畫出該二叉樹;
(3) 求該二叉樹的高度(假定空樹的高度爲-1)和度爲二、度爲一、及度爲0的結點個數。
該二叉樹的後序序列爲:J,G,D,H,E,B,K,L,I,F,C,A。
該二叉樹的形式如圖所示:
該二叉樹高度爲:5。
度爲2的結點的個數爲:3。
度爲1的結點的個數爲:5。
度爲0的結點個數爲:4。
(247) 有一份電文中共使用 6個字符:a,b,c,d,e,f,它們的出現頻率依次爲2,3,4,7,8,9,試構造一棵哈夫曼樹,並求其加權路徑長度WPL,字符c的編碼。
WPL=80 字符c:001(不惟一)
(4) 下圖是帶權的有向圖G的鄰接表表示法。從結點V1出發,求出:
a) 深度遍歷圖G;
b) G的一個拓撲序列;
c) 從結點V1到結點V8的最短路徑。
參考答案:v1,v2,v3,v8,v4,v5,v7,v6 (2分)
v1,v2,v4,v6,v5,v3,v7,v8 (2分)
V1到結點V8的最短路徑爲:v1,v2,v3,v8 (2分)
(248) 已知如圖所示的有向圖,請給出該圖的:
(1) 每一個頂點的入度、出度;
(2) 鄰接矩陣;
(3) 鄰接表;
(249) 對下面的有向圖,從頂點V1開始進行遍歷,試畫出遍歷獲得的DFS生成森林和BFS生成森林。
圖全對給4分,錯一個頂點扣1分,扣完爲止。
遍歷獲得的DFS生成森林和BFS生成森林以下圖:
(250) 採用哈希函數H(k)=3*k mod 13並用線性探測開放地址法處理衝突,在數列地址空間[0..12]中對關鍵字序列22,41,53,46,30,13,1,67,51
(1)構造哈希表(畫示意圖);
(2)裝填因子;等機率下
(3)成功的和(4)不成功的平均查找長度
1)
散列地址 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
關鍵字 |
13 |
22 |
|
53 |
1 |
|
41 |
67 |
46 |
|
51 |
|
30 |
比較次數 |
1 |
1 |
|
1 |
2 |
|
1 |
2 |
1 |
|
1 |
|
1 |
(2)裝填因子=9/13=0.7 (3)ASLsucc =11/9 (4)ASLunsucc =29/13
(251) 設有一組關鍵字{9,01,23,14,55,20,84,27},採用哈希函數:H(key)=key mod 7 ,表長爲10,用開放地址法的二次探測再散列方法Hi=(H(key)+di) mod 10(di=12,22,32,…,)解決衝突。要求:對該關鍵字序列構造哈希表,並計算查找成功的平均查找長度。
散列地址 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
關鍵字 |
14 |
01 |
9 |
23 |
84 |
27 |
55 |
20 |
|
|
比較次數 |
1 |
1 |
1 |
2 |
3 |
4 |
1 |
2 |
|
|
平均查找長度:ASLsucc=(1+1+1+2+3+4+1+2)/8=15/8
以關鍵字27爲例:H(27)=27%7=6(衝突) H1=(6+1)%10=7(衝突)
H2=(6+22)%10=0(衝突) H3=(6+33)%10=5 因此比較了4次。
(252) 對於給定的一組記錄的關鍵字{ 23,13,17,21,30,60,58,28,30,90},試分別寫出冒泡排序、快速排序、堆排序、歸併排序第一趟排序後的結果。
冒泡排序13,23,17,21,,28,30,60,58,30*, 90
快速排序:(21,13,17,) 13,( 30,60,58,28,30*,90 )
堆排序: 13,21,17,23,30,60,58,28,30*,90,
歸併排序按層遍歷:(13 23) (17 21 ) (30 60 ) ( 28 58 ) (30* 90)
(253) 採用哈希函數H(k)=2*k mod 13並用鏈地址法處理衝突,在數列地址空間[0..12]中對關鍵字序列22,41,53,46,30,13,1,67,51進行下列工做:
(a)構造哈希表(畫示意圖);
(b)等機率下成功的和不成功的平均查找長度。
參考答案:鏈地址表全對給8分。錯一個結點扣1分,扣完爲止。
0 |
→ |
13 |
^ |
|
|
1 |
→ |
46 |
^ |
|
|
2 |
→ |
53 |
→ |
1 |
^ |
3 |
^ |
|
|
|
|
4 |
→ |
41 |
→ |
67 |
^ |
5 |
→ |
22 |
^ |
|
|
6 |
^ |
|
|
|
|
7 |
^ |
|
|
|
|
8 |
→ |
30 |
^ |
|
|
9 |
^ |
|
|
|
|
10 |
^ |
|
|
|
|
11 |
→ |
51 |
^ |
|
|
12 |
^ |
|
|
|
|
ASLsucc=(7+4)/13=11/9(1分) ASLunsucc=(5+4)/13=9/13(1分)
4、算法設計題(10分)
(254) 閱讀下列遞歸算法,寫出非遞歸方法實現相同功能的C程序。
void test(int &sum)
{ int x;
scanf(x);
if(x=0) sum=0 else {test(sum); sum+=x;}
printf(sum);
}
#include<stdio.h> (1分)
void main() (1分)
{ int x,sum=0,top=0,s[]; (1分)
scanf(「%d」,&x)
while (x<>0)
{ s[++top]:=a; scanf(「%d」,&x); }(3分)
while (top)
sum+=s[top--]; (3分)
printf(「%d」,sum); (1分)
}
(255) 試寫出把圖的鄰接矩陣表示轉換爲鄰接表表示的算法。
設圖的鄰接矩陣爲g[n][n](針對無向圖),定義鄰接表節點的類型爲
struct edgenode
{ int adjvex;
edgenode next;
}
typedef edgenode *adjlist[n];
void matritolist (int g[][], adjlist gl, int n )
{ edgenode *p, *q;
for (int i=0 i<n; i++) gl[i]=null;
for (int i=0; i<n; i++)
for ( int j=0; j<n; j++)
{ if (g[i][j]!=0 )
p = ( edgenode *) malloc(sizeof (edgenode));
p->adjvex=j;
p->next=null;
if (gl[i]=null) { gl[i]==p; q=p; }
else ( q->next=p; q=p; }
}
}
(256) 閱讀算法並根據輸入數據畫出鏈表。
linklist createlistr1( )
{ char ch;
linklist head=(listnode*)malloc(sizeof(listnode));
listnode *p,*r;
r=head;
while((ch=getchar( ))!=‵\n′)
{ p=(listnode*)malloc(sizeof(listnode));
while (p) p=(listnode*)malloc(sizeof(listnode));
p–>data=ch; r–>next=p; r=p;
}
r–>next=NULL;
return(head);
}
輸入數據爲:text8
(257) 閱讀算法並指出下列各段程序完成的功能。
void add_poly(Lnode *pa,Lnode *pb)
{ Lnode *p,*q,*u,*pre; int x;
p=pa->next; q=pb->next; pre=pa;
while((p!=NULL) && ((q!=NULL))
{ if (p->exp < q->exp)
{ pre=p; p=p->next; }
else if (p->exp= =q->exp)
{ x=p->coef+q->coef;
if (x!=0) { p->coef=x; pre=p;}
else { pre->next=p->next; free(p); }
p=pre->next; u=q; q=q->next;
free(u);
}
else
{ u=q->next;q->next=p;pre->next=q;
pre=q; q=u;
}
}
if (q!=NULL) pre->next=q;
free(pb);
}
兩個多項式相加
(258) 閱讀下面的程序,說明程序的具體功能。
typedef int elementype
typedef struct node
{ elemtype data;
strunct node *next;
}linklist;
void function( linklist *head, elemtype x )
{ linklist *q, *p;
q=head;
p=q-next;
while (p !=NULL) && (p->data != x )
{ q=p; p=p->next; }
if (q==NULL) printf (「there is no this node ::\n」);
else { q ->next =p ->next ; free (p); }
}
該程序的功能是:在帶頭結點的單鏈表中,刪除單鏈表中枝爲z的數據元素。
(259) 閱讀下面的程序,說明程序的具體功能。
void function( )
{ initstack(s);
scanf (「%」,n);
while(n)
{ push(s,n%8); n=n/8; }
while(! Stackempty(s))
{ pop(s,e); printf(「%d」,e); }
}
該程序的功能是:10進制數轉換爲8進制
(260) 閱讀下面的程序,說明程序的具體功能。
void print(int w)
{ int i;
if ( w!=0)
{ print(w-1);
for(i=1;i<=w;++i)
printf(「%3d,」,w);
printf(「/n」);
}
}
運行結果:
1,
2,2,
3,3,3,
(261) 閱讀下面的程序,分別說明程序中四個for循環和語句 ++cpot[col];的具體功能。
void FastTransposeSMatrix(Matrix M, Matrix &T)
{ T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if (T.tu)
{ for (col=1;col<=M.nu;++col) num[col]=0;
for (t=1;t<=M.tu;++t) ++num[M. item[t].j];
cpot[1]=1;
for (col=2;col<=M.nu;++col)
cpot[col]=cpot[col-1]+num[col-1];
for (p=1;p<=M.tu;++p)
{ col=M. item[p].j;
q=cpot[col];
T.item[q].i=M.data[p].j;
T.item [q].j=M. item[p].i;
T.item[q].e=M.data[p].e;
++cpot[col];
}
}
return OK;
}
第一個for循環:初始化每一列中非零元素的個數爲0
第二個for循環,計算每一列中非零元素的個數;
第三個for循環,計算每一列的第一個元素的首地址;
第四個for循環,轉置過程;
++cpot[col]:語句的功能是當每一列進行一次轉置後,其位置向後加1。
(262) 已知二叉樹的二叉鏈表存儲表示,指出創建如圖所示樹的結構時輸入的字符序列。
typedef struct BiTNode
{ char data;
struct BiTNode *lchild,*rchild;
} BiTNode;
void CreateBiTree( BiTNode *T)
{ char ch;
scanf(&ch);
if(ch= =‘ ‘) T=NULL;
else{ T=(BiTNode *)malloc(sizeof(BiTNode));
while (T==NULL)
T=(BiTNode *)malloc(sizeof(BiTNode));
T–>data=ch;
CreateBiTree(T–>lchild);
CreateBiTree(T–>rchildd);
}
}
ABVDVVCEVFGVVV8
(263) 已知二叉樹的二叉鏈表存儲表示,寫出中序遍歷的遞歸算法。
typedef struct BiTNode
{ char data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
void inorder( BiTNode *p)
{ if (p!=NULL)
{ inorder(p–>lchild);
printf(「%c」,p–>data)
inorder(p–>rchild);
}
}
(264) 閱讀下面的程序,分別指出程序中三個for循環、整個程序以及語句scanf("%d,%d",&G.vexnum,&G.arcnum); 的功能。
void funcgraph(MGraph &G)
{ int i,j,k,w; char v1,v2;
printf("Input vexnum & arcnum:");
scanf("%d,%d",&G.vexnum,&G.arcnum);
printf("Input Vertices:");
for (i=0;i<G.vexnum;i++)
scanf("%c",&G.vexs[i]);
for (i=0;i<G.vexnum;i++)
for (j=0;j<G.vexnum;j++)
G.arcs[i][j]=0;
for (k=0;k<G.arcnum;k++)
{ printf("Input Arcs(v1,v2 & w):\n");
scanf("%c%c,%d",&v1,&v2,&w);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G.arcs[i][j]=w; G.arcs[j][i]=w;
}
}
第一個for循環:將圖中的頂點輸入到數組G.vexs[i];
第二個for循環,初始化鄰接矩陣;
第三個for循環,將圖中邊信息存入數組G.vexs[i]中;
本程序的功能是:建立圖的鄰接矩陣;
scanf("%d,%d",&G.vexnum,&G.arcnum); :語句的功能輸入定點數和圖中的邊數。
設哈希(Hash)表的地址範圍爲0~17,哈希函數爲:H(K)=K MOD 16。
K爲關鍵字,用線性探測法再散列法處理衝突,輸入關鍵字序列:
(10,24,32,17,31,30,46,47,40,63,49)
造出Hash表,試回答下列問題:
(1) 畫出哈希表的示意圖;
(2) 若查找關鍵字63,須要依次與哪些關鍵字進行比較?
(3) 若查找關鍵字60,須要依次與哪些關鍵字比較?
(4) 假定每一個關鍵字的查找機率相等,求查找成功時的平均查找長度。
解: (1)畫表以下:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
32 |
17 |
63 |
49 |
|
|
|
|
24 |
40 |
10 |
|
|
|
30 |
31 |
46 |
47 |
(2) 查找63,首先要與H(63)=63%16=15號單元內容比較,即63 vs 31 ,no;
而後順移,與46,47,32,17,63相比,一共比較了6次!
(3)查找60,首先要與H(60)=60%16=12號單元內容比較,但由於12號單元爲空(應當有空標記),因此應當只比較這一次便可。
(4) 對於黑色數據元素,各比較1次;共6次;
對紅色元素則各不相同,要統計移位的位數。「63」須要6次,「49」須要3次,「40」須要2次,「46」須要3次,「47」須要3次,
因此ASL=1/11(6+2+3×3)=17/11=1.5454545454≈1.55