More Related Content Similar to 資料結構-20個經典題型 (20) 資料結構-20個經典題型2. Issue 1 時間複雜度(time complexity)
重點摘要1
1. 用來衡量演算法執行所需時間。
2. 為衡量演算法優劣的重要參數。
3.常用的衡量標準為:
• Big-oh
• Theta
• Omega
Big-oh
Omega
Theta
2
3. Issue 1 時間複雜度(time complexity)
題 1:
T(n) = 4n+1009
Big-oh=
題 2:
T(n) = 4n3+19n +2000
Big-oh=
小試身手 參考解答:
題 1:
T(n) = 4n+1009
Big-oh = O(n)
題 2:
T(n) = 4n3+19n +2000
Big-oh = O(n3)
3
4. Issue 1 時間複雜度(time complexity)
考古練習 (105高考三級)
請算出下列兩題之時間複雜度,並請以big-oh進行表示:
1.for (int i = 0; i * i < n; i++) S
2.for (int i = 1; i < n+1; i*=2) S
4
5. Issue 1 時間複雜度(time complexity)
考古練習 (105高考三級) 解答(1)
1.for (int i = 0; i * i < n; i++) S
解答:
i會從 0, 1, 4, 9,.......i2 ,故為O(n1/2)
例如: 當n等於25時,i僅會到5,因5的平方即等於25
5
6. Issue 1 時間複雜度(time complexity)
考古練習 (105高考三級) 解答(2)
2.for (int i = 1; i < n+1; i*=2) S
解答:
i會從 1, 2, 4, 8,....... ,故為O(logn)
例如: 當n等於16時,i僅會到4,因2的4次方即等於16,並小於n+1
6
7. Issue 2 陣列(array)和鏈結(linked list)
重點摘要1
陣列(array)特色:
1. Array是一種是先宣告資料結構.
2. Array用以存放同質性資料.
3. Array支援循序和隨機存取.
4.隨機存取時間複雜度為O(1).
鏈結(linked list)特色:
1. Linked list可以動態配置.
2. Linked list需額外link空間.
3. Linked list僅支援循序存取.
4.循序存取時間複雜度為O(n).
Compare/
7
8. Issue 2 陣列(array)和鏈結(linked list)
重點摘要2
1. Row major (以列為基礎)
A(i,j) = l + [ (i-1)*n +(j-1)]*d
2. Col major (以行為基礎)
A(i,j) = l + [ (j-1)*m +(i-1)]*d
陣列常考公式: (假設l為初值,並且有m列n行,且元素大小為d)
8
Tips:
Row major只能算出行…
Col major只能算出列…
9. 此題宣告後如下:
並且由後往前做輸出的動作
故為反向輸出:
5 4 3 2 1
Issue 2 陣列(array)和鏈結(linked list)
小試身手
試問下列結束後印出為何?
int main() {
int A[] ={1,2,3,4,5};
for(int i=5; i>0; i--){
print(A[i]);
}
}
參考解答:
1 2 3 4 5
9
10. Issue 2 陣列(array)和鏈結(linked list)
10
重點摘要1
你該瞭解的鏈結演算法:
1. 插入
2. 刪除
3. . 回收
4. 翻轉
void insert (Node *x) {
Node *t=new Node x( );
t → data=50;
t → link=x → link;
x → link=t;
}
11. Issue 2 陣列(array)和鏈結(linked list)
11
重點摘要1
你該瞭解的鏈結演算法:
1. 插入
2. 刪除
3. . 回收
4. 翻轉
delete (Node*x , Node*y) {
if (y == null) First=x→ link;
else y→link=x →link;
delete x;
}
假設有一個First串列,刪除有2種
可能,一種為刪除的x位在第一個,
一種為不為第一個:
12. Issue 2 陣列(array)和鏈結(linked list)
12
重點摘要1
你該瞭解的鏈結演算法:
1. 插入
2. 刪除
3. 回收
4. 翻轉
void ret (Node *t){
Node *p=t;
while (p→link!=null) {
p=p→link;
}
P→link=AV;
AV=t;
單向鏈結回收演算法:
13. Issue 2 陣列(array)和鏈結(linked list)
13
重點摘要1
你該瞭解的鏈結演算法:
1. 插入
2. 刪除
3. 回收
4. 翻轉
void invert (Node *s) {
Node*r, *q, *p;
q = null;
p = s;
while(p!=null){
r = q; q = p; p = p→link;
}
s=q;
}
15. Issue 3 遞迴(Recursive)
重點摘要2
1. 連加 (1+2+3…..+n)
2. 連乘(1*2*3…..*n)
3. . 費式數列 (常考題型)
4. 最大公因數
5. 河內塔(Hanoi) (常考題型)
你該瞭解的遞迴演算法: int sum ( int n){
if(n==0) return 0;
else
return(n +sum(n-1));
15
16. Issue 3 遞迴(Recursive)
重點摘要2
1. 連加 (1+2+3…..+n)
2. 連乘(1*2*3…..*n)
3. . 費式數列 (常考題型)
4. 最大公因數
5. 河內塔(Hanoi) (常考題型)
你該瞭解的遞迴演算法: int sum ( int n){
if(n==0) return 0;
else
return(n *sum(n-1));
16
17. Issue 3 遞迴(Recursive)
1. 連加 (1+2+3…..+n)
2. 連乘(1*2*3…..*n)
3. . 費式數列 (常考題型)
4. 最大公因數
5. 河內塔(Hanoi) (常考題型)
你該瞭解的遞迴演算法:
int F ( int n){
if(n==0) return 0;
else if(n==1) return 1;
else{
return F(n-1)+F(n-2);
17
重點摘要2
18. Issue 3 遞迴(Recursive)
1. 連加 (1+2+3…..+n)
2. 連乘(1*2*3…..*n)
3. . 費式數列 (常考題型)
4. 最大公因數
5. 河內塔(Hanoi) (常考題型)
你該瞭解的遞迴演算法:
int GCD ( int a, int b){
if(a%b==0)
return b;
else
return GCD(b,a%b);
18
重點摘要2
19. Issue 3 遞迴(Recursive)
1. 連加 (1+2+3…..+n)
2. 連乘(1*2*3…..*n)
3. . 費式數列 (常考題型)
4. 最大公因數
5. 河內塔(Hanoi) (常考題型)
你該瞭解的遞迴演算法:
void Hanoi (n:disc , A , B , C : peg) {
if (n==1)
move disc from A to C
else {
Hanoi (n 1 ,A ,C ,B);
move the disk n from A to C;
Hanoi (n 1 ,B ,A ,C);
}
}
重點摘要2
26. Issue 9
重點摘要1
26
前,中, 後序相互轉換
例如:
• 前序: +AB
• 中序: A+B
• 後序: AB+
重點1: 中序轉後序
1. 依據優先權及結合性加上完整括號。
2. 將運算子(operator)取代最近的右括號。
3. 輸出(省略左括號)。
重點2: 中序轉前序
1. 依據優先權及結合性加上完整括號。
2. 將運算子(operator)取代最近的左括號。
3. 輸出(省略右括號)。
41. 41
Issue 14 深度先搜尋(Depth First Search)
重點摘要1
概念:
說明:選擇一起始拜訪頂點,挑選步驟如下:
step 1:從目前拜訪頂點的未拜訪相鄰頂點之集合選一拜訪
step 2:若無,則回溯目前拜訪之前一頂點並做step 1
step 3:反覆step1 , step 2,直到所有頂點皆拜訪或無頂點可拜訪。
採用stack支援
43. 43
Issue 15 廣度先搜尋(Breadth First Search)
重點摘要1
概念:
說明:選擇一起始拜訪頂點,之後挑選步驟如下:
step 1:將目前選擇到的頂點之未拜訪的相鄰頂點逐一拜訪。
step 2:若目前頂點之相鄰頂點皆拜訪完畢,往先拜訪的頂點走,回step 1。
step 3:反覆step1 , step 2,直到所有頂點拜訪完畢,或無頂點可拜訪。
採用queue支援
45. 45
Issue 16 Kruscal’s algo.
重點摘要1
概念:
(1) 依序排最小成本邊(Vi , Vj)。
(2) 若(Vi , Vj)之加入不會使spanning tree 形成cycle,則加入,否則放棄。
(3) repeat step 1 , 2 直到挑了n 1 個邊或無邊可挑為止。
47. 47
Issue 17 Prime’s algo.
重點摘要1
概念:
一圖形G < V , E >,含有n 個頂點,V = {1 , 2 , … , n},另外設U={1},
每次尋找一最短的edge (μ, v),其中μ是U 集合的元素,V 是V U 集合
之元素,將此邊加入T 中,且把V 點從V 集合中刪除並加入U 集合中,
直到U 集合 = V 集合。
48. 48
Issue 17 Prime’s algo.
考題練習
A
B
C
D
E
10
5
1
3
6
2
8
採用prime‘s algo(由A開始)
則最低成本為何?
參考解答: 11
49. 49
Issue 18 搜尋(search)
重點摘要1
• 線性搜尋 (linear search)
✓ 由頭到尾依資料的順序一筆一筆
的進行比對搜尋。
✓ 右邊為non-sential之作法。
void non-sential (F, n, k){
int i;
while (i <=n) {
if (F [i].key ==k)
return i;
else
i=i+1;
}
return 0;
}
50. 50
Issue 18 搜尋(search)
重點摘要1.2
• 線性搜尋 (linear search)
✓ 由頭到尾依資料的順序一筆一筆
的進行比對搜尋。
✓ 右邊為sential之作法,即將欲找
值放在最前面,由後往前找。
void sential (F , n , k) {
F [0] . key=k;
int i=n;
while ( F [i] . key!=k) {
i=i-1 ;
}
return i;
}
51. 51
Issue 18 搜尋(search)
重點摘要2
• 二分搜尋 (binary search)
✓ 資料需要事先排序。 (常考)
✓ 通常採用陣列作為存放機制。
int BS (int A [ ] , int key,int l, int μ) {
if (l <=μ) {
int mid=(l +μ)/2;
if (key == A [mid]) return mid;
else if (key<A[mid])
return binarySearch (A ,key , l , mid-1) ;
else
return binarySearch (A ,key ,mid+1 ,μ) ;
}
else
return -1 ; //Not Found
}
}
52. 52
Issue 19 排序(sort)
重點摘要1
• 插入排序 (insertion sort)
• 選擇排序 (selection sort)
• 氣泡排序 (bubble sort)
• 快速排序 (quick sort)
• 合併排序 (merge sort)
• 堆積排序 (heap sort)
初等排序: 平均時間複雜度為O(n2)
高等排序: 平均時間複雜度為O(nlogn)
53. 53
Issue 19 排序(sort)
插入排序 (insertion sort)
將第i 筆記錄插入到前面( i-1)筆已排好的記錄串列中,使之成為i 筆已
排序好的串列。
例如: 3, 8, 2. 10進行插入排序
Initial: 3, 8, 2, 10
Pass1: 3, 8, 2, 10
Pass2: 2, 3, 8, 10
Pass3: 2, 3, 8, 10
54. 54
Issue 19 排序(sort)
選擇排序 (selection sort)
從第i 到n 筆資料中挑出最小值,與第i 筆元素swap。
例如: 3, 8, 2. 10進行選擇排序
Initial: 3, 8, 2, 10
Pass1: 2, 8, 3, 10
Pass2: 2, 3, 8, 10
Pass3: 2, 3, 8, 10
55. 55
Issue 19 排序(sort)
氣泡排序 (bubble sort)
針對元素進行兩兩交換,每回合最大值會於最後一筆。
例如: 3, 8, 2. 10進行氣泡排序
Initial: 3, 8, 2, 10
Pass1: 3, 2, 8, 10
Pass2: 2, 3, 8, 10
Pass3: 2, 3, 8, 10
56. 56
Issue 19 排序(sort)
快速排序 (quick sort)
1. 每回合挑選一鍵值,並將此鍵值插入到最適當的位置。
2. 將未排序的集合反覆做step 1 的動作。
例如: 3, 8, 2. 10進行快速排序
Initial: 3, 8, 2, 10
Pass1: [2], 3, [8, 10] (分成兩群,左邊比3小,右邊比3大)
Pass2: 2, 3, [8, 10]
Pass3: 2, 3, 8, 10
57. 57
Issue 19 排序(sort)
合併排序 (merge sort)
merge sort 常用於外部排序。
例如: 3, 8, 2. 10進行合併排序
Initial: 3, 8, 2, 10
Pass1: 3, 8, 2, 10
Pass2: 2, 3, 8, 10
將數列分為兩段進行排序
將兩段數列合併進行排序
60. Heap(堆積)特性:
Heap 特性
1. Heap 用array 來儲存(∵為Complete Binary Tree)。
2. Heap 中插入元素:Time Complexity : O (log n)。
3. 刪除最大or 最小鍵值元素:Time Complexity : O (log n)。
. Max-Heap : 最大鍵值落在Root , ∴ 找最大只須: O(1)
60
Issue 19 排序(sort)
堆積排序 (heap sort) 3/3
62. 62
Issue 20 雜湊(hash function)
重點摘要2
Overflow處理機制:
一. 線性探測(linear probing)。
二. 二次方探測。
三. 再散置(rehashing)。
四. link list。
範例
有4筆資料分別為10, 20, 22, 4,
且hash function為h(x) = k mod 5
請問以線性探測與link list處理overflow
結果為何?
63. 63
Issue 20 雜湊(hash function)
解題1 (採用線性探測)
10
20
22
4
0
1
2
3
4
10 mod 5 =0
20 mod 5 = 0 (往下一格找)
22 mod 5 = 2
4 mod 5 =3
解法
64. 64
Issue 20 雜湊(hash function)
解題1 (採用linked list)
10
22
4
0
1
2
3
4
20 null
10 mod 5 =0
20 mod 5 = 0 (增加一個link)
22 mod 5 = 2
4 mod 5 =3
解法