[课程复习] 数据结构之线性表、树、图、查找、排序经典算法复习
作者最近在復習考博,乘此機會分享一些計算機科學與技術、軟件工程等相關專業(yè)課程考題,一方面分享給考研、考博、找工作的博友,另一方面也是自己今后完成這些課程的復習資料,同時也是在線筆記。基礎知識,希望對您有所幫助,不喜勿噴~
無知?樂觀?低調?謙遜?生活
無知的我需要樂觀的去求知,低調的底色是謙遜,而謙遜是源于對生活的通透,我們不止有工作、學習、編程,還要學會享受生活,人生何必走得這么匆忙!成都倒計時,加油,補充幾張好看的框架圖給大家。書閣覓知音,潯聲只傾心。
參考前文:
[課程復習] 數(shù)據(jù)結構之經(jīng)典題目回顧 (一)選擇題、填空題1
文章目錄
- 一.線性表
- 二. 樹和二叉樹
- 1.二叉樹
- 2.遍歷二叉樹
- 3.哈夫曼樹
- 三. 圖
- 1.圖的存儲結構
- 2.DFS和BFS
- 3.最小生成樹
- 4.有向無環(huán)圖-拓撲排序
- 5.最短路徑
- 四. 查找
- 1.靜態(tài)查找-折半查找
- 2.動態(tài)查找-二叉排序樹
- 3.哈希表
- 五. 排序
- 1.排序對比
- 2.快速排序
- 3.選擇排序
- 4.冒泡排序
- 5.插入排序
- 6.合并排序
一.線性表
示例1:刪除但列表中的相同節(jié)點元素。
二. 樹和二叉樹
1.二叉樹
2.遍歷二叉樹
舉例:
設某棵二叉樹的中序遍歷序列為ABCD,前序遍歷序列為CABD,則后序遍歷該二叉樹得到序列為( )。
解析:
通過中序遍歷和前序遍歷可以將樹構建出來,再求其后序遍歷結果。
前序遍歷(先根排序),故C為根節(jié)點,再看中序遍歷可知,AB為C的左子樹,D為其右子樹。AB - C - D
前序遍歷第二個節(jié)點為A,則A為根節(jié)點,再看中序遍歷B在A后面,則B為右子樹,最終構建樹如下圖所示。
答案:后序遍歷結果為 BADC。
代碼:
3.哈夫曼樹
舉例:
設一組權值集合W=(15,3,14,2,6,9,16,17),要求根據(jù)這些權值集合構造一棵哈夫曼樹,則這棵哈夫曼樹的帶權路徑長度為( )。
三. 圖
1.圖的存儲結構
‘2.DFS和BFS
DFS:深度優(yōu)先搜索
DFS代碼:
// DFS的遞歸實現(xiàn) void DFS_Recursive(Node* pRoot) {if (pRoot==NULL)return;cout<<pRoot->nVal<<" ";if (pRoot->pLeft!=NULL) DFS_Recursive(pRoot->pLeft);if (pRoot->pRight!=NULL)DFS_Recursive(pRoot->pRight); }BFS:廣度優(yōu)先搜索
舉例:
3.最小生成樹
Prim算法
克魯斯卡爾(Kruskal)算法
設連通網(wǎng) N = ( V, {E} )。
4.有向無環(huán)圖-拓撲排序
拓撲排序:把AOV網(wǎng)絡中所有頂點按照它們相互之間的優(yōu)先關系排列成一個線性序列的過程。
拓撲排序的應用:是檢測AOV網(wǎng)中是否存在環(huán)的有效方法。
5.最短路徑
Dijkstra算法
Floyd算法
四. 查找
1.靜態(tài)查找-折半查找
如下圖所示,表示折半查找的過程:
對應的代碼如下所示:(背)
舉例:
設一組有序的記錄關鍵字序列為(13,18,24,35,47,50,62,83,90),查找方法用二分查找,要求計算出查找關鍵字62時的比較次數(shù)并計算出查找成功時的平均查找長度。
解析:其計算過程如下圖所示。
答案:2,ASL = (1 * 1 + 2 * 2 + 3 * 4 + 4 * 2) / 9 = 25/9。
索引順序表的查找:
2.動態(tài)查找-二叉排序樹
二叉排序樹
二叉排序樹是一棵空樹,或者是具有下列性質的二叉樹:
(1) 若左子樹不空,則左子樹上所有結點的值均小于根結點的值;
(2) 若右子樹不空,則右子樹上所有結點的值均大于根結點的值;
(3) 根結點的左、右子樹也分別為二叉排序樹。
二叉排序樹的刪除操作:
舉例:
設一組初始記錄關鍵字序列為 (20 , 12 , 42 , 31 , 18 , 14 , 28) ,則根據(jù)這些記錄關鍵字構造的二叉排序樹的平均查找長度是_________。
平衡二叉樹
3.哈希表
常用的解決沖突的方法:
(1) 開放地址法(線性探測再散列、二次探測再散列、隨機探測再散列);
(2) 鏈地址法;
(3) 再哈希法;
(4) 建立一個公共溢出區(qū)。
舉例:
設散列表的長度為8,散列函數(shù)H(k)=k % 7,用線性探測法解決沖突,則根據(jù)一組初始關鍵字序列(8,15,16,22,30,32)構造出的散列表的平均查找長度是________。
余數(shù):0 1 2 3 4 5 6 7
8:8%7=1,1次
15:15%7=1,沖突+1,2次
16:16%7=2,與15沖突,2次
22:22%7=1,沖突3次,4次
30:30%7=2,沖突3次,4次
32:32%7=4,沖突2次,3次
故:(1 + 2 + 2 + 4 + 4 + 3)/6 = 8/3
五. 排序
1.排序對比
舉例:
在快速排序、堆排序、歸并排序中, 歸并 排序是穩(wěn)定的。
解析:
穩(wěn)定排序:直接插入排序、冒泡排序、歸并排序、基數(shù)排序
不穩(wěn)定排序:希爾排序、直接選擇排序、堆排序、快速排序
2.快速排序
核心思想:兩端向中間比較,并交換順序
下面是一個簡單的示例:
代碼實現(xiàn):
/** 快速排序** 參數(shù)說明:* a -- 待排序的數(shù)組* l -- 數(shù)組的左邊界(例如,從起始位置開始排序,則l=0)* r -- 數(shù)組的右邊界(例如,排序截至到數(shù)組末尾,則r=a.length-1)*/ void quick_sort(int a[], int l, int r) {if (l < r){int i,j,x;i = l;j = r;x = a[i];while (i < j){while(i < j && a[j] > x)j--; // 從右向左找第一個小于x的數(shù)if(i < j)a[i++] = a[j];while(i < j && a[i] < x)i++; // 從左向右找第一個大于x的數(shù)if(i < j)a[j--] = a[i];}a[i] = x;quick_sort(a, l, i-1); /* 遞歸調用 */quick_sort(a, i+1, r); /* 遞歸調用 */} }舉例1:
設一組初始關鍵字記錄關鍵字為(20,15,14,18,21,36,40,10),則以20為基準記錄的一趟快速排序結束后的結果為( )。
A.10,15,14,18,20,36,40,21
B.10,15,14,18,20,40,36,21
C.10,15,14,20,18,40,36,2l
D.10,15,14,18,20,36,40,21
解析:第一趟快排如下
20,15,14,18,21,36,40,10 => 右邊開始,找到小于20的10,交換次序
10, 15,14,18,21,36,40,() => 左邊繼續(xù),找到大于20的21,交換次序
10,15,14,18,(),36,40,21 => 右邊繼續(xù)找小于20的數(shù)字,找到()處停止
10,15,14,18,20,36,40,21 => 輸出第一趟快速排序結果,故選D。
舉例2:
設一組初始記錄關鍵字序列(5,2,6,3,8),以第一個記錄關鍵字5為基準進行一趟快速排序的結果為( 3,2,5,6,8 )。
解析:
快速排序5為基準,基本規(guī)則如下:left=5,right=8,先遍歷right,尋找比基準5小的數(shù)字左移;找到之后與左邊left下標替換,接著left向右移動,尋找比基準5大的數(shù)字,找到之后替換,最后left=right時,該數(shù)字與基準替換。
初始:5 2 6 3 8,right尋找到3,與left=5交換位置
接著:3 2 6 () 8,left從左邊移動,找到6,與()替換位置
接著:3 2 () 6 8,此時向左移動right,right=left,停止快速排序,并用()替換基準5。
輸出:3 2 5 6 8,其為第一趟快速排序的結果。
3.選擇排序
核心思想:選擇最小、最大值并交換順序
舉例:
初始值為(38, 65, 97, 76, 13, 27, 10) 經(jīng)過第3趟選擇排序的最小值結果為___________。
解析:
第一趟結果:尋找最小值并交換順序
10 65 97 76 13 27 38
第二趟結果:尋找第二個最小值并與第二個位置交換順序
10 13 97 76 65 27 38
第三趟結果:尋找第三個最小值并與第三個位置交換順序
10 13 27 76 65 97 38
4.冒泡排序
核心思想:兩兩比較,交換順序,每次能在最后一個位置獲得最大值或最小值
舉例:
初始值為(38, 65, 97, 76, 13, 27, 10) 經(jīng)過第3趟冒泡排序的最小值結果為___________。
解析:
第一趟結果:
38 65 76 13 27 10 97
第二趟結果:
38 65 13 27 10 76 97
第三趟結果:
38 13 27 10 65 76 97
5.插入排序
核心思想:尋找相應位置按順序插入元素
算法實現(xiàn)過程:
插入排序之希爾排序:
6.合并排序
核心思想:分而治之再歸并數(shù)據(jù)
舉例:
設一組初始記錄關鍵字序列為(55,63,44,38,75,80,31,56),則利用篩選法建立的初始堆為___________________________。
答案:(31,38,54,56,75,80,55,63)
(By:Eastmount 2019-03-11 深夜9點 http://blog.csdn.net/eastmount/ )
總結
以上是生活随笔為你收集整理的[课程复习] 数据结构之线性表、树、图、查找、排序经典算法复习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [知识图谱实战篇] 八.HTML+D3绘
- 下一篇: [Python图像处理] 十二.图像几何