Professional Documents
Culture Documents
Cấu trúc dữ liệu và thuật giải - C1
Cấu trúc dữ liệu và thuật giải - C1
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
➢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
➢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
➢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
➢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.