1. Trang chủ
  2. » Công Nghệ Thông Tin

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

35 43 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Mở đầu về thuật toán và độ phức tạp
Tác giả Nguyễn Văn Hạnh
Trường học Đại Học Nông Nghiệp Hà Nội
Chuyên ngành Mạng và hệ thống thông tin
Thể loại bài giảng
Định dạng
Số trang 35
Dung lượng 3,12 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 thuật toán và độ phức tạp; đánh giá độ phức tạp thuật toán như thế nào; dùng o(f(n)) để đánh giá độ phức tạp của thuật toán; các quy tắc để đánh giá độ phức tạp thuật toán; các thuật toán cơ bản và độ phức tạp...

Trang 2

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

Trang 3

Đị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.

Trang 4

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.

m, n

g

Trang 5

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 n

Trang 6

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 →

Trang 7

Đá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.

Trang 8

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

Trang 9

Phương pháp liệt kê từng bước

Thuật toán: Giải phương trình bậc hai

• 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 4: Nếu thông báo PT vô nghiệm và chuyển sang bước 8

• Bước 6: Tính và chuyển sang bước 7

• Bước 7: Thông báo các nghiệm

• Bước 8: Kết thúc thuật toán

Trang 10

Phương pháp sơ đồ khối

Thuật toán: Giải phương trình bậc hai ax2 + bx + c = 0

Trang 11

Ngôn ngữ lập trình Python

Thuật toán: Giải phương trình bậc hai ax2 + bx + c = 0

Trang 12

Độ 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

Trang 13

Độ 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

Trang 14

Độ 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ử

.

• 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ử đầu tiên thoả mãn thì dừng lại

• Hoặc khi đến cuối danh sách mà không gặp nào bằng a thì trong trường hợp này a không có trong danh sách

• 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 trên tất cả các dữ liệu vào cỡ

Trang 15

Dùng O(f(n)) để đánh giá độ phức tạp của thuật toán

Trang 16

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 để

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))

c1, c2, n1, n2

T(n) ≤ c1f(n) n ≥ n1 f(n) ≤ c2g(n) n ≥ n2

T(n) ≤ c1c2g(n) n ≥ n0 = max(n1, n2)

Trang 17

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

Trang 18

Dùng O(f(n)) để đánh giá độ phức tạp của thuật toán

Trang 19

Các quy tắc để đánh giá độ phức tạp của thuật toán

Trang 20

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): là câu lệnh thì

Begin End gọi là lệnh hợp thành: Độ phức tạp được xác định bằng luật tổng

S1, S2, …, Sn

S1, S2, …, Sn

Trang 21

Quy tắc để đánh giá độ phức tạp của câu lệnh If

3 Lệnh If: là các câu lệnh có độ phức tạp , E là biểu thức logic:

If E then và If E then else gọi là lệnh If và có độ phức tạp là

S1, S2 O( f1(n)), O( f2(n))

O(max( f1(n), f2(n)))

Trang 22

Quy tắc để đánh giá độ phức tạp của câu lệnh Case

biểu thức có kiểu thứ tự đếm được và là các giá trị có cùng kiểu với E:

Case E of

End

Trang 23

Quy tắc để đánh giá độ phức tạp của câu lệnh While

5 Lệnh While: Nếu là các câu lệnh có độ phức tạp , E là biểu thức logic:

While E do

gọi là lệnh While Nếu g(n) là số tối đa các lần thực hiện lệnh S khi thực hiện lệnh

S O( f(n))

S

O( f(n)g(n))

Trang 24

Quy tắc để đánh giá độ phức tạp của câu lệnh Repeat

6 Lệnh Repeat: Nếu là các câu lệnh có độ phức tạp , E là biểu thức logic:

Trang 25

Quy tắc để đánh giá độ phức tạp của câu lệnh For

7 Lệnh For: Nếu là các câu lệnh có độ phức tạp , là biểu thức cùng một kiểu thứ tự đếm được thì:

For to do S

gọi là lệnh For Nếu g(n) là số tối đa các lần lặp thì độ phức tạp của lệnh For là

Trang 26

Quy tắc để đánh giá độ phức tạp của hàm đệ quy

8 Hàm đệ quy: Giả sử độ phức tạp của hàm đệ quy là T(n) với n là cỡ dữ liệu vào

• Khi đó độ phức tạp của các lời gọi đệ quy thủ tục là T(m); với m < n

• Đánh giá độ phức tạp , với là cỡ dữ liệu vào nhỏ nhất có thể được

• Đánh giá thân của hàm để nhận được quan hệ đệ quy như sau

với

• Giải phương trình đệ quy này ta sẽ nhận được sự đánh giá của T(n)

T(n0) n0T(n) = F(T(n1), T(n2), …, T(nk)) n1, n2, …, nk < n

Trang 27

Ví dụ đánh giá độ phức tạp của hàm đệ quy

Ví dụ: Đánh giá độ phức tạp của hàm đệ quy để tính

• Độ phức tạp là với là cỡ dữ liệu vào

• Với : T(1) = O(1) vì chỉ thực hiện lệnh gán fact := 1

• Với : T(n) sẽ là O(1) để thực hiện phép gán (:=) và phép nhân (*) cộng với T(n-1) là độ phức tạp của lời gọi đệ quy fact(n-1) Nên ta có:

T(1) = ; T(n) = + T(n-1);

Trang 28

Ví dụ đánh giá độ phức tạp của hàm đệ quy

Ví dụ: Đánh giá độ phức tạp của hàm đệ quy để tính

Trang 29

Ví dụ xác định độ phức tạp của thuật toán

Ví dụ: Xác định độ phức tạp của thuật toán tính dãy số Fibonacci

Công thức truy hồi của dãy Fibonacci là:

Bài toán áp dụng: Một đôi thỏ (gồm một thỏ đực và một thỏ cái) cứ mỗi tháng đẻ được một đôi thỏ con (cũng gồm một thỏ đực và thỏ cái); một đôi thỏ con, khi tròn 2 tháng tuổi, sau mỗi tháng đẻ ra một đôi thỏ con, và quá trình sinh nở cứ thế tiếp diễn Hỏi sau n tháng có bao nhiêu đôi thỏ, nếu đầu năm (tháng Giêng)

có một đôi thỏ sơ sinh?

Trang 30

Ví dụ xác định độ phức tạp của thuật toán

Function Fibo(n: integer): integer;

Trang 31

Ví dụ so sánh độ phức tạp của 2 thuật toán

Ví dụ: Xét bài toán tính giá trị của đa thức

Trang 32

Độ phức tạp của thuật toán 1

Thuật toán 1:

Bước 1 Tính giá trị của từng hạng tử: với i = 1 đến n tính

ta phải thực hiện 1 phép nhân:

ta phải thực hiện 2 phép nhân

Trang 33

Độ phức tạp của thuật toán 2

Thuật toán 2:

Bước 1 Gán : ta thực hiện một phép toán

cần thực hiện 3 phép toán là 1 phép nhân và một phép cộng và 1 phép gán nên bước 2 cần thực hiện phép toán

Vậy thuật toán 2 cần thức hiện phép toán nên độ phức tạp của thuật toán

Trang 34

Bài tập về nhà

Hãy xây dựng và đánh giá độ phức tạp của các thuật toán sau:

1 Thuật toán tìm phần tử lớn nhất của một dãy hữu hạn số thực

2 Thuật toán tìm phần tử bé nhất của một tập con của tập hợp các số tự nhiên

3 Thuật toán xếp lại một dãy theo thứ tự tăng dần

4 Thuật toán tìm một dãy các số liên tiếp nhau (dài nhất có thể) có tổng dương trong một dãy số thực cho trước.

Trang 35

The end

of chapter 1

Ngày đăng: 08/07/2021, 09:46

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm