Từ bài toán đến chương trình• Mô hình hóa bài toán thực tế thành bài toán giải quyết trên máy tính • Xác định các thao tác xử lý xây dựng giải thuật • Ngôn ngữ giả và tinh chế từng bước
Trang 1CẤU TRÚC DỮ LIỆU
& GIẢI THUẬT
Lê Thị Diễm
Bộ môn Tin học ứng dụng
Trang 2Chương 1
Mở đầu
Trang 3NỘI DUNG
• Tiếp cận từ bài toán đến chương trình
• Kiểu dữ liệu (Data Type)
• Kiểu dữ liệu trừu tượng (Abstract Data Type)
• Cấu trúc dữ liệu (Data Structure)
Trang 4Từ bài toán đến chương trình
• Mô hình hóa bài toán thực tế thành bài toán giải quyết trên máy tính
• Xác định các thao tác xử lý xây dựng giải thuật
• Ngôn ngữ giả và tinh chế từng bước (Pseudo
language and stepwise refinement)
• Cài đặt chương trình giải quyết bài toán
Trang 5Giải thuật (GT)
• Là 1 chuỗi hữu hạn các thao tác để giải 1 bài toán nào đó
• Các tính chất quan trọng của giải thuật là:
– Hữu hạn (finiteness): giải thuật phải luôn luôn kết
thúc sau một số hữu hạn bước.
– Xác định (definiteness): mỗi bước của GT phải được xác
định rõ ràng và phải được thực hiện chính xác, nhất quán.
– Hiệu quả (effectiveness): các thao tác trong GT phải
được thực hiện trong một lượng thời gian hữu hạn
(đơn giản, dễ hiểu, dễ lập trình, thực hiện nhanh )
Trang 6Kiểu dữ liệu (Data Type)
• Khái niệm: là một tập hợp các giá trị và một
tập hợp các phép toán trên các giá trị đó
– Ví dụ: kiểu int là tập hợp các số nguyên có giá
trị -32768 32767 cùng các phép toán cộng,
trừ, nhân, chia, %,
• Các thuộc tính: tên kiểu dữ liệu, miền giá trị,
kích thước lưu trữ, tập các toán tử tác động lên kiểu DL
Trang 7Kiểu dữ liệu trừu tượng (ADT: Abstract Data Type)
• là một mô hình toán học cùng với một tập hợp các phép toán trên nó
• là kiểu dữ liệu do ta định nghĩa ở mức khái niệm,
chưa được cài đặt cụ thể bằng một ngôn ngữ lập
trình
Che lấp những chi tiết phức tạp trong chương trình
Trang 8Cấu trúc dữ liệu (Data Structure)
• Khi cài đặt một ADT, ta dùng
– các CTDL phù hợp có trong ngôn ngữ lập trình, hoặc
– cấu trúc phức hợp được xây dựng lên từ các kiểu cơ bản của ngôn ngữ lập trình
• Cấu trúc dữ liệu = cách thức tổ chức dữ liệu
• Cấu trúc dữ liệu + Giải thuật = Chương trình
Trang 9Các tiêu chuẩn đánh giá CTDL
• Phản ánh đúng thực tế
– Là tiêu chuẩn quan trọng
– Quyết định tính đúng đắn của bài toán
– Phải chọn CTDL lưu trữ thể hiện chính xác đối tượng thực tế.
Trang 10Các tiêu chuẩn đánh giá CTDL
• Tiết kiệm tài nguyên hệ thống
– chỉ nên sử dụng tài nguyên hệ thống vừa đủ để đảm nhiệm chức năng của nó.
Trang 11Đánh giá độ phức tạp GT (1)
• Tại sao phải phân tích đánh giá giải thuật?
– Có nhiều giải thuật khác nhau để giải quyết 1 bài toán
=> lựa chọn 1 giải thuật tốt (nhất).
hiện nó thông qua việc sử dụng tài nguyên
– tài nguyên: bộ nhớ, thời gian sử dụng CPU,…
– thông thường nhất là thời gian cần thiểt để giải quyết vấn đề (thời gian thực hiện chương trình).
Trang 12Đánh giá độ phức tạp GT (2)
• Các vấn đề chúng ta giải quyết có kích thước tự
nhiên n (thường là số lượng dữ liệu được xử lý),
• Tài nguyên cần dùng được mô tả như 1 hàm số
theo n (T(n))
– Nghĩa là: Thời gian thực hiện của chương trình là 1
hàm của kích thước dữ liệu vào ký hiệu T(n) trong đó n
là kích thước (độ lớn) của dữ liệu vào.
• T(n) ≥ 0 ∀ n ≥ 0
Trang 13Đánh giá độ phức tạp GT (3)
• Có thể đánh giá giải thuật bằng phương pháp thực nghiệm thông qua việc cài đặt giải thuật, rồi chọn các bộ dữ liệu thử nghiệm
– nhược điểm: chịu sự hạn chế của ngôn ngữ lập trình cài
đặt, trình độ của người lập trình, khó khăn và tốn chi
phí trong việc chọn các bộ dữ liệu thử đặc trưng,…
• Tìm những phương pháp đánh giá giải thuật hình thức hơn, ít phụ thuộc môi trường cũng như phần cứng hơn
Trang 14Đánh giá độ phức tạp GT (4)
– Phương pháp đánh giá giải thuật theo hướng xấp xỉ
tiệm cận qua các khái niệm toán học O (Big-O), Ω
(Big-Omega), Θ (Big-Theta),…
– Thường sử dụng Big-O
• Tỷ suất tăng của hàm
– Hàm không âm T(n) có tỷ suất tăng f(n) nếu tồn tại hằng số C và N0 sao cho T(n) <= C.f(n)
với mọi n>= N0
– Qui tắc vận dụng: Nếu T(n) là một đa thức của n thì tỷ
Trang 15• Hay: Độ phức tạp của GT là 1 hàm chặn trên của
hàm thời gian
Trang 16Cách tính độ phức tạp GT (1)
• Qui tắc cộng: Nếu
– T1(n): thời gian thực hiện đoạn chương trình P1
– T2(n): thời gian thực hiện đoạn chương trình P2
– Và T1(n) = O(f(n)), T2(n) = O(g(n)),
thì độ phức tạp của đoạn 2 chương trình đó nối tiếp
nhau là T(n) = O( max(f(n), g(n)))
Trang 17Cách tính độ phức tạp GT (2)
• Qui tắc nhân: Nếu
– T1(n): thời gian thực hiện đoạn chương trình P1
– T2(n): thời gian thực hiện đoạn chương trình P2
Trang 18Cách tính độ phức tạp GT (3)
• Câu lệnh đơn: các câu lệnh đơn như gán, đọc,
viết, so sánh, lệnh return, định trị các biểu thức (không gọi hàm),… có thời gian thực hiện là O(1)
• Lệnh rẽ nhánh: if <điều kiện> P1; else P2;
– tính thời gian thực hiện là O(max (f1(n), f2(n))) và độ phức tạp của thời gian kiểm tra điều kiện Thông
thường kiểm tra điều kiện tốn O(1).
• Lệnh vòng lặp
– Xác định thời gian thực hiện của vòng lặp, sau đó lấy
tỷ suất tăng của hàm thời gian này.
Trang 19• Ví dụ: Tính
ex =1 + x/1! + x2/2! + x3/3! + … + xn /n!
trình con: không gọi đệ qui, đệ qui (tham khảo)
Trang 20ex = ex+lt/gt;
} return ex;
}
Trang 21Cách tính độ phức tạp GT (6)
• Thời gian chạy của
nhiều thuật toán tiệm
nó thành các bài toán con nhỏ hơn, sau đó tổng hợp lại.
– n2
– n3
– 2n
– n!