67
1 Chương 1: Tng quan 1.1. Các bước cơ bn khi gii mt bài toán tin hc 1.2. Vai trò ca cu trúc dliu và gii thut 1.3. Các cu trúc dliu cơ bn 1.4. Đánh giá độ phc tp gii thut 1.5. Bài tp

Chuong 1. tong quan

  • Upload
    vu-nam

  • View
    405

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Chuong 1. tong quan

1

Chương 1: Tổng quan1.1. Các bước cơ bản khi giải một bài toán tin học

1.2. Vai trò của cấu trúc dữ liệu và giải thuật

1.3. Các cấu trúc dữ liệu cơ bản

1.4. Đánh giá độ phức tạp giải thuật

1.5. Bài tập

Page 2: Chuong 1. tong quan

2

1.1. Các bước cơ bản khi giải một bài to án tin h ọc

Page 3: Chuong 1. tong quan

3

Các bước cơ bản

Khi tiến hành giải các bài toán tin học cần tiến hành các bước cơ bản sau:

1. Xác định bài toán2. Tìm cấu trúc dữ liệu3. Tìm giải thuật4. Lập trình5. Kiểm thử6. Tối ưu chương trình

Page 4: Chuong 1. tong quan

4

B1: Xác định b ài to án

Việc xác định bài toán tức là phải xác định xem:

1. Phải giải quyết vấn đề gì?

2. Với giả thiết nào đã cho?

3. Lời giải cần phải đạt những yêu cầu gì?

Đôi khi những bài toán tin học ứng dụng trong thực tếchỉ cần tìm lời giải tốt tới mức nào đó, thậm chí là tồi ởmức chấp nhận được. Bởi vì lời giải tốt nhất có thể đòi hỏi quá nhiều thời gian và chi phí. Ví dụ: Giải phương trình f(x) = 0 với x là biến số, f(x) là

1 đa thức của x có bậc ≥ 3.

Page 5: Chuong 1. tong quan

5

B1: Xác định b ài to án

Bài toán 1:Chia nhóm thảo luận

Một lớp học cóN sinh viên cùng tham gia thảo luận về một vấn đề, họ muốn chia thành các nhóm và mỗi nhóm thảo luận riêng về một phần của vấn đề. Nhóm có bao nhiêu sinh viên thì được đưa ra bấy nhiêu ý kiến. Nếu lấy ở mỗi nhóm một ý kiến đem ghép lại thì được một bộ ý kiến để giải quyết vấn đề. Hãy tìm cách chia sinh viên thành các nhóm để số bộ ý kiến S thu được làlớn nhất.

Ví dụ: với N = 7, kết quả là chia thành 2 nhóm (3, 4)

Phát biểu lại bài toán:

Cho một số nguyên dương N, tìm cách phân tích N thành tổng các số nguyên dương sao cho tích Scủa các số đó là lớn nhất.

Page 6: Chuong 1. tong quan

6

B2: Tìm cấu trúc d ữ liệu Để biểu diễn tình trạng cụ thể của bài toán, tuỳ thuộc

vào bài toán cần giải quyết và những thao tác sẽ tiến hành trên dữ liệu vào. Xây dựng CTDL không thể tách rời việc tìm kiếm GT.

Các tiêu chuẩn khi lựa chọn cấu trúc dữ liệu: Biểu diễn được đầy đủ các thông tin nhập, xuất. Phù hợp với các thao tác của GT được lựa chọn. Cài đặt được trên máy tính với NNLT đang sử dụng.

Trước khi tổ chức dữ liệu, có thể phải viết một đoạn chương trình nhỏ để khảo sát xem dữ liệu cần lưu trữlớn tới mức độ nào.

Page 7: Chuong 1. tong quan

7

B2: Tìm cấu trúc d ữ liệu

Bài toán 2: Tính S là tổng bình phương của các số tựnhiên không lớn hơn N, N là số tự nhiên ≤ 100.

S = 12 + 22 + ... + N2

Tìm cấu trúc dữ liệu: (NNLT sử dụng làC++) N có kiểu số nguyên 1 byte, không dấu (unsigned char). Để chọn chính xác CTDL của S, chạy thử đoạn chương

trình:unsigned long S = 0;// unsigned int S = 0;for(unsigned char i = 1; i <= 100; i++)

S = S + i * i;printf(“S = %d”, S); //Kết quả S = 338.350

Kết luận: S có kiểu số nguyên 4 byte (unsigned long).

Page 8: Chuong 1. tong quan

8

B3: Tìm gi ải thu ật

Khái ni ệm: Giải thuật là một hệ thống chặt chẽ và rõ ràng các quy tắc nhằm xác định một dãy thao tác trên cấu trúc dữ liệu sao cho: Với một bộ dữ liệu vào, sau một số hữu hạn bước thực hiện các thao tác đã chỉ ra, ta đạt được mục tiêu đã định.

Các đặc trưng của giải thuật: 1. Tính đơn nghĩa: 1 dữ liệu vào cho 1 kết quả ra duy nhất2. Tính dừng: cho kết quả sau một số hữu hạn bước. 3. Tính đúng: phải được kết quả mong muốn với mọi bộ

dữ liệu đầu vào 4. Tính phổ dụng: làm việc trên các dữ liệu khác nhau.5. Tính khả thi: Kích thước bộ nhớ phải đủ nhỏ, thực hiện

trong thời gian cho phép, dễ hiểu và dễ cài đặt.

Page 9: Chuong 1. tong quan

9

B3: Tìm gi ải thu ật

Bài toán 3: Tìm ước số chung lớn nhất của 2 số a, b không đồng thời bằng0.

Tìm giải thuật: Input: 2 số nguyên tự nhiên a và b không đồng thời

bằng 0 Output: USCLN(a, b) Giải thuật Euclide:B1 (Input): Nhập 2 số tự nhiên a và bB2: Nếu b ≠ 0 thì chuyển sang B3, ngược lại chuyển sang

B4.B3: Đặt r = a % b; a = b; b = r; Quay trở lại B2.B4 (Output): Kết luận ước số chung lớn nhất phải tìm là giá

trị của a. Kết thúc giải thuật.

Page 10: Chuong 1. tong quan

10

B4: Lập trình Kỹ thuật lập trình tốt thể hiện ở kỹ năng viết chương

trình, khả năng gỡ rối và thao tác nhanh. Nên tiến hành lập trình theo phương pháp tinh chế từng

bước (Stepwise refinement): Ban đầu, giải thuật được thể hiện bằng ngôn ngữ tự

nhiên với các bước tổng thể, mỗi bước nêu lên 1 công việc phải thực hiện.

1 công việc đơn giản hoặc 1 đoạn chương trình đã học thuộc thì tiến hành viết mã lệnh ngay bằng NNLT.

1 công việc phức tạp thì chia ra thành những công việc nhỏ hơn và lại tiếp tục với những công việc nhỏ hơn đó.

Tránh việc mò mẫm, xoá đi viết lại nhiều lần, biến chương trình thành tờ giấy nháp.

Page 11: Chuong 1. tong quan

11

B4: Lập trình

Bài toán 4:Tìm ước số chung lớn nhất của 2 số tựnhiên a, b.

Mô tả bằng ngôn ngữ tự nhiên như ở B3: Tìm giải thuật Đoạn chương trình:

int a, b, r;printf(“Nhap 2 so a va b: “); //B1scanf(“%d%d”, &a, &b);while (b != 0) //B2

r = a % b; a = b; b = r; //B3 printf(“USCLN = %d“, a); //B4

Page 12: Chuong 1. tong quan

12

B5: Ki ểm thử

Gồm 2 nhiệm vụ chính là: 1. Chạy thử và tìm lỗi2. Xây dựng các bộ test Chạy thử và tìm lỗi:

Kỹ năng tìm lỗi, sửa lỗi, điều chỉnh lại chương trình là 1 kỹ năng quan trọng của người lập trình.

Có ba loại lỗi:1. Lỗi cú pháp: hay gặp, dễ sửa, chỉ cần nắm vững NNLT.2. Lỗi cài đặt: thể hiện không đúng giải thuật đã định, phải

kết hợp với chức năng gỡ rối để sửa lại cho đúng.3. Lỗi giải thuật: ít gặp, nguy hiểm nhất, có thể phải điều

chỉnh lại giải thuật, thậm chí phải tìm giải thuật khác.

Page 13: Chuong 1. tong quan

13

B5: Ki ểm thử

Xây dựng các bộ test: để kiểm tra tính đúng đắn của chương trình. Đặt trong các file văn bản: tạo nhanh, mỗi lần chạy thử

chỉ cần thay tên file, không nhập lại bộ test từ bàn phím. Kinh nghiệm làm các bộ test là:1. Một bộ test nhỏ, đơn giản, làm bằng tay cũng có được

đáp số để so sánh với kết quả chương trình chạy ra.2. Các bộ test nhỏ chứa các giá trị đặc biệt hoặc tầm

thường. Đây là những test dễ sai nhất.Ví dụ: a = 0, b = 0 USCLN = 0 là test cho kết quả sai3. Các bộ test phải đa dạng, tránh sự lặp đi lặp lại.4. Một vài test lớn để kiểm tra tính chịu đựng của chương

trình.

Page 14: Chuong 1. tong quan

14

B5: Ki ểm thử

Chú ý: Chương trình chạy qua được hết các test không có

nghĩa là chương trình đó đã đúng. Bởi có thể chưa xây dựng được bộ test làm cho chương trình chạy sai.

Nên tìm cách chứng minh tính đúng đắn của giải thuật và chương trình. Tuy nhiên, điều này thường rất khó.

Page 15: Chuong 1. tong quan

15

B6: Tối ưu chương trình

Trước khi kiểm thử nên đặt mục tiêu viết chương trình sao cho đơn giản và chạy ra kết quả đúng là được!

Sau khi đã chạy đúng, phải sửa đổi để chương trình chạy nhanh hơn, hiệu quả hơn.

Khi tối ưu chương trình, xem lại những chỗ nào viết chưa tốt thì tối ưu lại mã lệnh để chương trình ngắn hơn, chạy nhanh hơn.

Không nên viết tới đâu tối ưu mã đến đó, bởi chương trình có mã lệnh tối ưu thường phức tạp, khó kiểm soát.

Page 16: Chuong 1. tong quan

16

B6: Tối ưu chương trình

Việc tối ưu chương trình dựa trên các tiêu chuẩn sau:

1. Tính tin cậy: chạy đúng như dự định, mô tả đúng một giải thuật đúng, cần kiểm tra tính đúng đắn của các bước mỗi khi có thể.

2. Tính uyển chuyển: dễ sửa đổi, giảm bớt công sức khi phát triển chương trình.

3. Tính trong sáng: dễ đọc, dễ hiểu, phụ thuộc rất nhiều vào công cụ lập trình và phong cách lập trình.

4. Tính hữu hiệu: chạy nhanh và ít tốn bộ nhớ, cần phải cógiải thuật tốt và những tiểu xảo khi lập trình. Tiêu chuẩn này nên dừng lại ở mức chấp nhận được.

Page 17: Chuong 1. tong quan

17

B6: Tối ưu chương trình Bài toán 5: Kiểm tra tính nguyên tố của số tự nhiên N.

long kt = 1; //Gia su n la so nguyen tolong k = n - 1;for(long j = 2; j <= k; j++)if (n % j == 0)

kt = 0; //n khong la so nguyen tobreak;

if (kt)

printf("%d la so nguyen to", n);else printf("%d khong la so nguyen to", n);

Page 18: Chuong 1. tong quan

18

B6: Tối ưu chương trình

Cải thiện thời gian chạy của chương trình kiểm tra tính nguyên tố: số lần lặp giảm khoảng 1 nửa.long k = n / 2;

Một cải tiến tiếp theo: số lần lặp giảm khoảng căn bậc 2 của N.long k = (long) sqrt(n);

Cải tiến sau giúp chương trình có thể xử lý với số tựnhiên N lớn và thời gian xử lý nhanh hơn.

Page 19: Chuong 1. tong quan

19

Kết lu ận

Một chương trình đòi hỏi rất nhiều công đoạn, chỉ 1 công đoạn không hợp lý sẽ làm tăng chi phí viết chương trình.

Bài học kinh nghiệm: Đừng bao giờ viết chương trình khi chưa suy xét kỹ về giải thuật và những dữ liệu cần thao tác.

Chỉ cần mắc 1 trong 2 lỗi (sai về GT hoặc GT không thể triển khai được trên 1 CTDL không phù hợp) thì nguy cơ sụp đổ toàn bộ chương trình là hoàn toàn cóthể, càng cố chữa càng bị rối và hầu như chắc chắn làphải làm lại từ đầu.

Page 20: Chuong 1. tong quan

20

1.2. Vai trò c ủa CTDL và GT

1.2.1. Mối quan hệ giữa CTDL và GT

1.2.2. Các tiêu chuẩn đánh giá CTDL

1.2.3. Các tiêu chuẩn đánh giá GT

Page 21: Chuong 1. tong quan

21

1.2.1. Mối quan h ệ giữa CTDL và GT

Trong các bước cơ bản khi giải quyết 1 bài toán tin học: B1: Xác định bài toán: đọc để hiểu bài toán thực tế B2: Tìm cấu trúc dữ liệu: biểu diễn các đối tượng dữ liệu

của bài toán bằng các cấu trúc thích hợp (kiểu dữ liệu của NNLT).

B3: Tìm giải thuật: tìm ra hướng giải quyết bài toán, làcác GT để xác định trình tự các thao tác máy tính phải thi hành để cho ra kết quả mong muốn.

Nội dung chính của môn học là B2 và B3. B4: Lập trình, B5: Kiểm thử, B6: Tối ưu chương

trình:dành cho các lập trình viên sau khi đã hoàn thành phần mô tả bài toán thực tế và tìm ra hướng giải quyết.

Phần bài tập ứng dụng và bài tập lớn của môn học.

Page 22: Chuong 1. tong quan

22

Mối quan h ệ giữa CTDL và GT

Sai lầm thường gặp: chỉ chú trọng đến GT mà quên mất tầm quan trọng của việc tổ chức CTDL của bài toán.

Để xác định được GT phù hợp cần phải biết nó tác động đến loại CTDL nào. Ví dụ: Cho 1 dãy khoá tăng dần. Nếu tổ chức dữ liệu

bằng danh sách liên kết thì phải dùng GT tìm kiếm tuần tự. Nhưng nếu tổ chức dữ liệu bằng mảng 1 chiều thì cóthể dùng GT tìm kiếm nhị phân có tốc độ nhanh hơn.

Khi chọn lựa CTDL cũng cần phải hiểu rõ những thao tác (GT) nào sẽ tác động đến nó. Ví dụ: Với bài toán trên, nếu tìm kiếm được thực hiện

nhiều lần thì nên tổ chức dữ liệu kiểu mảng 1 chiều.

Page 23: Chuong 1. tong quan

23

Mối quan h ệ giữa CTDL và GT

Với CTDL đã chọn, sẽ có những GT tương ứng, phùhợp. Khi CTDL thay đổi, GT cũng phải thay đổi theo để tránh việc xử lý không phù hợp.

CTDL tốt sẽ giúp GT xử lý trên đó có thể phát huy tác dụng tốt hơn, vừa đáp ứng nhanh vừa tiết kiệm tài nguyên, GT cũng dễ hiểu và đơn giản hơn.

Trong 1 bài toán tin học, CTDL và GT có mối quan hệ

chặt chẽ với nhau, được thể hiện qua công thức: :CẤU TRÚC DỮ LI ỆU + GIẢI THUẬT = CHƯƠNG TRÌNH

Page 24: Chuong 1. tong quan

24

1.2.2. Các tiêu chu ẩn đánh giá CTDL

Trong B2: Tìm cấu trúc dữ liệu đã nêu ra 1 số tiêu chuẩn khi lựa chọn CTDL. Tuy nhiên, 1 bài toán có thểcó nhiều CTDL mô tả được nó, vấn đề được đặt ra làlàm sao chọn được 1 CTDL tốt.

Nếu lựa chọn CTDL theo 1 cách ưu tiên nào đó thì phải là “tốt nhất”.

CTDL tốt là 1 CTDL thoả mãn các tiêu chuẩn sau:

1. CTDL đúng đắn: mô tả đúng các đối tượng dữ liệu.

2. CTDL đơn giản: dễ tiến hành các thao tác xử lý.

3. CTDL tiết kiệm tài nguyên: sử dụng ít bộ nhớ.

Page 25: Chuong 1. tong quan

25

1.2.3. Các tiêu chu ẩn đánh giá GT

Trong B3: Tìm giải thuật đã nêu ra 1 số tiêu chuẩn khi lựa chọn GT xử lý bài toán. Khi giải 1 bài toán tin học có thể có 1 số GT khác nhau, vấn đề là cần phải đánh giá các GT đó để lựa chọn 1 GT tốt.

Nếu lựa chọn GT theo 1 cách ưu tiên nào đó thì phải là“ tốt nhất”.

GT tốt là 1 GT thoả mãn các tiêu chuẩn sau:

1. GT đúng đắn: cho kết quả đúng với mọi bộ dữ liệu vào.

2. GT đơn giản: dễ cài đặt, cài đặt nhanh.

3. GT thực hiện nhanh: thời gian thực hiện ngắn.

Page 26: Chuong 1. tong quan

26

1.3. Các CTDL cơ bản

1.3.1. Khái niệm kiểu dữ liệu

1.3.2. Các kiểu dữ liệu cơ bản

1.3.3. Các kiểu dữ liệu có cấu trúc

Page 27: Chuong 1. tong quan

27

1.3.1. Khái ni ệm ki ểu dữ liệu

Khái ni ệm: Kiểu dữ liệu T được xác định bởi một bộ<V, O>, trong đó:1. V: Tập các giá trị hợp lệ mà đối tượng T có thể lưu trữ.2. O: Tập các thao tác có thể thi hành trên đối tượng T.Ví dụ: Kiểu dữ liệu số nguyên int trong NNLT C được xác

định bởi bộ <V, O> với:V = -32768..32767 và O = +, -, *, /, %, …

Các thuộc tính của 1 kiểu dữ liệu:1. Tên //int2. Miền giá trị // [-32768, 32767]3. Kích thước lưu trữ //2 byte4. Tập các toán tử //+, -, *, /, %, …

Page 28: Chuong 1. tong quan

28

1.3.2. Các ki ểu dữ liệu cơ bản

Là các loại dữ liệu đơn giản, không có cấu trúc, biểu diễn các giá trị vô hướng như: số nguyên, số thực, ký tự, logic,...

Thường được các NNLT cấp cao xây dựng sẵn như 1 thành phần của NNLT để giảm nhẹ công việc cho người lập trình. Còn gọi là các kiểu dữ liệu định sẵn.

Các kiểu dữ liệu cơ bản bao gồm: Các kiểu có thứ tự rời rạc (hay còn gọi là vô hướng đếm

được): số nguyên, ký tự, logic, liệt kê, đoạn con,… Các kiểu có thứ tự không rời rạc: số dấu phẩy động,…

Các kiểu dữ liệu cơ bản của các NNLT có thể khác nhau đôi chút.

Page 29: Chuong 1. tong quan

29

1.3.3. Các ki ểu dữ liệu có cấu trúc

Kiểu dữ liệu có cấu trúc là các kiểu dữ liệu được xây dựng dựa trên việc tổ chức, liên kết các thành phần dữliệu có kiểu dữ liệu đã được định nghĩa.

Các NNLT đều cài đặt sẵn 1 số kiểu dữ liệu có cấu trúc cơ bản như: tập hợp, mảng, xâu ký tự, bản ghi, tập tin... và cho phép lập trình viên tự định nghĩa KDL mới.

Trong môn học này sẽ nghiên cứu về 1 số CTDL phức tạp hơn: danh sách tuyến tính (ngăn xếp, hàng đợi), danh sách liên kết (đơn, vòng, kép), cây (nhị phân, tổng quát), đồ thị,…

Page 30: Chuong 1. tong quan

30

1.4. Đánh giá độ phức tạp GT

1.4.1. Phương pháp đánh giá

1.4.2. Phân tích đánh giá 1 GT đơn giản

Page 31: Chuong 1. tong quan

31

1.4.1. Phương ph áp đánh giá

Thực nghiệm: là phương pháp đơn giản nhất để đánh giá “hiệu quả” của một giải thuật (GT). Cách đánh giá :

• Lập trình, kiểm thử.

• Thống kê thời gian thực hiện của GT (theo thời gian thực).

Nhược điểm:• GT chịu sự hạn chế của NNLT dùng để cài đặt.

• Hiệu quả của GT bị ảnh hưởng bởi trình độ của lập trình viên.

• Việc chọn được các bộ dữ liệu thử đặc trưng cho tất cả tập các dữ liệu vào của GT rất khó khăn và tốn nhiều chi phí.

• Các thông số kiểm thử phụ thuộc nhiều vào phần cứng.

Kết luận: khó có khả năng áp dụng trên thực tế!

Page 32: Chuong 1. tong quan

32

Phương ph áp xấp x ỉ tiệm cận

Đánh giá giải thuật theo hướng xấp xỉ tiệm cận: làphương pháp mang tính hình thức, không phụ thuộc vào môi trường và phần cứng. Sử dụng 1 số khái niệm toán họcO, Ω, Θ.

Kích th ước dữ liệu vào ( N): là lượng dữ liệu cần được xử lý của bài toán.• Bài toán số nguyên tố: N là độ lớn của số nguyên cần kiểm tra.

• Bài toán sắp xếp dãy số: N là số lượng phần tử của dãy số.

Hàm thời gian ( T(N)): xác định bởi số lệnh mà chương trình cần thực hiện. • T(N) không phụ thuộc vào phần cứng!

Page 33: Chuong 1. tong quan

33

Phương ph áp xấp x ỉ tiệm cận Mục đích của phương pháp : Đánh giá, so sánh các

GT trong trường hợp dữ liệu vào N khá lớn và theo cách độc lập với phần cứng, NNLT, chương trình dịch,…

Ví dụ:

So sánh 2 giải thuật P1 và P2 với hàm thời gian thực hiện tương ứng là T1(N) = 100N2 và T2(N) = N3.

• Trường hợp N < 100: thời gian thực hiện của P1 và P2 ít, sự khác biệt giữa T1 và T2 là không đáng kể (T1 ≈ T2 ≈ 0)

Không đánh giá.

• Trường hợp N > 100: Đánh giá.

• Kết luận: P1 “hiệu quả” P2.

Page 34: Chuong 1. tong quan

34

Các trường hợp của GT

Một số trường hợp đánh giá GT: Tốt nhất: hàm thời gian T(N) có giá trị nhỏ nhất. Trung bình : hàm thời gian T(N) có giá trị trung bình.

• Được quan tâm nhiều nhất, đại diện cho đa số trường hợp sửdụng giải thuật.

• Việc xác định T(N) trong trường hợp trung bình thường gặp nhiều khó khăn về phân tích toán học.

Xấu nhất: hàm thời gian T(N) có giá trị lớn nhất.• Được quan tâm trong các bài toán có liên quan đến rủi ro, y

học, ...• Hoặc khi gặp khó khăn trong đánh giá GT ở trường hợp trung

bình.

Page 35: Chuong 1. tong quan

35

Các trường hợp của GT Ví dụ: Xét giải thuật của bài toán số nguyên tố:kt = 1; //Giả sử N là số nguyên tốfor (i = 2; i < N; i++)

if (N % i == 0)

kt = 0; //N không là số nguyên tốbreak; //Thoát khỏi for.

• Tốt nhất: N là 1 số chẵn (vòng for thực hiện 1 lần).• Xấu nhất: N là 1 số nguyên tố (vòng for thực hiện N-2 lần).• Trung bình: N là 1 số nguyên dương bất kỳ. Rất khó xác định

T(N) trường hợp trung bình!

Page 36: Chuong 1. tong quan

36

Các ký ph áp đánh giá độ phức tạp

Đặt vấn đề: để đánh giáđộ phức tạp của 1 GT, cần ước lượng hàm thời gian T(n) của GT với 1 hàm g(n). g(n): là 1 hàm xác định, g(n) > 0 với mọi n. Căn cứ vào độ lớn của g(n) để xác định GT là “hiệu quả”

(nếu g(n) nhỏ) hoặc “không hiệu quả” (nếu g(n) lớn).

Ký pháp: Độ phức tạp của GT(còn gọi là độ phức tạp tính toán của GT) được xác định trong các trường hợp (tốt nhất, trung bình, xấu nhất) với các ký pháp: Ký pháp Θ lớn (big-theta). Ký pháp Ω lớn (big-omega). Ký pháp O lớn (big-oh): được sử dụng trong môn học!

Page 37: Chuong 1. tong quan

37

Ký ph áp đánh giá độ phức tạp ΘΘΘΘ Khái ni ệm: T(n) = Θ(g(n))

nếu tồn tại các hằng số dương c1, c2 vàn0 sao cho:c1.g(n) ≤ T(n) ≤ c2.g(n)

với mọi n ≥ n0Ký hiệu này gọi là ký pháp

Θ lớn (big-theta notation) Hàm g(n) được gọi là giới

hạn chặt (asymptotic tight bound) của hàm T(n).

Page 38: Chuong 1. tong quan

38

Ký ph áp đánh giá độ phức tạp Ω Khái ni ệm: T(n) = Ω(g(n))

nếu tồn tại các hằng số dương c vàn0 sao cho:

c.g(n) ≤ T(n) với mọi n ≥ n0

Ký hiệu này gọi là ký pháp Ω lớn (big-omega notation)

Hàm g(n) được gọi là giới hạn dưới (asymptotic lower bound) của hàm T(n).

Page 39: Chuong 1. tong quan

39

Ký ph áp đánh giá độ phức tạp O

Khái ni ệm: T(n) = O(g(n))nếu tồn tại các hằng số dương c vàn0 sao cho:

c.g(n) ≥ T(n) với mọi n ≥ n0

Ký hiệu này gọi là ký pháp O lớn (big-oh notation)

Hàm g(n) được gọi là giới hạn trên (asymptotic upper bound) của hàm T(n).

Luôn tìm được g(n) và cần tìm g(n) nhỏ nhất có thể!!!

Page 40: Chuong 1. tong quan

40

Ký ph áp đánh giá độ phức tạp O

Ví dụ:GT với T(n)= (n+1)2 sẽ có độ phức tạp là O(n2) vì có thể

chọn được các giá trị c = 4, n0 = 14.n2 ≥ (n+1)2 với mọi n ≥ 1

Cũng có thể kết luận T(n) = O(n3), … nhưng g(n) = O(n2)là hàm nhỏ nhất ta tìm được!

Tổng quát 1: GT với T(n)= a2.n2 + a1.n + a0 (với a0, a1, a2 là các hằng số) có độ phức tạp làO(n2).Giải thích???

Tổng quát 2: GT với T(n)= ak.nk + ak-1.nk-1 +…+ a0

(với a0,…,ak là các hằng số) có độ phức tạp làO(nk).

Page 41: Chuong 1. tong quan

41

Ký ph áp đánh giá độ phức tạp O

Kết luận:

Khi đánh giá độ phức tạp GT bằng ký pháp OChỉ quan tâm đến luỹ thừa cao nhất của n!Bỏ qua các hằng số!

Page 42: Chuong 1. tong quan

42

Độ phức tạp của giải thu ật

Khái ni ệm: Độ phức tạp của giải thuật là hàm chặn trêncủa hàm thời gian T(N). GT có hàm thời gian T(N) và độ phức tạp giải thuật là

g(N) nếu T(N) = O(g(N)).

Sự phân lớp giải thuật: căn cứ vào hàm g(n) Ý ngh ĩa: Cho phép so sánh “hiệu quả” của các GT một

cách nhanh chóng theo nguyên tắc “GT nào có độ phức tạp ở phân lớp thấp hơn thì hiệu quả hơn”.

Một số phân lớp thường gặp: 1, lgn, n, nlgn, n2, n3, 2n, n!, nn, …• Hàm logarit (lgn): thường gặp nhất là log2n, phân biệt với ký

hiệu toán học của log10n.

Page 43: Chuong 1. tong quan

43

Sự phân l ớp gi ải thu ật Hàm 1 gọi là hàm hằng số, là trường hợp lý tưởng về

GT của các bài toán tin học: “Với kích thước dữ liệu vào N bất kỳ, GT luôn dừng sau 1 vài câu lệnh”.Bài toán đơn giản, trường hợp đặc biệt,…

Các hàm lgN, N, N2, N3,… gọi là các hàm loại đa thức. Các GT thuộc phân lớp hàm đa thức có thời gian thực hiện khá nhanh và thường được sử dụng.

Các hàm 2N, N!, NN,… được gọi là hàm loại mũ. Các GT thuộc phân lớp hàm loại mũ có thời gian thực hiện rất chậm và thường phải thay thế bằng các GT “gần đúng” thuộc phân lớp hàm loại đa thức!

Page 44: Chuong 1. tong quan

44

Sự phân l ớp gi ải thu ật

≈≈≈≈ 2,63*10354.294.967.296 1.024160325………………

lgN N NlgN N2 2N N!

0 1 0 1 2 1

1 2 2 4 4 2

2 4 8 16 16 24

3 8 24 64 256 40.320

4 16 64 256 65.536 2.004.189.184

Page 45: Chuong 1. tong quan

45

Sự phân l ớp gi ải thu ật

Phân tích:GT có độ phức tạp thuộc phân lớp N!, với kích thước dữ

liệu vào N = 32, sẽ cần khoảng T(N) = 2,63*1035 lệnh.

Giả sử máy tính chạy chương trình được cài đặt bằng GT trên có tốc độ xử lý khoảng 2,63 tỷ phép tính/giây (2,63 GHz trong điều kiện lý tưởng) thì thời gian thực hiện là:

T(N) = 1026 giây ≈ 3.170.979.198.376.458.650 năm• 1 năm = 365 * 24 * 60 * 60 = 31.536.000 giây

Thời gian thực hiện chương trình hơn 3 tỷ tỷ năm!

Page 46: Chuong 1. tong quan

46

1.4.2. Phân tích đánh giá 1 GT

Bài toán: Gỡ mìn (OLP Không chuyên 2010) Đội đặc nhiệm thành phố XYZ nhận được thông tin tình

báo rằng, quân khủng bố đặt n quả mìn trên tuyến đường cao tốc, trong số đó có 1 quả mìn hẹn giờ với cơ chế hoạt động đặc biệt. Khi có người tiếp xúc với một quả mìn bất kỳ trong n quả mìn thì quả mìn hẹn giờ sẽbị kích hoạt đồng hồ đếm ngược của nó và sau t giây thìquả mìn này sẽ nổ nếu chưa được tháo gỡ.

Các quả mìn đánh số từ 1 tới n dọc theo quốc lộ và cóthể coi vị trí của mỗi quả mìn là một điểm trên trục sốtheo trục quốc lộ. Quả mìn thứ i có tọa độ là xi trên trục số đó.

Page 47: Chuong 1. tong quan

47

1.4.2. Phân tích đánh giá 1 GT Một chuyên gia gỡ mìn hàng đầu của đội đặc nhiệm

được cử đến để gỡ n quả mìn. Với khả năng của anh ta, hầu như thời gian gỡ một quả mìn là không đáng kể. Tuy nhiên chuyên gia này cần thời gian để di chuyển từquả mìn này tới quả mìn khác với chi phí là 1 giây cho 1 đơn vị độ dài.

Thời gian để chuyên gia gỡ hết các quả mìn (bao gồm cả quả mìn hẹn giờ) phụ thuộc rất nhiều vào cách chọn quả mìn đầu tiên bắt đầu gỡ cũng như thứ tự các quảmìn cần xử lý.

Page 48: Chuong 1. tong quan

48

1.4.2. Phân tích đánh giá 1 GT Yêu cầu: Cho n, t (2≤n, t≤100), k là chỉ số của quả mìn

hẹn giờ và tọa độ các quả mìn (là các số nguyên không âm không vượt quá 100). Hãy xác định thời gian tối thiểu tính từ lúc bắt đầu gỡ quả mìn đầu tiên cho tới khi gỡ được n quả mìn mà quả mìn hẹn giờ không phát nổ.

Dữ liệu:• Dòng 1: chứa số 2 nguyên n và t, • Dòng 2: chứa n số nguyên theo thứ tự tăng dần là tọa độ mìn, • Dòng 3: chứa số nguyên k.

Kết quả: thời gian gỡ được n quả mìn. Ví dụ: Có n = 6 quả mìn ở vị trí (1, 2, 3, 6, 8, 25), quả

mìn hẹn giờ là quả mìn k = 5, thời gian phát nổ t = 4. Thời gian tối thiểu để gỡ mìn an toàn là 31.

Page 49: Chuong 1. tong quan

49

1.4.2. Phân tích đánh giá 1 GT

B1: Xác định bài toán Vấn đề cần giải quyết: gỡ n quả mìn mà mìn hẹn giờ

không nổ. Giả thiết: các quả mìn đặt trên 1 trục số, tọa độ mìn tăng

dần, cơ chế mìn nổ, … Yêu cầu: thời gian là nhỏ nhất có thể.

B2: Tìm cấu trúc dữ liệu n, t, k: kiểu số nguyên 1 byte, không dấu x: kiểu mảng 1 chiều của kiểu số nguyên 1 byte, không

dấu Biến kết quả min : kiểu số nguyên 1 byte, không dấu

Page 50: Chuong 1. tong quan

50

1.4.2. Phân tích đánh giá 1 GT

B3: Tìm giải thuật GT 1:

• Ý tưởng: “vét cạn”, duyệt tất cả các phương án gỡ mìn để tìm ra thời gian tối thiểu min.

• Mô tả:min = +∞;

<Duyệt mọi phương án gỡ mìn> //Giải thuật quay lui

<Tìm thời gian tg của phương án>;

if (<mìn không nổ> && (tg < min)) tg = min;

printf(“%d”, min);

• Đánh giá: Độ phức tạp GT 1 thuộc phân lớp N!.

Page 51: Chuong 1. tong quan

51

1.4.2. Phân tích đánh giá 1 GT GT 2:

• Ý tưởng: chỉ duyệt các phương án gỡ mìn 1 cách “liên tiếp” đểtìm ra thời gian tối thiểu min. Bỏ qua các phương án “nhảy cóc”.

• Mô tả:min = +∞;

for (i = 1; i <= n; i++)

<Đi theo 2 hướng để tìm thời gian tg của phương án>;

if (<mìn không nổ> && (tg < min)) tg = min;

printf(“%d”, min);

• Đánh giá: Độ phức tạp GT 2 thuộc phân lớp N.

Page 52: Chuong 1. tong quan

52

1.4.2. Phân tích đánh giá 1 GT GT 3:

• Ý tưởng: thời gian tối thiểu min chỉ có thể xuất hiện ở 1 trong 4 phương án gỡ mìn sau đây:

- Phương án 1: nếu gỡ mìn từ 1 đến n mà mìn không nổ.

- Phương án 2: nếu gỡ mìn từ n đến 1 mà mìn không nổ.

- Ngược lại: min là giá trị nhỏ nhất trong 2 phương án 3 và 4

- + Phương án 3: gỡ mìn từ k đến 1, rồi gỡ từ k+1 đến n.- + Phương án 4: gỡ mìn từ k đến n, rồi gỡ từ k – 1 đến 1.

• Giải thích: dựa trên quãng đường cần di chuyển giữa các quảmìn.

Page 53: Chuong 1. tong quan

53

1.4.2. Phân tích đánh giá 1 GT• Mô tả:min = x[n] – x[1]; //Phương án 1 hoặc phương án 2

d1 = x[k] – x1; //Khoảng cách từ mìn hẹn giờ đến mìn 1

d2 = x[n] – x[k]; //Khoảng cách từ mìn hẹn giờ đến mìn n

if ((d1 > t) && (d2 > t)) //Phương án 1 và 2 làm mìn nổ

if (d1 < d2)

min = min + d1; //Phương án 3

else

min = min + d2; //Phương án 4

printf(“%d”, min);

• Đánh giá: Độ phức tạp GT 3 thuộc phân lớp 1.

Page 54: Chuong 1. tong quan

54

1.4.2. Phân tích đánh giá 1 GT

Phân tích đánh giá 1 GT thường là 1 quá trình phức tạp đòi hỏi nhiều phân tích toán học. Mục này chỉ đưa ra cách phân tích đánh giá 1 GT đơn giản (sau khi đã diễn tả bằng ngôn ngữ tự nhiên hoặc lập trình bằng 1 NNLT nào đó) giúp người học hiểu rõ hơn về phương pháp đánh giá giải thuật theo hướng xấp xỉ tiệm cận.

Phép toán tích cực: Là các phép toán thuộc GT mà thời gian thực hiện nókhông ít hơn thời gian thực hiện các phép toán khác. Phép toán tích cực có thể không phải là duy nhất.

Khi đánh giá độ phức tạp của 1 GT, phương pháp xấp xỉ tiệm cận chỉ quan tâm đến các phép toán tích cực.

Page 55: Chuong 1. tong quan

55

Các bước phân tích đánh giá

Bước 1: Xác định phép toán tích cực của GT

Đây là những phép toán cóảnh hưởng quyết định đến thời gian thực hiện của GT.

Bước 2: Xác định số lần thực hiện của phép toán tích cực

Xác định hàm thời gian T(n)theo kích thước dữ liệu ncủa bài toán bằng cách xác định số lần thực hiện của phép toán tích cực trong các trường hợp tốt nhất, trung bình, xấu nhất (theo yêu cầu).

Bước 3: Kết luận độ phức tạp GT

Sử dụng ký pháp O kết luận hàm thời gian T(n) trong các trường hợp của bài toán.

Page 56: Chuong 1. tong quan

56

Phân tích đánh giá 1 GT đơn gi ản

Xét bài toán tính tổng S của các giai thừa từ 0 đến n:S = 0! + 1! + 2! + … + n!

Có 2 cách tính S:1. Tính từng số hạng rồi cộng lại:

Tính i! với i = 1..n (0! = 1: không cần tính)2. Dựa vào số hạng trước để tính số hạng sau:

i! = (i – 1)! * i Yêu cầu:1. Viết các chương trình con mô tả 2 GT tính tổng.2. Phân tích đánh giá độ phức tạp 2 GT trong các trường

hợp tốt nhất, xấu nhất và trung bình.

Page 57: Chuong 1. tong quan

57

GT tính t ừng số hạng rồi cộng l ại

Chương trình con mô tả GT bằng NNLT C/C++:void Tong1()

S = 1; //Khởi tạo S = 0!for(i = 1; i <= N; i++)

p = 1;for(j = 2; j <= i; j++) p = p * j; //Tính p = i!S = S + p; //Cộng i! vào S

Page 58: Chuong 1. tong quan

58

GT tính t ừng số hạng rồi cộng l ại

Phân tích đánh giá độ phức tạp GT:Bước 1: Xác định phép toán tích cực của GT

p = p * j;

Bước 2: Xác định số lần thực hiện của phép toán tích cực Trong các trường hợp tốt nhất, trung bình và xấu nhất,

số lần thực hiện của phép toán tích cực là như nhau. Khi i chạy từ 1 đến n, phép toán tích cực thực hiện i - 1

lần. Tổng số lần thực hiện là:

Bước 3: Kết luận độ phức tạp giải thuật Trong 3 trường hợp độ phức tạp GT là: T(n) = O(n2)

nnnn

nin

i 2

1

2

1

2

)1()1(...210)1( 2

1

−=−=−++++=−∑=

Page 59: Chuong 1. tong quan

59

GT dựa vào số hạng tr ước tính s ố hạng sau

Chương trình con mô tả GT bằng NNLT C/C++:void Tong2()

S = 1; //Khởi tạo S = 0!p = 1; //Khởi tạo p = 0!for(i = 1; i <= N; i++)

p = p * i; //Tính p = i! = (i – 1)! * iS = S + p; //Cộng i! vào S

Page 60: Chuong 1. tong quan

60

GT dựa vào số hạng tính s ố hạng sau

Phân tích đánh giá độ phức tạp GT:Bước 1: Xác định phép toán tích cực của GT

p = p * j; S = S + p;

Bước 2: Xác định số lần thực hiện của phép toán tích cực Trong các trường hợp tốt nhất, trung bình và xấu nhất,

số lần thực hiện của phép toán tích cực là như nhau. Khi i chạy từ 1 đến n, phép toán tích cực thực hiện 1

lần. Tổng số lần thực hiện là:

Bước 3: Kết luận độ phức tạp giải thuật Trong 3 trường hợp độ phức tạp GT là: T(n) = O(n)

nn

i

=+++=∑=

1...1111

Page 61: Chuong 1. tong quan

61

1.5. Bài tập

1.5.1. Bài tập lý thuyết

1.5.2. Bài tập thực hành

Page 62: Chuong 1. tong quan

62

1.5.1. Bài tập lý thuy ết

1. Nêu các bước cơ bản khi giải một bài toán tin học.

2. Mối quan hệ giữa cấu trúc dữ liệu và giải thuật trong một bài toán tin học.

3. Hãy nêu một vài cấu trúc dữ liệu của ngôn ngữ lập trình đã học. Các tiêu chuẩn đánh giá một cấu trúc dữ liệu.

4. Các tiêu chuẩn đánh giá một giải thuật. Phép toán tích cực là gì?

5. Các bước phân tích đánh giá độ phức tạp giải thuật theo hướng xấp xỉ tiệm cận. Ý nghĩa của các ký pháp dùng trong phương pháp.

Page 63: Chuong 1. tong quan

63

1.5.2. Bài tập thực hành

6. Viết chương trình tính xấp xỉ của hàm ex theo 2 cách:

a) Tính riêng rẽ từng phần tử rồi cộng vào tổng.b) Tính phần tử sau dựa vào phần tử đứng trước.

!n

x...

!2

x

!1

x1e

n2x ++++=

)!2()1(...

!6!4!21)(

2642

n

xxxxxCos

nn−+−+−=

)!12()1(...

!7!5!3)(

12753

+−+−+−=

+

n

xxxxxxSin

nn

Page 64: Chuong 1. tong quan

64

1.5.2. Bài tập thực hành

7. Phân tích đánh giá độ phức tạp GT của 2 GT ở bài tập 6 rồi so sánh.

8. Viết chương trình kiểm tra tính nguyên tố của số tựnhiên N bằng các cách đã học.

9. Phân tích đánh giá độ phức tạp GT của các GT ở bài 8 trong trường hợp tốt nhất, xấu nhất rồi so sánh.

10. Nêu 1 ý tưởng cải tiến GT ở bài 9.

Page 65: Chuong 1. tong quan

65

1.5.2. Bài tập thực hành

11. Phân tích đánh giá độ phức tạp các giải thuật bằng ký pháp chữ O lớn trong trường hợp xấu nhất. Cho biết nội dung thực hiện của từng GT.a) float Bai1()

Sum = 0;for(i = 1; i <= n; i++)

scanf(“%f”, &x);Sum = Sum + x;

return Sum;

Page 66: Chuong 1. tong quan

66

1.5.2. Bài tập thực hànhb) void Bai2()

for(i = 1; i <= n; i++)for(j = 1; j <= n; j++)

C[i][j] = 0;for(k = 1; k <= n; k++)

C[i][j] = C[i][j] + A[i][k] * B[k][j];

Page 67: Chuong 1. tong quan

67

1.5.2. Bài tập thực hànhc) void Bai3()

for(i = 1; i < n; i++)

for(j = 1; j < n; j++)if (X[j] > X[j + 1])

T = X[j];X[j] = X[j + 1];X[j + 1] = T;