Thuật giải - Heapsort
Bạn đang xem 20 trang mẫu của tài liệu "Thuật giải - Heapsort", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- thuat_giai_heapsort.pdf
Nội dung text: Thuật giải - Heapsort
- HEAPSORT • Giải thuật sắp xếp (sorting algorithm) • Heaps • Thuật giải Heapsort • Hàng đợi ưu tiên (priority queue) 1
- GIẢI THUẬT SẮP XẾP • Input: một dãy n số (a1, a2, , an) • Output: một hoán vị của input (a’1, a’2, , a’n) sao cho a’1 a’2 a ’n 2
- HEAPS • Đólàmột mảng các đối tượng được biểu diễn bởi một cây nhị phân có thứ tự và cân bằng • Mỗi nút tương ứng với một phần tử của mảng, gốc ứng với phần tử đầu tiên của mảng 3
- HEAPS • Cây được lấp đầy trên tất cả các mức, ngoại trừ mức thấp nhất được lấp đầy từ bên trái sang (có thể chưa lấp đầy) • Một heap biểu diễn một mảng A có hai đặc tính: . length[A], là số phần tử của mảng . heap-size[A], là số phần tử của A được biểu diễn bởi heap 4
- HEAPS 5
- HEAPS • Chỉ số của cha, con trái và con phải của nút i có thể tính: . PARENT( i) return i/2 . LEFT(i) return 2i . RIGHT(i) return 2i+ 1 6
- HEAPS • Có hai loại heap nhị phân, max-heap và min-heap . Trong max-heap A[PARENT(i)] A[i] với mọi nút i khác gốc phần tử lớn nhất được lưu trữ tại g ốc . Trong min-heap A[PARENT(i)] A[i] với mọi nút i khác gốc phần tử nhỏ nhất được lưu trữ tại gốc 7
- HEAPS • Các thủ tục trên max-heap dùng cho sắp xếp . MAX-HEAPIFY tạo một max-heap có gốc tại nút i . BUILD-MAX-HEAP xây dựng một max-heap từ một mảng không thứ tự . HEAPSORT sắp xếp một mảng 8
- MAX-HEAPIFY • Đầu vào là một mảng (heap) A và chỉ số i trong mảng • Các cây nhị phân được định gốc tại LEFT(i) và RIGHT(i) là các max-heap nhưng A[i] có thể nhỏ hơn các con c ủa nó • MAX-HEAPIFY đẩy giá trị A[i] xuống sao cho cây con định gốc tại A[i] là một max-heap 9
- MAX-HEAPIFY 10
- MAX-HEAPIFY • Thời gian chạy của MAX-HEAPIFY từ dòng 1 đến 8 là O(1) • Mỗi cây con có kích thước lớn nhất là 2n/3 nếu heap có n nút vì vậy thời gian ch ạy của MAX-HEAPIFY là T(n) T(2n/3)+ O(1) • Giải hệ thức này ta có T(n) = O(lg n)=O(h) (h là chiều cao cây) 11
- BUILD-MAX-HEAP • Các nút có chỉ số n/2 +1, n/2 +2, , n trong A[1 n] là các lá của cây, mỗi nút như vậy là mộ t max-heap • BUILD-MAX-HEAP áp dụng MAX-HEAPIFY cho các nút con khác lá của cây từ dưới lên gốc bắt đầu từ nút n/2 • Kết quả là một max-heap tương ứng với A[1 n] 12
- BUILD-MAX-HEAP 13
- BUILD-MAX-HEAP 14
- BUILD-MAX-HEAP • Bất biến vòng lặp: Tại điểm bắt đầu của mỗi lần lặp của vòng lặp 2-3, mỗi nút i+1, i+2, , n là gốc của một max-heap • Bất biến này đúng trước lần lặp đầu tiên, sau đóduy trìcho mỗi lần lặp tiếp theo 15
- BUILD-MAX-HEAP • Khởi đầu: i = n/2 , mỗi nút n/2 +1, n/2 +2, , n là một lá, chúng là gốc của một max-heap • Duy trì: MAX-HEAPIFY(A, i) đảm bảo nút i và các con của nó là các gốc của các max-heap, bất biến vòng lặp thỏa khi i giảm và trở về đầu vòng lặp • Kết thúc: Khi i = 0, mỗi nút 1, 2, , n là gốc của một max- heap 16
- BUILD-MAX-HEAP • Thời gian chạy của BUILD-MAX-HEAP là O(nlgn), vì có n lần gọi MAX-HEAPIFY, mỗi lần chi phí lgn • Thực sự thời gian chạy của BUILD-MAX-HEAP là O(n) 17
- HEAPSORT • Heapsort sử dụng BUILD-MAX-HEAP để xây dựng một max- heap trên mả ng input A[1 n] • Hoán đổi giá trị A[1] với A[n] • Loại nút n ra khỏi heap và chuyển A[1 (n-1)] thành một max- heap • Lặp lại các bước trên cho đến khi heap chỉ còn một phần tử 18
- HEAPSORT 19
- HEAPSORT 20
- HEAPSORT • Chi phí của BUILD-MAX-HEAP là O(n) • Có n-1 lời gọi MAX-HEAPIFY, mỗi lời gọi chi phí O(lgn) • Vậy tổng chi phí của HEAPSORT là O(nlgn) 21
- HÀNG ĐỢI ƯU TIÊN • Hàng đợi ưu tiên (priority queue) gồm một tập đối tượng trong đó đối tượng có khoá ưu tiên được xử lý trước • Dùng max-heap để biểu diễn hàng đợi ưu tiên theo khóa lớn hơn • Dùng min-heap để biểu diễn hàng đợi ưu tiên theo khóa nhỏ hơn 22
- HÀNG ĐỢI ƯU TIÊN • Thao tác trên hàng đợi ưu tiên . MAX-HEAP-INSERT(A, x) . HEAP-EXTRACT-MAX(A) . HEAP-MAXIMUM(A) . HEAP-INCREASE-KEY(A, x, k) 23
- HEAP-EXTRACT-MAX • HEAP-EXTRACT-MAX(A) loại phần tử được ưu tiên nhất ra khỏi hàng đợi A 24
- HEAP-EXTRACT-MAX 25
- HEAP-EXTRACT-MAX • Thời gian chạy của HEAP-EXTRACT-MAX(A) là O(lg n) trên một heap n phần tử 26
- HEAP-INCREASE-KEY • HEAP-INCREASE-KEY(A, i, key) tăng khoá tại nút i lên thành khoá key • Đi chuyển phần tử có khóa key từ nút i hướng đến gốc để tìm nơi chính xác cho nút nhận khoá này 27
- HEAP-INCREASE-KEY 28
- HEAP-INCREASE-KEY • Thời gian chạy của HEAP-INCREASE-KEY tối đa là O(lg n) trên một heap n phần tử 29
- HEAP-INCREASE-KEY 30
- MAX-HEAP-INSERT • MAX-HEAP-INSERT(A, key) chèn một phần tử có khoá key vào một max-heap • Đầu tiên, mở rộng heap bằng cách thêm vào một lá mới • Áp dụng HEAP-INCREASE-KEY để tăng khóa key cho nút lá này 31
- MAX-HEAP-INSERT 32
- MAX-HEAP-INSERT • Thời gian chạy của MAX-HEAP- INSERT tối đa là O(lg n) trên một heap n phần tử 33
- QUICKSORT • Mô tả Quicksort • Giải thuật Quicksort • Hiệu suất Quicksort 1
- MÔ TẢ QUICKSORT • Do C. A. R Hoare công bố năm 1962 • Là giải thuật tốt, được ứng dụng nhiều trong thực tế 2
- MÔ TẢ QUICKSORT • Được thiết kế dựa trên kỹ thuật chia để trị (divide-and- conquer): . Divide: Phân hoạch A[p r] thành hai mảng con A[p q-1] và A[q+1 r] có các phần tử tương ứng nhỏ hơn hoặc bằng A[q ] và lớn hơn A[q] . Conquer: Sắp xếp hai mảng con A[p q-1] và A[q+1 r] bằng lời gọi đệ qui 3
- GIẢI THUẬT QUICKSORT 4
- PARTITION 5
- PARTITION 6
- PARTITION • PARTITION luôn chọn phần tử x = A[r] làm phần tử chốt (pivot) để phân hoạch mảng A[ p r] • Khi partition đang thực hiện mảng bị phân hoạch thành bốn vùng 7
- PARTITION • Tại điểm bắt đầu của vòng lặp for dòng 3-6 mỗi vùng thoả các tính chất sau đây (bất biến của vòng lặp) . Nếu p k i, thì A[k] x (1) . Nếu i +1 k j -1 , thì A[k] > x (2) . Nếu k = r , thì A[k] = x (3) 8
- PARTITION 9
- PARTITION • Khởi đầu . Trước lần lặp đầu tiên, i = p -1 và j = p, không có giá trị nào giữa p và i và không có giá trị nào giữa i +1 và j -1 . Các bất biếnvòng lặp thỏa 10
- PARTITION • Duy trì . Nếu A[j] > x, thao tác duy nhất trong vòng lặp là tăng j lên 1 , điều kiện 2 thoả cho A[j-1] và tất các mục khác không thay đổi . Nếu A[j] x, i được tăng lên 1, A[i] và A[j] được tráo đổi sau đ ó j tăng lên 1, hệ quả A[i] x và A[j-1 ] > x các bất biến thỏ a 11
- PARTITION 12
- PARTITION • Kết thúc . Khi j = r, các bất biến vòng lặp thỏa và mảng đã phân hoạch thành ba phần, nhỏ hơn hoặc bằng x , lớ n hơn x và phần cuối chỉ chứa A[r] = x . Hai lệnh kết thúc partition hoán đổi A[r] với phần tử trái nhất l ớn hơn x (vị trí q =i +1) 13
- PARTITION • Gọi n = r – p +1 là kích thước đầu vào của PARTITION trên mảng A[ p r] • Thời gian chạy của PARTITION là O(n) 14
- HIỆU SUẤTCỦA QUICKSORT • Thời gian chạy của Quicksort phụ thuộc vào partition • Nếu phân hoạch là cân bằng, Quicsort chạy nhanh ít nhất như Heapsort • Trường hợp xấu nhất, thời gian chạy của Quicksort là O(n2) 15
- HIỆU SUẤTCỦA QUICKSORT • Trường hợp xấu nhất (worst-case), hai mảng A[p q-1] và A[q+1, r] có thước n -1 và 0 • Chi phí cho PARTITION là O(n) • Vì vậy, thời gian chạy của Quicksort là T(n) = T(n-1) + T(0) + O(n) = O(n2) 16
- HIỆU SUẤTCỦA QUICKSORT • Trường hợp tốt nhất (best-case), hai mảng A[p q-1] và A[q+1, r] có thước là n/2 và n/2 -1 • Chi phí cho PARTITION là O(n) • Vì vậy, thời gian chạy của Quicksort là T(n) 2T(n/2) + O(n) = O(nlgn) 17
- HIỆU SUẤTCỦA QUICKSORT • Phân hoạch cân bằng (balanced partitioning), hai mảng A[p q- 1] và A[q+1, r] có thướ c xấp xỉ 9n/10 và n/10 • Chi phí cho PARTITION là O(n) • Thơi gian chạy của Quicksort là T(n) T(9n/10) + T(n/10) + O(n) = O(nlgn) 18
- HIỆU SUẤTCỦA QUICKSORT Cây đệ qui phân hoạch cân bằng 19
- HIỆU SUẤTCỦA QUICKSORT • Trường hợp trung bìmh (average case), Quicksort chạy nhanh gần với trường hợp tốt nhất T(n) = O(nlgn) 20
- HIỆU SUẤTCỦA QUICKSORT Hai mức của cây đệ qui cho trường hợp trung bình 21
- SẮP XẾP THỜI GIAN TUYẾN TÍNH • Khái niệm • Sắp xếp bằng đếm • Sắp xếp theo lô 1
- KHÁI NIỆM • Giải thuật sắp xếp thời gian tuyến tính là giải thuật có thời gian chạy O(n) • Các giải thuật tốt như Heapsort, Quicksort có thời gian chạy O(nlgn) 2
- KHÁI NIỆM • Các giải thuật Heapsort, Quicksort dùng phương pháp so sánh, hoán đổi để sắp xếp • Các giải thuật tuyế n tính dựa trên thông tin của các phần tử để sắp xếp nên giảm được bậc của độ phức tạp 3
- SẮP XẾP BẰNG ĐẾM • Cho k là một số nguyên, sắp xếp bằng đếm (counting sort) giả sử mỗi một phần tử trong dãy input là một số nguyên trong miền từ 0 đến k 4
- SẮP XẾP BẰNG ĐẾM • Ý tưởng là đếm số phần tử nhỏ hơn phần tử x trong mảng nhập để đặ t x trực tiếp vào vị trí của nó trong mảng xuất • Chẳng hạn, nếu có 17 phần tử nh ỏ hơn ho ặc bằng x thì x được đặt vào ví trí 17 5
- SẮP XẾP BẰNG ĐẾM // B là mảng xuất kết quả // C là mảng chứa quan hệ các phần tử của A 6
- SẮP XẾP BẰNG ĐẾM 7
- SẮP XẾP BẰNG ĐẾM • Dòng 1-2 khởi tạo các C[i] = 0 • Dòng 3-4 xác định số phần tử có giá trị là i = A [j] trong A • Dòng 6-7 xác định số phần tử trong A nh ỏ hơn hoặc bằng i, đólàtổng của C[i] và C[i-1] 8
- SẮP XẾP BẰNG ĐẾM • Dòng 9-10 đặt A[j] vào trong vị trí được sắp chính xác của nó trong mảng B căn cứ vào số ph ần tử nhỏ hơn hoặc bằng A[j] trong C[A[j]] • Giảm C[A[j]] đi 1 trong dòng 10 để các phần tử còn lại bằng A[j] sẽ được đặt chính xác vào mảng B lần lặp sau 9
- SẮP XẾP BẰNG ĐẾM • Chi phí cho lệnh 1-2 là O(k) • Chi phí cho lệnh 3-4 là O(n) • Chi phí cho 6-7 là O(k) • Chi phí cho 9-11 là O(n) . Vì vậ y tổng chi phí thời gian là O(k + n) . Nế u k = O(n) thì tổ ng chi phí là O(n). 10
- SẮP XẾP BẰNG ĐẾM • COUNTING-SORT chạy thời gian tuyến tính và hiệu quả hơn các giải thuật sắp xếp bằng so sánh • COUNTING-SORT chỉ sắp xếp các phần tử có khoá trong một miền nhất định (nh ỏ hơn hoặc bằng k cho trướ c) • COUNTING-SORT ph ải sử dụng thêm các mảng trung gian 11
- SẮPXẾPTHEO LÔ • Sắp xếp theo lô (Bucket sort) giả sử input là một mảng n số không âm nhỏ hơn 1 12
- SẮPP XẾPTHEO LÔ • Ý tưởng của Bucketsort . Phân bố mảng input vào n khoảng con (lô) của khoảng [0, 1) . Sắp xếp các phần tử trong mỗi lô và nố i các lô để có mảng được sắp 13
- SẮPXẾPTHEO LÔ // A là mảng mà 0 A[i] <1 // B chứa các lô 14
- SẮPXẾPTHEO LÔ 15
- SẮPXẾPTHEO LÔ • Xét hai phần tử A[i] và A[j] . Nếu A[i] và A [j] cùng rơi vào một lô, chúng có thứ tự nhờ giải thuật chèn trực tiếp . Ngược lại, gọi các lô tương ứng của A[i] và A[j] là B[i’ ] và B[j’ ], nếu i’ < j’ thì lô B[i’ ] được nối trước lô B[j’ ] và khi đó A[i] A[j] 16
- SẮPXẾPTHEO LÔ • Thật vậy, giả sử ngược lại A[i] A[j] thì . i’ = nA[i] nA[j] = j’ . Điều này mâu thuẫn với i’ < j’ , nghĩa là A[i] A[j] • Như vậy, giải thuật đảm bảo th ứ tự củ a mả ng output 17
- SẮPXẾPTHEO LÔ • Do phân bố ngẩu nhiên n phần tử vào n khoảng con nên trung bình m ỗi lô có 1 phần tử, vì v ậy thời gian sắp xếp chèn là O(1) • Từ đó, chi phí toàn bộ của giải thuật là O(n) 18
- SẮPXẾPTHEO LÔ • BUCKET-SORT chạy thời gian tuyến tính và hiệu quả hơn các giải thuật s ắp xếp bằng so sánh • BUCKET-SORT chỉ sắp xếp các phần tử có khoá trong khoảng [0, 1) • Không phải mọi phân bố sẽ cho mỗi lô chứa 1 phần tử 19
- CÁC THUẬTTOÁN ĐỒ THỊ CƠ BảN • Các khái niệm và thuật ngữ • Biểu diễn đồ thị • Tìm kiếm theo chiều rộng • Tìm kiếm theo chiều sâu 1
- KHÁI NIỆM VÀ THUẬT NGỮ • Đồ thị vô hướng (undirected graph) G = (V, E), gồm một tập V các đỉnh (vertice) và một tập E các cạnh (edge), mỗi cạnh e = (u, v) E ứng với m ột cặp không có thứ tự các đỉnh u, v V • Đồ thị có hướng (directed graph) G = (V, E), gồm một tập V các đỉnh và một tập E các cạnh, mỗi cạnh e = (u, v) E ứng với một cặp có thứ tự các đỉnh u, v V 2
- KHÁI NIỆM VÀ THUẬT NGỮ Ví dụ 1: Đồ thị vô hướng: V = {u, v, x, y, z} E = {e1, e2, e3, e4, e5, e6, e7} e e =(x, y) 1 3 u v e4=(x, y) e5 e7=(z, z) e 2 e z e 3 7 e6 x y e4 3
- KHÁI NIỆM VÀ THUẬT NGỮ Ví dụ 2: Đồ thị có hướng: V = {u, v, x, y, z} E = {e1, e2, e3, e4, e5, e6, e7} e e =(x, y) 1 3 u v e4=(y, x) e5 e7=(z, z) e 2 e z e 3 7 e6 x y e4 4
- KHÁI NIỆM VÀ THUẬT NGỮ • e7 = (z, z) là cạnh khuyên • e3= (x, y) và e4=(x, y) là hai cạnh song song • Mộ t đồ thị không có cạnh khuyên hoặc cạnh song song gọi là đơ n đồ thị (simple graph), ngược lại gọi là đa đồ thị (multigraph) 5
- KHÁI NIỆM VÀ THUẬT NGỮ • Đỉnh u và v là kề nhau (adjacent) nếu có cạnh e =(u, v), cạnh e gọi là liên thuộ c vớ i u và v • Bậ c (degree) của đỉnh v trong đồ thị vô hướng là số cạnh liên thuộc với nó, ký hiệu deg(v), đỉnh bậc 0 gọi là đỉnh cô lậ p, đỉnh bậc 1 gọi là đỉnh treo • Bán bậc ra (bán bậc vào) của đỉnh v trong đồ thị có hướng là số cạnh đi ra khỏi nó (đi vào nó) và ký hiệu deg+(v) (deg -( v)) 6
- KHÁI NIỆM VÀ THUẬT NGỮ Ví dụ 3: Bậc của các đỉnh đồ thị vô hướng e w deg(t)= 1 1 u v deg(z)= 4 deg(w)= 0 e5 e2 e3 z e7 e6 t x y e8 e4 7
- KHÁI NIỆM VÀ THUẬT NGỮ Ví dụ 4: Bán bậc của các đỉnh đồ thị có hướng e w deg+(t)= 0 1 u v deg-(t)= 1 deg+(z)= 2 e5 - e2 deg (z)= 2 e3 z e7 e6 t x y e8 e4 8
- KHÁI NIỆM VÀ THUẬT NGỮ • Đường đi độ dài n từ đỉnh x0 đến đỉnh xn trong một đồ thị là dãy P = x0, x1 , , xn trong đóm ỗi (xi, xi+1) là một cạnh • Đường đi có đỉnh đầu x0 trùng với đỉnh cuối xn gọi là chu trình • Đường đi hay chu trình g ọi là đơn nếu không có đỉnh lặp lại (trừ đỉnh đầu và cuối nếu là chu trình) 9
- KHÁI NIỆM VÀ THUẬT NGỮ Ví dụ 5: P = u, v, z, y là một đường đi và C = u, v, z, y, x, u là m ột chu trình w e1 u v e5 e2 e3 z e7 e6 t x y e8 e4 10
- KHÁI NIỆM VÀ THUẬT NGỮ Ví dụ 6: P = x, u, v, z là một đường đi và C = x, y, x là một chu trình w e1 u v e5 e2 e3 z e7 e6 t x y e8 e4 11
- KHÁI NIỆM VÀ THUẬT NGỮ • Một đồ thị được gọi là liên thông nếu luôn tìm được đường đ i giữa hai đỉnh bất kỳ của nó 12
- KHÁI NIỆM VÀ THUẬT NGỮ Ví dụ 7: Đồ thị là liên thông e1 u v e5 e2 e3 z e6 t x y e8 e4 13
- KHÁI NIỆM VÀ THUẬT NGỮ Ví dụ 8: Đồ thị không liên thông u v e4 e2 e3 z e5 t x y e1 14
- BIỂU DIỄN ĐỒ THI • Biểu diễn bằng danh sách kề (adjacency list) • Biểu diễn bằng ma trận kề (adjacency matrix) • So sánh các phương pháp biểu diễn đồ thị 15
- DANH SÁCH KỀ • Danh sách kề của đỉnh u: adj(u) = {v V | (u, v) E} • Có thể biểu diễn đồ thị G = (V, E) như một tập các danh sách kề bằng cách lư u tr ữ mỗi đỉnh u V cùng với danh sách các đỉnh kề với u 16
- DANH SÁCH KỀ Ví dụ 1: Đồ thị vô hướng 1 2 3 nil 1 3 2 1 4 nil 5 3 1 4 5 nil 2 4 4 2 3 5 nil 5 3 4 nil 17
- DANH SÁCH KỀ Ví dụ 2: Đồ thị có hướng 1 2 3 nil 1 3 2 nil 5 3 4 5 nil 2 4 4 2 nil 5 4 nil 18
- MA TRẬN KỀ • Cho đơn đồ thị G = (V, E), với tập đỉnh V ={1, 2, , n}, ma trận kề của G là A = {aij | i, j =1, 2, , n}, aij = 0 nếu (i, j) E và aij = 1 nếu (i, j) E • Nếu G là đa đồ thị thì aij = 0 nếu (i, j) E và aij = k nếu có k cạnh nối hai đỉnh i và j 19
- MA TRẬN KỀ Ví dụ 1: Đồ thị vô hướng 0 1 1 0 0 1 3 1 0 0 1 0 5 1 0 0 1 1 0 1 1 0 1 2 4 0 0 1 1 0 20
- MA TRẬN KỀ Ví dụ 2: Đồ thị có hướng 0 1 1 0 0 1 3 0 0 0 1 0 5 0 0 0 1 1 0 0 0 0 0 2 4 0 0 0 1 0 21
- MA TRẬN KỀ • Ma trận kề của đồ thị vô hướng đối xứng aij = aji , i, j = 1, 2, 3, , n • Tổng các phầ n tử trên dòng i (cột j) của ma trận kề là bậc của đỉnh i (đỉnh j) 22
- MA TRẬN KỀ • Đồ thị có trọng số (weighted graph) là đồ thị mà mỗi cạnh (i, j) đượ c gán một số th ực w(i, j) • Một đồ thị có trọng số với n đỉnh có thể được biểu diễn bởi ma trận trọng s ố C ={cij: i, j =1,2, ,n}, trong đó cij = w(i, j) nếu có cạnh (i, j) và cij = 0, , hoặc - nếu không có cạnh (i, j) 23
- MA TRẬN KỀ Ví dụ 3: Ma trận trọng số của đồ thị vô hướng 5 0 10 5 0 0 1 3 12 10 0 6 15 0 6 10 9 5 5 6 0 9 12 0 15 9 0 7 7 2 4 15 0 0 12 7 0 24
- SO SÁNH CÁC CÁCH BIỂU DIỄN Biểu diễn đồ thị vô hướng bằng danh sách và ma trận 25
- SO SÁNH CÁC CÁCH BIỂU DIỄN Biểu diễn đồ thị có hướng bằng danh sách và ma trận 26
- SO SÁNH CÁC CÁCH BIỂU DIỄN • Chi phí bộ nhớ cho ma trận là O(|V|2) và cho danh sách là O(|V|+ 2| E|) • Chi phí xử lý khi dùng ma trận là O(1) và khi dùng danh sách là O|V | 27
- TÌM KIẾM THEO CHIỀU RỘNG (Breadth-First Search-BFS) • Thuật toán BFS • Phân tích BFS • Đường đi ngắn nhất 28
- THUẬT TOÁN BFS Ý tưởng thuật toán • Bắt đầu tìm kiếm từ đỉnh s cho trước tuỳ ý • Tại thời điểm đã tìm thấy u, thuật toán tiếp tục tìm kiếm tập tất cả các đỉnh kề với u • Thực hiện quá trình này cho các đỉnh còn lại 29
- THUẬT TOÁN BFS Ý tưởng thuật toán • Dùng một hàng đợi để duy trì trật tự tìm kiếm theo chiều rộng • Dùng các màu để không lặp lại các đỉnh tìm kiếm • Dùng một mảng để xác định đường đi ngắn nhất từ s đến các đỉnh đã được tìm kiế m • Dùng một mảng để lưu trữ đỉnh đi trước của đỉnh được tìm kiếm 30
- THUẬT TOÁN BFS 31
- THUẬT TOÁN BFS 32
- PHÂN TÍCH BFS • Tổng phí khởi tạo là O(V) • Mỗi thao tác trên hàng đợi là O(1), vì vậy tổng thời gian cho thao tác trên hàng đợi là O(V) • Tổng thời gian chi phí cho quét các danh sách kề là O(E) • Tổng thời gian chạy của BFS là O(V+E) 33
- ĐƯỜNG ĐI NGẮN NHẤT • Khoảng cách đường đi ngắn nhất (shortest-path distance) từ s đến v là số cạnh ít nhất trong các đường đi từ s đến v, ký hiệ u (s, v) • Qui ước (s, v) = nếu không có đường đi từ s đến v • Một đường đi độ dài bằng (s, v) từ s đến v được gọi là đường đi ngắn nhất từ s đến v 34
- ĐƯỜNG ĐI NGẮN NHẤT • Định lý: Cho BFS chạy trên một đồ thị từ đỉnh s, thì thuật toán tìm kiếm được mọi đỉnh v mà có th ể đạt được từ s, khi kết thúc, BFS xác định các đường đ i ngắn nhất từ s đến v sao cho d[v] = (s, v) với mọi v V 35
- ĐƯỜNG ĐI NGẮN NHẤT 36
- TÌM KIẾM THEO CHIỀU SÂU (Depth-First Search-DFS) • Thuật toán DFS • Phân tích DFS 37
- THUẬT TOÁN DFS Ý tưởng thuật toán • Bắt đầu tìm kiếm từ một đỉnh u nào đó • Chọn đỉnh kề v tùy ý của u để tiếp tục quá trình tìm kiếm và lặp lại quá trình tìm kiếm này đố i với v 38
- THUẬT TOÁN DFS Ý tưởng thuật toán • Dùng các màu để không lặp lại các đỉnh tìm kiếm • Dùng các biến thời gian để xác định các thời điểm phát hiện và hoàn thành tìm kiếm của m ột đỉnh • Dùng một mảng để lưu trữ đỉnh đi trước của đỉnh được tìm kiếm 39
- THUẬT TOÁN DFS 40
- THUẬT TOÁN DFS 41
- THUẬT TOÁN DFS 42
- PHÂN TÍCH DFS • Nếu chưa tính thời gian thực thi DFS-VISIT, vòng lặp 1-3 và 5-7 có chi phí là O(V) • Trong một lần thực thi DFS-VISIT(u), vòng lặp 4-7 thực thi trong |Adj[u]| lần • Vì u V |Adj[u]|= O(E), nên tổng chi phí thực thi dòng 4-7 của DFS-VISIT là O(E). • Vậy thời gian chạy của DFS là O(V+E) 43
- CÂY BAO TRÙM NHỎ NHẤT • Cây và cây bao trùm • Cây bao trùm nhỏ nhất 1
- CÂY VÀ CÂY BAO TRÙM • Định nghĩa cây • Các tính chất của cây • Cây bao trùm 2
- ĐINH NGHĨA CÂY • Cây tự do (free tree) là một đồ thị vô hướng liên thông không có chu trình (rừng là tập nhiều cây) u v z t x y 3
- ĐINH NGHĨA CÂY • Một rừng gồm hai cây u v T1 1 z T2 t x y 4
- CÁC TÍNH CHẤT CỦA CÂY • Định lý: Đồ thị T vô hướng n đỉnh là một cây nếu thỏa một trong các điều kiện sau . T không chứa chu trình và có n -1 cạnh . T liên thông và có n -1 cạnh . T liên thông và m ỗ i cạnh của nó đều là cầu . Hai đỉnh bất kỳ được nối với nhau bằng một đường đi duy nhất . T không chứa chu trình nhưng nếu thêm vào một cạnh thì có một chu trình duy nhất 5
- CÂY BAO TRÙM • Cây T= (V, F) được gọi là một cây bao trùm (spanning tree) của đồ thị vô hường liên thông G = (V, E) nếu F E v u v u v u y x y x y x G Cây BT T1 Cây BT T2 6
- CÂY BAO TRÙM • Nhận xét . Một đồ thị có thể có nhiều cây bao trùm . Ví dụ đồ thị Kn (gồm n đỉnh và mỗi đỉnh đều có cạnh nối với n-2 n-1 đỉnh còn lại) có n cây bao trùm . Cây bao trùm của G = (V, E) là đồ thị V đỉnh liên thông ít cạnh nhất 7
- CÂY BAO TRÙM NHỎ NHẤT • Khái niệm • Thuật giải Kruskal • Thuật giải Prim 8
- KHÁI NIỆM • Cho G là một đồ thị vô hướng, liên thông có trọng số và T là một cây bao trùm của G . Trọng số của T, ký hiệu w(T), là tổng trọng số của tất cả các cạnh của nó: w(T) = e T w(e) . Bài toán: Tìm một cây bao trùm T có trọng số nhỏ nhất (minimum spanning tree-MST) của G 9
- THUẬT GIẢI KRUSKAL Ý tưởng • Tại mỗi bước, thuật giải tìm một cạnh có trọng số nhỏ nhất thêm vào tập cạnh của cây bao trùm sao cho không gây ra chu trình • Thuật giải dừng khi số cạnh của cây bằng số đỉnh của đồ thị trừ 1 10
- THUẬT GIẢI KRUSKAL • Đồ thị G có trọng số và các cạnh được sắp a b c 11 5 14 6 7 9 d 10 4 3 e f g (e, f), (d, g), (c, d), (a, e), (a, f), (b, f), (f, g), (b, c), (c, f) 3, 4, 5, 6, 7, 9, 10, 11, 14 11
- THUẬT GIẢI KRUSKAL • Cây bao trùm nhỏ nhất của G a b c 5 6 9 d 10 4 3 e f g (e, f), (d, g), (c, d), (a, e), (b, f), (f, g) 3, 4, 5, 6, 9, 10 12
- THUẬT GIẢI KRUSKAL KRUSKAL(G, w) // G =(V, E) có n đỉnh 1. F // F là số cạnh của cây MST 2. Sort the edges of E into nondecreasing order by weight w 3. while F< n-1 and E // thực hiện cho đến khi F = n-1 hoặc E= 4. do e x w(x) = min{w(y), y E)} e có tr ọng số bé nhất 5. E E-{e} 6. if F {e} not contain cycle then F F{e} 7. if F< n-1 8. then G is not connected 9. else return T =(V, F) 13
- THUẬT GIẢI KRUSKAL • Thời gian sắp xếp là O(E lgE) • Chi phí cho tất cả các lần lặp trong vòng lặp while 3-6 không quá O(V2) • Do đó, tổng chi phí là O(E lg E )+ O(V2) 14
- THUẬT GIẢI PRIM Ý tưởng • Khởi đầu, thuật giải chọn một đỉnh bất kỳ của đồ thị làm đỉnh gốc của cây bao trùm bé nhất • Tại mỗi bước chọn thêm một đỉnh của đồ thị mà trọng số cạnh nối nó với một đỉnh của cây là nhỏ nhất • Thuật giải kết thúc khi tất cả các đỉnh của đồ thị đã được chọn 15
- THUẬT GIẢI PRIM MST-PRIM(G, w, s) 1. for each u V[G] 2. do key[u] // key[u] là trọng số nhỏ nhất của cạnh nối u 3. [u] NIL // với một đỉnh trong cây MSTđang xây dựng 4. key[s] 0 5. Q V[G] 6. while Q 7. do u Extract-min(Q) 8. for each v Adj[u] 9. do if v Q and w(u,v)<key[v] 10. then [v] u 11. key[v] w(u,v) 16
- THUẬT GIẢI PRIM • Đồ thị G có trọng số, lấy a làm đỉnh xuất phát a b c 11 5 9 14 6 7 d 10 4 3 e f g 17
- THUẬT GIẢI PRIM • Key[a]=0, key[u]= với mọi u thuộc V a b c 11 0 5 9 14 6 7 d 10 4 3 e f g 18
- THUẬT GIẢI PRIM • Chọn a là đỉnh đầu tiên của MST(do key[a] =0 nhỏ nhất) a b c 11 0 5 9 14 6 7 d 10 4 6 7 3 e f g Cập nhật key[e]=6, key[f]=7 19
- THUẬT GIẢI PRIM • Chọn e là đỉnh kế, key[e] =6 a b c 11 0 5 9 14 6 7 d 10 4 6 3 3 e f g Cập nhật key[f]=3 20
- THUẬT GIẢI PRIM • Chọn f là đỉnh kế của MST, key[f] =3 a b c 11 0 9 14 5 9 14 6 7 d 10 4 6 3 10 3 e f g Cập nhật key[b]=9, key[c]=14, key[g]=10 21
- THUẬT GIẢI PRIM • Chọn b là đỉnh kế của MST, key[b] =9 a b c 11 0 9 11 5 9 14 6 7 d 10 4 6 3 10 3 e f g Cập nhật key[c]=11 22
- THUẬT GIẢI PRIM • Chọn g là đỉnh kế của MST, key[g] =10 a b c 11 0 9 11 5 9 14 6 7 4 d 10 4 6 3 10 3 e f g Cập nhật key[d]=4 23
- THUẬT GIẢI PRIM • Chọn d là đỉnh kế của MST, key[d] =4 a b c 11 0 9 5 5 9 14 6 7 4 d 10 4 6 3 10 3 e f g Cập nhật key[c]=5 24
- THUẬT GIẢI PRIM • Chọn c là đỉnh kế của MST, key[c] =5, kết thúc thuật giải a b c 11 0 9 5 5 9 14 6 7 4 d 10 4 6 3 10 3 e f g 25
- THUẬT GIẢI PRIM • Chi phí khởi tạo dòng 1-3 là O(V) • Tổng thời gian cho tất cả các lần gọi EXTRACT-MIN trong vòng lặp while là O(V lg V) • Tổng thời gian cho tất cả các lần lặp của vòng lặp for 8- 11 là O(E lg V) • Do đó, tổng chi phí là O(V lg V + E lg V) = O(E lg V) 26