Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 1: Tổng quan cấu trúc dữ liệu và giải thuật - Đỗ Ngọc Như Loan
Cấu trúc dữ liệu là cách tổ chức lưu trữ dữ liệu sao cho hiệu quả nhất
Thế nào là hiệu quả?
1. Chính xác
2. Dùng ít bộ nhớ
3. Khả năng tìm kiếm/truy xuất
4. Khả năng cập nhật, thêm (modification, insertion / deletion)
5. Đơn giản, dễ hiểu
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 1: Tổng quan cấu trúc dữ liệu và giải thuật - Đỗ Ngọc Như Loan", để 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 1: Tổng quan cấu trúc dữ liệu và giải thuật - Đỗ Ngọc Như Loan
Tổng quan về Cấu trúc dữ liệu & Giải thuật GV: Đỗ Ngọc Như Loan Cấu trúc dữ liệu là gì? C ấ u trúc d ữ li ệu là cách t ổ ch ứ c lưu trữ d ữ li ệ u sao cho hi ệ u qu ả nh ấ t Thế nào là hiệu quả? 1. Chính xác 2. Dùng ít b ộ nh ớ 3. Khả năng tìm kiếm/truy xuất 4. Khả năng cập nhật , thêm (modification, insertion / deletion) 5. Đơn giản , dễ hiểu Giải thuật là gì? Thu ậ t toán là m ộ t phương pháp bao g ồ m m ộ t dãy các bư ớ c tính toán để giải quyết một bài toán. Thuật toán có thể được diễn tả dưới ngôn ngữ tự nhiên ( tiếng Việt , tiếng Anh ), mã giả hay ngôn ngữ lập trình (C ++, Java ) Thế nào là một thuật toán tốt ? 1. Đúng đắn 2. Nhanh 3. Ít bộ nhớ 4. Đ ơn giản , dễ hiểu Ví dụ Tìm x trong dãy a1, a2, ...., an Input: Số x, dãy n số a1, a2, ..., an Output: Một giá trị logic true hoặc false Search(x , a, n) for i 1 to n do if ai = x then return true return false Một vấn đề có thể được giải quyết bẳng nhiều thuật toán khác nhau Ví dụ Tính tổng các số nguyên từ 1 đến n. Input: n (n >1) Output: Tổng các số nguyên từ 1 đến n Cách 1 sum = 0; for (int i = 1; i <= n; i++) sum = sum + i; Cách 2 sum = n*(n+1)/2; Cách 1 sum = 0; for (int i = 1; i <= n; i++) sum = sum + i; Cách 2 sum = n*(n+1)/2; Độ phức tạp O(n) Độ phức tạp O(1) ĐỘ PHỨC TẠP THUẬT TOÁN Độ phức tạp của giải thuật là chi phí về tài nguyên của hệ thống (chủ yếu là thời gian, bộ nhớ, CPU, đường truyền) cần thiết để thực hiện giải thuật Độ phức tạp về không gian (dung lượng bộ nhớ sử dụng) Độ phức tạp về thời gian Phân tích giải thuật (Analyzing of Algorithm) là quá trình tìm ra những đánh giá về tài nguyên cần thiết để thực hiện giải thuật ĐỘ PHỨC TẠP THUẬT TOÁN Độ phức tạp về thời gian của giải thuật: • Được qui về đếm số lệnh cần thực thi của giải thuật • Đó là một hàm T (n) phụ thuộc vào kích thước n của input • Coi như có một máy trừu tượng (abstract machine) để thực hiện giải thuật ĐỘ PHỨC TẠP THUẬT TOÁN • Thời gian tối thiểu để thực hiện giải thuật với kích thước đầu vào n gọi là thời gian chạy tốt nhất (best-case) của giải thuật • Thời gian nhiều nhất để thực hiện giải thuật với kích thước đầu vào n được gọi là thời gian chạy xấu nhất (worst-case) của giải thuật • Thời gian trung bình để thực hiện giải thuật với kích thước đầu vào n được gọi là thời gian chạy trung bình (average case) của giải thuật Ví dụ Đánh giá độ phức tạp về thời gian của giải thuật Search(x, a, n) for i 1 to n do if ai = x then return true return false dssdsdsssssssssssslkcddkcf;dxkac BIỂU DIỄN THỜI GIAN CHẠY BỞI KÝ HIỆU O Giả sử f(n) và g (n) là hàm thực không âm của đối số nguyên dương n , ta nói f(n ) = O(g(n)) nếu có hằng số c > 0 và số nguyên dương N sao cho f(n ) = N Nếu giải thuật có thời gian chạy tốt nhất (trung bình, xấu nhất) là T(n) và T(n) = O(g(n)) thì ta nói độ phức tạp của giải thuật trong trường hợp tốt nhất (trung bình, xấu nhất) là O(g(n)) Ví dụ: Giả sử f(n) = 5n 3 + 2n 2 + 13n + 6 , ta có: f(n) = 5n 3 + 2n 2 + 13n + 6 =1) f(n) = O(n 3 ) Tổng quát nếu f(n) là một đa thức bậc k của n: f(n) = a k n k + a k-1 n k-1 + ... + a 1 n + a 0 thì f(n) = O(n k ) Quy Tắc QUY TẮC CỘNG: Nếu đoạn chương trình P1 có thời gian thực hiện T1(n) = O(f(n)) và đoạn chương trình P2 có thời gian thực hiện là T2(n) = O(g(n )) thì thời gian thực hiện P1 rồi đến P2 tiếp theo sẽ là : T1(n ) + T2(n) = O(f(n) + g(n)) QUY TẮC NHÂN: Nếu đoạn chương trình P có thời gian thực hiện là T(n) = O(f(n )). Khi đó, nếu thực hiện k(n) lần đoạn chương trình P với k(n) = O(g(n )) thì độ phức tạp tính toán sẽ là O(g(n ). f(n )) QUY TẮC MAX: Nếu đoạn chương trình P có thời gian thực hiện T(n) = O(f(n) + g(n)) thì có thể coi đoạn chương trình đó có độ phức tạp tính toán O(max(f(n),g(n))). Độ phức tạp (tăng dần) • O(1) Hằng số • O(log 2 n ) Logarithm • O(n) Tuyến tính • O(nlog 2 n ) n log n • O(n 2 ) Bậc hai • O(n 3 ) Bậc ba • O(n m ) Đa thức • O(m n ), m >= 2 Hàm mũ • O(n!) Giai thừa VÍ DỤ Viết và phân tích giải thuật tính giai thừa của số tự nhiên n. VÍ DỤ Factorial(n) if n = 0 or n = 1 then return 1 else if n > 1 then return n*Factorial(n-1) VÍ DỤ Gọi T(n) là thời gian chạy của thuật giải O(1), n=0, 1 T(n)= T(n-1)+O(1), n>1 T(n) = T(n-1) + c = T(n-2)+c +c =T(n-2) + 2c = T(n-3)+c + 2c = T(n-3) + 3c . = T(n-(n-1)) + (n-1)c = T(1) + (n-1)c = c + (n-1)c = nc T(n) = O(n) (tương đương với giải thuật không đệ qui) Luyện tập 1 for (i = 0 ; i < n ; i++) if (A[i] % 2 == 0) return true; r eturn false; Độ phức tạp? Luyện tập 2 s um = 0; for (i = 0 ; i < 2 0 ; i++) sum = sum + i; Độ phức tạp? Luyện tập 3 for (i = 0 ; i < n ; i++) for (j = 0 ; j < n ; j ++) A[i ][j] = 0; for (i = 0 ; i < n ; i++) A[i ][i] = 1 ; Độ phức tạp? Luyện tập 4 sum = 0; for ( i = 0; i < n; i + +) for ( j = i + 1; j < = n; j + +) for ( k = 1; k < 10; k + +) sum = sum + i * j * k ; Độ phức tạp? Luyện tập 5 sum = 0; for ( i = 0; i < n; i + +) for ( j = i + 1; j < = n; j + +) for ( k = 1; k < m; k + +) { sum = sum + i * j * k ; } Độ phức tạp? Luyện tập 6 for (i = 0; I < n; I ++) for (j = 0; j < m; j ++) { int x = 0; for (k = 0; k < n; k ++) x = x + k; for (k = 0; k < m; k++) x = x +k; } Độ phức tạp? MỘT SỐ LƯU Ý Nếu bài toán có thuật giải với thời gian chạy xấu nhất là đa thức , O(n m ), thì bài toán gọi là được giải tốt Nếu bài toán không có thuật giải với thời gian chạy xấu nhất là đa thức thì bài toán gọi là khó giải (intractable problem) Nếu bài toán khó đến mức không thể xây dựng được thuật giải thì nó được gọi là không giải được (unsolvable problem) Phân tích độ phức tạp chủ yếu dựa trên kỹ thuật đếm và biểu diễn hệ thức truy hồi Có hai phương pháp chính để giải hệ thức truy hồi: Thay thế lặp và áp dụng trực tiếp các công thức toán học Phân tích trường hợp trung bình thường phức tạp hơn và cần thêm các công cụ toán học như lý thuyết xác suất, hàm sinh Trong nhiều trường hợp chỉ cần tính thời gian chạy xấu nhất
File đính kèm:
- bai_giang_cau_truc_du_lieu_va_giai_thuat_chuong_1_tong_quan.pptx