Bài giảng Mạng và hệ thống thông tin - Chương 1: Mở đầu về thuật toán và độ phức tạp - Nguyễn Văn Hạnh
Chương 1
Mở đầu về thuật toán
và độ phức tạp
Nguyễn Văn Hạnh
Bộ môn Mạng và hệ thống thông tin
Email: nvhanh@vnua.edu.vn
Nội dung
1. Thuật toán và độ phức tạp
2. Đánh giá độ phức tạp thuật toán như thế nào?
3. Dùng O(f(n)) để đánh giá độ phức tạp của thuật toán
4. Các quy tắc để đánh giá độ phức tạp thuật toán
5. Các thuật toán cơ bản và độ phức tạp
Định nghĩa thuật toán
Thuật toán: là một dãy hữu hạn các bước, mỗi bước mô tả chính xác các
phép toán, hoặc hành động cần thực hiện … để cho ta lời giải của bài
toán.
•
•
Ví dụ Thuật toán Euclid: Tìm UCLN của hai số nguyên dương.
1. Input: là 2 số nguyên dương
2. Output: (UCLN của và )
3. Phương pháp:
Bước 1: Tìm , phân dư của phép chia cho .
Bước 2: Nếu , thì (gán giá trị của cho ) và dừng
lại. Ngược lại (), thì và quay lại bước 1.
Các yêu cầu về thuật toán
1. Input: là các giá trị cần đưa vào khi thuật toán bắt đầu làm việc. Ví dụ
trong thuật toán Euclid, input là 2 số nguyên dương
2. Output: là các giá trị có quan hệ hoàn toàn xác định với các dữ liệu
input, và là kết quả của sự thực hiện thuật toán. Ví dụ trong thuật toán
Euclid, output là UCLN
3. Tính xác định:
Ở mỗi bước, các thao tác phải rõ ràng, không gây nên sự nhập
nhằng.
Thuật toán cần được mô tả trong các ngôn ngữ lập trình: các mệnh
đề được tạo theo các quy tắc cú pháp nghiêm ngặt và chỉ có một
nghĩa duy nhất.
4. Tính khả thi: các phép toán có thể được thực hiện trực tiếp.
5. Tính dừng: thuật toán phải dừng sau một số hữu hạn bước thực hiện.
Vấn đề giải được và không giải được
1. Vấn đề giải được: là vấn đề có thuật toán giải. Ví dụ, tìm nghiệm của hệ
phương trình tuyến tính là vấn đề giải được.
2. Vấn đề không giải được: là vấn đề không tồn tại thuật toán giải. Ví dụ,
thuật toán chắc thắng cho người thứ 2 của cờ ca rô; thuật toán xác định
xem một máy Turing có dừng lại sau bước hay không.
Các vấn đề liên quan đến thuật toán
1. Thiết kế thuật toán: một số kỹ thuật thiết kế thuật toán:
Phương pháp chia để trị (divide-and-conque)
Phương pháp tham lam (greedy method)
Phương pháp quy hoạch động
•
•
•
2. Tính đúng đắn của thuật toán: khi thuật toán được thực hiện sẽ cho kết
quả đúng với mọi dữ liệu vào hợp lệ.
3. Phân tích thuật toán: với một bài toán có một số thuật giải cần phân
tích, đánh giá độ phức tạp của thuật toán để lựa chọn thuật toán nào.
Đánh giá hiệu quả của thuật toán
Hai tiêu chuẩn để lựa chọn thuật toán:
Thuật toán đơn giản, dễ hiểu, dễ cài đặt (dễ viết chương trình)
Thuật toán sử dụng tiết kiệm nhất các nguồn tài nguyên của máy
tính, chạy nhanh nhất có thể được: tính hiệu quả của thuật toán:
Dung lượng không gian nhớ cần thiết để lưu các dữ liệu vào, các
kết quả tính toán trung gian và kết quả của thuật toán.
•
Thời gian để thực hiện thuật toán: một thuật toán hiệu quả nếu
có thời gian chạy ít hơn so với các thuật toán khác.
•
Biểu diễn thuật toán
Phương pháp biểu diễn thuật toán:
Phương pháp liệt kê từng bước
Phương pháp sơ đồ khối
Ngôn ngữ lập trình
•
•
•
Phương pháp liệt kê từng bước
Thuật toán: Giải phương trình bậc hai 2
Bước 1: Xác định các hệ số a, b, c
•
Bước 2: Kiểm tra các hệ số a, b, c có khác 0 hay không? Nếu a = 0 quay
lại thực hiện bước 1.
•
Bước 3: Tính 2
•
•
Bước 4: Nếu thông báo PT vô nghiệm và chuyển sang bước 8
−b
Bước 5: Nếu , tính x1 = x2 = và chuyển sang bước 7
•
•
−b ∓ Δ
Bước 6: Tính x1,2 =
và chuyển sang bước 7
Bước 7: Thông báo các nghiệm xx
Bước 8: Kết thúc thuật toán
•
•
Phương pháp sơ đồ khối
Thuật toán: Giải phương trình bậc hai 2
Ngôn ngữ lập trình Python
Thuật toán: Giải phương trình bậc hai 2
Độ phức tạp của thuật toán
Tại sao lại cần thuật toán có hiệu quả?
Đối với một vấn đề có thể có nhiều thuật toán giải, trong số đó có thể thuật
toán này hiệu quả hơn thuật toán kia (chạy nhanh hơn).
•
Đánh giá thời gian thực hiện thuật toán như thế nào?
1. Phương pháp thử nghiệm: viết chương trình và cho chạy chương trình với
các dữ liệu vào khác nhau trên một máy tính nào đó. Thời gian chạy chương
trình phụ thuộc vào các nhân tố:
Các dữ liệu vào
•
•
•
Chương trình dịch để chuyển chương trình 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
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.
Độ phức tạp của thuật toán
Đánh giá thời gian thực hiện thuật toán như thế nào?
2. Phương pháp lý thuyết:
Ta sẽ coi thời gian thực hiện thuật toán như là hàm số của cỡ dữ liệu vào.
•
•
Cỡ của dữ liệu vào là một tham số đặc trưng cho dữ liệu vào, có ảnh hưởng
quyết định đến thời gian thực hiện chương trình. Thông thường cỡ của dữ liệu
vào là một số nguyên dương .
Ta sẽ sử dụng hàm số , trong đó là cỡ dữ liệu vào, để biểu diễn thời gian
•
•
thực hiện một thuật toán.
Thời gian thực hiệ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. Ví dụ các phép toán số học và các phép toán so sánh
là các phép toán sơ cấp.
Độ phức tạp của thuật toán
Ví dụ: xét bài toán xác định một đối tượng có trong danh sách phần tử
aaa.
So sánh a với từng phần tử có trong danh sách đi từ đầu tới cuối danh sách
•
•
•
Khi gặp phần tử ađầu tiên thoả mãn aa thì dừng lại
Hoặc khi đến cuối danh sách mà không gặp anào bằng a thì trong trường hợp
này a không có trong danh sách.
Các dữ liệu vào là a và danh sách aaa. Cỡ của dữ liệu vào là
Nếu xem thời gian thực hiện là số các phép so sánh, ta có .
là độ phức tạp của thuật toán trong trường hợp xấu nhất.
•
•
•
•
Độ phức tạp trung bình của thuật toán là thời gian trung bình Tntrên tất cả
các dữ liệu vào cỡ
Dùng O(f(n)) để đánh giá độ phức tạp của thuật toán
Định nghĩa
Giả sử là số nguyên dương. T(n) và f(n) là các hàm thực không âm. Ta
viết T(n) = O(f(n)) nếu và chỉ nếu tồn tại các hằng số dương cnsao cho
, với mọi n n.
•
Nếu một thuật toán có độ phức tạp T(n) = O(f(n)), ta nói thuật toán có độ
phức tạp cấp f(n).
•
Ví dụ: Giả sử 2 . Ta có
2 2 2 2, với mọi .
Vậy 2: thuật toán có độ phức tạp cấp 2
Dùng O(f(n)) để đánh giá độ phức tạp của thuật toán
Tính chất
Nếu T(n) = O(f(n)) và f(n) = O(g(n)) thì T(n) = O(g(n)).
•
Thật vậy, T(n) = O(f(n)) và f(n) = O(g(n)) nên tồn tại ccnnđể
Tncfnvới mọi n nvà fncgnvới mọi n n.
•
Khi đó Tnccgnvới mọi n nmaxnn. Nên ta có T(n) =
•
O(g(n)).
Khi biểu diễn cấp của độ phức tạp thuật toán bởi hàm f(n), ta sẽ chọn f(n)
là hàm nhỏ nhất, đơn giản nhất có thể sao cho T(n) = O(f(n)).
•
Dùng O(f(n)) để đánh giá độ phức tạp của thuật toán
Danh sách sắp xếp theo thứ tự tăng dần của độ phức tạp thuật toán
Dùng O(f(n)) để đánh giá độ phức tạp của thuật toán
Ví dụ:
Thuật toán A có độ phức tạp TnOn2, thuật toán B có độ phức tạp
TnOnlogn.
•
Với n = 1024, thuật toán A cần 1048576 phép toán sơ cấp, còn thuật toán B
cần 10240 phép toán sơ cấp.
•
•
•
•
Nếu cần 1 micro-giây cho một phép toán sơ cấp thì thuật toán A cần
khoảng 1,05 giây, thuật toán B cần khoảng 0,01 giây.
Với n = 1024x2 = 2048 thì thuật toán A cần khoảng 4,2 giây, thuật toán B
cần khoảng 0,02 giây.
Với n càng lớn thì thuật toán A càng đòi hỏi thời gian thực hiện nhiều hơn
rất nhiều so với thuật toán B.
Các quy tắc để đánh giá độ phức tạp của thuật toán
Quy tắc tổng: Nếu TnOfnvà TnOfnthì
TnTnOmaxfnfn
Áp dụng: Giả một thuật toán được phân thành 3 phần với độ phức tạp của
từng phần lần lượt là TnOTnOn2và TnOn. Khi đó
độ phức tạp của thuật toán là:
•
TnTnTnTnOmaxn2nOn2
Quy tắc để đánh giá độ phức tạp của các câu lệnh đơn, khối
1. Câu lệnh (đơn): các phép gán, đọc, viết, goto có độ phức tạp O(1).
2. Lệnh hợp thành (hoặc khối): SSSlà câu lệnh thì
Begin SSSEnd
gọi là lệnh hợp thành: Độ phức tạp được xác định bằng luật tổng.
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Mạng và hệ thống thông tin - Chương 1: Mở đầu về thuật toán và độ phức tạp - Nguyễn Văn Hạnh", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
bai_giang_mang_va_he_thong_thong_tin_chuong_1_mo_dau_ve_thua.pdf

