Bài giảng Cấu trúc dữ liệu và giải thuật - Chương I: Tổng quan về giải thuật và cấu trúc dữ liệu

Trong phạm vi tin học, ta có thể quan niệm bài toán (Problems) là công việc mà ta muốn máy tính thực hiện

VD: In dòng chữ ra màn hình, giải phương trình bậc 2, quản lý cán bộ trong một cơ quan

Diễn đạt bài toán thành 2 thành phần

Input: Thông tin đầu vào

Output: Thông tin đầu ra

Cấu trúc dữ liệu: là tập các dữ liệu có quan hệ với nhau, được tổ chức theo những phương thức nhất định

Giải thuật (thuật toán-Algorithm): là một dãy hữu hạn các thao tác chặt chẽ và rõ ràng được sắp xếp theo một trình tự xác định sao cho sau khi thực hiện dãy thao tác đó, ta nhận được mục tiêu định trước

Tính xác định

Ở mỗi bước của thuật toán các thao tác phải hết sức rõ ràng: Không thể gây nên sự nhập nhằng, tuỳ tiện. Nói một cách khác là trong cùng một điều kiện, hai bộ xử lý cùng thực hiện một bước của giải thuật thì phải cho cùng một kết quả

Tính hữu hạn dừng

Giải thuật bao giờ cũng phải dừng sau một số hữu hạn bước

ppt 63 trang kimcuc 8180
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cấu trúc dữ liệu và giải thuật - Chương I: Tổng quan về giải thuật và cấu trúc dữ liệu", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Cấu trúc dữ liệu và giải thuật - Chương I: Tổng quan về giải thuật và cấu trúc dữ liệu

Bài giảng Cấu trúc dữ liệu và giải thuật - Chương I: Tổng quan về giải thuật và cấu trúc dữ liệu
Cấu trúc dữ liệu và giải thuật  (Data structure and Algorithms) 
Nội dung chương trình 
Chương I 
	 TỔNG QUAN VỀ GIẢI THUẬT VÀ CẤU TRÚC DỮ LIỆU 
Khái niệm về cấu trúc dữ liệu và giải thuật 
Một số cú pháp điều khiển 
Đánh giá độ phức tạp của giải thuật 
Chương II. 
	TÌM KIẾM VÀ SẮP XẾP 
I. Các giải thuật tìm kiếm nội 
Tìm kiếm tuyến tính 
Tìm kiếm nhị phân 
II. Các giải thuật sắp xếp nội 
Chọn trực tiếp (Selection sort) 
Chèn trực tiếp (Insertion sort) 
Đổi chỗ trực tiếp (Interchange Sort) 
Nổi bọt ( Buble sort) 
Sắp xếp cây (Heap sort) 
Sắp xếp dựa trên phân hoạch (Quick sort) 
Sắp xếp trộn trực tiếp (Merge sort ) 
Nội dung chương trình 
Chương III. 
	CẤU TRÚC DỮ LIỆU ĐỘNG 
Kiểu dữ liệu con trỏ 
Danh sách liên kết-khái niệm 
Danh sách liên kết đơn 
Tổ chức danh sách đơn 
Các thao tác cơ bản trên danh sách đơn 
Tạo danh sách 
Duyệt danh sách 
Chèn phần tử vào danh sách 
Xoá phần tử khỏi danh sách 
3. Sắp xếp dánh sách ( lý thuyết+đọc thêm ) 
4. Các cấu trúc đặc biệt của danh sách đơn 
Stack 
Queue 
IV. Một số cấu trúc dữ liệu dạng danh sách liên kết khác 
Danh sách liên kết kép 
Hàng đợi 2 đầu 
Danh sách liên kết có thứ tự 
Danh sách liên kết vòng 
Danh sách có nhiều mối liên kết 
Nội dung chương trình 
Chương IV. 
	 CẤU TRÚC CÂY 
Khái niệm về cây 
Cây nhị phân 
Một số tính chất của cây nhị phân 
Biểu diễn cây nhị phân 
Duyệt cây nhị phân 
Biểu diễn cây tổng quát 
III. Cây nhị phân tìm kiếm 
Tìm một phần tử 
Thêm một phần tử 
Huỷ một phần tử 
IV. Cây nhị phân cân bằng 
Cây nhị phân cân bằng hoàn toàn 
Cây nhị phân cân bằng 
Nội dung chương trình 
Phần II. 
Bài tập+Thực hành + Ceminar 
- Cài đặt các chương thuật toán trong phần lý thuyết đã học 
Nội dung chương trình 
Tài liệu tham khảo 
Trần Hạnh Nhi-Dương Anh Đức , Giáo trình cấu trúc dữ liệu và giải thuật ĐH Quốc gia Tp Hồ Chí Minh 
Đỗ Xuân Lôi , Cấu trúc dữ liệu và giải thuật , NXB Khoa học kỹ thuật , 1996 
Robert Sedgewick , Cẩm nang thuật toán , tập 1, NXB Khoa học kỹ thuật , 1994, bản dịch của nhóm tác giả ĐH TH Tp . HCM 
N. Wirth: Algorithms+Data structures=Programs (Prentice Hall, 1976) 
V v 
Tổng quan về các giải thuật và cấu trúc dữ liệu 
Chương I 
Khái niệm về cấu trúc dữ liệu và giải thuật 
Một số cú pháp điều khiển 
Đánh giá độ phức tạp của giải thuật 
I. Khái niệm về cấu trúc dữ liệu và giải thuật 
Trong phạm vi tin học , ta có thể quan niệm bài toán (Problems) là công việc mà ta muốn máy tính thực hiện 
1. Khái niệm bài toán 
VD : In dòng chữ ra màn hình , giải phương trình bậc 2, quản lý cán bộ trong một cơ quan  
* Diễn đạt bài toán thành 2 thành phần 
Input: Thông tin đầu vào 
Output: Thông tin đầu ra 
Ví dụ 
Giải thuật ( thuật toán -Algorithm): là một dãy hữu hạn các thao tác chặt chẽ và rõ ràng được sắp xếp theo một trình tự xác định sao cho sau khi thực hiện dãy thao tác đó , ta nhận được mục tiêu định trước 
2. Khái niệm Cấu trúc dữ liệu và giải thuật 
Cấu trúc dữ liệu : là tập các dữ liệu có quan hệ với nhau , được tổ chức theo những phương thức nhất định 
3. Các đặc trưng của giải thuật 
a. Tính xác định 
Ở mỗi bước của thuật toán các thao tác phải hết sức rõ ràng : Không thể gây nên sự nhập nhằng , tuỳ tiện . Nói một cách khác là trong cùng một điều kiện , hai bộ xử lý cùng thực hiện một bước của giải thuật thì phải cho cùng một kết quả 
b. Tính hữu hạn dừng 
 Giải thuật bao giờ cũng phải dừng sau một số hữu hạn bước 
3. Các đặc trưng của giải thuật 
c. Tính đúng đắn 
 Sau khi thực hiện tất cả các thao tác của thuật toán ta phải được kết quả mong muốn 
d. Tính phổ dụng 
 Thuật toán có thể giải bất kỳ bài toán nào trong cùng một lớp các bài toán 
3. Các đặc trưng của giải thuật ( tiếp ) 
e. Tính có đại lượng vào , đại lượng ra 
 Khi bắt đầu giải thuật bao giờ cũng nhận các đại lượng vào mà ta thường gọi là dữ liệu vào 
 Sau khi kết thúc , một thuật toán bao giờ cũng cho một số đại lượng ra tuỳ theo các chức năng mà thuật toán đảm nhiệm , chúng thường được gọi là dữ liệu ra . 
3. Các đặc trưng của giải thuật ( tiếp ) 
f. Tính có hiệu quả 
Tính có hiệu quả của giải thuật được đánh giá dựa trên các tiêu chuẩn sau 
 Dung lượng bộ nhớ cần có 
 Số các phép tính cần thực hiện 
 Thời gian cần thiết để chạy 
 Có dễ hiểu không 
 Có dễ cài đặt trên máy không 
4. Ngôn ngữ diÔn đạt giải thuật 
a. Liệt kê từng bước ( ngôn ngữ tự nhiên ) 
Liệt kê các bước thực hiện giải thuật theo thứ tự thực hiện 
Ví dụ 
b. Sơ đồ khối 
 Khối bắt đầu hoặc kết thúc 
 Khối thao tác 
 Nhập dữ liệu 
 Khối điều kiện 
 Chỉ hướng thực hiện của giải thuật 
Ví dụ 
4. Ngôn ngữ diÔn đạt giải thuật ( tiếp ) 
c. Dùng ngôn ngữ phỏng trình ( tựa ngôn ngữ lập trình ) 
Sử dụng cú pháp của một ngôn ngữ lập trình + Ngôn ngữ tự nhiên để diễn đạt giải thuật 
d. Dùng ngôn ngữ lập trình 
Dùng ngôn ngữ lập trình nào đó để viết giải thuật 
Hạn chế : 
Phụ thuộc vào ngữ nghĩa , cú pháp nặng nề , gò bó 
Không được nhiều người dùng ưa thích và sử dụng 
Ví dụ 
Ví dụ 
Lưu ý: Trong quá trình học môn học này , chủ yếu dùng ngôn ngữ phỏng trình tựa Pascal /C để diễn đạt giải thuật 
 Dữ liệu : Số, ký tự , hình ảnh , âm thanh  
Thuộc tính của một kiểu dữ liệu bao gồm : 
 Tên kiểu dữ liệu 
 Mièn giá trị 
 Kích thức lưu trữ 
 Tập các phép toán tác động lên KDL đó 
5. Kiểu dữ liệu 
 KDL cơ bản : 
 Rời rạc : Số nguyên , ký tự , logic, liệt kê , miền con 
 Liên tục : Số thực 
 KDL cấu trúc 
 Kiểu chuỗi (String) 
 Kiểu Mảng (Array) 
 Kiểu bản ghi ( Recorrd ) 
Kiểu tập hợp (Union) 
Các kiểu dữ liệu 
5. Kiểu dữ liệu 
 KDL trừu tượng 
 Danh sách móc nối (List) 
 Cây (Tree) 
 Đồ thị (Graph) 
 Tập hợp (union) 
Các kiểu dữ liệu 
5. Kiểu dữ liệu 
6. Mối quan hệ giữa cấu trúc dữ liệu và giải thuật 
 North Wirth say that: 
Data Structures+Algorithms = Programs 
 Để xây dựng giải thuật phù hợp phải xác định nó tác động trên các kiểu dữ liệu nào 
Ví dụ : Làm nhuyễn các hạt đậu xay chứ không băm 
 Khi chọn lựa cấu trúc dữ liệu cần phải hiểu rõ những thao tác ( giải thuật ) sẽ tác động lên nó 
Ví dụ : Biểu diễn điểm của sinh viên dùng số chứ không dùng chữ 
- Cấu trúc dữ liệu thay đổi giải thuật thay đổi theo 
Ví dụ 
7. Tiêu chuẩn đánh giá CTDL 
a. Phản ánh đúng thực tế 
	 Quan trọng nhất , quyết định tính đúng đắn của toàn bộ bài toán 
c. Tiết kiệm tài nguyên hệ thống 
CPU, bộ nhớ 
VD: Khai báo tháng trong năm : Nên dùng kiểu byte thay vì kiểu int 
b. Phù hợp với các thao tác trên đó 
	 Giúp tăng tính hiệu quả của bài toán 
Tổng quan về các giải thuật và cấu trúc dữ liệu 
Chương I 
Khái niệm về cấu trúc dữ liệu và giải thuật 
Một số cú pháp điều khiển 
Đánh giá độ phức tạp của giải thuật 
II. Một số cú pháp điều khiển 
II. Một số cú pháp điều khiển 
 Có dạng : S1; S2; S3;  Sn 
 Với Si là các lệnh trọng chương trình 
 Để thực hiện câu lệnh tuần tự thì chương trình thực hiện lần lượt từ S1 đến Sn . Đầu ra của S1 là đầu vào của S2, đầu ra của S2 là đầu vào của S3 
1. Cú pháp tuần tự 
 Phải tôn trọng thứ tự thực hiện công việc , công việc nào làm trước thì phải viết lệnh trước 
Sơ đồ hoạt động 
 Có dạng V:=E 
với V chỉ tên biến , tên hàm ; E chỉ biểu thức 
2. Câu lệnh gán 
 Có dạng : Begin S1; S2; , Sn End; 
 Nó cho phep ghép nhiều câu lệnh lại để được coi như một câu lệnh 
3. Câu lệnh ghép 
II. Một số cú pháp điều khiển 
 Có dạng : If B Then S; 
 B là một biểu thức logic, S là một câu lệnh khác 
4. Câu lệnh điều kiện 
 Có dạng : If B Then S1 Else S2; 
 B là một biểu thức logic, S1, S2 là một câu lệnh khác 
Hoặc 
Sơ đồ hoạt động 
II. Một số cú pháp điều khiển 
 Có dạng : for i:=m to n do S; 
 Thực hiện câu lệnh S với i lấy giá trị nguyên từ m tới n (n>=m), với bước nhảy tăng bằng 1 
5. Câu lệnh lặp xác định 
Hoặc 
 Có dạng : for i:=n downto m do S; 
 Thực hiện tương tự như câu lệnh trên với bước nhảy giảm bằng 1 
II. Một số cú pháp điều khiển 
 Có dạng : while B do S; 
 Trong đó B là biểu thức logic; S là câu lệnh ; 
 Chừng nào B có giá trị True thì thực hiện S 
6. Câu lệnh lặp không xác định 
Hoặc 
 Có dạng : repeat S until B; 
 Trong đó B là biểu thức logic; S là câu lệnh ; 
 Lặp lại cho tới khi B có giá trị True 
Sơ đồ hoạt động 
II. Một số cú pháp điều khiển 
 Có dạng : go to n; 
 n là số hiệu của một bước trong chương trình 
 Thường hạn chế việc dùng Go to 
7. Câu lệnh nhảy 
 Có dạng : read( ); 
	 write();	 
8. Câu lệnh vào , ra 
II. Một số cú pháp điều khiển 
 Chương trình con Hàm 
function ( danh sách tham số ) 
Begin 
S1; S2; S3; ; Sn 
Return 
End; 
9. Chương trình con 
II. Một số cú pháp điều khiển 
9. Chương trình con 
 Chương trình con Thủ tục 
procedure ( danh sách tham số )> 
Begin 
S1; S2; S3; ; Sn 
End; 
II. Một số cú pháp điều khiển 
Tổng quan về các giải thuật và cấu trúc dữ liệu 
Chương I 
Khái niệm về cấu trúc dữ liệu và giải thuật 
Một số cú pháp điều khiển 
Đánh giá độ phức tạp của giải thuật 
III. Đánh giá độ phức tạp của giải thuật 
Thời gian 
Bộ nhớ 
Thực nghiệm 
Nhược điểm : 
Phải cài đặt bằng ngôn ngữ lập trình cụ thể 
Phụ thuộc trình độ người cài đặt 
Chọn mẫu thử 
Phụ thuộc nhiều vào phần cứng 
 Đánh giá theo hướng xấp xỉ tiệm cận qua các khái niệm toán học : O(), o(), 
 Quan tâm đến trường hợp trung bình 
Các tiêu chuẩn đánh giá độ phức tạp 
 Nếu thời gian thực hiện một giải thuật là T(n)=c.n 2 ( với c là hằng số ) thì ta nói : Độ phức tạp về thời gian của giải thuật này có cấp n 2 và ký hiệu T(n)=O(n 2 ) ( ký hiệu chữ O lớn ) 
2. Độ phức tạp về thời gian của giải thuật 
 Một cách tổng quát ta có thể định nghĩa : 
Một hàm f(n ) được xác định là O(g(n )) 
f(n )= O(g(n )) 
và được gọi là có cấp g(n ) nếu tồn tại các hàng số c và n 0 sao cho : 
f(n ) c .g(n ) khi n n 0 
Ví dụ 
Quy tắc tổng : 
Giả sử T 1 (n) và T 2 (n) là thời gian thực hiện của 2 đoạn chương trình P 1 và P 2 mà T 1 (n)=O(f(n)) và T 2 (n)=O(g(n)) thì thời gian thực hiện P 1 và P 2 kế tiếp nhau sẽ là : 
T(n )=T 1 (n)+T 2 (n)=O(max(f(n), g(n))) 
3. Xác định độ phức tạp về thời gian 
Quy tắc nhân 
Nếu tương ứng với P 1 và P 2 là T 1 (n)= O(f(n )), T 2 (n)= O(g(n )) thì thời gian thực hiện P 1, P 2 lồng nhau sẽ là : 
T(n )=T 1 (n).T 2 (n)= O(f(n).g(n )) 
Ví dụ 
Ví dụ 
4. Độ phức tạp về thời gian của các cú pháp điều khiển 
Câu lệnh gán , đọc , viết , nhẩy : 
 Có thời gian thực hiện =c ( hằng số ) đánh giá là O(1) 
b. Câu lệnh ghép 
Begin S1; S2; , Sn End; 
Thời gian thực hiện theo luật cộng 
 Khái niệm : Phép toán tích cực : Là phép toán 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 . Ví dụ : 
4. Độ phức tạp về thời gian của các cú pháp điều khiển 
c. Câu lệnh điều kiện 
If B then S1 Else S2; 
Thời gian thực hiện là O(Max(f 1 (n), f 2 (n))) 
Trong đó : Thời gian thực hiện S 1 là T 1 (n)=O(f 1 (n)); 
	 S 2 là T 2 (n)=O(f 2 (n)) 
4. Độ phức tạp về thời gian của các cú pháp điều khiển 
d. Câu lệnh lặp While 
 While B Do S; 
 Nếu thời gian thực hiện S là T(n )= O(f(n )) và có g(n ) lần thực hiện S trong vòng lặp While ( tối đa ) thì thời gian thực hiện vòng lặp là O(f(n).g(n )) 
e. Câu lệnh lặp Repeat 
 Repeat S1; S2; , Sn Until B; 
 Nếu thời gian thực hiện S1, S2, , Sn là T(n )= O(f(n )) và số lần lặp tối đa là g(n ) thì thời gian thực hiện vòng lặp là O(f(n).g(n )) 
4. Độ phức tạp về thời gian của các cú pháp điều khiển 
f. Câu lệnh lặp xác định 
 for i:=m to n do S; 
 Nếu thời gian thực hiện S là T(n )= O(f(n )) và có g(n ) lần lặp For thì thời gian thực hiện là O(f(n).g(n )) 
Ví dụ về đánh giá độ phức tạp 
5. Phân lớp các thuật toán  
 Phức tạp đa thức : O(1), O(n), O(n.logn ), O(n 2 ), O(n 3 ) 
 Phức tạp hàm mũ : O(2 n ) 
 Phức tạp giai thừa : O(n!) 
Mục tiêu thiết kế giải thuật : Đưa bài toán về độ phức tạp đa thức 
Đồ thị của một số hàm số 
So sánh các độ phức tạp 
Bảng giá trị của một số hàm số 
4 
8 
4 
2 
2 
1 
2.147.483.648 
32768 
1024 
160 
32 
5 
6536 
4096 
256 
64 
16 
4 
256 
512 
64 
24 
8 
3 
16 
64 
16 
8 
4 
2 
2 
1 
1 
0 
1 
0 
2n 
n3 
n2 
nlog2n 
n 
long2n 
So sánh các độ phức tạp 
The End ! 
Ví dụ : Chương trình quản lý điểm của sinh viên 
Chương trình quản lý điểm của sinh viên , cần lưu điểm số của 3 sinh viên . 
Do mỗi sinh viên có 4 điểm số ứng với 4 môn học dữ liệu có dạng bảng sau : 
SV 
Môn 1 
Môn 2 
Môn 3 
Môn 4 
SV 1 
5 
6 
7 
0 
SV 2 
6 
5 
8 
8 
SV 3 
5 
5 
9 
7 
Ví dụ : Chương trình quản lý điểm của sinh viên 
Phương án 2 : Sử dụng mảng hai chiều 3 X 4, phần tử A[i,j] là điểm thi môn j của sinh viên i 
7 
9 
5 
5 
8 
8 
5 
6 
0 
7 
6 
5 
A= 
Phương án 1 : Sử dụng mảng một chiểu 12 phần tử , nhóm 4 phần tử là điểm của 1 SV 
7 
9 
5 
5 
8 
8 
5 
6 
0 
7 
6 
5 
SV1	 SV2	 SV3 
Truy xuất điểm j của sinh viên i 
Bảng ( dòng i, cột j)= A[(i-1)* số cột+j ] 
Dùng sơ đồ khối 
Begin 
m,n 
m=n 
m>n 
UCLN = m 
End 
Đúng 
Sai 
m:=m-n 
Đúng 
n:=n-m 
Sai 
Tìm UCLN của 2 số nguyên dương m và n 
Dùng ngôn ngữ phỏng trình 
Function UCLN (m,n ) { Tìm ước số chung lớn nhất của hai số nguyên dương m và n} 
Begin 
Nhập m, n nguyên dương 
While mn do 
If m>n then m:=m-n else n:=n-m 
UCLN:=m 
End; 
Dùng ngôn ngữ lập trình 
# includ e 
# include 
void main() 
{ 
int m, n; 
printf("Nhap 2 so nguyen duong m,n\n"); 
scanf("%d%d",&m,&n ); 
while (m!=n) 
{ 
if (m>n) 
m=m-n; 
else n=n-m; 
} 
printf("UCLN =%d",m); 
getch (); 
} 
Bài toán : Tìm UCLN của 2 số nguyên dương m và n 
Dùng liệt kê từng bước 
Bước 1 : Nhập hai số nguyên dương 
Bước 2 : Nếu m=n sang bước 4 ; ngược lại sang bước 3 
Bước 3 : Nếu m>n thì đặt m=m-n về bước 2 
	 Nếu m<n thì đặt n=n-m về bước 2 
Bước 4 : Trả lời UCLN=m, Kết thúc 
Bài toán : Tìm UCLN của 2 số nguyên dương m và n 
Ví dụ : Diễn đạt bài toán thành 2 thành phần 
Diễn đạt bài toán giải phương trình bậc 2 
Input : Các hệ số a,b,c 
Outpu t: Thông báo nghiệm x1, x2; nghiệm kép x; hoặc vô nghiệm 
Diễn đạt bài toán Tìm ước số chung lớn nhất 
Input : Hai số nguyên dương m, n 
Outpu t: ước số chung lớn nhất của m, n 
Sơ đồ hoạt động của lệnh điều kiện 
B 
S 
True 
False 
B 
S 1 
True 
False 
S 2 
Sơ đồ hoạt động của lệnh lặp không biết trước 
B 
S 
True 
False 
True 
B 
S 
False 
Hoặc 
f. Câu lệnh lặp xác định 
For i:=1 to n do x:=x+1 
Thời gian thực hiện là O(n.1)=O(n) 
For i:=1 to n do 
 For j:=1 to n do x:=x+1 
Thời gian thực hiện là O(n.n)=O(n 2 ) 
Ví dụ : Xác định độ phức tạp 
Tính : e x =1+x/1!+x 2 /2!++ x n /n ! 
Program EXP1 ; 
{ Tính từng số hạng rồi cộng lại } 
Begin 
Read(x); s:=1; 
For i:=1 to n do 
Begin 
P:=1; 
For j:=1 to i do p:=p*x/j; 
S:=s+p; 
End; 
End; 
 Phép toán tích cực p:=p*x/j; 
 Nó thực hiện 	1+2++n=n(n+1)/2 lần 
 Độ phức tạp T(n)=O(n 2 ) 
Ví dụ : Xác định độ phức tạp 
Tính : e x =1+x/1!+x 2 /2!++ x n /n ! ( cách 2) 
Tách x 2 /2!=x/1!.x/2, , x n /n !=x n-1 /(n-1)!.x/2 
Progam EXP2; 
Begin 
Read(x); s:=1;p:=1; 
For i:=1 to n do 
Begin 
p:=p*x/i; 
S:=s+p; 
End; 
Phép toán tích cực p:=p* x/i ; 
Nó thực hiện n lần 
 Độ phức tạp T(n)=O(n) 
Ví dụ : Xác định phép toán tích cực 
Tính : e x =1+x/1!+x 2 /2!++ x n /n ! 
Tách x 2 /2!=x/1!.x/2, , x n /n !=x n-1 /(n-1)!.x/2 
Progam EXP2; 
Begin 
Read(x); s:=1;p:=1; 
For i:=1 to n do 
Begin 
p:=p*x/i; 
S:=s+p; 
End; 
Phép toán tích cực p:=p* x/i ; 
Đánh giá độ phức tạp bằng ký pháp O() 
a. f(n )=n 3 +4n+4 
g(n )=n 3 : vì chọn hằng số c=9 và n 0 =1 thì 
	 n 3 +4n+4=1 
 Độ phức tạp f(n )=O(n 3 ) 
b. f(n )=500n 2 +4nlogn+4n+3 
g(n )=n 2 : chọn hằng số c=511 và n 0 =1 thì 
4nlogn=1 
4n=1 
3=1 
 500n 2 +4nlogn+4n+3<= 500n 2 + 4n 2 + 4n 2 + 3n 2 =511n 2 
Độ phức tạp f(n )=O(n 2 ) 
Đánh giá độ phức tạp bằng ký pháp O() 
c. f(n )=n 4 +4n 3 +4n 2 +10000 
g(n )=n 4 vì chọn hằng số c=10009 và n 0 =1 
n 4 +4n 3 +4n 2 +10000=1 
 n 4 +4n 3 +4n 2 +10000=1 
 Độ phức tạp f(n )=O(n 4 ) 
d. f(n )=n!+100n 3 +n 2 
g(n )=n! vì chọn hằng số c=102 và n 0 =10 ta có 
n!+100n 3 +n 2 =10 
 n!+100n 3 +n 2 =10 
 Độ phức tạp f(n )= O(n !) 
For i:=1 to n do 
	 	 c[i,i ]:=c[i,i]+100 
P1 
Thời gian thực hiện P1 là : T 1 (n)= O(n ) 
S:=0; 
For i:=1 to n do 
For j:=1 to n do 
If c[i,j ]>0 then S:= S+c[i,j ] 
P2 
Thời gian thực hiện P2 là : T 2 (n)=O(n 2 ) 
 T hời gian thực hiện P 1 và P 2 kế tiếp nhau sẽ là : T(n )=T 1 (n)+T 2 (n)= O(max( n , n 2 ))= O( n 2 ) 
Ví dụ : Quy tắc cộng 
For i:=1 to N.N do 
Ví dụ : Quy tắc nhân 
For j:=1 to N do 
S:= S+c[j ] 
Đoạn chương trình P1. 
Thời gian thực hiện P1 là : T 1 (n)= O(n ). Vì thực hiện n lần tính tổng 
Đoạn chương trình P2. 
Thời gian thực hiện P2 là : T 2 (n)=O(n 2 ). Vì thực hiện n 2 lần đoạn chương trình P1 
 Thời gian thực hiện P 1, P 2 lồng nhau sẽ là : 
T(n )=T 1 (n)T 2 (n)= O(n . n 2 )=O( n 3 ) 
Cú pháp tuần tự 
S1 
S2 
S3 
Sn 

File đính kèm:

  • pptbai_giang_cau_truc_du_lieu_va_giai_thuat_chuong_i_tong_quan.ppt