数据结构期末复习
zzulier的數據結構期末復習
數據結構期末復習
- **zzulier的數據結構期末復習**
- 第一章 緒論
- 1.基本概念和術語
- 2.算法和算法分析
- 第二章 線性表
- 1.線性表的類型定義
- 2.線性表的順序表示和實現
- 3.線性表的鏈式表示和實現
- 第三章 棧和隊列
- 1.棧
- 2.隊列
- 第四章 串
- 第五章 數組和廣義表
- 矩陣的壓縮存儲
- 第六章 樹和二叉樹
- 1.樹的遍歷&線索二叉樹
- 2.樹<——>二叉樹<——>森林(互相轉化)
- 3.赫夫曼樹&赫夫曼編碼
- 第七章 圖
- 1.鄰接矩陣&鄰接表
- 2.深度、廣度優先遍歷
- 3.最小生成樹(Prim&克魯斯卡爾算法)
- 4.拓撲序列
- 5.關鍵路徑
- 第九章 查找
- 1.線性表的查找
- 2.有序表的查找
- 3.樹表的查找
- 4.散列表的查找
- 第十章 排序
- 1.插入排序
- 2.交換排序
- 3.選擇排序
- 4.歸并排序
第一章 緒論
1.基本概念和術語
(1)數據結構:是互相之間存在一種或多種特定關系的數據元素的集合。
(2)數據、數據元素、數據對象、數據項概念辨析:
①首次需要明確的是:數據>數據元素>數據項
(例:學生表>個人信息>某一信息)
②關系圖:若將數據看做一個集合,那么有以下關系:
(3)數據結構包含:邏輯結構&存儲(物理)結構
- 邏輯結構:數據元素之間的邏輯關系。
- 存儲(物理)結構:數據元素及其關系在計算機內存中的表示(映像)。
①邏輯結構的劃分:線性結構&非線性結構
②四種基本的邏輯結構:集合、線性結構、樹、圖
③四種基本的存儲結構:順序存儲結構、鏈式存儲結構、索引存儲結構、散列存儲結構(平時講課及考試僅針對前兩種)
切記:一個數據結構的邏輯結構是唯一的,其存儲結構不唯一!!!
(4)抽象數據類型(不用重點掌握)
用三元組(D,S,P)表示: - D:數據對象
- S:D上的關系集
- P:對D的基本操作集
2.算法和算法分析
(1)算法特征:有窮性、確定性、可行性、輸入、輸出
(2)算法效率:
①包括:時間效率&空間效率
②用所消耗的時間來度量:事后統計(實際測算)、事前分析(估計)。
③算法的漸進時間復雜度(僅比較數量級)
切記:隨著n的增大,T(n)的增長較慢的算法為最優的算法!!!
④算法時間效率的比較:
時間復雜度T(n)按數量級遞增順序即復雜度由低到高:
| 常數階 | O(1) |
| 對數階 | O(log2n) |
| 線性階 | O(n) |
| 線性對數階 | O(nlog2n) |
| 平方階 | O(n*n) |
| k次方階 | O(n*…*n) |
| … | … |
| 指數階 | O(2的n次方) |
⑤空間復雜度:算法所需存儲空間的度量(非重點)
- 算法要占據的空間包括算法兩部分:本身要占據的空間&算法要使用的輔助空間。
第二章 線性表
1.線性表的類型定義
(1)線性表是由n個類型相同的數據元素組成的有限序列。
(2)線性表是一種最簡單的數據結構,因為數據元素之間是由一前驅一后繼的直觀有序的關系確定,即線性表中相鄰的數據元素之間存在著序偶關系。
(3)線性表的邏輯結構為線性結構,存儲結構為順序存儲或鏈式存儲。
2.線性表的順序表示和實現
(1)線性表的順序存儲結構
①順序存儲定義:把邏輯上相鄰的數據元素存儲在物理上相鄰的存儲單元中的存儲結構。
②順序存儲方法:用一組地址連續的存儲單元依次存儲線性表的元素,可通過數組來實現。
③線性表順序存儲特點:
·邏輯上相鄰的數據元素,其物理上也相鄰。
· 可以實現隨機存取: 設首元素a1的存放地址為LOC(a1)(稱為基地址或起始位置),設每個元素占用存儲空間(地址長度)為L字節,則表中任一數據元素的存放地址為:LOC(ai) = LOC(a1) + L *(i-1)
(2)線性表的順序存儲結構上的基本運算
首先,給出描述:
①初始化操作
· 為三要素(首地址、長度、空間大小)賦初值
②插入操作
- 插入前兩判斷:i值是否合法&存儲空間是否已滿
- 插入時一循環:將第n至i位的元素依次向后移動&將要插入的元素寫到第i個位置
- 插入完一切記:表長+1
③刪除操作
- 刪除前一判斷:i值是否合法
- 刪除時一循環:將第i+1至n位的元素依次向前移動
- 刪除完一切記:表長-1
③查找操作(在順序表中查找元素)
int LocateElem_Sq(SqList L,ElemType e, Status(*compare)(ElemType, ElemType)){ //在順序線性表L中查找第1個值與e滿足compare()的元素的位序,找到返回其在L中的位置,否則返回0int i=1;//i的初值為第一個元素的位序p=L.elem;//p的初值為第一個元素的存儲位置while (i<=L.length && !(*compare)(*p++,e)) ++i;if (i<=L.length)return i;else return 0; }(3)線性表的順序存儲結構的優缺點
①優:
- 無需為表示結點間的邏輯關系而增加額外的存儲空間(因為邏輯上相鄰的元素其存儲的物理位置也是相鄰的);
- 可方便地隨機存取表中的任一元素。
②缺:
- 插入或刪除運算不方便,除表尾的位置外,在表的其它位置進行插入或刪除操作都必須移動大量的結點,其效率較低;
- 需要預分配空間(可能導致浪費);
- 表的擴充不方便。
3.線性表的鏈式表示和實現
(1)線性表的鏈式存儲結構
①用一組任意的存儲單元存儲線性表的數據元素(可以連續,也可以不連續)
②利用指針實現用不相鄰的存儲單元存放邏輯上相鄰的元素
③結點包含兩個域:數據域(數據元素本身信息)&指針域(指示直接后繼的存儲位置)
④頭指針、頭結點、首元結點概念辨析
· 首元結點:是鏈表中存儲線性表第一個數據元素a1的結點
· 頭結點:是在鏈表的首元結點之前附設的一個結點
· 頭指針:是指向鏈表中第一個結點的指針
切記:單鏈表可由一個頭指針唯一確定!!!
ps:在鏈表中設置頭結點有什么好處??
解答:頭結點是在鏈表的首元結點之前附設的一個結點,該結點的數據域中不存儲線性表的數據元素,其作用是為了對鏈表進行操作,可以對空表、非空表的情況以及對首元結點進行統一處理,編程更方便。
(2)線性表的鏈式存儲結構上的基本運算
首先,給出結點描述:
解釋:假設L是LinkList型的變量,則L是一個結構指針,即單鏈表的頭指針,它指向表中第一個結點(對于帶頭結點的單鏈表,則指向單鏈表的頭結點),若L=NULL(對于帶頭結點的單鏈表為L->next=NULL),則表示單鏈表為一個空表,其長度為0。若不是空表,則可以通過頭指針訪問表中結點,找到要訪問的所有結點的數據信息。對于帶頭結點的單鏈表L,p=L->next指向表中的第一個結點a1,即p->data=a1,而p->next->data=a2。其余依此類推。
①查找操作
- 查找前兩初始:p指針初始化為首元結點&計數器j=1
- 查找時一循環:順指針向后查找 p = p->next
- 查找完一判斷:判斷第i個元素是否存在
②插入操作
核心任務:“連上兩條鏈”
鏈①:p->next = s->next
鏈②:p->next = s
③刪除操作
核心任務:“連一條鏈”
令q指向被刪除結點:q = p->next
鏈①:p->next = q->next
④頭插法建立單鏈表
- 建立空表:L->next = NULL;//建空表
- 核心任務:“連接鏈①” 即 p->next=L->next; L->next=p; //插入結點
⑤尾插法建立單鏈表
void CreateList_L(LinkList &L, int n){L= (Linklist) malloc(sizeof(Lnode));L->next = NULL;LinkList r = L;for(i = n; i>0; --i){p=(LinkList)malloc(sizeof(Lnode));scanf(&p->data);r->next=p;r = r->next; p->next=Null;} }(3)循環鏈表(循環鏈表的操作和線性鏈表基本一致)
①有時候若在循環鏈表中設立尾指針而不設頭指針,可以簡化操作,比如將兩個線性表合并成一個表的時候,僅需將一個表的表尾和另一個表的表頭相接。(我們那年考試簡答題)
(4)雙向鏈表(了解一下應該就可以)
第三章 棧和隊列
(這一章重點掌握棧和隊列的特點就可以了)
1.棧
(1)特點:后進先出
(2)考題形式(我們就考了一個選擇題)
【例】對于棧來講,若輸入 A,B,C,D,同時在插入的時候也可能進行刪除操作。可能的輸出序列為?
2.隊列
特點:先進先出
第四章 串
(這一章沒什么重點,了解一下模式匹配就可以了)
1.串是內容受限的線性表
2.關于模式匹配:
(1)模式匹配是干嘛的(我們那年的一個選擇題):子串的定位操作通常稱作串的模式匹配(其中T被稱為模式串),是各種串處理系統中最重要的操作之一。
(2)KMP算法(大概了解就行)
第五章 數組和廣義表
(這一章復習的時候重點看壓縮存儲!)
矩陣的壓縮存儲
(1)概念:為多個值相同的元只分配一個存儲空間,對零元不分配空間。
(2)特殊矩陣
①對稱矩陣:僅存下(上)三角(包括主對角線)的數據元素
②三角矩陣:k和aij存在著一一對應關系
·下三角:即i>=j時,k = i*(i-1)+j-1
·上三角:即i<=j時,k = j*(j-1)+i-1
③帶狀矩陣(對角矩陣)
eg:三對角矩陣:
i<j:k=3i-4
i=j:k=3i-3
i>j:k=3i-2
(3)在壓縮存儲結構下實現矩陣轉置(弄懂兩種方式,非重點)
第六章 樹和二叉樹
(這一章直接上題!!)
1.樹的遍歷&線索二叉樹
2.樹<——>二叉樹<——>森林(互相轉化)
(1)樹和二叉樹的轉化
(2)二叉樹和森林的轉化
3.赫夫曼樹&赫夫曼編碼
注:①一般考試題還會讓計算一下WPL
②當題目給出要傳輸字符串的時候,切記空格,不要把空格忘掉!!!
第七章 圖
1.鄰接矩陣&鄰接表
2.深度、廣度優先遍歷
3.最小生成樹(Prim&克魯斯卡爾算法)
綜合1、2、3,給出一道大題:
4.拓撲序列
5.關鍵路徑
綜合4、5,先放出我的小筆記,再給出一道大題
第九章 查找
1.線性表的查找
2.有序表的查找
注:順序表和有序表有什么不同,折半查找為什么用順序存儲(我們當時考試的簡答題,建議百度,總結答案)
3.樹表的查找
(1)二叉排序樹
(2)平衡二叉樹:LL型、RR型、LR型、RL型
我的筆記:
建議:老師上課講的例題以及課件上面的例題搞明白之后再去找題練習!
(3)B-樹
注:還有一種類型的考題會給出一棵已知樹,依次進行插入、刪除操作
4.散列表的查找
第十章 排序
1.插入排序
(1)直接插入排序
(2)二分插入排序
(3)希爾排序
2.交換排序
(1)冒泡排序(起泡排序)
(2)快速排序
3.選擇排序
(1)簡單選擇排序
(2)堆排序
4.歸并排序
我的考前復習小筆記(關于排序建議看B站一個青島大學老師講的課,直接搜數據結構應該就可以看到它啦):
關于期末考試(我們當時的):
①試卷分布:選擇題10、簡答題2、應用題6、編程題2
②書上和課件里面的例題很重要!
寫此博客,僅作為本人對數據結構的小結,如有錯誤,還望指正!
總結
- 上一篇: php数据库插入表情转换,如何转义emo
- 下一篇: 快播