日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【大学复习】算法与数据结构试卷分析

發布時間:2024/8/1 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【大学复习】算法与数据结构试卷分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 填空題
1.數據的邏輯結構是從 邏輯 關系上描述數據,它與數據的 具體存儲 無關,是獨立于計算機的。
2.在一個帶頭結點的單循環鏈表中,p指向尾結點的直接前驅,則指向頭結點的指針head可用p表示為head= p->next->next .尾結點表示為 p->next
3.棧頂的位置是隨著 入棧出棧 操作而變化的。
4.在串S=“structure”中,以t為首字符的子串有 12
第一個t為首的子串有t、tr、tru.、truck、truct、tructu、tructur、tructure等8個
第二個t為首的有t、tu、tur、ture4個一共是12個

不需要去掉
5.假設一個9階的上三角矩陣A按列優先順序壓縮存儲在一堆數組B中、其中B[0]存儲矩陣中第一個元素a[1][1],則B[31]中存放的元素是 a[4][8]
九階:9*9上三角:非零元素在右上半部分。按列:1+2+3+4+5+6+7=28個,第一列存儲1個第二列存儲2個,以此類推。第8列需要存儲四個(31+1-28=4)。B[0~31]共32個。故答案是a(4,8)。第四行第8列。
6.已知一棵完全二叉樹中共有768結點,則該樹中共有 384 個葉子結點和 1 個只具有左孩子的結點和 0 個只具有右孩子的結點。
設二叉樹度為0結點個數為n0,度為1的結點個數為n1,度為2結點個數為n2
于是n0 + n1 + n2 = 768
按照二叉樹的性質:n0 = n2 + 1,代入得
2n2 + n1 + 1 = 768,顯然n1為奇數
考慮到完全二叉樹中,最多只有1個度為1的結點 ,因此n1 =1
所以n2 = 383
n0 = 384

7.AOV網是一種 有向無環 的圖。
8.在單鏈表上難以實現的排序方法有 快速排序堆排序
9.在有序表(12,24,36,48,60,72,84)中二分查找關鍵字72時所需進行的關鍵字比較次數為:
2
第一次二分查找取序列中間值48,比較72>48
第二次查找取48右側的子序列60,72,84的中值72,比較72==72,返回。查找完成

10.對于一棵具有n個結點的二叉樹,用二叉鏈表存儲時,其指針總數為 2n 個, n+1個指針是空閑的,有 n-1 指向孩子結點。
n個節點則有2n個鏈域,除了根節點沒有被lchild和rchild指向,其余的節點必然會被指到。所以指針總數為2n個,指向了孩子節點的指針則為n-1個,因為n個節點的二叉樹,除根結點以外都有自己的父親結點或者說其都是一個孩子節點,所以有n-1個指針指向他們。那剩下的就是空閑指針了,共有2n-(n-1)=n+1個。

11.若對一棵完全二叉樹從0開始進行結點的編號,并按此編號把它順序存儲到一堆數組A中,即編號為0的結點存儲到A[0]中。其余類推。則A[i]元素的左孩子元素為 A[2i+1] ,右孩子元素為 A[2i+2] ,雙親元素為 A[(i-1)/2]
畫圖找規律。

12.在一個具有n個頂點的無向完全圖中,包含有 n(n-1)/2 條邊,在一個具有n個頂點的有向完全圖中包含有 n(n-1) 條邊。
定義:具有n個頂點和n(n-1)/2條邊的無向圖稱為完全無向圖,具有n個頂點,n(n-1)條弧的有向圖稱為完全有向圖。完全無向圖和完全有向圖都稱為完全圖。顯然,完全圖具有最多的邊數,即任意一對頂點間均有邊或弧相連。
記不住就畫圖找規律!

13.在所有內部排序算法中,速度最快的是 快速排序

二、單選題
1.算法指的是( D 解決問題的有限運算序列 )。
2.線性表采用鏈式存儲時,結點的存儲地址( B 連續與否均可
3.將長度為n的單鏈表接在長度為m的單鏈表之后的算法的時間復雜度為( C O(m)
4.由兩個棧共享一個向量空間的好處是:( B 節省存儲空間,降低上溢發生的機率

雙向棧——兩個棧共享同一存儲空間
當程序中同時使用兩個棧時,可以將兩個棧的棧底設在向量空間的兩端,讓兩個棧各自向中間延伸。如下圖所示:當一個棧的元素較多,超過向量空間的一半時,只要另一個棧的元素不多,那么前者就可以占用后者的部分存儲空間。只有當整個向量空間被兩個棧占滿(即兩個棧頂相遇)時,才會發生上溢,因此兩個棧共享一個長度為m的向量空間

5.設有如下遺產繼承規則:丈夫和妻子可以互相繼承遺產;子女可以繼承父親或母親的遺產;子女間不能相互繼承。表示該遺產繼承關系最適合的數據結構應該是( B
6.在數據結構中,從邏輯上可以把數據結構分成( C 線性結構和非線性結構
7.以下數據結構中不屬于線性數據結構的是( C 二叉樹
8.算法的時間復雜度是指( C 算法執行過程中所需要的基本運算次數
9.哈夫曼樹是( C 樹的路徑長度最短的二叉樹?可能有問題,我最后這套試卷不是滿分
10.由帶權9,1,3,5,6的五個葉子結點生成的哈夫曼樹的帶權路徑長度為( C 52
算法步驟如下:
①有n棵權值分別為w1,w2,,wn的二叉樹,將其組合成一個森林集合F={T1,T2,Tn},其中每棵二叉樹Ti中都只有一個權值為wi的根節點,其左右孩子為空。
②在森林F中選出兩棵根節點的權值最小的樹,將這兩棵樹合并為一棵新樹,為了保證新樹仍是二叉樹,需要增加一個新結點作為新樹的根,并將所選的兩棵樹的根分別作為新樹的左、右孩子,不用區分先后,將左、右孩子的權值之和作為新樹根的權值。
③對新的森林集合F重復步驟②,直到森林F中只剩下一棵樹為止,最后生成的二叉樹為哈夫曼樹。

11.深度為k的完全二叉樹所含葉子結點的個數最多為( C 2^(K-1)
找規律!
12.具有10個葉結點的二叉樹中有( B 9 )個度為2的結點。
公式:對任何一棵二叉樹,如果葉子結點數為n0,度為2的結點數為n2,則一定有n0=n2+1。所以n2=n0-1=9。

三、簡答題
1.對于給定的五個實數w={8,5,13,2,6},試構造哈夫曼樹,并求出該樹的最小帶權路徑長度。
構造的哈夫曼樹是:
(34)
/
(13) (21)
/ \ /
6 (7) 8 13
/
2 5
WPL = 62+23 + 53 + 82+ 13*2 = 75

2.已知一個無向圖的頂點集為{a,b,c,d,e},其鄰接矩陣如下所示

(1)畫出該圖的圖形;
(2)根據鄰接矩陣從頂點a出發進行深度優先遍歷和廣度優先遍歷,寫出相應的遍歷序列。

鄰接矩陣:
定義
鄰接矩陣(Adjacency Matrix)是表示頂點之間相鄰關系的矩陣。設G=(V,E)是一個圖,其中V={v1,v2,…,vn} [1] 。G的鄰接矩陣是一個具有下列性質的n階方陣:
①對無向圖而言,鄰接矩陣一定是對稱的,而且主對角線一定為零(在此僅討論無向簡單圖),副對角線不一定為0,有向圖則不一定如此。
②在無向圖中,任一頂點i的度為第i列(或第i行)所有非零元素的個數,在有向圖中頂點i的出度為第i行所有非零元素的個數,而入度為第i列所有非零元素的個數。
③用鄰接矩陣法表示圖共需要n^2個空間,由于無向圖的鄰接矩陣一定具有對稱關系,所以扣除對角線為零外,僅需要存儲上三角形或下三角形的數據即可,因此僅需要n(n-1)/2個空間。
在圖的鄰接矩陣表示法中:
① 用鄰接矩陣表示頂點間的相鄰關系
② 用一個順序表來存儲頂點信息
圖的矩陣
設G=(V,E)是具有n個頂點的圖,則G的鄰接矩陣是具有如下性質的n階方陣:

【例】
下圖中無向圖G 5 和有向圖G 6 的鄰接矩陣分別為A1 和A 2 。


網絡矩陣
若G是網絡,則鄰接矩陣可定義為:


其中:
w ij 表示邊上的權值;
∞表示一個計算機允許的、大于所有邊上權值的數。
【例】下面帶權圖的兩種鄰接矩陣分別為A 3 和A 4 。


二叉樹深度優先遍歷和廣度優先遍歷

對于一顆二叉樹,深度優先搜索(Depth First Search)是沿著樹的深度遍歷樹的節點,盡可能深的搜索樹的分支。以上面二叉樹為例,深度優先搜索的順序
為:ABDECFG。怎么實現這個順序呢 ?深度優先搜索二叉樹是先訪問根結點,然后遍歷左子樹接著是遍歷右子樹,因此我們可以利用堆棧的先進后出的特點,
現將右子樹壓棧,再將左子樹壓棧,這樣左子樹就位于棧頂,可以保證結點的左子樹先與右子樹被遍歷。

  廣度優先搜索(Breadth First Search),又叫寬度優先搜索或橫向優先搜索,是從根結點開始沿著樹的寬度搜索遍歷,上面二叉樹的遍歷順序為:ABCDEFG.
可以利用隊列實現廣度優先搜索。

3.已知一個圖的頂點集V和邊集E分別為:
V={1,2,3,4,5,6,7},E={(1,2)3,(1,3)5,(1,4)8,(2,5)10,(2,3)6,(3,4)15,(3,5)12,(3,6)9,(4,6)4,(4,7)20,(5,6)18,(6,7)25};
(1)畫出其鄰接表;
(2)用布魯斯卡爾算法得到最小生成樹,試寫出在最小生成樹中依次得到的各條邊。


自己的感想:如果是v1、v2、v3···用下標,不是直接用值。

②鄰接表
  鄰接表存儲的基本思想:對于圖的每個頂點vi,將所有鄰接于vi的頂點鏈成一個單鏈表,稱為頂點vi的邊表(對于有向圖則稱為出邊表),所有邊表的頭指針和存儲頂點信息的一維數組構成了頂點表。
  鄰接表有兩種結點結構:頂點表結點和邊表結點.。

頂點表                  邊表
                          
  其中:vertex:數據域,存放頂點信息。 firstedge:指針域,指向邊表中第一個結點。 adjvex:鄰接點域,邊的終點在頂點表中的下標。 next:指針域,指向邊表中的下一個結點。
adjacency
英 [?’d?e?sns?] 美 [?’d?e?s?ns?]
n.鄰接
vertex
英 [?v?:teks] 美 [?v?:rteks]
n.
頂點;最高點;<數>(三角形、圓錐體等與底相對的)頂;(三角形、多邊形等的)角的頂點


若是有向圖,鄰接表的結構是類似的,如圖7-4-7,以頂點作為弧尾來存儲邊表容易得到每個頂點的出度,而以頂點為弧頭的表容易得到頂點的入度,即逆鄰接表。

對于帶權值的網圖,可以在邊表結點定義中再增加一個weight的數據域,存儲權值信息即可,如圖7-4-8所示。

克魯斯卡爾算法
克魯斯卡爾算法的基本思想是以邊為主導地位,始終選擇當前可用(所選的邊不能構成回路)的最小權植邊。所以Kruskal算法的第一步是給所有的邊按照從小到大的順序排序。這一步可以直接使用庫函數qsort或者sort。接下來從小到大依次考察每一條邊(u,v)。


具體實現過程如下:
<1> 設一個有n個頂點的連通網絡為G(V,E),最初先構造一個只有n個頂點,沒有邊的非連通圖T={V,空},圖中每個頂點自成一格連通分量。
<2> 在E中選擇一條具有最小權植的邊時,若該邊的兩個頂點落在不同的連通分量上,則將此邊加入到T中;否則,即這條邊的兩個頂點落到同一連通分量上,則將此邊舍去(此后永不選用這條邊),重新選擇一條權植最小的邊。
<3> 如此重復下去,直到所有頂點在同一連通分量上為止。

四、算法填空題
1.void ABC(BTNode*BT)
{
if(BT){
ABC(BT->left);
ABC(BT->right);
cout<data<<’’;
}
}
該算法的功能是:

后序遍歷(LRD)是二叉樹遍歷的一種,也叫做后根遍歷、后序周游,可記做左右根。后序遍歷有遞歸算法和非遞歸算法兩種。在二叉樹中,先左后右再根,即首先遍歷左子樹,然后遍歷右子樹,最后訪問根結點。
后序遍歷首先遍歷左子樹,然后遍歷右子樹,最后訪問根結點,在遍歷左、右子樹時,仍然先遍歷左子樹,然后遍歷右子樹,最后遍歷根結點。即:

若二叉樹為空則結束返回,
否則:
(1)后序遍歷左子樹(2)后序遍歷右子樹(3)訪問根結點
如右圖所示二叉樹
后序遍歷結果:DEBFCA
已知前序遍歷和中序遍歷,就能確定后序遍歷。 [1]
1、先序遍歷(根左右)
先序遍歷先從二叉樹的根開始,然后到左子樹,再到右子樹,,如圖


先序遍歷序列是ABDCEF,重點是記住第一個字母“A”是根,出發點是根“A”

2、中序遍歷(左根右)
中序遍歷先從左子樹開始,然后到根,再到右子樹,如圖3


即中序遍歷序列是DBAECF,重點是記住中序遍歷的根位置,是在序列的第一個字母和最 后一個字母之間,出發點是左子樹的最下邊的左邊的開始,(為什么到A之后直接跳過C呢?因為C也是E和F的根,所以按照中序遍歷規律,先到E再到C再到F)

3、后序遍歷(左右根)
后序遍歷先從左子樹開始,然后到右子樹,再到根,如圖


即后序遍歷序列式DBECFCA,重點是知道了根是最后面一個字母“A”, 出發點是左子樹的最下邊左邊。

四、道了先序遍歷和中序遍歷,或者是后序遍歷和中序遍歷,判斷出后序遍歷,或者是先序遍歷的方法
比如知道先序遍歷是ABDCEF,中序遍歷是DBAECF,那么可以從先序遍歷知道這個二叉樹的根是A,(如果是選擇題,可以快速判斷出后序遍歷的序列最后面一個字母肯定是A,然后選擇最后面有A的選項)
從中序遍歷看出A把DB和ECF隔開,即DB \A \ECF,因此可以知道DB屬于左子樹,ECF屬于右子樹

如果是填空題就要寫出該二叉樹的圖,先寫出左子樹,從中序遍歷知道DB是右子樹,把DB看成一個整體,則從先序遍歷判斷可以確定B是D的根,這樣就確定出左子樹的圖是

把ECF右子樹看成一個整體,則從先序遍歷可以知道C是E和F的根,確定出右子樹是

然后把兩個子樹連在根“A”的下面,再根據后序遍歷規律讀出序列就可以了

2、二叉樹搜索樹的查找——遞歸算法
bool Find(BTreeNode*BST,ElemType& item)
{ if (BSTNULL)
return false;//查找失敗
else {
if (itemBST->data){
item=BST->data;//查找成功
return ;}
else if (itemdata)
return Find( ,item);
else return Find( ,item);
}

五、編程題
1、編寫一個函數實現單鏈表的倒置。
struct Node
{
int data;
struct Node*next;
};

非遞歸(迭代)方式

node* reverseList(node* H) {if (H == NULL || H->next == NULL) //鏈表為空或者僅1個數直接返回return H;node* p = H, *newH = NULL;while (p != NULL) //一直迭代到鏈尾{node* tmp = p->next; //暫存p下一個地址,防止變化指針指向后找不到后續的數p->next = newH; //p->next指向前一個空間newH = p; //新鏈表的頭移動到p,擴長一步鏈表p = tmp; //p指向原始鏈表p指向的下一個空間}return newH; }

老師的代碼:

//倒置 typedef struct Node {int data;//數據域struct Node *next;//指針域 } TNode; TNode*reverse(TNode*head) {TNode *p,*q;p=q=head;head=NULL;while(p!=NULL){q=p->next;p->next=head;head=p;p=q;}return head; }

2、統計出單鏈表HL中結點的值等于給定X的結點數。(有多少個結點的值是x)


最后:考試回憶的原題卷子,考試滿分100分,我好像最后只考了93分。里面可能有些不對的地方,請自行糾正,辯證看待。

總結

以上是生活随笔為你收集整理的【大学复习】算法与数据结构试卷分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。