Nội dung
 Cấu trúc dữ liệu và thuật toán
 Thuật toán và các đặc trưng của thuật toán
 Diễn đạt thuật toán
 Kiểu dữ liệu, ADT, cấu trúc dữ liệu
 Phân tích và thiết kế thuật toán
 Thiết kế thuật toán
 Phân tích thuật toán
 Một số lớp các thuật toán
              
                                            
                                
            
 
            
                 65 trang
65 trang | 
Chia sẻ: phuongt97 | Lượt xem: 866 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang 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 1: Tổng quan - Nguyễn Thị Khiêm Hòa, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 1: Tổng quan 
 Giảng viên: Ths. Nguyễn Thị Khiêm Hòa 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
Nội dung 
 Cấu trúc dữ liệu và thuật toán 
  Thuật toán và các đặc trưng của thuật toán 
  Diễn đạt thuật toán 
  Kiểu dữ liệu, ADT, cấu trúc dữ liệu 
 Phân tích và thiết kế thuật toán 
  Thiết kế thuật toán 
  Phân tích thuật toán 
 Một số lớp các thuật toán 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 2 
Mục tiêu 
 Tìm hiểu các nội dung: 
  Thiết kế và phân tích được thuật toán. 
  Hiểu rõ về kiểu dữ liệu, kiểu dữ liệu trừu 
 tượng, cấu trúc dữ liệu. 
  Đánh giá độ phức tạp của thuật toán. 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 3 
Giải bài toán bằng máy tính 
 Giải quyết một bài toán: 
  Mục tiêu 
  Phương pháp 
 Giải quyết bài toán tin học cần phải: 
  Tổ chức biểu diễn các đối tượng thực tế 
  Xây dựng trình tự các thao tác xử lý trên các 
 đối tượng dữ liệu đó 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 4 
Giải bài toán bằng máy tính 
 Cấu trúc dữ liệu 
 + Thuật toán 
 Chương trình 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 5 
Kiểu dữ liệu trừu tượng _ADT 
  Kiểu dữ liệu 
  Kiểu dữ liệu trừu tượng 
  ADT - abstract data type 
  Kiểu dữ liệu trừu tượng: T = 
  V: Values - miền giá trị 
  O: Operators – các thao tác 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 6 
Cấu trúc dữ liệu 
 Cấu trúc dữ liệu (Data structure): Cách tổ 
 chức dữ liệu cho bài toán 
 Có một số cấu trúc dữ liệu riêng của ngôn 
 ngữ lập trình được gọi là CTDL tiền định. 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 7 
Đánh giá cấu trúc dữ liệu 
 Phản ánh đúng thực tế 
 Phù hợp với thao tác 
 Tiết kiệm tài nguyên hệ thống 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 8 
Cấu trúc lưu trữ (trong/ngoài) 
 Cách biểu diễn tối ưu của cấu trúc dữ liệu 
 trên bộ nhớ (trong/ngoài) của máy tính được 
 gọi là cấu trúc lưu trữ. 
 Có nhiều cấu trúc lưu trữ khác nhau cho cùng 
 một cấu trúc dữ liệu 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 9 
Thuật toán 
 Định nghĩa 
 Lý thuyết thuật toán quan tâm đến những 
 vấn đề sau: 
  Giải được bằng thuật toán 
  Tối ưu hóa thuật toán 
  Triển khai thuật toán 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 10 
Thuật toán 
  Đặc trưng của thuật toán 
  Tính xác định 
  Tính hữu hạn (Tính dừng) 
  Tính đúng đắn 
  Tính phổ dụng 
  Tính khả thi 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 11 
Diễn đạt thuật toán 
  Dạng lưu đồ (sơ đồ khối) 
  Dạng ngôn ngữ tự nhiên (Ngôn ngữ liệt 
 kê từng bước) 
  Ngôn ngữ lập trình 
  Dạng mã giả 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 12 
 Diễn đạt thuật toán 
Các ký hiệu biểu diễn thuật toán bằng sơ đồ 
khối 
 Nút thao tác 
 Nút điều khiển: trong đó ghi điều 
 kiện cần kiểm tra trong quá trình tính 
 toán. 
 Nút khởi đầu ,kết thúc 
 Cung 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 13 
Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 14 
Diễn đạt thuật toán 
Ví dụ 1: Thuật toán xác định n là số nguyên tố 
  Bước 1: Nhập n 
  Bước 2: Nếu n ≤ 1  n ko nguyên tố  dừng 
  Bước 3: Nếu n ≥ 2, gán i  2 
  Bước 4: Nếu i ≥ √n hay n chia hết cho i  bước 6 
  Bước 5: Gán i  i+1, trở lại bước 4 
  Bước 6: 
  Nếu i > √n  n nguyên tố  dừng 
  Ngược lại, n không là nguyên tố  dừng 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 15 
Diễn đạt thuật toán 
Ví dụ 2: Thuật toán tìm phần tử thứ n 
 của dãy số Fibonacci 
  Bước 1: Nhập n 
  Bước 2: Nếu n=1 hay n=2  fn=1  dừng 
  Bước 3: Nếu n > 2, gán a1, b1, i1 
  Bước 4: Gán ca+b, ab, bc 
  Bước 5: 
  Nếu i = n - 2  fn=c  dừng 
  Ngược lại i  i+1, quay lại bước 4 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 16 
Diễn đạt thuật toán 
Ví dụ 3: Tìm phần tử lớn nhất trong mảng A 
  Thuật toán Tim_max(A, n) 
 Input: Mảng A, gồm n số nguyên 
 Output: Giá trị lớn nhất của A 
 Max  A[0] 
 for i  1 to n  1 do 
 if A[i]  Max then 
 Max  A[i] 
 return Max 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 17 
 Mối quan hệ giữa 
 Cấu trúc dữ liệu và thuật toán 
 Đối tượng xử lý của thuật toán chính là 
 dữ liệu 
 Với một cấu trúc dữ liệu, sẽ có những 
 thuật toán tương ứng. 
 Thuật toán thường thay đổi khi cấu trúc 
 dữ liệu thay đổi. 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 18 
Thiết kế thuật toán 
 Từ bài toán đến chương trình 
 Thiết kế Lập trình #include 
 Bài toán  
 thực tế 
 Giải thuật Chương trình 
 Kỹ thuật thiết kế giải •Ngôn ngữ lập 
 thuật: Chia để trị, quy trình: 
 hoạch động, back •PASCAL, C/C++, 
 tracking v.v JAVA,  
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 19 
Thiết kế thuật toán 
 Module hoá và việc giải quyết bài 
 toán 
  Chiến thuật chia để trị (divide-conquer): 
  Để thực hiện chiến thuật này, thường có 
 hai cách thiết kế: 
  Từ trên xuống (Top-Down Design). 
  Tinh chỉnh từng bước 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 20 
Thiết kế thuật toán 
 Tinh chỉnh từng bước: 
  Biểu diễn ý tưởng bằng ngôn ngữ tự nhiên 
  Chi tiết hóa các công việc nhỏ hơn dùng mã 
 giả rồi đến ngôn ngữ lập trình 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 21 
Thiết kế thuật toán 
 Ví dụ: Bài toán sắp xếp một dãy n số, theo thứ tự 
 tăng dần 
  Chọn số bé nhất trong n số để vào vị trí thứ 1 
  Chọn số bé nhất trong n-1 số còn lại để vào vị 
 trí thứ 2 
   
  Chọn số bé nhất trong 2 số còn lại để vào vị trí 
 thứ n-1 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 22 
Thiết kế thuật toán 
Tinh chế 1: 
For (i= 1, i <= n-1, i++) 
{ - Chọn số bé nhất trong các số xi, xi+1, , xn 
 - Đổi chỗ cho xi 
} 
Tinh chế 2: 
For (i= 1, i <= n-1, i++) 
{ - min = x[i] 
 - So sánh min với các số từ xi+1 -> xn . 
 Nếu x[j] > min thì min = x[j] với j [i+1,n] 
 - đổi chổ x[i] và min 
 } Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 23 
Thiết kế thuật toán 
 for (i= 1; i <= n-1; i++) 
 { min =x[i]; vt =i; 
 for(j = i+1; j <=n; j++) 
 if (x[j] < min) 
 { 
 min = x[j] ; 
 vt =j; 
 } 
 if (vt!=i) 
 { 
 x[vt] = x[i]; 
 x[i] = min 
 } 
 } Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 24 
 Phân tích thuật toán 
 Khi xây dựng thuật toán cần đặt ra các yêu cầu: 
  Tính đúng đắn 
  Tính đơn giản 
  Không gian 
  Thời gian 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 25 
Phân tích thuật toán 
  Giải quyết bài toán 
  Phải đứng trước việc lựa chọn giải thuật nào? 
  Dựa trên cơ sở nào để lựa chọn ? 
  Có hai mục tiêu trái ngược 
  Thuật toán dễ hiểu, cài đặt và gỡ lỗi. 
  Thuật toán sử dụng hiệu quả tài nguyên máy tính, 
 đặc biệt chạy càng nhanh càng tốt. 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 26 
Đánh giá độ phức tạp thuật toán 
  Độ phức tạp không gian (Space complexity) 
 Dung lượng bộ nhớ mà thuật toán đòi hỏi 
  Độ phức tạp thời gian (Time complexity) 
 Thời gian thực hiện thuật toán 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 27 
Phân tích thời gian thực hiện thuật toán 
 Thời gian thực hiện giải thuật phụ thuộc 
 vào các yếu tố sau: 
  Dữ liệu vào 
  Tốc độ thực hiện các phép toán của máy tính 
 (phần cứng máy tính) 
  Trình biên dịch 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 28 
Phân tích thời gian thực hiện thuật toán 
  Định nghĩa: 
 Phép toán cơ bản là phép toán có thể thực hiện 
 với thời gian bị chặn bởi một hằng số không phụ 
 thuộc vào kích thước dữ liệu 
  Để tính toán thời gian thực hiện thuật 
 toán ta đếm số phép toán cơ bản mà 
 thuật toán thực hiện. 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 29 
Các loại thời gian tính 
  Ký hiệu: T(n) 
  Thời gian tính tốt nhất 
  Thời gian tính trung bình 
  Thời gian tính xấu nhất 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 30 
Ký hiệu tiệm cận 
  , O,  
  Được sử dụng để mô tả thời gian tính 
 của thuật toán. 
  Được xác định đối với các hàm nhận 
 giá trị nguyên không âm. 
  Dùng để so sánh tốc độ tăng của hai 
 hàm 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 31 
Ký hiệu O 
 Ký hiệu O (big-Oh): hàm f(n) và g(n), ta 
 nói: 
 f(n) = Ο(g(n)), nếu tồn tại các hằng số dương c 
 và no sao cho f(n) ≤ cg(n) khi n ≥ no. 
 Ký hiệu này dùng để chỉ chặn trên của một 
 hàm 
 Ý nghĩa: Tốc độ tăng của hàm f(n) không 
 lớn hơn hàm g(n). Hay có thể nói g(n) là 
 cận trên tiệm cận của f(n) 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 32 
Ký hiệu O 
 f(n) = 2n + 6
  Ví dụ : 
 f(n) = 2n+6, c g(n) = 4n 
 g(n) = n và c = 4, 
 n0=3 
  f(n)= O(n) 
 g(n) = n 
 N = 3 
 0 n 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 33 
Ký hiệu Ω 
 Định nghĩa Ω: 
 f(n) = Ω(g(n)), nếu tồn tại các hằng số 
 dương c và no sao cho f(n) ≥ cg(n) khi n ≥ no 
 f(n) = Ω(g(n))  g(n) = Ο(f(n)) 
 Ta nói g(n) là cận dưới tiệm cận cho f(n) 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 34 
Ký hiệu  
 Định nghĩa  
 f(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)  f(n)  c2. g(n) với 
 mọi n> n0 
 Ta nói g(n) là đánh giá tiệm cận đúng cho 
 f(n) 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 35 
Biểu diễn đồ thị đánh giá thời gian tính 
của thuật toán 
 f (n)O(g(n)) f (n)(g(n))
 cg(n) f(n) 
 f(n) 
 cg(n) 
 n0 n0 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 36 
Biểu diễn đồ thị đánh giá thời gian tính 
của thuật toán 
 f (n)(g(n))
 c2g(n) 
 f(n) 
 c1g(n) 
 n0 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 37 
Liên hệ giữa , O,  
 Hai hàm bất kỳ f(n) và g(n), 
 f(n) = (g(n)) khi và chỉ khi 
 f(n) = O(g(n)) và f(n) = (g(n)) 
 Nghĩa là: 
 (g(n)) = O(g(n))  (g(n)) 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 38 
Thời gian tính của thuật toán 
  O(f(n)): là thời gian tính xấu nhất. 
  (f(n)) : là thời gian tính tốt nhất. 
  (f(n)) : là thời gian tính trung bình. 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 39 
Một số qui tắc về ký hiệu O lớn 
 f = O(f) 
 f = O(g) và g = O(h) thì f = O(h) 
 f = O(g) và h=O(r) thì fh = O(gr) 
 f =O(g) và h=O(r) thì f+h = O(g+r) 
 f =O(g) thì af = O(g) với mọi a>0. 
 f là đa thức bậc k thì f(n) là O(nk) 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 40 
Một số qui tắc về ký hiệu O lớn 
  O(c) = O(1), c là hằng số 
  O(lg2 n) = O(ln n) = O(log n) 
  Ví dụ: 
  2n là O(n) 
  3n + 5 là O(n) thay vì 3n + 5 là O(3n) 
  4n2 + 5n + 7 là O(?) 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 41 
Xác định độ phức tạp tính toán 
 T1(n) và T2(n) là thời gian thực hiện của hai giai 
 đoạn chương trình P1 và P2 mà 
 T1(n) = O(f(n)); T2(n) = O(g(n)) 
 Qui tắc tổng: 
  Thời gian thực hiện đoạn P1 rồi P2 tiếp theo sẽ là 
 T1(n) + T2(n) = O(max(f(n),g(n))). 
 Qui tắc nhân: 
  Thời gian thực hiện P1 và P2 lồng nhau sẽ là: 
 T1(n)T2(n) = O(f(n)*g(n)) 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 42 
Các qui tắc tổng quát 
  Các phép gán, đọc, viết, goto là các phép 
 toán sơ cấp: 
 Thời gian thực hiện là: O(1) 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 43 
 Các qui tắc tổng quát 
Lệnh lựa chọn: if-else có dạng 
 if () T0(n) = O(1) 
 lệnh 1 T1(n) = O(f(n)) 
 else 
 lệnh 2 T2(n) = O(g(n)) 
 Thời gian tính của lệnh if-else là O(max(f(n),g(n))) 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 44 
Các qui tắc tổng quát 
  Câu lệnh switch được đánh giá tương tự 
 như lệnh if-else. 
  Các lệnh lặp: for, while, do-while 
  Cần đánh giá số tối đa các lần lặp, giả sử đó 
 là L(n) 
  Tiếp theo đánh giá thời gian chạy của mỗi lần 
 lặp là Ti(n), (i=1,2,..., L(n)) 
  Mỗi lần lặp, chi phí kiểm tra điều kiện lặp,là 
 T0(n). 
 L(n)
  Chí phí lệnh lặp là: 
 T0 n+ Ti n
 i1
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 45 
Một số ví dụ 
 Ví dụ: Tìm giá trị x có trong mảng A chứa 
 n số thực không? 
 i = 0; 
 while (i < n && x != A[i]) 
 i++; 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 46 
Một số ví dụ 
Ví dụ 1: for (i=0; i<n; i++) 
 for (j=0; j<n; j++) O(n2) 
 k++; 
Ví dụ 2: for (i=0; i<n; i++) 
 k++; 
 for (i=0; i<n; i++) O(n2) 
 for (j=0; j<n; j++) 
 k++; 
Ví dụ 3: for (int i=0; i<n-1; i++) 
 for (int j=0; j<i; j++) 
 O(n2) 
 int k+=1; 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 47 
Một số ví dụ 
int MaxSubSum1(const int a[], int n) { 
 int maxSum=0; 
 for (int i=0; i<n; i++) 
 for (int j=i; j<n; j++) 
 { 
 int thisSum=0; 
 for (int k=i; k<=j; k++) 3
 thisSum+=a[k]; O(n ) 
 if (thisSum>maxSum) 
 maxSum=thisSum; 
 } 
 return maxSum; 
} 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 48 
Một số ví dụ 
int MaxSubSum2(const int a[], int n) { 
 int maxSum=0; 
 for (int i=0; i<n; i++) 
 { 
 thisSum=0; 
 for (int j=i; j<n; j++) 
 { 2
 thisSum+=a[j]; O(n ) 
 if (thisSum>maxSum) 
 maxSum=thisSum; 
 } 
 } 
 return maxSum; 
} 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 49 
Một số ví dụ 
int MaxSubSum4(const int a[], int n) 
{ 
 int maxSum=0, thisSum=0; 
 for (int j=0; j<n; j++) 
 { 
 thisSum+=a[j]; 
 if (thisSum>maxSum) O(n) 
 maxSum=thisSum; 
 else if (thisSum<0) 
 thisSum=0; 
 } 
 return maxSum; 
} 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 50 
Một số ví dụ 
 Sum=0 
 for (i=0;i<N;i++) 
 for (j=0;j<N*N;++) O(N3) 
 Sum++; 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 51 
Một số ví dụ 
 Ví dụ: sắp xếp dãy 
 void BubbleSort(int a[], int n) 
 { int i,j,temp; 
 for(i= 0; i<n-1; i++) (1) 
 for(j=n-1; j>i; j--) (2) 
 if (a[j] < a[j-1]) (3) 
 { 
 temp=a[j-1]; (4) 
 a[j-1] = a[j]; (5) 
 a[j] = temp; (6) 
 } 
 } 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 52 
Một số ví dụ 
 Lệnh (3), (4), (5) và (6) đều tốn O(1) 
 Vòng lặp (2) thực hiện (n-i) lần, mỗi lần O(1) do đó 
 vòng lặp (2) tốn O((n-i)*1) = O(n-i). 
 Vòng lặp (1), i chạy từ 1 đến n-1, thời gian thực hiện 
 của vòng lặp (1) là n-1 
 Độ phức tạp của giải thuật là 
 n1 n(n 1)
 T(n)  (n i)   O(n2 )
 i1 2
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 53 
Phân tích các hàm đệ quy 
  Công thức đệ quy cho nhiều thuật toán dựa 
 trên chia để trị có dạng: 
  T(n) = O(1) nếu n≤ c 
  T(n) = aT(n/b) + D(n) + C(n) nếu n>c 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 54 
Phân tích các hàm đệ quy 
  Ví dụ: Hàm tính giai thừa 
 int Fact(int n) 
 { 
 if (n <= 1) 
 return 1; 
 else 
 return n * Fact(n-1); 
 } 
  Với n <= 1, ta có T(1) = O(1). 
  Với n > 1, ta có T(n) = 0(1) + T(n-1) 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 55 
Phân tích các hàm đệ quy 
 Ta có quan hệ đệ quy sau: 
  T(1) = O(1) 
  T(n) = T(n-1) + O(1) với n > 1 
 Thay các ký hiệu O(1) bởi các hằng số 
 dương a và b tương ứng, ta có 
  T(1) = a 
  T(n) = T(n-1) + b với n > 1 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 56 
Phân tích các hàm đệ quy 
 Sử dụng các phép thế T(n-1) = T(n-2) + 
 b, T(n-2) = T(n-3) + b,..., ta có 
 T(n) = T(n-1) + b 
 = T(n-2) + 2b 
 = T(n-3) + 3b 
 ... 
 = T(1) + (n-1)b 
 = a + (n-1)b 
 Từ đó, ta suy ra T(n) = O(n). 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 57 
Phân tích các hàm đệ quy 
 Gọi T(n) là thời gian chạy của hàm đệ quy F 
 Khi đó, thời gian chạy của các lời gọi hàm ở trong 
 hàm F sẽ là T(m) (với m < n) 
 Trước hết, phải đánh giá thời gian chạy của hàm 
 F trên dữ liệu nhỏ nhất n = 1, giả sử T(1) = a 
 (điều kiện dừng) 
 Sau đó, đánh giá thời gian chạy của các câu lệnh 
 trong thân của hàm F 
 Tìm ra quan hệ đệ quy biểu diễn thời gian chạy 
 của hàm F thông qua lời gọi hàm 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 58 
Sự phân lớp của giải thuật 
 Độ phức tạp 
  O(1) độ phức tạp hằng số 
  O(logn) độ phức tạp logarit 
  O(n) độ phức tạp tuyến tính 
  O(nlogn) độ phức tạp nlogn 
  O(nb) độ phức tạp đa thức 
  O(bn) độ phức tạp mũ 
  O(n!) độ phức tạp giai thừa 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 59 
Sự phân lớp của giải thuật 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 60 
Đánh giá độ phức tạp trong ba trường hợp 
 Ví dụ: Thuật toán tìm kiếm tuần tự 
 int sequenceSearch(int x, int a[], int n) 
 { 
 for (int i=0;i<n;i++) 
 { 
 if (x==a[i]) 
 return i; 
 } 
 return -1; 
 } 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 61 
Đánh giá độ phức tạp trong ba trường hợp 
  Tốt nhất: phần tử đầu tiên là phần tử cần 
 tìm, số lượng phép so sánh là 2  T(n) ~ 
 O(2) = O(1) 
  Xấu nhất: so sánh đến phần tử cuối cùng, 
 số lượng phép so sánh là 2n  T(n) ~ O(n) 
  Trung bình: so sánh đến phần tử thứ i, cần 
 2i phép so sánh, vậy trung bình cần 
 (2+4+6++2n)/n=2(1+2++n)/n=n+1 
  T(n) ~ O(n) 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 62 
Kiến thức Toán học bổ trợ về Tổng các chuỗi 
 N
 S(N) 1+ 2 ++ N  i  N(1+ N) / 2
 i1
 N N(N +1)(2N +1) N 3
  Tổng các BP: i2   for large N
  6 3
 i1
  Logarithms: 
 a
  x = b  logx b = a 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 63 
Kiến thức Toán học bổ trợ về Tổng các chuỗi 
 N N k+1
 ik  for large N and k  -1
 i1 | k +1|
 N AN +1 1
  Ai 
 i0 A1
  Đặc biệt khi A = 2 
  20 + 21 + 22 +  + 2N = 2N+1 - 1 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 64 
Q&A 
 Khoa Công Nghệ Thông Tin - Trường Đại học Ngân hàng TP.HCM 
 65 
            Các file đính kèm theo tài liệu này:
 bai_giang_cau_truc_du_lieu_va_giai_thuat_chuong_1_tong_quan.pdf bai_giang_cau_truc_du_lieu_va_giai_thuat_chuong_1_tong_quan.pdf