HUTECH
TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHỆ ------------
CẤU TRÚC DỮ LIỆU & GT
CHƯƠNG 1
GV: ThS. NGUYỄN HÀ GIANG
TP. HCM – 1/2009
T G & L D T C
1
HUTECH
Nội dung
• Dự án tin học
• Chương trình máy tính • Cấu trúc dữ liệu & giải thuật • Tiêu chuẩn đánh giá CTDL • Giải thuật • Kiểu dữ liệu trong máy tính • Độ phức tạp của giải thuật
– Biểu diễn đối tượng – Xử lý dữ liệu
T G & L D T C
2
HUTECH
Dự án tin học
Bài toán giải quyết trong máy tính
Bài toán thực tế
Đối tượng dữ liệu
Xử lý trên đối tượng DL
T G & L D T C
3
HUTECH
Tổ chức biểu diễn đối tượng
• Dữ liệu thực tế:
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!
– 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
Xây dựng CTDL
T G & L D T C
4
HUTECH
Xây dựng thao tác xử lý DL
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
Thao tác xử lý
Kết quả mong muốn
T G & L D T C
5
HUTECH
Chương trình máy tính
Quan hệ chặt chẽ
Cấu trúc dữ liệu
Giải thuật
Chương trình
T G & L D T C
6
HUTECH
CTDL & Giải thuật
• Có mối quan hệ mật thiết
– Giải thuật phản ánh phép xử lý, còn đối tượng xử
lý của giải thuật là dữ liệu.
– Với CTDL đã chọn sẽ có những giải thuật tương
ứng phù hợp.
– Khi CTDL thay đổi thì GT cũng thay đổi tránh xử lý gượng ép, thiếu tự nhiên trên cấu trúc ko thích hợp.
– CTDL tốt giúp giải thuật xử lý phát huy tốt đa
khả năng.
T G & L D T C
7
HUTECH
Ví dụ
Quản lý điểm học sinh: gồm có 4 điểm, và 3 học sinh Thao tác duy nhất là xuất điểm số từng môn học của học sinh!
Học sinh Tiên Tùng Thảo Toán 7 9 8 Lý 9 5 6 Hoá 5 8 9 Văn 6 7 5
T G & L D T C
8
HUTECH
Ví dụ
– int result[12] = { 7, 9, 5, 6, 9, 5, 8, 7, 8, 6, 9, 5 };
• Phương án A: dùng mảng 1 chiều
7 9 5 6 9 5 8 7 8 6 9 5
Tiên
Tùng
Thảo
T G & L D T C
9
HUTECH
Ví dụ
• Truy xuất điểm môn j của hs i là phần tử tại dòng i và cột j
– Bảng điểm(i, j) result[((i-1)*số cột)+j]
• Ngược lại
– Result[i] Bảng điểm(dòng((i/số cột)+1), cột((i-1) %số cột)+1)
• Thao tác xử lý như sau:
void XuatDiem() {
const int so_mon = 4; int sv, mon; for( int i=0; i < 12; i++) {
sv = i/so_mon; mon = i % so_mon; printf(“Diem mon %d của sv % d là %d”, mon, sv, result[i]);
}
}
T G & L D T C
10
HUTECH
Ví dụ
– Sử dụng mảng 2 chiều – int result[3][4] = { {7, 9, 5, 6}, {9, 5, 8, 7}, {8, 6, 9, 5} };
• Phương án B:
Cột 0 7 9 8 Cột 1 9 5 6 Cột 2 5 8 9 Cột 3 6 7 5 Dòng 0 Dòng 1 Dòng 2
T G & L D T C
11
HUTECH
Ví dụ
• Truy xuất điểm số môn j của học sinh i là phần tử dòng i và
cột j trong bảng – Bảng điểm(dòng i, cột j) result[i][j]
• Theo phương án này thì phần xử lý như sau:
void XuatDiem() {
int so_mon = 4, so_sv=3; for(int i=0; i < so_sv; i++)
for(int j=0; j
{
printf(“Diem mon %d của sv %d là %d”, j, i, result[i][j]);
}
}
T
G
&
L
D
T
C
12
HUTECH
Ví dụ
• Nhận xét: về 2 phương án
– Phương án B cung cấp cấu trúc dữ liệu phù hợp
với thực tế hơn!
– Do đó giải thuật xây dựng trên CTDL B cũng
đơn giản và tự nhiên hơn.
T
G
&
L
D
T
C
13
HUTECH
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
• VD:
toán.
– Chọn kiểu dữ liệu nguyên lưu trữ tiền thưởng bán
hàng (TienThuong)
• TienThuong = trị giá hàng * 5%
T
G
&
L
D
T
C
14
HUTECH
Các tiêu chuẩn đánh giá CTDL
• 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ả
• VD:
của dự án tin học.
– Dữ liệu được cập nhật thêm, xoá liên tục nên
dùng cấu trúc danh sách liên kết!
– Dữ liệu có kích thước cố định, không thêm xóa
thì dùng mảng (có thể tĩnh)
T
G
&
L
D
T
C
15
HUTECH
Các tiêu chuẩn đánh giá CTDL
• 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
• VD:
năng & nhiệm vụ.
T
G
&
L
D
T
C
16
HUTECH
Các tiêu chuẩn đánh giá CTDL
• Sự thích hợp giữa CTDL & NNLT:
– Dễ dàng cài đặt trên ngôn ngữ được chọn
T
G
&
L
D
T
C
17
HUTECH
Thuật toán - giải thuật
• Thuật toán: hệ thống chặt chẽ và rõ ràng các
quy tắc nhằm xác định dãy thao tác trên
CTDL, sao cho
– Một bộ dữ liệu vào
– Sau một số hữu hạn bước thực hiện thao tác chỉ
ra.
– Kết quả đạt được theo mục tiêu đã định.
T
G
&
L
D
T
C
18
HUTECH
Thuật toán - giải thuật
•
Các đặc trưng của thuật toán
1. Tính đơn nghĩa:
• Đơn định:
• Ngẫu nhiên:
2. Tính dừng:
3. Tính đúng:
4. Tính phổ dụng:
T
G
&
L
D
T
C
19
HUTECH
Thuật toán - giải thuật
5. Tính khả thi:
1. Kích thước phải đủ nhỏ
2. Thuật toán phải chuyển được thành chương
trình
3. Thuật toán phải được máy tính thực hiện
trong thời gian cho phép
T
G
&
L
D
T
C
20
HUTECH
VD về giải thuật
• Input: hai số nguyên a và b khác 0
• Output: ước số chung lớn nhất của a và b
• Các bước thực hiện như sau (Euclide)
– B1: nhập a và b: số tự nhiên
– B2: nếu B ≠ 0 sang B3, ngược lại qua B4
– B3: đặt r = a mod b; a = b; b = r; quay lại B2
– B4: kết quả USCLN là giá trị a. Kết thúc thuật
toán
T
G
&
L
D
T
C
21
HUTECH
VD về giải thuật
Begin
Sinh viên
cài đặt
Input a, b
no
b >0
Output a
yes
r := a mod b;
a :=b;
b :=r;
End
T
G
&
L
D
T
C
22
HUTECH
Bài toán chương trình
• Bài toán thực tế
Làm ntn ?
Phải làm gì?
– Xác định bài toán
T
G
&
L
D
T
C
23
HUTECH
Các bước tiếp cận bài toán
1. Mô hình hoá bài toán
2. Tìm giải thuật trên mô hình đó
3. Hình thức hoá giải thuật thông qua các thủ tục hay
mã giả
4. Cài đặt giải thuật trên NNLT cụ thể
Mô hình toán học
Kiểu DL trừu tượng
CTDL
Giải thuật hình thức
Chương trình mã giả
CT Pascal, C, Java,C#...
T
G
&
L
D
T
C
24
HUTECH
Kiểu dữ liệu trừu tượng
– 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á:
• Trừu tượng hoá dữ liệu: đưa ra các kiểu dữ liệu trừu
tượng (Abstract Data Type)
– Mô tả dữ liệu
– Tác vụ liên quan
• ADT: gồm
• 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.
T
G
&
L
D
T
C
25
HUTECH Kiểu dữ liệu trừu tượng
T =
• V: là tập giá trị, miền giá trị mà kiểu T có thể
nhận
• O: là tập các thao tác cơ bản được định nghĩa
trên V
T
G
&
L
D
T
C
26
HUTECH Kiểu dữ liệu trừu tượng
• T: int
• V: {-32768…32767}
• O: {+,-,*,/, %,>,<,>=,<=…}
T
G
&
L
D
T
C
27
HUTECH Kiểu dữ liệu trừu tượng
• Cài đặt theo hướng cấu trúc
– Sử dụng trong lập trình thủ tục
– Xây dựng thao tác dưới dạng thủ tục/hàm
– Các thao tác & dữ liệu (V, O) tách rời nhau
– Dữ liệu không được “bảo vệ”, do có thể truy xuất
ở bất cứ đâu trong phạm vi dữ liệu khai báo!
T
G
&
L
D
T
C
28
HUTECH Kiểu dữ liệu trừu tượng
• Cài đặt theo hướng đối tượng
– Dữ liệu và thao tác được tích hợp lại
– Dữ liệu được ẩn và được bảo vệ, tránh những
truy xuất trực tiếp
– Chương trình chỉ truy xuất đến dữ liệu thông qua
các thao tác định nghĩa
– Che dấu những xử lý cục bộ, chỉ đưa ra thao tác
thật sự cần thiết!
– Nâng cao tính module hóa chương trình
T
G
&
L
D
T
C
29
HUTECH
Kiểu dữ liệu – CTDL - ADT
• Kiểu dữ liệu: một tập hợp các giá trị và một tập hợp
AND, OR, NOT…
– Kiểu Integer là tập hợp các số nguyên có giá trị từ -32768
đến 32767 với các phép toán cộng trừ nhân chia, mod…
các phép toán trên các giá trị đó
– Kiểu boolean gồm 2 giá trị {true, false} và các phép toán
– Kiểu DL sơ cấp
– Kiểu dữ liệu cấu trúc hay cấu trúc dữ liệu.
• Kiểu dữ liệu:
T
G
&
L
D
T
C
30
HUTECH
Kiểu dữ liệu cơ bản
• Thường đơn giản và ko 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.
– số nguyên
– số thực
– ký tự
– giá trị logic
• Thường là các trị vô hướng:
T
G
&
L
D
T
C
31
HUTECH
Kiểu dữ liệu cơ bản
Tên kiểu
KT
Miền giá trị
Ghi chú
-128 đến 127
char
01
Có thể dùng như số nguyên 1 byte có
dấu hay kiểu ký tự
0 đến 255
Số nguyên 1 byte ko dấu
unsigned char
01
-32768 đến 32767
int
02
0 đến 65355
Gọi tắt là unsigned
unsigned int
02
-232 đến 231 -1
long
04
0 đến 232 -1
unsigned long
04
3.4E-38 … 3.4E38
float
04
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.
1.7E-308 … 1.7E308
double
08
3.4E-4932 …1.1E4932
long double
10
T
G
&
L
D
T
C
32
HUTECH
Kiểu dữ liệu cấu trúc
• 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 NN đều cài đặt sẵn một số kiểu có
cấu trúc cơ bản như 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.
T
G
&
L
D
T
C
33
HUTECH
Kiểu dữ liệu cấu trúc
• Cấu trúc dữ liệu SV
Mã SV: chuỗi kt
/ số nguyên
Tên SV: chuỗi kt
Ngày sinh: ngày tháng
Nơi sinh: chuỗi kt
Điểm thi: số nguyên
Sinh viên
T
G
&
L
D
T
C
34
HUTECH
Kiểu dữ liệu cấu trúc
• Hiện thực
– Kiểu dữ liệu cơ sở cho phép mô tả
thông tin:
typedef struct tagSV
{
• int DiemThi
– Thông tin khác đòi hỏi kiểu dữ liệu
char MSSV[15];
cấu trúc:
char TenSV[30];
char NoiSinh[30];
• char MSSV[15];
• char TenSV[30];
• char NoiSinh[30];
Date NgaySinh;
– Thông tin ngày tháng năm sinh dùng
struct:
int DiemThi;
• typedef struct tagDate
{
} SinhVien;
char ngay;
char thang;
char nam;
} Date;
T
G
&
L
D
T
C
35
HUTECH
Độ phức tạp của giải thuật
• Sự cần thiết phân tích giải thuật
GT A
GT C
GT tốt
GT B
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
T
G
&
L
D
T
C
36
HUTECH
Thời gian thực hiện
• Thời gian thực hiện phụ thuộc vào
• Thời gian thực hiện một chương trình là một
hàm theo kích thước dữ liệu vào: T(n), n là
kích thước của dữ liệu vào.
– Giải thuật
– Tập chỉ thị của máy tính
– Cấu hình của máy tính (tốc độ)
– Kỹ năng của người lập trình
T
G
&
L
D
T
C
37
HUTECH
Thời gian thực hiện
• Đơn vị của T(n) : theo số lệnh được thực hiện.
• T(n) = Cn: CT cần Cn chỉ thị thực thi
• Thời gian thực hiện xấu nhất: do tính chất dữ
liệu cũng ảnh hưởng
– Chương trình sắp xếp sẽ cho thời gian khác nhau
• T(n) thường được xem là TG chương trình
thực hiện xấu nhất trên DL kích thước n.
với các bộ DL có thứ tự khác nhau!
T
G
&
L
D
T
C
38
HUTECH
Tỉ suất tăng
• Hàm ko âm T(n) có tỉ suất tăng f(n) nếu tồn tại
các hằng số C và N0 sao cho:
– T(n) < Cf(n), với mọi n ≥ N0
– “cho hàm ko âm T(n) bất kỳ, ta luôn tìm được tỷ
• Giả sử T(0) =1, T(1) = 4, tổng quát
T(n) = (n+1)2.
suất tăng f(n) của nó”
– Đặt N0 = 1, và C = 4, thì n ≥ 1, chứng minh
được rằng T(n) = (n+1)2 ≤ 4n2, n ≥ 1, tỉ suất
tăng khi đó n2
T
G
&
L
D
T
C
39
HUTECH
Độ phức tạp giải thuật
T2(n) = 5n3
T1(n) = 100n2
• Khi n đủ lớn: n > 20, thì T1(n) < T2(n)
• Cách hợp lý nhất là xét tỷ suất tăng của hàm
TG thực hiện CT thay vì chính bản thân thời
gian thực hiện.
T
G
&
L
D
T
C
40
HUTECH
Độ phức tạp giải thuật
• Cho hàm T(n), T(n) có độ phức tạp f(n) nếu
tồn tại các hằng C, N0 sao cho:
– T(n) ≤ Cf(n) với mọi n ≥ N0 (tức là T(n) có tỉ
suất tăng là f(n) và ký hiệu T(n) là O(f(n))
– VD: T(n) = (n+1)2 có tỷ suất tăng là n2 nên T(n)
= (n+1)2 là O(n2).
– Lưu ý: O(Cf(n)) = O(f(n)) với C là hằng số.
• Nói cách khác độ phức tạp tính toán giải
thuật là hàm chặn trên của hàm thời gian
O(C) = O(1).
T
G
&
L
D
T
C
41
HUTECH
Độ phức tạp giải thuật
• Các độ phức tạp thường gặp:
• Thông thường thuật giải có độ phức tạp đa
thức thì có thể cài đặt
• Còn phức tạp ở mức hàm mũ thì phải cải tiến
giải thuật!
– Log2n, n, nlog2n, n2, n3, 2n, n!, nn
T
G
&
L
D
T
C
42
HUTECH
Qui tắc tính độ phức tạp
• Thời gian thực hiện lệnh gán, đọc/ghi dữ liệu là O(1).
• Thời gian thực hiện một chuỗi tuần tự các lệnh được
xác định bằng quy tắc cộng.
• Thời gian thực hiện cấu trúc IF là thời gian lớn nhất
thực hiện sau THEN hoặc ELSE và thời gian điều
kiện. Thường thời gian điều kiện là O(1).
• Thời gian thực hiện vòng lặp là tổng thời gian thực
hiện thân vòng lặp. Nếu thời gian thực hiện thân
vòng lặp ko đổi thì tg thực hiện vòng lặp là tích số
lần lặp với thời gian thực hiện thân vòng lặp
T
G
&
L
D
T
C
43
HUTECH
VD tính độ phức tạp
if (a[j-1] > a[j]){
• VD giải thuật sắp xếp nổi bọt
– (1) for(i = 0; i < n-1; i++)
for(j=n-1; j >i; j--)
– (2)
– (3)
– (4)
– (5)
– (6)
– (7)
temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
T
G
&
L
D
T
C
44
HUTECH
VD tính độ phức tạp
• VD hàm tìm kiếm tuần tự
i=0;
found = false;
while ( i
found = true;
else
i++;
return found; – (1)
– (2)
– (3)
– (4)
– (5)
– (6)
– (7)
– (8)
T
G
&
L
D
T
C
45
HUTECH
Tài liệu tham khảo
[1]. Cấu trúc dữ liệu & thuật toán, Dương Anh
Đức, Trần Hạnh Nhi, ĐHKHTN, 2000.
[2]. Kỹ thuật lập trình, Học viện BCVT, 2002.
[3]. Cấu trúc dữ liệu, Nguyễn Trung Trực,
ĐHBK, 1992.
[4]. Giải thuật & lập trình, Lê Minh Hoàng,
ĐHSPHN, 1999-2002.
[4]. Fundamentals of Data Structures, Ellis
Horowitz, Sartaj Sahni
[5]. Foundations of Algorithms Using C++
Pseudocode, Richard Neapolitan and Kumarss,
Jones and Bartlett Publishers © 2004
[6]. Giải thuật, Nguyễn Văn Linh, ĐH Cần thơ, 2003
T
G
&
L
D
T
C
46
{
printf(“Diem mon %d của sv %d là %d”, j, i, result[i][j]);
}
}
T G & L D T C
12
HUTECH
Ví dụ
• Nhận xét: về 2 phương án
– Phương án B cung cấp cấu trúc dữ liệu phù hợp
với thực tế hơn!
– Do đó giải thuật xây dựng trên CTDL B cũng
đơn giản và tự nhiên hơn.
T G & L D T C
13
HUTECH
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
• VD:
toán.
– Chọn kiểu dữ liệu nguyên lưu trữ tiền thưởng bán
hàng (TienThuong) • TienThuong = trị giá hàng * 5%
T G & L D T C
14
HUTECH
Các tiêu chuẩn đánh giá CTDL
• 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ả
• VD:
của dự án tin học.
– Dữ liệu được cập nhật thêm, xoá liên tục nên
dùng cấu trúc danh sách liên kết!
– Dữ liệu có kích thước cố định, không thêm xóa
thì dùng mảng (có thể tĩnh)
T G & L D T C
15
HUTECH
Các tiêu chuẩn đánh giá CTDL
• 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
• VD:
năng & nhiệm vụ.
T G & L D T C
16
HUTECH
Các tiêu chuẩn đánh giá CTDL
• Sự thích hợp giữa CTDL & NNLT:
– Dễ dàng cài đặt trên ngôn ngữ được chọn
T G & L D T C
17
HUTECH
Thuật toán - giải thuật
• Thuật toán: hệ thống chặt chẽ và rõ ràng các quy tắc nhằm xác định dãy thao tác trên CTDL, sao cho – Một bộ dữ liệu vào – Sau một số hữu hạn bước thực hiện thao tác chỉ
ra.
– Kết quả đạt được theo mục tiêu đã định.
T G & L D T C
18
HUTECH
Thuật toán - giải thuật
•
Các đặc trưng của thuật toán 1. Tính đơn nghĩa: • Đơn định: • Ngẫu nhiên:
2. Tính dừng: 3. Tính đúng: 4. Tính phổ dụng:
T G & L D T C
19
HUTECH
Thuật toán - giải thuật
5. Tính khả thi:
1. Kích thước phải đủ nhỏ 2. Thuật toán phải chuyển được thành chương
trình
3. Thuật toán phải được máy tính thực hiện
trong thời gian cho phép
T G & L D T C
20
HUTECH
VD về giải thuật
• Input: hai số nguyên a và b khác 0 • Output: ước số chung lớn nhất của a và b • Các bước thực hiện như sau (Euclide)
– B1: nhập a và b: số tự nhiên – B2: nếu B ≠ 0 sang B3, ngược lại qua B4 – B3: đặt r = a mod b; a = b; b = r; quay lại B2 – B4: kết quả USCLN là giá trị a. Kết thúc thuật
toán
T G & L D T C
21
HUTECH
VD về giải thuật
Begin
Sinh viên cài đặt
Input a, b
no
b >0
Output a
yes
r := a mod b; a :=b; b :=r;
End
T G & L D T C
22
HUTECH
Bài toán chương trình
• Bài toán thực tế
Làm ntn ?
Phải làm gì?
– Xác định bài toán
T G & L D T C
23
HUTECH
Các bước tiếp cận bài toán
1. Mô hình hoá bài toán 2. Tìm giải thuật trên mô hình đó 3. Hình thức hoá giải thuật thông qua các thủ tục hay
mã giả
4. Cài đặt giải thuật trên NNLT cụ thể
Mô hình toán học
Kiểu DL trừu tượng
CTDL
Giải thuật hình thức
Chương trình mã giả
CT Pascal, C, Java,C#...
T G & L D T C
24
HUTECH
Kiểu dữ liệu trừu tượng
– 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á:
• Trừu tượng hoá dữ liệu: đưa ra các kiểu dữ liệu trừu
tượng (Abstract Data Type)
– Mô tả dữ liệu – Tác vụ liên quan
• ADT: gồm
• 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.
T G & L D T C
25
HUTECH Kiểu dữ liệu trừu tượng
T =
• V: là tập giá trị, miền giá trị mà kiểu T có thể
nhận
• O: là tập các thao tác cơ bản được định nghĩa
trên V
T G & L D T C
26
HUTECH Kiểu dữ liệu trừu tượng
• T: int • V: {-32768…32767} • O: {+,-,*,/, %,>,<,>=,<=…}
T G & L D T C
27
HUTECH Kiểu dữ liệu trừu tượng
• Cài đặt theo hướng cấu trúc
– Sử dụng trong lập trình thủ tục – Xây dựng thao tác dưới dạng thủ tục/hàm – Các thao tác & dữ liệu (V, O) tách rời nhau – Dữ liệu không được “bảo vệ”, do có thể truy xuất
ở bất cứ đâu trong phạm vi dữ liệu khai báo!
T G & L D T C
28
HUTECH Kiểu dữ liệu trừu tượng
• Cài đặt theo hướng đối tượng
– Dữ liệu và thao tác được tích hợp lại – Dữ liệu được ẩn và được bảo vệ, tránh những
truy xuất trực tiếp
– Chương trình chỉ truy xuất đến dữ liệu thông qua
các thao tác định nghĩa
– Che dấu những xử lý cục bộ, chỉ đưa ra thao tác
thật sự cần thiết!
– Nâng cao tính module hóa chương trình
T G & L D T C
29
HUTECH
Kiểu dữ liệu – CTDL - ADT
• Kiểu dữ liệu: một tập hợp các giá trị và một tập hợp
AND, OR, NOT…
– Kiểu Integer là tập hợp các số nguyên có giá trị từ -32768 đến 32767 với các phép toán cộng trừ nhân chia, mod…
các phép toán trên các giá trị đó – Kiểu boolean gồm 2 giá trị {true, false} và các phép toán
– Kiểu DL sơ cấp – Kiểu dữ liệu cấu trúc hay cấu trúc dữ liệu.
• Kiểu dữ liệu:
T G & L D T C
30
HUTECH
Kiểu dữ liệu cơ bản
• Thường đơn giản và ko 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.
– số nguyên – số thực – ký tự – giá trị logic
• Thường là các trị vô hướng:
T G & L D T C
31
HUTECH
Kiểu dữ liệu cơ bản
Tên kiểu
KT
Miền giá trị
Ghi chú
-128 đến 127
char
01
Có thể dùng như số nguyên 1 byte có dấu hay kiểu ký tự
0 đến 255
Số nguyên 1 byte ko dấu
unsigned char
01
-32768 đến 32767
int
02
0 đến 65355
Gọi tắt là unsigned
unsigned int
02
-232 đến 231 -1
long
04
0 đến 232 -1
unsigned long
04
3.4E-38 … 3.4E38
float
04
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.
1.7E-308 … 1.7E308
double
08
3.4E-4932 …1.1E4932
long double
10
T G & L D T C
32
HUTECH
Kiểu dữ liệu cấu trúc
• 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 NN đều cài đặt sẵn một số kiểu có cấu trúc cơ bản như 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.
T G & L D T C
33
HUTECH
Kiểu dữ liệu cấu trúc
• Cấu trúc dữ liệu SV
Mã SV: chuỗi kt / số nguyên
Tên SV: chuỗi kt
Ngày sinh: ngày tháng
Nơi sinh: chuỗi kt
Điểm thi: số nguyên
Sinh viên
T G & L D T C
34
HUTECH
Kiểu dữ liệu cấu trúc
• Hiện thực
– Kiểu dữ liệu cơ sở cho phép mô tả
thông tin:
typedef struct tagSV {
• int DiemThi
– Thông tin khác đòi hỏi kiểu dữ liệu
char MSSV[15];
cấu trúc:
char TenSV[30];
char NoiSinh[30];
• char MSSV[15]; • char TenSV[30]; • char NoiSinh[30];
Date NgaySinh;
– Thông tin ngày tháng năm sinh dùng
struct:
int DiemThi;
• typedef struct tagDate
{
} SinhVien;
char ngay; char thang; char nam;
} Date;
T G & L D T C
35
HUTECH
Độ phức tạp của giải thuật
• Sự cần thiết phân tích giải thuật
GT A
GT C
GT tốt
GT B
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
T G & L D T C
36
HUTECH
Thời gian thực hiện
• Thời gian thực hiện phụ thuộc vào
• Thời gian thực hiện một chương trình là một hàm theo kích thước dữ liệu vào: T(n), n là kích thước của dữ liệu vào.
– Giải thuật – Tập chỉ thị của máy tính – Cấu hình của máy tính (tốc độ) – Kỹ năng của người lập trình
T G & L D T C
37
HUTECH
Thời gian thực hiện
• Đơn vị của T(n) : theo số lệnh được thực hiện. • T(n) = Cn: CT cần Cn chỉ thị thực thi • Thời gian thực hiện xấu nhất: do tính chất dữ
liệu cũng ảnh hưởng – Chương trình sắp xếp sẽ cho thời gian khác nhau
• T(n) thường được xem là TG chương trình
thực hiện xấu nhất trên DL kích thước n.
với các bộ DL có thứ tự khác nhau!
T G & L D T C
38
HUTECH
Tỉ suất tăng
• Hàm ko âm T(n) có tỉ suất tăng f(n) nếu tồn tại
các hằng số C và N0 sao cho: – T(n) < Cf(n), với mọi n ≥ N0 – “cho hàm ko âm T(n) bất kỳ, ta luôn tìm được tỷ
• Giả sử T(0) =1, T(1) = 4, tổng quát T(n) = (n+1)2.
suất tăng f(n) của nó”
– Đặt N0 = 1, và C = 4, thì n ≥ 1, chứng minh được rằng T(n) = (n+1)2 ≤ 4n2, n ≥ 1, tỉ suất tăng khi đó n2
T G & L D T C
39
HUTECH
Độ phức tạp giải thuật
T2(n) = 5n3
T1(n) = 100n2
• Khi n đủ lớn: n > 20, thì T1(n) < T2(n) • Cách hợp lý nhất là xét tỷ suất tăng của hàm TG thực hiện CT thay vì chính bản thân thời gian thực hiện.
T G & L D T C
40
HUTECH
Độ phức tạp giải thuật
• Cho hàm T(n), T(n) có độ phức tạp f(n) nếu
tồn tại các hằng C, N0 sao cho: – T(n) ≤ Cf(n) với mọi n ≥ N0 (tức là T(n) có tỉ suất tăng là f(n) và ký hiệu T(n) là O(f(n))
– VD: T(n) = (n+1)2 có tỷ suất tăng là n2 nên T(n)
= (n+1)2 là O(n2).
– Lưu ý: O(Cf(n)) = O(f(n)) với C là hằng số.
• Nói cách khác độ phức tạp tính toán giải thuật là hàm chặn trên của hàm thời gian
O(C) = O(1).
T G & L D T C
41
HUTECH
Độ phức tạp giải thuật
• Các độ phức tạp thường gặp:
• Thông thường thuật giải có độ phức tạp đa
thức thì có thể cài đặt
• Còn phức tạp ở mức hàm mũ thì phải cải tiến
giải thuật!
– Log2n, n, nlog2n, n2, n3, 2n, n!, nn
T G & L D T C
42
HUTECH
Qui tắc tính độ phức tạp
• Thời gian thực hiện lệnh gán, đọc/ghi dữ liệu là O(1). • Thời gian thực hiện một chuỗi tuần tự các lệnh được
xác định bằng quy tắc cộng.
• Thời gian thực hiện cấu trúc IF là thời gian lớn nhất thực hiện sau THEN hoặc ELSE và thời gian điều kiện. Thường thời gian điều kiện là O(1).
• Thời gian thực hiện vòng lặp là tổng thời gian thực hiện thân vòng lặp. Nếu thời gian thực hiện thân vòng lặp ko đổi thì tg thực hiện vòng lặp là tích số lần lặp với thời gian thực hiện thân vòng lặp
T G & L D T C
43
HUTECH
VD tính độ phức tạp
if (a[j-1] > a[j]){
• VD giải thuật sắp xếp nổi bọt – (1) for(i = 0; i < n-1; i++) for(j=n-1; j >i; j--) – (2) – (3) – (4) – (5) – (6) – (7)
temp = a[j-1]; a[j-1] = a[j]; a[j] = temp;
}
T G & L D T C
44
HUTECH
VD tính độ phức tạp
• VD hàm tìm kiếm tuần tự
i=0;
found = false;
while ( i found = true; else i++; return found; – (1)
– (2)
– (3)
– (4)
– (5)
– (6)
– (7)
– (8) [1]. Cấu trúc dữ liệu & thuật toán, Dương Anh
Đức, Trần Hạnh Nhi, ĐHKHTN, 2000. [2]. Kỹ thuật lập trình, Học viện BCVT, 2002.
[3]. Cấu trúc dữ liệu, Nguyễn Trung Trực, ĐHBK, 1992. [4]. Giải thuật & lập trình, Lê Minh Hoàng, ĐHSPHN, 1999-2002. [4]. Fundamentals of Data Structures, Ellis Horowitz, Sartaj Sahni [5]. Foundations of Algorithms Using C++ Pseudocode, Richard Neapolitan and Kumarss,
Jones and Bartlett Publishers © 2004 [6]. Giải thuật, Nguyễn Văn Linh, ĐH Cần thơ, 2003T
G
&
L
D
T
C
45
HUTECH
Tài liệu tham khảo
T
G
&
L
D
T
C
46