Download as pdf or txt
Download as pdf or txt
You are on page 1of 54

CẤU TRÚC DỮ LIỆU VÀ

THUẬT GIẢI
Chương 1:
ÔN TẬP VỀ NGÔN NGỮ LẬP TRÌNH
Mục tiêu:
1. Nhắc lại các kiến thức cơ bản trong lập trình C
2. Giới thiệu vai trò của tổ chức dữ liệu
3. Mối quan hệ giữa giải thuật & cấu trúc dữ liệu
4. Các khái niệm và yêu cầu về CTDL
5. Tổng quan về đánh giá độ phức tạp giải thuật
Nội dung:
1. Kiểu dữ liệu
2. Xác định bài toán
3. Cấu trúc dữ liệu
4. Giải thuật
5. Độ phức tạp của giải thuật
6. Vai trò của cấu trúc dữ liệu & giải thuật
KIỂU DỮ LIỆU
➢ Xét đoạn chương trình sau:
void main()
{
char x=200, y=100, z;
z=x+y; printf(“Z=%d“,z);
}
KHÁI NIỆM VỀ KIỂU DỮ LIỆU
T = <V, O>
➢Các thuộc tính của một kiểu dữ liệu gồm:
✓ T: Tên kiểu dữ liệu
✓ V: Miền giá trị (thường phụ thuộc vào kích thước lưu trữ)
✓ O: Tập các xử lý tác động lên kiểu dữ liệu đó
PHÂN LOẠI DỮ LIỆU
Dữ liệu tỉnh ( kiểu dữ liệu cơ bản)
➢ Kiểu cơ số: Số nguyên, số thực và kiểu logic
➢ Kiểu dãy (mảng), xâu ký tự
➢ Kiểu có cấu trúc
➢ Kiểu tập tin
PHÂN LOẠI DỮ LIỆU
Dữ liệu động
➢ Danh sách liên kết
➢ Hàng đợi
➢ Ngăn xếp
➢ Cây
➢ Bảng băm
PHÂN LOẠI DỮ LIỆU

• Kiểu dữ liệu tỉnh. • Kiểu dữ liệu động


✓ Được định nghĩa ở thời điểm biên dịch ✓Được gắn kết với một con trỏ( Tại thời
điểm biên dịch chưa có)
✓Được cấp phát ở thời điểm liên kết
✓Phát sinh lúc thực thi
✓Có thể có giá trị ban đầu tùy theo từng
ngôn ngữ lập trình ✓Không xác định giá trị ban đầu
✓Tồn tại đến khi kết thúc chương trình ✓Được giải phóng khỏi bộ nhớ khi cần
PHÂN LOẠI KIỂU DỮ LIỆU

➢Kiểu dữ liệu tĩnh


✓Kiểu số nguyên
PHÂN LOẠI KIỂU DỮ LIỆU
➢Kiểu dữ liệu tĩnh
✓Kiểu số thực

✓Kiểu luận lý (C++)


PHÂN LOẠI KIỂU DỮ LIỆU
➢Kiểu dữ liệu tĩnh
✓Mãng một chiều

✓Kiểu xâu ký tự ( chuổi)


PHÂN LOẠI KIỂU DỮ LIỆU
➢Kiểu dữ liệu tĩnh
✓Kiểu có cấu trúc
PHÂN LOẠI KIỂU DỮ LIỆU

➢Kiểu dữ liệu động _


Biến con trỏ
✓Khi sử dụng phải cấp
phát biến con trỏ bằng
lệnh new, hủy bằng
lệnh delete
PHÂN LOẠI KIỂU DỮ LIỆU
➢Kiểu dữ liệu động _
Biến con trỏ
✓Truy cập thành phần của
biến
▪ Biến cấu trúc kiểu tĩnh
(cấu trúc): dùng dấu
chấm giữa tên biến và
thuộc tính thành phần
▪ Biến cấu trúc kiểu con
trỏ: dùng dấu chấm
giữa tên biến và thuộc
tính thành phần
XÁC ĐỊNH BÀI TOÁN

➢B1: Mô tả rõ
✓Input: các giả thiết, thông tin được cung cấp
✓Output: kết quả cần đạt được
➢B2: Lựa chọn cấu trúc dữ liệu sẽ sử dụng trong cài đặt chương
trình( Process)
➢B3: Thiết kế giải thuật: mô tả trình tự các thao tác trên một số
đối tượng nào đó sao cho môt số hữu hạn lần thực hiện ta thu
được kết quả như mong đợi.
CẤU TRÚC DỮ LIỆU

➢Khái niệm
✓Cách thức liên kết/ tổ chức các kiểu dữ liệu cơ sở/ kiểu dữ liệu có cấu
trúc hợp lý để sử dụng một cách hiệu quả.
✓Tập các thao tác để truy cập/ xử lý các thành phần dữ liệu
➢Các tiêu chuẩn đánh giá cấu trúc dữ liệu
✓Phản ánh đúng thực tế
✓Phù hợp với thao tác
✓Tiết kiệm tài nguyên hệ thống
GIẢI THUẬT (HAY THUẬT GIẢI)

➢Khái niệm
✓Giải thuật là một tổ hợp hữu hạn của các chỉ thị hay phương cách được
định nghĩa rõ ràng cho việc hoàn tất một số sự việc từ một trạng thái ban
đầu cho trước.
➢Các phương pháp biểu diễn thuật giải
✓Mã tự nhiên
✓Pseudocode (mã giả)
✓Flowchart (lưu đồ)
CÁC PHƯƠNG PHÁP BIỂU DIỄN GIẢI THUẬT

➢Mô tả thuật giải bằng mã tự nhiên


✓Thể hiện ý thưởng giải quyết bài toán bằng ngôn ngữ tự nhiên giản
lược.
✓Ví dụ: Tìm ước số chung lớn nhất của 2 số nguyên dương a, b
• Bước 1: Nếu a = b thì kết luận a là ước số chung lớn nhất, kết thúc
• Bước 2: Nếu a > b thì a = a – b; ngược lại thì b = b – a;
• Bước 3: Quay trở lại Bước 1
CÁC PHƯƠNG PHÁP BIỂU DIỄN GIẢI THUẬT
➢Mô tả giải thuật bằng mã giả (PSEUDOCODE)
✓Dễ hiểu, không chi tiết đến các kỹ thuật lập trình.
✓Ở cấp độ hết sức tổng quát: gần ngôn ngữ tự nhiên
✓Hoặc rất chi tiết: như dùng ngôn ngữ tựa Pascal, C++,….
✓Các từ khóa
CÁC PHƯƠNG PHÁP BIỂU DIỄN GIẢI THUẬT
➢Mô tả giải thuật bằng lưu đồ(Flowchart)
✓Các ký hiệu dung mô tả giải thuật.
CÁC PHƯƠNG PHÁP BIỂU DIỄN GIẢI THUẬT
➢Mô tả giải thuật bằng 3 phương pháp
✓Bài toán 1: cho số nguyên n. Tính trị tuyệt đối của n
• Đầu vào: số nguyên dương n
• Đầu ra: |n|
CÁC PHƯƠNG PHÁP BIỂU DIỄN GIẢI THUẬT
➢Mô tả giải thuật bằng 3 phương pháp
✓Bài toán 2: Giải và biện luận phương trình bậc nhất ax+b=0
• Đầu vào: 2 số nguyên a,b
• Đầu ra: nghiệm của phương trình
CÁC PHƯƠNG PHÁP BIỂU DIỄN GIẢI THUẬT
➢Mô tả giải thuật bằng 3 phương pháp
✓Bài toán 2: Giải và biện luận phương trình bậc nhất ax+b=0
• Đầu vào: 2 số nguyên a,b
• Đầu ra: nghiệm của phương trình
CÁC PHƯƠNG PHÁP BIỂU DIỄN GIẢI THUẬT
➢Mô tả giải thuật
bằng 3 phương
pháp
✓Bài toán 3: Giải và
biện luận phương
trình bậc hai ax2+bx
+c =0
• Đầu vào: 3 số
nguyên a,b,c
• Đầu ra: nghiệm
của phương
trình
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Cấu trúc tuần tự
Lệnh 1
Lệnh 2
Lệnh 3….

➢Cấu trúc rẻ nhánh


If
If…else
If…else lồng nhau nhiều cấp

➢Cấu trúc lựa chọn switch … case


➢Cấu trúc lặp
For
While
Do ….while
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C

➢Cấu trúc tuần tự


✓Cấu trúc tuần tự thực thi tiến
trình, mỗi lệnh được thực thi
theo một chuỗi từ trên
xuống, xong lệnh này rồi
chuyển xuống lệnh kế tiếp.
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C

➢Cấu trúc
tuần tự
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Cấu trúc rẽ nhánh
✓Công dụng: Cấu trúc
rẽ nhánh chỉ cho máy
tính chọn thực hiện
một dãy lệnh nào đó
dựa vào kết quả của
một điều kiện (biểu
thức quan hệ hay biểu
thức so sánh)
✓Phân loại: gồm hai
dạng
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Cấu trúc rẽ nhánh
✓Ví dụ 1: viết chương trình nhập vào một số, in ra trị tuyệt đối của số đó
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Cấu trúc rẽ
nhánh
✓Ví dụ 2: viết
chương trình
nhập vào số
nguyên a,b. Nếu
a là bội số của b
thì in thông báo
“ a là bội số của
b” ngược lại in
thông báo “ a
không là bội số
của b”.
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Cấu trúc lựa chọn
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Cấu trúc
nhiều lựa chọn
✓Ví dụ 1: Nhập
vào tháng n. Cho
biết tháng vừa
nhập thuộc quý
nào? Vẽ lưu đồ và
viết chương trình.
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Cấu trúc
nhiều lựa chọn
✓Ví dụ 1: Nhập
vào tháng n. Cho
biết tháng vừa
nhập thuộc quý
nào? Vẽ lưu đồ và
viết chương trình.
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Cấu trúc lặp
✓While : xét điều kiện trước khi thực hiện lệnh/ khối lệnh
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Cấu trúc lặp While
✓Ví dụ 1: Cho một số nguyên dương n, tính tổng các số từ 1->n ( n=5 => in ra là
15 vì 1+2+3+4+5 = 15)
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Cấu trúc lặp While
✓Ví dụ 2: Cho một số nguyên dương n, in ra số lớn nhất có trong n( n=5716 => in
ra “Số lớn nhất là 7”)
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Cấu trúc lặp
✓Do…While : xét điều kiện sau khi thực hiện lệnh/ khối lệnh
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Do…while
✓Ví dụ : Nhập vào một số nguyên dương n (n>0), nếu nhập sai thì yêu cầu nhập lại.
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Do…while
✓Ví dụ : Nhập vào một số nguyên dương n (n>0), nếu nhập sai thì thông báo lỗi và yêu cầu
nhập lại.
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C

➢Cấu trúc lặp


✓For : xét điều kiện
trước khi thực hiện
lệnh/ khối lệnh
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢For
✓Ví dụ: In ra màn hình 10 dòng chữ “Xin chao”
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C
➢Cấu trúc lặp For
✓Ví dụ 1: Cho một số nguyên dương n, tính tổng các số từ 1->n ( n=5 => in ra là
15 vì 1+2+3+4+5 = 15)
CẤU TRÚC ĐIỀU KHIỂN TRONG NGÔN NGỮ C

➢Bài tập
✓Bài tâp 1: Viết chương trình cho nhập 1 số nguyên. In ra số lơn nhất có
trong n. VD: n=196 => in ra 9
✓Bài tập 2: Viết chương trình cho nhập 1 số nguyên. In ra chữ số tương ứng.
VD: n=190 => một chín không in ra “mot chin khong”
✓Bài tập 3: Viết chương trình cho nhập 3 số nguyên. Tìm số lớn nhì?
ĐỘ PHỨC TẠP CỦA THUẬT GIẢI

➢Đánh giá thời gian chạy của chương trình


✓Thời gian chạy của chương trình phụ thuộc vào:
▪ Input cho chương trình
▪ Chất lượng mã sinh ra của chương trình dịch
▪ Trạng thái và tốc độ của các lệnh chạy trên máy
▪ Độ phức tạp thời gian của thuật giải
ĐỘ PHỨC TẠP CỦA THUẬT GIẢI
➢Tiêu chuẩn đánh giá của thuật giải
✓Tiêu chuẩn đánh giá của thuật giải phụ thuộc vào:
▪ Tính đúng đắn
▪ Tính đơn giản
▪ Tính hiệu quả
Thông thường, để so sánh các thuật toán, người ta dựa vào độ phức tạp về
thời gian thực thi (độ phức tạp của thuật toán (algorithm complexity)
=> ước lượng số phép tính cần thực hiện
hay Đánh giá độ phức tạp giải thuật
ĐỘ PHỨC TẠP CỦA THUẬT GIẢI
➢Tiêu chuẩn đánh giá của thuật giải
✓Độ phức tạp giải thuật càng thấp => thời gian thực hiện chương trình càng
nhanh và ngược lại.
✓Các độ phức tạp giải thuật thường gặp:
ĐỘ PHỨC TẠP CỦA THUẬT GIẢI
➢Các độ phức tạp giải thuật thường gặp:
✓ O(1) : Nếu T(n) là hằng số (T(n)=C)
✓ O(log2n) : Độ phức tạp dạng logarit
✓ O( n) : Độ phức tạp tuyến tính
✓ O(nlog2n): Độ phức tạp tuyến tính logarit
✓ O( n2), O(n3),…,O(n α): Độ phức tạp đa thức
✓ O(n!), O( nn)

➢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!
QUY TẮC TÍNH ĐỘ PHỨC TẠP CỦA THUẬT GIẢI
➢Quy tắc cộng
✓Nếu 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; và T1(N)=O(f(N)), T2(N)=O(g(N))
 thời gian thực hiện của đoạn hai chương trình đó nối tiếp nhau là
T(N)=O(max(f(N), g(N)))
➢ Quy tắc nhân
✓ Nếu T1(N) và T2(N) là thời gian thực hiện của hai đoạn chương trình
P1và P2 và T1(N) = O(f(N)), T2(N) = O(g(N)
 thời gian thực hiện của đoạn hai đoạn chương trình đó lồng nhau là
T(N) = O(f(N).g(N))
QUY TẮC TÍNH ĐỘ PHỨC TẠP CỦA THUẬT GIẢI
➢Quy tắc tính thời gian chạy
✓Mỗi lệnh gán, read, write có giả thiết là O(1).
✓Một dãy lệnh xác định theo quy tắc tổng.
✓Lệnh if là thời gian thực hiện lệnh điều kiện cộng với thời gian kiểm tra điều
kiện.
✓Lệnh if … else là thời gian kiểm tra điều kiện cộng với thời gian lớn nhất của 1
trong 2 lệnh rẽ nhánh true và false.
✓Vòng lặp là tổng thời gian thực hiện trong thân vòng lặp và thời gian kiểm tra
kết thúc vòng lặp.
✓Gọi hàm: Nếu chương trình có các thủ tục và không có thủ tục nào là đệ quy thì
ta có thể tính thời gian chạy cùng một lúc, bắt đầu từ các thủ tục không gọi đến
các thủ tục khác.
CÁCH TÍNH ĐỘ PHỨC TẠP GIẢI THUẬT
➢Ví dụ 1: Tính thời gian thực hiện
của thủ tục sắp xếp “nổi bọt”
✓Toàn bộ chương trình chỉ gồm
một lệnh lặp {1}, lồng trong
lệnh {1} là lệnh {2}, lồng trong
lệnh {2} là lệnh {3} và lồng
trong lệnh {3} là 3 lệnh nối tiếp
nhau {4}, {5} và {6}. Chúng ta
sẽ tiến hành tính độ phức tạp
theo thứ tự từ trong ra.
CÁCH TÍNH ĐỘ PHỨC TẠP GIẢI THUẬT
➢Ví dụ 1: Tính thời gian thực hiện của thủ tục sắp xếp “nổi bọt”
✓Cả ba lệnh gán {4}, {5} và {6} đều tốn O(1) thời gian, việc so
sánh a[j-1] > a[j] cũng tốn O(1) thời gian, do đó lệnh {3} tốn
O(1) thời gian. Vòng lặp {2} thực hiện (n-i) lần, mỗi lần O(1) do
đó vòng lặp {2} tốn O((n-i).1) = O(n-i).Vòng lặp {1} lặp có i
chạy từ 1 đến n-1 nên thời gian thực hiện của vòng lặp {1} và
cũng là độ phức tạp của giải thuật là:
CÁCH TÍNH ĐỘ PHỨC TẠP GIẢI THUẬT
➢Ví dụ 2: Hàm tìm kiếm Search nhận vào một mảng a có n số
nguyên và một số nguyên x, hàm sẽ trả về giá trị logic TRUE nếu
tồn tại một phần tử a[i] = x, ngược lại hàm trả về FALSE.
CÁCH TÍNH ĐỘ PHỨC TẠP GIẢI THUẬT

➢Ví dụ 2: Giải thuật tìm kiếm tuần tự là lần lượt so sánh x với các phần tử của
mảng a, bắt đầu từ a[1], nếu tồn tại a[i] = x thì dừng và trả về TRUE, ngược lại
nếu tất cả các phần tử của a đều khác X thì trả về FALSE.
➢Các lệnh {1}, {2}, {3} và {5} nối tiếp nhau, do đó độ phức tạp của hàm
Search chính là độ phức tạp lớn nhất trong 4 lệnh này. Ba lệnh {1}, {2} và {5}
đều có độ phức tạp O(1) do đó độ phức tạp của hàm Search chính là độ phức
tạp của lệnh {3}. Lồng trong lệnh {3} là lệnh {4}. Lệnh {4} có độ phức tạp
O(1). Trong trường hợp xấu nhất (tất cả các phần tử của mảng a đều khác x)
thì vòng lặp {3} thực hiện n lần, vậy ta có T(n) = O(n).
TÀI LIỆU THAM KHẢO

➢[1]. Slide Cấu trúc dữ liệu và giải thuật – Ths. Nguyễn Hà Giang, Đại
học Kỹ Thuật Công Nghệ.
➢[2]. Cấu trúc dữ liệu & thuật toán, Dương Anh Đức, Trần Hạnh Nhi,
ĐHKHTN, 2000.
➢[3]. Kỹ thuật lập trình, Học viện BCVT, 2002.
➢[4]. Cấu trúc dữ liệu, Nguyễn Trung Trực, ĐHBK, 1992.
➢[5]. Giải thuật & lập trình, Lê Minh Hoàng, ĐHSPHN, 1999-2002.

You might also like