Giáo trình Cấu trúc dữ liệu và giải thuật (Bản đẹp)
Giới thiệu:
Tổng quan về giải thuật. Đầu tiên là cách phân tích 1 vấn đề, từ thực tiễn
cho tới chương trình, cách thiết kế một giải pháp cho vấn đề theo cách giải quyết
bằng máy tính. Tiếp theo, các phương pháp phân tích, đánh giá độ phức tạp và
thời gian thực hiện giải thuật cũng được xem xét trong chương.
Mục tiêu:
- Mô tả được khái niệm giải thuật, mối quan hệ giữa cấu trúc dữ liệu và giải
thuật. Trình bày được các tiêu chuẩn để đánh giá độ phức tạp của giải thuật.
- Ghi nhớ được các kiểu dữ liệu cơ bản, kiểu dữ liệu trừu tượng và các cấu
trúc dữ liệu cơ bản.
- Thực hiện các thao tác an toàn với máy tính.
Nội dung chính:
1.Khái niệm giải thuật và đánh giá độ phức tạp của giải thuật
Mục tiêu: Mô tả được khái niệm giải thuật, mối quan hệ giữa cấu trúc
dữ liệu và giải thuật. Trình bày được các tiêu chuẩn để đánh giá độ phức tạp
của giải thuật.
1.1. Khái niệm giải thuật
❖ Khái niệm:
Giải thuật, còn gọi là thuật toán (algorithm) là một trong những khái
niệm quan trọng nhất trong tin học. Thuật ngữ thuật toán xuất phát từ nhà toán
học Arập Abu Ja'far Mohammed ibn Musa al Khowarizmi (khoảng năm 825).
Giải thuật thể hiện một giải pháp cụ thể, thực hiện từng bước một để đưa
tới lời giải cho một bài toán.
Nói cách khác, giải thuật là một tập hữu hạn các phép toán cơ sở, được sắp
đặt theo những quy tắc chính xác, nhằm giải một bài toán, hay 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,
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.
Các phép toán cơ sở là những phép toán đơn giãn mà thời gian thực hiện nó
là hữu hạn và không phụ thuộc vào kích thước của dữ liệu.
Các phép toán trong giải thuật phải được xác định rỏ ràng, dễ hiểu, không
mập mờ.
Với mọi bộ dữ liệu vào thoả mãn các điều kiện của bài toán, thuật toán phải
dừng lại sau một số hữu hạn các bước cần thực hiệnGiáo trình Cấu trúc dữ liệu và giải thuật Trang 9 / 92
❖ Các đặc trưng của giải thuật:
• Dữ liệu vào: Mỗi thuật toán đều có một số giá trị nhập vào, chúng được
gọi là Input data.
• Dữ liệu ra: Mỗi thuật toán có một số giá trị đưa ra, chúng được gọi là
Output data.
• Tính xác định: Mọi bước của một thuật toán bao giờ cũng được xác
định rõ ràng, chính xác và do đó luôn thực hiện được.
• Tính dừng: Sau một số hữu hạn các bước bài toán luôn được giải
quyết.
• Tính phổ dụng: Thuật toán có thể làm việc với các kiểu dữ liệu khác
nhau trong miền xác định và luôn dẫn đến kết quả mong muốn.
• Tính hiệu quả: Được thể hiện ở sự đúng đắn của thuật toán và độ phức
tạp của thuật toán.
Tính hiệu quả được thể hiện bởi khả năng thực thi các bước của
thuật toán để đạt được kết quả mong muốn và tổng thời gian thực
hiện thuật toán phải đủ nhỏ.
Chú ý: Trên thực tế để đánh giá tính hiệu quả của các thuật toán,
người ta thường qui về các đơn vị tính sơ cấp. Tính hiệu quả của một
thuật giải được đo bởi số lượng các đơn vị tính sơ cấp mà thuật toán này
yêu cần thực hiện. Ví dụ cho các phép tính sơ cấp đó là phép +, -, *, :
các số tự nhiên nhỏ hơn 10
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Giáo trình Cấu trúc dữ liệu và giải thuật (Bản đẹp)
trỏ, trỏ tới cây con trái của nút D E G đó Trường right ứng với con trỏ, trỏ tới cây con phải của Hình 6.8 nút đó Ta có thể khai báo như sau: Type item = ...;{kiểu dữ liệu của các nút trên cây } Tree = ^Node; Node = record Giáo trình Cấu trúc dữ liệu và giải thuật Trang 81 / 92 info : item; left, right: Tree; end; var Root :Tree; Ví dụ: cây nhị phân hình 5.8 có dạng lưu trữ móc nối như ở hình 5.9 Root A B C D E G Hình 6.9. Cấu trúc dữ liệu biểu diễn cây Để truy nhập vào các nút trên cây cần có một con trỏ Root, trỏ tới nút gốc của cây 2.2. Biểu diễn cây tổng quát Biểu diễn cây tổng quát bằng một cây nhị phân gọi là cây nhị phân tương đương. Với cách biểu diễn này chúng ta gán số thứ tự cho các cây con của mỗi nút.Giả sử trên hình vẽ ta đánh số thứ tự từ trái sang phải. Chẳng hạn với nút có 5 cây con sau đây,thì sẽ đánh số như A B C D E F 1 2 3 4 5 HÌNH 6.10 Chúng ta xem: nút 1 là “con cả“ của nút A, nút 2 là “em kề nút 1”.,nút 3 là “em kề nút 2” v.v. Với mỗi nút chúng ta chỉ cần chú ý tới hai quan hệ này là đủ Từ đó quy cách của mỗi nút trên cây nhị phân tương đương, có dạng : LCC INFO REK Giáo trình Cấu trúc dữ liệu và giải thuật Trang 82 / 92 Với LCC là trường con trỏ, ở đó chứa địa chỉ của nút “con cả” REK là trường con trỏ, ở đó chứa địa chỉ của nút “em kề nó” Như vậy với bất kì một cây con nào cũng có một và chỉ một cây nhị phân tương đương với nó. Điều đó cũng có nghĩa là : với một cây tổng quát cho, thì biểu diễn trong máy của nó là cây nhị phân tương đương. Các phép xử lí trên cây tổng quát đều thực hiện qua cây nhị phân tương đương này và kết quả sau khi chuyển đổi lại. sẽ phải khớp với ý đồ xử lí đối với cây tổng quát. Sau đây là ví dụ minh họa một vài cây nhị phân tương đương ứng với cây tổng quát cho: T T’ A A B B C D E F G H I J K E C T F G D T’ A H A B C B I D C J D E F G E F K H I J H G K I J K T là con trỏ,Trỏ tới gốc cây tổng quát T’ là con trỏ, trỏ tới gốc cây nhị phân tương đương của cây T) HÌNH 6.11 Ta thấy : - Gốc của cây nhị phân tương đương T’ không có con phải. Giáo trình Cấu trúc dữ liệu và giải thuật Trang 83 / 92 - Cây nhị phân tương đương T’ của một cây nhị phân T thường khác nó. 3. Bài toán duyệt cây nhị phân Phép xử lý các nút trên cây - mà ta gọi chung là phép thăm các nút một cách hệ thống, sao cho mỗi nút được thăm đúng một lần, gọi là phép duyệt cây. Chúng ta thường duyệt cây nhị phân theo một trong ba thứ tự: duyệt trước, duyệt giữa và duyệt sau, các phép này được định nghĩa đệ qui như sau: 3.1. Duyệt theo thứ tự trước (gốc – trái – phải) - Thăm gốc A - Duyệt câycon trái theo thứ trước - Duyệt cây con phải theo thư tự trước B C Cài đặt: procedure Truoc(Root : Tree); D E F Begin if Root nil then G Begin H write(Root^.info); Truoc(Root^.left); HÌNH 6.12 Truoc(Root^.right); end; end; Ví dụ: Chúng ta duyệt trước với cây ở hình 5.12, có kết quả như sau: A B D C E G H F 3.2. Duyệt theo thứ tự giữa (trái – gốc – phải) - Duyệt câycon trái theo thứ giữa - Thăm gốc - Duyệt cây con phải theo thư tự giữa Cài đặt: procedure Giua(Root : Tree); Begin if Root^.left nil then Begin Preorder(Root^.left); Giáo trình Cấu trúc dữ liệu và giải thuật Trang 84 / 92 write(Root^.info); Preorder(Root^.right); end; end; Ví dụ: Chúng ta duyệt trước với cây ở hình 5.12, có kết quả như sau: D B A G H E C F 3.3. Duyệt theo thứ tự sau (trái – phải – gốc) - Duyệt câycon trái theo thứ sau - Duyệt cây con phải theo thư tự sau - Thăm gốc Cài đặt: procedure Sau(Root : Tree); Begin if Root^.right nil then Begin Preorder(Root^.left); Preorder(Root^.right); write(Root^.info); end; end; Ví dụ: Chúng ta duyệt trước với cây ở hình 5.12, có kết quả như sau: D B H G E F C A Bài tập thực hành của học viên 6.1. Trình bày các biểu thức theo thứ tự duyệt trước, duyệt sau, duyệt giữa của cây sau: A B J I K D F H L Y 6.2. Dựng cây nhị phân biết thứ tự các đỉnh khi duyệt theo Giáo trình Cấu trúc dữ liệu và giải thuật Trang 85 / 92 a. Thứ tự trước: A D F G H K L P Q R W Z Thứ tự giữa : G F H K D L A W R Q P Z b. Theo thứ tự sau: F G H D A L P Q R Z W K Thứ tự giữa : G F H K D L A W R Q P Z YÊU CẦU VỀ ĐÁNH GIÁ KẾT QUẢ HỌC TẬP: Kết quả Kết qủa Tiêu chí đánh giá Hệ số thực hiện học tập Kiến thức 0,3 Kỹ năng 0,5 Thái độ 0,2 Cộng: Giáo trình Cấu trúc dữ liệu và giải thuật Trang 86 / 92 CHƯƠNG 7: ĐỒ THỊ Mã chương: Mh17-07 Giới thiệu: Đồ thị có vai trò rất quan trọng trong thực tế. Đồ thị được dùng để giải các bài toán trong nhiều lĩnh vực khác nhau. Ví dụ, dùng đồ thị để biểu diễn các mạch điện, biểu diễn các công thức phân tử hóa học, biểu diễn mạng máy tính. Đồ thị với các trọng số được gán cho các cạnh của nó có thể dùng để giải các bài toán như bài toán tìm đường đi ngắn nhất giữa hai thành phố trong một mạng giao thông. Chúng ta cũng có thể dùng đồ thị để lập lịch thi và phân chia kênh cho các đài truyền hình. Mục tiêu: - Trình bày được khái niệm về đồ thị; - Cài đặt được đồ thị trên máy tính bằng các cấu trúc mảng và cấu trúc danh sách liên kết; - Giải được bài toán tìm đường đi trên đồ thị. - Thực hiện các thao tác an toàn với máy tính. Nội dung gồm: 1.Các định nghĩa Một đồ thị G bao gồm một tập hợp V các đỉnh và một tập hợp E các cung, ký hiệu G=(V,E). Các đỉnh còn được gọi là nút (node). Các cung nối giữa hai đỉnh, hai đỉnh này có thể trùng nhau. Hai đỉnh có cung nối nhau gọi là hai đỉnh kề (adjacency). Một cung nối giữa hai đỉnh v, w có thể coi như là một cặp điểm (v,w). Nếu cặp này có thứ tự thì ta có cung có thứ tự, ngược lại thì cung không có thứ tự. Nếu các cung trong đồ thị G có thứ tự thì G gọi là đồ thị có hướng (directed graph). Nếu các cung trong đồ thị G không có thứ tự thì đồ thị G là đồ thị vô hướng (undirected graph). Trong các phần sau này ta dùng từ đồ thị (graph) để nói đến đồ thị nói chung, khi nào cần phân biệt rõ ta sẽ dùng đồ thị có hướng, đồ thị vô hướng. Thông thường trong một đồ thị, các đỉnh biểu diễn cho các đối tượng còn các cung biểu diễn mối quan hệ (relationship) giữa các đối tượng đó. Chẳng hạn các đỉnh có thể biểu diễn cho các thành phố còn các cung biểu diễn cho đường giao thông nối giữa hai thành phố. Một đường đi (path) trên đồ thị là một dãy tuần tự các đỉnh v1, v2,..., vn sao cho (vi,vi+1) là một cung trên đồ thị (i=1,...,n-1). Đường đi này là đường đi Giáo trình Cấu trúc dữ liệu và giải thuật Trang 87 / 92 từ v1 đến vn và đi qua các đỉnh v2,...,vn-1. Đỉnh v1 còn gọi là đỉnh đầu, vn gọi là đỉnh cuối. Độ dài của đường đi này bằng (n-1). Trường hợp đặc biệt dãy chỉ có một đỉnh v thì ta coi đó là đường đi từ v đến chính nó có độ dài bằng không. Đường đi gọi là đơn (simple) nếu mọi đỉnh trên đường đi đều khác nhau, ngoại trừ đỉnh đầu và đỉnh cuối có thể trùng nhau. Một đường đi có đỉnh đầu và đỉnh cuối trùng nhau gọi là một chu trình (cycle). Một chu trình đơn là một đường đi đơn có đỉnh đầu và đỉnh cuối trùng nhau và có độ dài ít nhất là 1. Trong nhiều ứng dụng ta thường gắn các giá trị (value) vào các cung thể hiện một thông tin liên quan tới cung đó, giá trị đó được gọi là trọng số, lúc này ta nói đồ thị có trọng số. Đồ thị con của một đồ thị G=(V,E) là một đồ thị G'=(V',E') trong đó: ¾ V’⊆V và ¾ E’ gồm tất cả các cạnh (v,w) ∈ E sao cho v,w ∈ V’. 2. Biểu diễn đồ thị 2.1. Biểu diễn đồ thị bằng ma trận kề Ta dùng một mảng hai chiều, chẳng hạn mảng A, kiểu boolean để biểu diễn các đỉnh kề. Nếu đồ thị có n đỉnh thì ta dùng mảng A có kích thước nxn. Giả sử các đỉnh được đánh số 1..n thì A[i,j] = true, nếu có cung nối giữa đỉnh thứ i và đỉnh thứ j, ngược lại thì A[i,j] = false. Rõ ràng, nếu G là đồ thị vô hướng thì ma trận kề sẽ là ma trận đối xứng. Ví dụ 11: Ma trận liền kề với thứ tự các đỉnh v1, v2, v3, v4 là: V1 V2 1 1 1 0 0 1 0 1 V3 V4 0 1 1 0 0 0 0 1 Do ma trận lưu trữ kế tiếp, nên việc truy cập đến các phần tử của ma trận kề được thực hiện trực tiếp, với tốc độ nhanh, nhưng cách lưu trữ này rỏ rang là tốn không gian nhớ khi n lớn 2.2. Biểu diễn đồ thị bằng danh sách các đỉnh kề: Trong cách biểu diễn này, ta sẽ lưu trữ các đỉnh kề với một đỉnh i trong một danh sách liên kết theo một thứ tự nào đó, gọi là danh sách kề. Mỗi nút trong danh sách có qui cách: INFO LINK Trường INFO chứa số j ứng với đỉnh j là kề của i(1<=i<=n) trong danh sách lân cận của i Giáo trình Cấu trúc dữ liệu và giải thuật Trang 88 / 92 Trường LINK chứa con trỏ, trỏ tới nút tiếp theo trong danh sách. Danh sách có m nút, nếu đỉnh i có m đỉnh kề . Mỗi danh sách như vậy lại có “nút đầu danh sách”. Thường các “nút đầu danh sách” là các phần tử của một vec tơ V, có kích thước bằng n, phần tử V[i] của V (1<=i<=n), ứng với danh sách kề của nút thứ i, nó chứa địa chỉ của nút đầu tiên của danh sách kề này. Ví dụ 11: Hình ảnh danh sách kề biểu diễn đồ thị sau là: V1 V2 V3 V4 V[1] 2 3 V[2] 1 3 4 V[3] 1 2 4 V[4] 2 3 3. Bài toán tìm đường đi trên đồ thị Trong đời sống, chúng ta thường gặp những tình huống như sau: để đi từ địa điểm A đến địa điểm B trong thành phố, có nhiều đường đi, nhiều cách đi; có lúc ta chọn đường đi ngắn nhất (theo nghĩa cự ly), có lúc lại cần chọn đường đi nhanh nhất (theo nghĩa thời gian) và có lúc phải cân nhắc để chọn đường đi rẻ tiền nhất (theo nghĩa chi phí), v.v... Có thể coi sơ đồ của đường đi từ A đến B trong thành phố là một đồ thị, với đỉnh là các giao lộ (A và B coi như giao lộ), cạnh là đoạn đường nối hai giao lộ. Trên mỗi cạnh của đồ thị này, ta gán một số dương, ứng với chiều dài của đoạn đường, thời gian đi đoạn đường hoặc cước phí vận chuyển trên đoạn đường đó, ... Giáo trình Cấu trúc dữ liệu và giải thuật Trang 89 / 92 Đồ thị có trọng số là đồ thị G=(V,E) mà mỗi cạnh (hoặc cung) e E được gán bởi một số thực m(e), gọi là trọng số của cạnh (hoặc cung) e. Cho đơn đồ thị liên thông, có trọng số G=(V,E). Tìm khoảng cách d(u0,v) từ một đỉnh u0 cho trước đến một đỉnh v bất kỳ của G và tìm đường đi ngắn nhất từ u0 đến v. Ở đây, chúng ta có thuật toán do E. Dijkstra, nhà toán học người Hà Lan, đề xuất năm 1959. Phương pháp của thuật toán Dijkstra là: xác định tuần tự đỉnh có khoảng cách đến u0 từ nhỏ đến lớn. Trước tiên, đỉnh có khoảng cách đến a nhỏ nhất chính là a, với d(u0,u0)=0. Trong các đỉnh v u0, tìm đỉnh có khoảng cách k1 đến u0 là nhỏ nhất. Đỉnh này phải là một trong các đỉnh kề với u0. Giả sử đó là u1. Ta có:d(u0,u1) = k1. Trong các đỉnh v u0 và v u1, tìm đỉnh có khoảng cách k2 đến u0 là nhỏ nhất. Đỉnh này phải là một trong các đỉnh kề với u0 hoặc với u1. Giả sử đó là u2. Ta có: + d(u0,u2) = k2. Tiếp tục như trên, cho đến bao giờ tìm được khoảng cách từ u0 đến mọi đỉnh v của G. Nếu V={u0, u1, ..., un} thì: + 0 = d(u0,u0) < d(u0,u1) < d(u0,u2) < ... < d(u0,un). + Thuật toánDijkstra procedureDijkstra (G=(V,E) là đơn đồ thị liên thông, có trọng số với trọng số dương) {G có các đỉnh a=u0, u1, ..., un=z và trọng số m(ui,uj), với m(ui,uj) = nếu (ui,uj) không là một cạnh trong G} + for i := 1 to n + L(ui) := + L(a) := 0 + S := V \ {a} + u := a + while S + begin + for tất cả các đỉnh v thuộc S + if L(u) +m(u,v) < L(v) then L(v) := L(u)+m(u,v) + u := đỉnh thuộc S có nhãn L(u) nhỏ nhất Giáo trình Cấu trúc dữ liệu và giải thuật Trang 90 / 92 + {L(u): độ dài đường đi ngắn nhất từ a đến u} + S := S \ {u} + End; Ví dụ 1: Tìm khoảng cách d(a,v) từ a đến mọi đỉnh v và tìm đường đi ngắn nhất từ a đến v cho trong đồ thị G sau. + 4 6 b c d + 1 1 2 2 + 2 2 3 4 3 + a e g h 3 + 2 3 5 5 1 + 3 n m k + 6 3 Giáo trình Cấu trúc dữ liệu và giải thuật Trang 91 / 92 + L+ L+ L+ L+ L+ L+ L+ L+ L+ L (a) (b) (c) (d) (e) (g) (h) (k) (m) (n) + + + + + + + + + + +0 + + + + + + + + + + − 1 3 3 2 + +− + − + 5 + + 2 + + + + + 3 2 + − +− + + 5 + + 2 + + + + 3 − + − − +− + + 4 + + + 6 + + + 3 + − + − − 4 − 6 6 − − + + + + + + + + + + + − − − 10 − 6 6 − − + + + + + + + + + + +− − − 8 − − 9 6 − − + + + + + + + + + + +− − − 8 − − 7 − − − + + + + + + + + + + +− − − 8 − − − − − − + + + + + + + + + + + Bài tập thực hành của học viên 7.1.Hãy nêu vài ví dụ thực tế biểu diễn được bằng cấu trúc đồ thị. 7.2. Cây có phải là một đồ thị ? 7.3.Một đồ thị vô hướng có 5 đỉnh thì có tối đa bao nhiêu cung giữa một đỉnh với một đồ thị đỉnh khác. 7.4. Với đồ thị có n đỉnh thì sao ? 7.5. Vẽ một đồ thị định hướng có 5 đỉnh A,B,C,D,E và các cung định hướng : (A,B);(C,D);(D,A);(B,D);(B,E);(E,D). 7.6.Cho các đồ thị G1 và G2 sau đây : Giáo trình Cấu trúc dữ liệu và giải thuật Trang 92 / 92 1 2 1 2 3 5 4 4 3 G1 G2 Hãy lập ma trận kề của G1 và G2 Hãy lập danh sách kề của G1 và G2 YÊU CẦU VỀ ĐÁNH GIÁ KẾT QUẢ HỌC TẬP: Kết quả Kết qủa Tiêu chí đánh giá Hệ số thực hiện học tập Kiến thức 0,3 Kỹ năng 0,5 Thái độ 0,2 Cộng: Giáo trình Cấu trúc dữ liệu và giải thuật Trang 93 / 92 TÀI LIỆU THAM KHẢO 1. Aho, Hopcroft & Ullman, Data Structures and Algorithms,Addison Wesley, 2001. 2. Robert Sedewick, Algorithms in Java Third Edition,Addison Wesley, 2002. Niklaus Wirth, Data Structures and Algorithms,Prentice Hall, 2004. Robert Sedewick, Algorithms,Addison Wesley, 1983. 3. Bruno R. Preiss, Data Structures and Algorithms with Object-Oriented Design, Jon Wiley &Sons, 1998. 4. Đinh Mạnh Tường, Cấu trúc dữ liệu và thuật toán, NXB Đại học Quốc gia Hà Nội. 5. PGS.TS.Đỗ Xuân Lôi – Cấu trúc dữ liệu và giải thuật – NXB Khoa học và Kỹ thuật – 1997. 6. PGS.TS.Đỗ Xuân Lôi – Giáo trình Cấu trúc dữ liệu và giải thuật – Vụ giáo dục chuyên nghiệp, NXB Giáo dục - 2002 7. Trần Hạnh Nhi, Giáo trình cấu trúc dữ liệu,Trường đại học Khoa hoc tựnhiên, tp. Hồ Chí Minh, 2003 8. PGS. TS. Hoàng Nghĩa Tý, Cấu Trúc Dữ Liệu Và Thuật Toán, Xây Dựng, 2002 9. Gia Việt(Biên dịch), ESAKOV.J , WEISS T, Bài Tập Nâng Cao Cấu Trúc Dữ Liệu Cài Đặt Bằng C, Nhà xuất bản: Thống kê 10. Minh Trung(Biên dịch), TS. Khuất Hữu Thanh(Biên dịch), Chu Trọng Lương(Tác giả), 455 Bài Tập Cấu Trúc Dữ Liệu - Ứng Dụng Và Cài Đặt Bằng C++,Thống kê . 11. Robert Sedgewick, Trần Đan Thư(Biên dịch), Bùi thị Ngọc Nga(Biên dịch), Cẩm Nang Thuật Toán (Tập1,2); Khoa học và kỹ thuật 12. GS. TSKH. Hoàng Kiếm, Giải Một Bài Toán Trên Máy Tính Như Thế Nào,Giáo dục, 2005. 13. Nguyễn Quốc Lượng, Hoàng Đức Hải – Cấu trúc dữ liệu + giải thuật = chương trình – NXB Giáo dục – 1996.
File đính kèm:
- giao_trinh_cau_truc_du_lieu_va_giai_thuat_ban_dep.pdf