You are on page 1of 61

CẤU TRÚC DỮ LIỆU

& GIẢI THUẬT


ĐH HUTECH
KHOA CNTT
GV: TS. HUỲNH MINH TRÍ
Thông tin học phần
1. Tên học phần: Cấu trúc dữ liệu và giải thuật

2. Mã học phần: COS120

3. Số tín chỉ: 03

4. Học phần tiên quyết: Kỹ thuật lập trình

26/08/2023 2
Mục tiêu học phần
• Cung cấp các PP tổ chức và các thao tác cơ sở trên các
CTDL, song song là sự kết hợp hai thành phần trên để
hình thành nên một chương trình máy tính.
• Củng cố và phát triển kỹ năng lập trình được học trong
giai đoạn trước.
• Hình thành thái độ làm việc chăm chỉ, có cường độ cao
và chú ý đến chi tiết. Hình thành phong cách lập trình
chuyên nghiệp.
26/08/2023 3
Tóm tắt nội dung học phần
▪ Tìm hiểu các phương pháp tổ chức và những thao tác cơ sở
trên từng CTDL, kết hợp với việc phát triển tư duy giải thuật
để hình thành nên chương trình máy tính.
▪ Hiểu được tầm quan trọng của giải thuật và cách tổ chức dữ
liệu, hai thành tố quan trọng nhất cho một chương trình.
▪ Củng cố và phát triển kỹ năng lập trình được học trong giai
đoạn trước

26/08/2023 4
Phương pháp đánh giá
1) Điểm quá trình
Điểm bài tập/ kiểm tra trong quá trình học: 7,0 điểm
Điểm danh: 3,0 điểm
2) Điểm thi kết thúc môn
Thi tự luận theo lịch thi của Phòng Khảo thí
Điểm học phần = (1) x 50% + (2) x 50%
26/08/2023 5
Tài liệu tham khảo
1. Slide bài giảng

2. Tài liệu học tập do trường cung cấp

3. Michael T. Goodrich, Roberto Tamassia, David M. Mount


(2011). Data structures and Algorithm in C++, 2nd, Wiley.

4. Reinhard Diestel (2017). Graph Theory, 5th. Springer-Verlag


New York.

26/08/2023 6
Nội dung
Bài 1. Tổng quan về CTDL & GT
1.1. Vai trò của cấu trúc dữ liệu trong một đề án tin học
1.2. Các tiêu chuẩn đánh giá cấu trúc dữ liệu
1.3. Trừu tượng hóa dữ liệu
1.4. Kiểu dữ liệu cơ bản
1.5. Kiểu dữ liệu có cấu trúc
1.6. Độ phức tạp của giải thuật*
1.7 Các qui tắc đánh giá thời gian thực hiện giải thuật
1.8. Bài tập
26/08/2023 7
Nội dung
Bài 2. Cấu trúc danh sách
2.1. Khái niệm
2.2. Cấu trúc danh sách
2.3. Các phương pháp cài đặt danh sách
2.4. Hiện thực danh sách kề
2.5. Hiện thực danh sách liên kết đơn
2.6. Các loại danh sách khác
2.7. Bài tập
26/08/2023 8
Nội dung
Bài 3. Cấu trúc Stack và Queue
3.1. Giới thiệu về Stack
3.2. Hiện thực Stack
3.3. Một số bài toán ứng dụng Stack
3.4. Giới thiệu về Queue
3.5. Hiện thực Queue
3.6. Hàng đợi có ưu tiên
3.7. Bài tập
26/08/2023 9
Nội dung
Bài 4. Cấu trúc Cây - Cây nhị phân – Cây nhị phân tìm kiếm
4.1 Cấu trúc cây tổng quát
4.2 Cây nhị phân
4.3 Mô tả cây nhị phân
4.4 Hiện thực cây nhị phân tổng quát
4.5. Định nghĩa cây nhị phân tìm kiếm
4.6. Cài đặt cây nhị phân tìm kiếm
4.7. Bài tập
26/08/2023 10
Nội dung
Bài 5. Cây nhị phân tìm kiếm cân bằng - AVL

5.1. Định nghĩa cây nhị phân tìm kiếm cân bằng

5.2. Các tác vụ xoay

5.3. Thêm một nút vào cây AVL

5.4. Cài đặt cây AVL

5.5. Bài tập


26/08/2023 11
Nội dung
Bài 6. Đồ thị và biểu diễn đồ thị

6.1. Các khái niệm

6.2. Tính liên thông của đồ thị

6.3. Biểu diễn đồ thị

6.4. Bài tập

26/08/2023 12
Nội dung
Bài 7. Đường đi và chu trình

7.1. Chu trình EULER

7.2. Chu trình HAMILTON

7.3. Ứng dụng

7.4. Bài tập

26/08/2023 13
Nội dung
Bài 8. Duyệt đồ thị

8.1. Bài toán duyệt đồ thị

8.2. Duyệt theo chiều rộng (BFS)

8.3. Duyệt theo chiều sâu (DFS)

8.4. Ứng dụng

8.5. Bài tập


26/08/2023 14
Nội dung
Bài 9. Cây bao trùm và cây bao trùm nhỏ nhất

9.1. Định nghĩa

9.2. Thuật toán KRUSKAL

9.3. Thuật toán PRIM

9.4. Bài tập

26/08/2023 15
Nội dung
Bài 10. Đường đi ngắn nhất

10.1. Bài toán đường đi ngắn nhất

10.2. Thuật toán DIJKSTRA

10.3. Thuật toán FLOYD

10.4. Bài tập

26/08/2023 16
Bài 1. Tổng Quan Về CTDL & GT
Nội dung
• 1.1. Vai trò CTDL trong một đề án tin
học
• 1.2 Các tiêu chuẩn đánh giá CTDL
• 1.3 Trừu tượng hóa dữ liệu
• 1.4 Kiểu dữ liệu cơ bản
• 1.5 Kiểu dữ liệu có cấu trúc
• 1.6 Độ phức tạp của giải thuật
26/08/2023 17
1.1. Vai trò CTDL trong 1 đề án tin học (1)

Bài toán giải quyết


trong máy tính
Bài toán thực tế

Đối tượng Xử lý trên


đối tượng DL
dữ liệu

26/08/2023 18
1.1. Vai trò CTDL trong 1 đề án tin học (2)
▪ Dữ liệu thực tế:
- Muôn hình vạn trạng, đa dạng, phong phú
- Thường có chứa đựng quan hệ với nhau
▪ Cần phải tổ chức biểu diễn thành cấu trúc thích hợp nhất
- Phản ánh chính xác dữ liệu thực tế
- Dễ dàng xử lý trong máy tính

Xây dựng
CTDL
26/08/2023 19
1.1. Vai trò CTDL trong 1 đề án tin học (3)
Xây dựng thao tác xử lý
Dựa trên Y/C cụ thể, xác định các trình tự giải
quyết vấn đề trên máy tính để đưa kết quả mong
muốn
Đối tượng DL
Kết quả
Thao tác xử lý mong
muốn

Xây dựng
giải thuật
26/08/2023 20
1.1. Vai trò CTDL trong 1 đề án tin học (4)
quan hệ chặc chẽ

Cấu trúc dữ liệu


+ Giải thuật = Chương trình

Niklaus Wirth

26/08/2023 21
1.2. Các tiêu chuẩn đánh giá CTDL
• Phản ánh đúng thực tế:
– Thể hiện được đầy đủ thông tin nhập/xuất của bài toán.
• Phù hợp với thao tác xử lý:
– Tăng tính hiệu quả của chương trình → hiệu quả của dự án
tin học.
• Tiết kiệm tài nguyên hệ thống:
– Sử dụng tài nguyên vừa đủ để thực hiện chức năng &
nhiệm vụ.

26/08/2023 22
1.3. Trừu tượng hóa dữ liệu (1)
• Trừu tượng hoá

- Làm đơn giản hóa, sáng sủa, dễ hiểu hơn.

- Che đi phần chi tiết, làm nổi bật cái tổng thể

• Trừu tượng hoá dữ liệu: đưa ra các kiểu dữ liệu trừu


tượng (Abstract Data Type)

26/08/2023 23
1.3. Trừu tượng hóa dữ liệu (2)
• ADT: gồm

- Mô tả dữ liệu

- Tác vụ liên quan

• VD: tập số nguyên với các phép toán hợp, giao, hiệu là kiểu
dữ liệu trừu tượng.

26/08/2023 24
1.3. Trừu tượng hóa dữ liệu (3)
• VD: mô tả kiểu dữ liệu trừu tượng về số hữu tỉ a/b với các tác
vụ: +,*, /

• Mô tả dữ liệu

- Tử số

- Mẫu số (≠0)

26/08/2023 25
1.3. Trừu tượng hóa dữ liệu (4)
• Mô tả tác vụ
Cộng(Số_Hữu_Tỉ 1, Số_Hữu_Tỉ 2)
• Nhập:
- a, b là tử số và mẫu số của Số_Hữu_Tỉ 1
- c, d là tử số và mẫu số của Số_Hữu_Tỉ 2
• Xuất:
- ad+bc là tử số của số hữu tỉ kết quả
- bd là mẫu số của số hữu tỉ kết quả

26/08/2023 26
1.4. Kiểu dữ liệu cơ bản (1)
• Thường đơn giản và không có cấu trúc, được NNLT xây dựng
sẵn, nên còn gọi là kiểu dữ liệu dựng sẵn.

• Thường là các trị vô hướng:


- số nguyên
- số thực
- ký tự
- giá trị logic

26/08/2023 27
1.4. Kiểu dữ liệu cơ bản (2)
Tên kiểu KT Miền giá trị Ghi chú
char 1 -128 đến 127 Có thể dùng như số nguyên 1 byte có dấu hay
kiểu ký tự
unsigned char 1 0 đến 255 Số nguyên 1 byte ko dấu

int 2 -32768 đến 32767


unsigned int 2 0 đến 65355 Gọi tắt là unsigned
long 4 -232 đến 231 -1

unsigned long 4 0 đến 232 -1


float 4 3.4E-38 … 3.4E38 Giới hạn chỉ trị tuyệt đối.Các giá trị <3.4E-38
được coi = 0. Tuy nhiên kiểu float chỉ có 7 chữ
số có nghĩa.
double 8 1.7E-308 … 1.7E308 Kiểu double có 19 chữ số có nghĩa
long double 10 3.4E-4932 …1.1E4932

26/08/2023 28
1.5. Kiểu dữ liệu có cấu trúc (1)
• Kết hợp nhiều kiểu dữ liệu cơ bản để phản ánh bản chất của
đối tượng thực tế

• Đa số các ngôn ngữ đều cài đặt sẵn một số kiểu có cấu trúc
cơ bản: mảng, chuỗi, tập tin, bản ghi…

• Ngoài ra cung cấp cơ chế cho người lập trình cài đặt các dữ
liệu cấu trúc khác.

26/08/2023 29
1.5. Kiểu dữ liệu có cấu trúc (2)
▪ Kiểu mảng một chiều
• Khai báo
<Kiểu Dũ Liệu> <Tên mảng> [<Số phần tử max>];
Ví dụ: int a[100];
• Gán giá trị ban đầu
Ví dụ 1: int a[100] = {0}; // a[0]=a[1]=…=a[99]=0
Ví dụ 2: int a[5] = {3, 6, 2, 10, 17};
hoặc: int a[] = {3, 6, 2, 10, 17};
26/08/2023 30
1.5. Kiểu dữ liệu có cấu trúc (3)
Phát sinh số nguyên ngẫu nhiên <time.h>
• Khởi tạo phát sinh ngẫu nhiên:
srand((unsigned int)time(NULL));
• Phát sinh số nguyên ngẫu nhiên x:
o k: Số nguyên dương
int x = rand()%k;
o x  [0..k-1]
• Ví dụ: Phát sinh 1 số nguyên ngẫu nhiên có giá trị từ 0 đến 50
srand((unsigned int)time(NULL));
int x = rand()%51;
26/08/2023 31
1.5. Kiểu dữ liệu có cấu trúc (4)
▪ Kiểu xâu ký tự
• Khai báo
char <Tên xâu> [<Số ký tự max>] ;
Ví dụ: char hoten[50];
• Xem lại các hàm
- gets, fflush, flushall
- strcpy, strcat, strlen
- strcmp, stricmp
- strchr, strstr

26/08/2023 32
1.5. Kiểu dữ liệu có cấu trúc (5)
• Cấu trúc dữ liệu Sinh viên
Mã SV: chuỗi kt

Tên SV: chuỗi kt


Sinh Viên
Ngày sinh: ngày tháng

Nơi sinh: chuỗi kt

Điểm thi: số thực


26/08/2023 33
1.5. Kiểu dữ liệu có cấu trúc (6)
typedef struct tên_struct //Truy cập thành phần
{ //có cấu trúc
khai báo các thuộc tính; Date d;
d.ngay =25;
} tên_kiểu;
d.thang =8;
Ví dụ: typedef struct ttDate d.nam =2023;
{
int ngay;
int thang; tên_biến . thành_phần_cấu_trúc = giá trị;
int nam;
} Date;
26/08/2023 34
1.6. Độ phức tạp của giải thuật (7)
• Sự cần thiết phân tích giải thuật

GT A GT C
GT B GT tốt

Vấn đề cần giải quyết

1. Giải thuật đúng


2. Giải thuật đơn giản
3. Giải thuật thực hiện nhanh
26/08/2023 35
1.6. Độ phức tạp của giải thuật (8)
▪ Giải thuật là dãy hữu hạn các bước, mỗi bước mô tả chính
xác các thao tác cần thực hiện để giải quyết một số vấn đề.
• Input: đó là các giá trị đưa vào khi Giải thuật bắt đầu làm việc
• Output: đó là kết quả thực hiện của thuật toán
▪ Các đặc trưng của Giải thuật
• Tính xác định: mỗi bước chỉ có một cách hiểu
• Tính khả thi: các bước của Giải thuật phải đủ đơn giản
• Tính dừng: Giải thuật phải dừng sau một số hữu hạn bước
• Tính phổ dụng: Giải quyết được một lớp bài toán
• Tính hiệu quả: Thời gian : tốc độ xử lý/Dung lượng: không gian
26/08/2023 lưu trử 36
1.6. Độ phức tạp của giải thuật (9)
▪ Các phương pháp mô tả giải thuật

• Dạng ngôn ngữ tự nhiên

• Dạng lưu đồ (sơ đồ khối)

• Dạng mã giả

• Ngôn ngữ lập trình

26/08/2023 37
1.6. Độ phức tạp của giải thuật (10)
▪ Dạng lưu đồ (sơ đồ khối)
Bắt đầu/ kết thúc Giá trị trả về

Điều Điều
kiện kiện
Rẽ nhánh Điểm nối
Luồng xử lý
Khối xử lý

Nhập/ Xuất
26/08/2023 38
1.6. Độ phức tạp của giải thuật (11)
▪ Dạng mã giả
• IF <điều kiện> THEN …ENDIF
• IF <điều kiện> THEN ... ELSE ... ENDIF
• WHILE <điều kiện> DO … ENDWHILE
• DO … UNTIL <điều kiện>
• DISPLAY …
• RETURN …
26/08/2023 39
1.6. Độ phức tạp của giải thuật (12)
▪ Ví dụ giải thuật dạng ngôn ngữ tự nhiên
Giải thuật Euclid tìm UCLN của hai số nguyên dương
• Input : m, n nguyên dương
• Output : g là ước chung lớn nhất của m và n
• Nội dung giải thuật:
Bước 1: Tìm r, phần dư của phép chia m cho n
Bước 2: Nếu r = 0, thì g  n (gán giá trị của n cho g) và
dừng lại. Trong trường hợp ngược lại (r  0), thì m  n, n
 r và quay lại bước 1.
26/08/2023 40
1.6. Độ phức tạp của giải thuật (13)
▪ Ví dụ giải thuật dạng lưu đồ (sơ đồ khối)
Giải thuật tìm Bắt đầu
Euclid tìm UCLN
của hai số nguyên
Nhập m, n >0
dương
r = m%n; Kết thúc

m = n; Sai Đúng
r=0 g = n; In g ra
n=r;
26/08/2023 41
1.6. Độ phức tạp của giải thuật (14)
Trong phương pháp thực nghiệm, thời gian chạy chương trình
phụ thuộc vào các yếu tố:
• Các dữ liệu vào
• Chương trình dịch để chuyển chương trình nguồn thành
mã máy
• Tốc độ thực hiện các phép toán của máy tính được sử
dụng để chạy chương tình
➔ Không thể biểu diễn chính xác thời gian chạy là bao nhiêu
đơn vị thời gian chuẩn
26/08/2023 42
1.6. Độ phức tạp của giải thuật (15)
Trong phương pháp lý thuyết

▪ Coi thời gian thực hiện Giải thuật là hàm T(n) với n là cỡ
của dữ liệu.

▪ Thời gian thực hiện Giải thuật không chỉ phụ thuộc vào
cỡ dữ liệu vào mà còn phụ thuộc dữ liệu cá biệt.

▪ Thời gian thực hiện Giải thuật trong trường hợp tốt nhất.

26/08/2023 43
1.6. Độ phức tạp của giải thuật (16)
▪ Thời gian thực hiện Giải thuật trong trường hợp trung bình.

▪ Thời gian thực hiện Giải thuật trong trường hợp xấu nhất.

▪ Thời gian thực hiện T(n) là số phép toán sơ cấp cần phải tiến
hành khi thực hiện thuật toán.

26/08/2023 44
1.6. Độ phức tạp của giải thuật (17)
▪ Kí pháp biểu diễn tiệm cận (Asymptotic Notation)

• Cận trên: Ký pháp O (đọc là O lớn, Big O) được sử


dụng để mô tả độ lớn của hàm T(n). Giả sử T(n) và g(n)
là các hàm thực không âm.

• Định nghĩa:

T(n) = O(g(n)) nếu tồn tại các hằng số dương c và no


sao cho T(n)  c.g(n), với mọi n  no
26/08/2023 45
1.6. Độ phức tạp của giải thuật (18)
Ý nghĩa: Tập các hàm có tốc độ tăng trưởng luôn nhỏ hơn
hàm g(n)
◼ Ví dụ. Giả sử T(n) = 3n2 + 4n +5.
Ta có : 3n2 + 4n + 5
<= 3n2 + 4n2+ 5n2
= 12n2 với mọi n >= 1.
Vậy T(n) = O(n2). Thuật
toán có thời gian thực hiện cấp n2
26/08/2023 46
1.6. Độ phức tạp của giải thuật (19)
▪ Khi biểu diễn cấp của Sử dụng ký hiệu BigO
thời gian thực hiện  Hằng số : O(c)
 logN : O(logN)
Giải thuật bởi hàm  N : O(N)
f(n), chúng ta sẽ chọn  NlogN : O(NlogN) Độ phức tạp
 N2 : O(N2) tăng dần
f(n) là hàm số nhỏ
 N3 : O(N3)
nhất, đơn giản nhất
 2N : O(2N)
có thể được sao cho  N! : O(N!)
T(n) = 0(f(n))
26/08/2023 47
1.6. Độ phức tạp của giải thuật (20)
N O(N) log(N) N.log(N) N2 N3 2N N!
10 10 1 10 100 1000 1024 3628800
100 100 2 200 10000 1000000 1.26765E+30 9.3326E+157
1000 1000 3 3000 1E+06 1E+09 1.0715E+301 #NUM!
10000 10000 4 40000 1E+08 1E+12 #NUM! #NUM!
100000 100000 5 500000 1E+10 1E+15 #NUM! #NUM!
1000000 1000000 6 6000000 1E+12 1E+18 #NUM! #NUM!

▪ Ghi chú: log(N)= log10(N)

26/08/2023 48
1.6. Độ phức tạp của giải thuật (21)
▪ Bảng minh hoạ dưới đây cho thấy thời gian thực cho cùng
một cở dữ liệu với các độ phức tạp khác nhau.

26/08/2023 49
1.6. Độ phức tạp của giải thuật (22)
▪ Bảng minh hoạ dưới đây cho n b b a

thấy thời gian thực cho cùng


 1 = n ; 1 = 1 − 1 = b − a + 1
i =1 i =a i =1 i =1
n
n(n + 1) n(n + 1) − (a − 1)a

n
một cở dữ liệu với các độ phức
i =1
i=
2
; 
i =a
i=
2
tạp khác nhau. n
n(n + 1)( 2n + 1)
n2
n (n + 1)

2 2

 i =
2
i= ;
▪ Thường dựa vào số phép so i =1 2 i =1 6

sánh và số phép gán


n
n 2
( n + 1) 2


i =1
i 3
=
4
▪ Một số công thức thường dùng
26/08/2023 50
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(1)
▪ Qui tắc tổng: Giả sử T1(n) và T2(n) là thời gian thực
hiện của hai đoạn chương trình P1 và P2 mà T1(n) =
O(f1(n)) và T2(n) = O(f2(n)) thì thời gian thực hiện P1 và
P2 kế tiếp nhau sẽ là: T1(n) + T2(n) = O(max (f1(n), f2(n)))
▪ Qui tắc nhân: Nếu thời gian thực hiện tương ứng với P1
và P2 là T1(n) = O(f1(n)) và T2(n) = O(f2(n)) thì thời gian
thực hiện P1 và P2 lồng nhau sẽ là: T1(n).T2(n) = O(f1(n).f2(n)))
26/08/2023 51
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(2)

▪ Thời gian thực hiện các lệnh đơn :


gán, đọc, viết, goto là O(1).
▪ Lệnh hợp thành:
thời gian thực hiện lệnh hợp thành được xác định bởi luật tổng.
▪ Lệnh if (đk logic B) S1; else S2; :
giả sử thời gian thực hiện các lệnh S1, S2 là O(f1(n)) và
O(f2(n)) tương ứng. Khi đó thời gian thực hiện lệnh if là
O(max(f1(n), f2(n))).
26/08/2023 52
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(3)

▪ Lệnh switch…case: được đánh giá như lệnh if.


▪ Lệnh for: được đánh giá tương tự lệnh while
▪ Lệnh while: giả sử thời gian thực hiện lệnh S (thân của
lệnh while) là O(f(n)). Giả sử g(n) là số tối đa các lần
thực hiện lệnh S, khi thực hiện lệnh while. Khi đó thời
gian thực hiện lệnh while là O(f(n)g(n)).

26/08/2023 53
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(4)
▪ Ví dụ: Câu lệnh gán : x = x +1 có thời gian thực hiện bằng c
(hằng số) nên được đánh giá là O(1).
Câu lệnh for (i = 1;i<= n; i++)
x = x +1;
có thời gian thực hiện O(n.1) = O(n).
▪ Ví dụ: Câu lệnh for (i = 1; i<=n; i ++)
for (j = 1;j<=n; j++)
x = x +1;
có thời gian được đánh giá là O(n.n) = O(n2)
Cũng có thể thấy O(c.f(n)) = O(f(n)) chẳng hạn O(n2/2) = O(n2).
26/08/2023 54
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(5)
▪ Ví dụ:
void BubleSort(int a[], int N )
{ int i, j,temp;
(1) for (i = 0 ; i<N-1 ; i++)
(2) for (j =N-1; j >i ; j --)
(3) if(a[j]< a[j-1]) {
(4) temp=a[j-1];
(5) a[j-1]=a[j];
(6) a[j]=temp
}
} Áp dụng các qui tắc ta được T(n)=O(N2)
26/08/2023 55
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(6)
▪ Ví dụ: int Euclid (int m, int n)
{ int r;
(1) r = m % n ;
(2) while (r != 0)
(3) { m =n;
(4) n =r;
(5) r=m%n;
}
(6) return n;
}
Áp dụng các qui tắc ta được O(n)=O(log2(n))
26/08/2023 56
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(7)

▪ Các Hàm Đệ Qui


• Giả thiết rằng các hàm là đệ qui trực tiếp. Điều đó có nghĩa
là các hàm chỉ chứa các lời gọi đệ qui đến chính nó.
• Giả sử thời gian thực hiện hàm là T(n), với n là cỡ dữ liệu
vào. Khi đó thời gian thực hiện các lời gọi đệ qui hàm sẽ là
T(m), với m < n

26/08/2023 57
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(8)

▪ Các Hàm Đệ Qui


• Đánh giá thời gian T(n0), với n0 là cỡ dữ liệu vào nhỏ nhất có
thể được
• Sau đó đánh giá thân của hàm theo các qui tắc, ta sẽ nhận được
quan hệ đệ qui sau đây.T(n) = F(T(m1), T(m2), ..., T(mk))
• Giải phương trình đệ qui này, ta sẽ nhận được sự đánh giá của
T(n)
26/08/2023 58
1.7 Các Qui Tắc Đánh Giá Thời Gian Thực Hiện Giải thuật(9)
▪ Ví dụ:
int fact(int n)
{
if (n <=1) return 1
else return n * fac(n-1)
}

▪ Đánh giá
• T(1)=C1
• T(n) = C2 + T(n-1)
• →T(n) = (n-1) C2 + C1 →T(n)=0(n)
26/08/2023 59
1.8 Câu Hỏi Ôn Tập Bài 1 (1)

1. Viết chương trình C khai báo kiểu dữ liệu là mảng một chiều,
chương trình có các chức năng như sau:
• Nhập giá trị vào mảng.
• Xuất các phần tử trong mảng.
2. Viết chương trình C có khai báo kiểu dữ liệu là mảng hai
chiều, chương trình có các chức năng sau:
• Nhập giá trị vào ma trận.
• Xuất các phần tử trong ma trận.
26/08/2023 60
1.8 Câu Hỏi Ôn Tập Bài 1 (2)

3. Hãy xây dựng và hiện thực kiểu dữ liệu trừu tượng cho thông
tin sinh viên với các thao tác nhập, xuất thông tin của sinh viên.

4. Hãy xây dựng và hiện thực kiểu dữ liệu trừu tượng của số
hữu tỉ a/b với các tác vụ cộng hai số hữu tỉ, nhân hai số hữu tỉ,
chia hai số hữu tỉ.

26/08/2023 61

You might also like