Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 1: Giới thiệu - Thuật toán - Đào Nam Anh

• Giải thuật • Dữ liệu • Quan hệ Dữ liệu – Giải thuật • Đánh giá độ phức tạp của giải thuật • Đánh giá độ phức tạp dữ liệu • Ký hiệu độ phức tạp

pdf46 trang | Chia sẻ: candy98 | Lượt xem: 812 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 1: Giới thiệu - Thuật toán - Đào Nam Anh, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Data Structure and Algorithm 1 DATA STRUCTURE AND ALGORITHM 1. INTRODUCTION CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1. GIỚI THIỆU Dr. Dao Nam Anh Data Structure and Algorithm 2 Outline – Nội dung • Giải thuật • Dữ liệu • Quan hệ Dữ liệu – Giải thuật • Đánh giá độ phức tạp của giải thuật • Đánh giá độ phức tạp dữ liệu • Ký hiệu độ phức tạp Data Structure and Algorithm 3 Resource - Reference Slides of Simonas Šaltenis, modified by Dao Nam Anh, “Algorithms and Data Structures”. Nykredit Center for Database Research, Aalborg University Major Reference: • Robert Sedgewick, and Kevin Wayne, “Algorithms” Princeton University, 2011, Addison Wesley • Giải thuật và lập trình, Lê Minh Hoàng, Đại Học Sư Phạm, 2002 • Cấu trúc dữ liệu và giải thuật, Đinh Mạnh Tường. Data Structure and Algorithm 4 Algorithm – Giải thuật Dữ liệu đầu vào Algorithm Kết quả phụ thuộc dữ liệu đầu vào Simonas Šaltenis slide Data Structure and Algorithm 5 Algorithm – Giải thuật Wiki: • Thuật toán, còn gọi là giải thuật, là một tập hợp hữu hạn của các chỉ thị hay phương cách được định nghĩa rõ ràng cho việc hoàn tất một số sự việc từ một trạng thái ban đầu cho trước; khi các chỉ thị này được áp dụng triệt để thì sẽ dẫn đến kết quả sau cùng như đã dự đoán. • Thuật toán là một bộ các qui tắc hay qui trình cụ thể nhằm giải quyết một vấn đề trong một số bước hữu hạn, hoặc nhằm cung cấp một kết quả từ một tập hợp của các dữ kiện đưa vào. Data Structure and Algorithm 6 Algorithm – Giải thuật • Việc nghiên cứu về thuật toán có vai trò rất quan trọng trong khoa học máy tính vì máy tính chỉ giải quyết được vấn đề khi đã có hướng dẫn giải rõ ràng và đúng. Nếu hướng dẫn giải sai hoặc không rõ ràng thì máy tính không thể giải đúng được bài toán. • Trong khoa học máy tính, thuật toán được định nghĩa là một dãy hữu hạn các bước không mập mờ và có thể thực thi được, quá trình hành động theo các bước này phải dừng và cho được kết quả như mong muốn. Data Structure and Algorithm 7 Algorithm – Giải thuật Ví dụ: thuật toán để giải phương trình bậc nhất P(x): ax + b = c, (a, b, c là các số thực), trong tập hợp các số thực có thể là một bộ các bước sau đây: Nếu a = 0 b = c thì P(x) có nghiệm bất kì b ≠ c thì P(c) vô nghiệm Nếu a ≠ 0 P(x) có duy nhất một nghiệm x = (c - b)/a Data Structure and Algorithm 8 Simonas Šaltenis slide Algorithm – Giải thuật Mục đích thiết kế Giải thuật Mục đích triển khai Hiệu quả Chạy được cả khi đầu vào có lỗi Thích ứng Tái sử dụng Đúng Data Structure and Algorithm 9 Algorithm – Giải thuật Lịch sử • Nhà toán học Batư Mohammed al-Khowarizmi, (850-780BC) đưa ra một các hệ thống giải phương trình tuyến tính và phương trình bậc 2, tên của ông trong tiếng latin dịch là Algorismus • Thuật toán đầu tiên: Euclidean Algorithm, tìm ước số chung lớn nhất của 2 số nguyên, 400-300 B.C. • Thế kỷ 19 – Charles Babbage, Ada Lovelace. • Thế kỷ 20 – Alan Turing, Alonzo Church, John von Neumann Simonas Šaltenis slide Data Structure and Algorithm 10 Sort Algorithm – Giải thuật Ví dụ: Sắp xếp Đầu vào Dãy số nguyên a1, a2, a3,.,an b1,b2,b3,.,bn Kết quả Dãy số theo thứ tự lớn dần 2 5 4 10 7 2 4 5 7 10 Tính đúng đắn: • b1 < b2 < b3 < . < bn Thời gian chạy Phụ thuộc •Số phần tử (n) • Cách sắp xếp (Giải thuật) Simonas Šaltenis slide Data Structure and Algorithm 11 Algorithm – Giải thuật Insertion Sort A 1 nj 3 6 84 9 7 2 5 1 i Chiến lược • Bắt đầu từ phần bên đã xếp bên trái trống” • Chèn vào bên phải phần đã xếp • Thực hiện đến khi đúng thứ tự for j=2 to length(A) do key=A[j] “chèn A[j] vào phần đã sắp xếp A[1..j-1]” i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key Data Structure and Algorithm 12 Algorithm – Giải thuật Insertion Sort A 1 nj 3 6 84 9 7 2 5 1 i Chiến lược • Bắt đầu từ phần bên đã xếp bên trái trống” • Chèn vào bên phải phần đã xếp • Thực hiện đến khi đúng thứ tự for j=2 to length(A) do key=A[j] “chèn A[j] vào phần đã sắp xếp A[1..j-1]” i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key Data Structure and Algorithm 13 Algorithm – Giải thuật Insertion Sort A 1 nj 3 6 84 9 7 2 5 1 i Chiến lược • Bắt đầu từ phần bên đã xếp bên trái trống” • Chèn vào bên phải phần đã xếp • Thực hiện đến khi đúng thứ tự for j=2 to length(A) do key=A[j] “chèn A[j] vào phần đã sắp xếp A[1..j-1]” i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key Data Structure and Algorithm 14 Algorithm – Giải thuật Insertion Sort A 1 nj 3 6 84 7 9 2 5 1 i Chiến lược • Bắt đầu từ phần bên đã xếp bên trái trống” • Chèn vào bên phải phần đã xếp • Thực hiện đến khi đúng thứ tự for j=2 to length(A) do key=A[j] “chèn A[j] vào phần đã sắp xếp A[1..j-1]” i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key Data Structure and Algorithm 15 Algorithm – Giải thuật Insertion Sort A 1 nj 3 6 84 7 9 2 5 1 i Chiến lược • Bắt đầu từ phần bên đã xếp bên trái trống” • Chèn vào bên phải phần đã xếp • Thực hiện đến khi đúng thứ tự for j=2 to length(A) do key=A[j] “chèn A[j] vào phần đã sắp xếp A[1..j-1]” i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key Data Structure and Algorithm 16 Algorithm – Giải thuật Insertion Sort A 1 nj 3 6 84 7 9 2 5 1 i Chiến lược • Bắt đầu từ phần bên đã xếp bên trái trống” • Chèn vào bên phải phần đã xếp • Thực hiện đến khi đúng thứ tự for j=2 to length(A) do key=A[j] “chèn A[j] vào phần đã sắp xếp A[1..j-1]” i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key Data Structure and Algorithm 17 Algorithm – Giải thuật Insertion Sort A 1 nj 3 6 74 8 9 2 5 1 i Chiến lược • Bắt đầu từ phần bên đã xếp bên trái trống” • Chèn vào bên phải phần đã xếp • Thực hiện đến khi đúng thứ tự for j=2 to length(A) do key=A[j] “chèn A[j] vào phần đã sắp xếp A[1..j-1]” i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key Data Structure and Algorithm 18 Algorithm – Giải thuật Insertion Sort A 1 nj 3 6 74 8 9 2 5 1 i Chiến lược • Bắt đầu từ phần bên đã xếp bên trái trống” • Chèn vào bên phải phần đã xếp • Thực hiện đến khi đúng thứ tự for j=2 to length(A) do key=A[j] “chèn A[j] vào phần đã sắp xếp A[1..j-1]” i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key Data Structure and Algorithm 19 Algorithm – Giải thuật Insertion Sort A 3 6 74 8 9 2 5 1 3 6 74 8 9 2 5 1 3 6 74 8 9 2 5 1 3 6 74 8 2 9 5 1 3 6 74 8 2 9 5 1 3 6 74 2 8 9 5 1 2 4 63 7 8 9 5 1 Data Structure and Algorithm 20 Cấu trúc dữ liệu • Khi giải một bài toán, ta cần phải định nghĩa tập hợp dữ liệu để biểu diễn tình trạng cụ thể. Việc lựa chọn này tuỳ thuộc vào vấ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. • Có những thuật toán chỉ thích ứng với một cách tổ chức dữ liệu nhất định, đối với những cách tổ chức dữ liệu khác thì sẽ kém hiệu quả hoặc không thể thực hiện được. Chính vì vậy nên bước xây dựng cấu trúc dữ liệu không thể tách rời bước tìm kiếm thuật toán giải quyết vấn đề. Data Structure and Algorithm 21 Các tiêu chuẩn khi lựa chọn cấu trúc dữ liệu • Cấu trúc dữ liệu trước hết phải biểu diễn được đầy đủ các thông tin nhập và xuất của bài toán • Cấu trúc dữ liệu phải phù hợp với các thao tác của thuật toán mà ta lựa chọn để giải quyết bài toán. • Cấu trúc dữ liệu phải cài đặt được trên máy tính với ngôn ngữ lập trình đang sử dụng • Đối với một số bài toán, trước khi tổ chức dữ liệu ta 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. Data Structure and Algorithm 22 Cấu trúc dữ liệu • Hạt nhân của các chương trình máy tính là sự lưu trữ và xử lý thông tin. • Việc tổ chức dữ liệu như thế nào có ảnh hưởng rất lớn đến cách thức xử lý dữ liệu đó cũng như tốc độ thực thi và sự chiếm dụng bộ nhớ của chương trình. Data Structure and Algorithm 23 Cấu trúc dữ liệu • Việc đặc tả bằng các cấu trúc tổng quát (generic structures) và các kiểu dữ liệu trừu tượng (abstract data types) còn cho phép người lập trình có thể dễ dàng hình dung ra các công việc cụ thể và giảm bớt công sức trong việc chỉnh sửa, nâng cấp và sử dụng lại các thiết kế đã có. Data Structure and Algorithm 24 Kiểu dữ liệu cơ bản • C++ Boolean – bool Liệt kê – enum Chữ - char  Số nguyên – short, int, long Thập phân – float, double Nor Bahiah Hj Ahmad, Software Engineering Department, FSKSM, UTM Data Structure and Algorithm 25 Structured Data Types Storage Structure Linked Structure State Structure •Array •Structure (struct) •Unsorted Linked List •Sorted Linked List •Binary Tree •Graph •Network •Stack •Queue Nor Bahiah Hj Ahmad, Software Engineering Department, FSKSM, UTM Data Structure and Algorithm 26 Lưu đồ giải thuật (Flowchart) Data Structure and Algorithm 27 Đánh giá giải thuật • Hiệu quả: Thời gian chạy  Sử dụng bộ nhớ • Đánh giá dựa và độ lớn của dữ liệu đầu vào:  Số lượng dữ liệu (các con số, các điểm)  Số lượng các bit biểu diễn con số Data Structure and Algorithm 28 Đánh giá giải thuật Insertion Sort for j=2 to length(A) do key=A[j] “chèn A[j] vào phần đã sắp xếp A[1..j-1]” i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key cost c1 c2 0 c3 c4 c5 c6 c7 times n n-1 n-1 n-1 n-1 2 n jj t =∑ 2 ( 1) n jj t = −∑ 2 ( 1) n jj t = −∑ • Thời gian thực hiện là hàm số phụ thuộc độ lớn của dữ liệu đầu vào Simonas Šaltenis slide Data Structure and Algorithm 29 Đánh giá giải thuật Insertion Sort • Trường hợp tốt nhất: mọi phần tử đã được sắp xếp → tj=1, thời gian thực hiện = f(n), tuyến tính. • Trường hợp xấu nhất : các phần tử trong thứ tự ngược lại → tj=j, thời gian thực hiện = f(n2), • Trường hợp trung bình: → tj=j/2, thời gian thực hiện = f(n2), )(1 2 *)1( 2 2 2 nf nn jt n j n j j ≈− + ==∑∑ = = Data Structure and Algorithm 30 Đánh giá giải thuật Tùy vào độ lớn của n, phân tích thời gian thực hiện : 1n 2n 3n 4n 5n 6n Simonas Šaltenis slide Data Structure and Algorithm 31 Đánh giá giải thuật Với mọi giá trị n: 1n 2n 3n 4n 5n 6n Input instance size R u n n i n g t i m e 1 2 3 4 5 6 7 8 9 10 11 12 .. best-case average-case worst-case Data Structure and Algorithm 32 Đánh giá giải thuật • Trường hợp xấu nhất thường được sử dụng: Rất cần thiết phải biết khi trường hợp xấu nhất xảy ra để phòng ngừa (điều hành không lưu, phẫu thuật) Trường hợp xấu nhất xảy ra thường xuyên cho một số thuật toán Trường hợp trung bình cũng cần được xem xét Tuy nhiên thường khó tìm trường hợp trung bình Data Structure and Algorithm 33 Đánh giá giải thuật 1,00E-01 1,00E+00 1,00E+01 1,00E+02 1,00E+03 1,00E+04 1,00E+05 1,00E+06 1,00E+07 1,00E+08 1,00E+09 1,00E+10 2 4 8 16 32 64 128 256 512 1024 n T ( n ) n log n sqrt n n log n 100n n^2 n^3 Data Structure and Algorithm 34 Đánh giá giải thuật 1,00E-01 1,00E+11 1,00E+23 1,00E+35 1,00E+47 1,00E+59 1,00E+71 1,00E+83 1,00E+95 1,00E+107 1,00E+119 1,00E+131 1,00E+143 1,00E+155 2 4 8 16 32 64 128 256 512 1024 n T ( n ) n log n sqrt n n log n 100n n^2 n^3 2^n Data Structure and Algorithm 35 Đánh giá giải thuật Insertion Sort • Thuật toán Insertion Sort có phải là thuật sẵp xếp tốt nhất? • Có chiến lược khác dựa trên chia nhóm • MergeSort Bài toán sắp xếp được chia thành  Sắp xếp và sau đó Ghép kết quả với nhau Thời gian thực hiện f(n log n) Data Structure and Algorithm 36 Ký hiệu về độ phức tạp • Cho một giải thuật thực hiện trên dữ liệu với kích thước n. Giả sử T(n) là thời gian thực hiện một giải thuật đó, g(n) là một hàm xác định dương với mọi n. Khi đó ta nói độ phức tạp tính toán của giải thuật là: • Θ(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. Ký pháp này được gọi là ký pháp Θ lớn (big-theta notation). Trong ký pháp Θ lớn, hàm g(.) được gọi là giới hạn chặt (asymptotically tight bound) của hàm T(.) Data Structure and Algorithm 37 Ký hiệu về độ phức tạp • O(g(n)) nếu tồn tại các hằng số dương c và n0 sao cho T(n) ≤ c.g(n) với mọi n ≥ n0. Ký pháp này được gọi là ký pháp chữ O lớn (big-oh notation). Trong ký pháp chữ O lớn, hàm g(.) được gọi là giới hạn trên (asymptotic upper bound) của hàm T(.) • Ω(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). Trong ký pháp Ω lớn, hàm g(.) được gọi là giới hạn dưới (asymptotic lower bound) của hàm T(.) Data Structure and Algorithm 38 Ký hiệu về độ phức tạp Ví dụ • O(n) • O(ln n) • O(n2) • O(nln n) Data Structure and Algorithm 39 Đánh giá độ phức tạp dữ liệu • Tìm xem thuật toán sử dụng bộ nhớ như thế nào, là hàm số phụ thuộc độ lớn dữ liệu đầu vào • Tương tự như đánh giá thuật toán Data Structure and Algorithm 40 Đánh giá giải thuật Insertion Sort for j=2 to length(A) do key=A[j] “chèn A[j] vào phần đã sắp xếp A[1..j-1]” i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key • Thời gian tính toán : O(n2) • Không gian tính toán: O(n) Data Structure and Algorithm 41 Ví dụ 2: Tìm kiếm Đầu vào • Cho một dãy các con số (cơ sở dữ liệu) • 1 con số a1, a2, a3,.,an; q j Kết quả • Vị trí của con số trong dãy số hoặc NIL 2 5 4 10 7; 5 2 2 5 4 10 7; 9 NIL Data Structure and Algorithm 42 Ví dụ 2: Tìm kiếm j=1 while j<=length(A) and A[j]!=q do j++ if j<=length(A) then return j else return NIL  Trường hợp xấu nhất: f(n), Trường hợp trung bình: f(n/2)  Đây là giới hạn dưới của bài toán tìm kiếm trong dãy số. Data Structure and Algorithm 43 Ví dụ 3: Tìm kiếm Đầu vào • Một dãy số đã sắp xếp tăng dần (CSDL) • 1 con số a1, a2, a3,.,an; q j Kết quả • vị trí của con số trong dãy số hoặc NIL 2 4 5 7 10; 5 2 2 4 5 7 10; 9 NIL Data Structure and Algorithm 44 Tìm kiếm nhị phân left=1 right=length(A) do j=(left+right)/2 if A[j]==q then return j else if A[j]>q then right=j-1 else left=j+1 while left<=right return NIL  Ý tưởng: Chia và tìm – một trong các kỹ thuật cơ bản Data Structure and Algorithm 45 Tìm kiếm nhị phân • Vòng lặp chạy bao lần?  Sau mỗi lần lặp chiều dài giảm một nửa  Sau bao lần giảm nửa thì giá trị n trở thành 1?  lg n Data Structure and Algorithm 46 Discussion – Câu hỏi