Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 158 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
158
Dung lượng
2,78 MB
Nội dung
HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA CƠNG NGHỆ THÔNG TIN - PT IT BÀI GIẢNG CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NÂNG CAO TRÊN JAVA Biên soạn : TS NGUYỄN DUY PHƯƠNG Hà Nội, tháng 12/2017 Nguyễn Duy Phương i LỜI NÓI ĐẦU Cấu trúc liệu phương pháp biểu diễn đối tượng giới thực thành liệu tổ chức, lưu trữ máy tính để phục vụ q trình xử lý khai thác thông tin cách hiệu Thuật tốn hiểu phương pháp xử lý thơng tin hay liệu biểu diễn cấu trúc liệu cách nhanh Sự kết hợp cấu trúc liệu thuật toán cấu trúc liệu đem lại hiệu cao xây dựng ứng dụng Chính lý này, Cấu trúc liệu giải thuật xem môn học bắt buộc mang tính chất kinh điển ngành Cơng nghệ thông tin Điện tử Viễn thông Tài liệu giảng dạy môn Cấu trúc liệu giải thuật nâng cao Java xây dựng dựa nội dung chương trình khung Học Viện Cơng Nghệ Bưu Chính Viễn Thơng ban hành Tài liệu trình bày thành chương Trong đó, Chương trình bày khái niệm IT định nghĩa cấu trúc liệu giải thuật Chương trình bày kỹ thuật xếp tìm kiếm Chương trình bày số mơ hình thuật tốn kinh điển ứng dụng Công nghệ Thông tin Chương trình bày kiểu liệu tuyến tính (ngăn xếp, PT hàng đợi danh sách liên kết) Chương 5, trình bày cấu trúc liệu rời rạc (cây, đồ thị) Đối với với cấu trúc liệu, tài liệu tập trung trình bày bốn nội dung bản: định nghĩa, biểu diễn, thao tác ứng dụng cấu trúc liệu Ứng với thuật tốn, tài liệu trình bày bốn nội dung bản: biểu diễn, đánh giá, thử nghiệm cài đặt thuật toán Trong phần tài liệu, chúng tơi cố gắng trình bày ngắn gọn trực tiếp vào chất vấn đề, đồng thời cài đặt thuật tốn ngơn ngữ lập trình Java nhằm đạt ba mục tiêu cho người học: làm chủ phương pháp biểu diễn liệu, nâng cao tư phân tích, thiết kế, đánh giá thuật tốn kỹ thuật lập trình thuật tốn Mặc dù cẩn trọng trình biên soạn, nhiên tài liệu khơng tránh khỏi thiếu sót hạn chế Chúng tơi mong góp ý quí báu tất bạn đọc Hà nội, tháng 12 năm 2017 Nguyễn Duy Phương ii MỤC LỤC LỜI NÓI ĐẦU ii CHƯƠNG GIỚI THIỆU CHUNG 1.1 Thuật toán số vấn đề liên quan .6 1.2 Biểu diễn thuật toán 1.3 Độ phức tạp thời gian thuật toán 1.3.1 Khái niệm độ phức tạp thuật toán 1.3.2 Một số qui tắc xác định độ phức tạp thuật toán 10 1.3.3 Một số dạng hàm dùng xác định độ phức tạp thuật toán 11 1.4 Độ phức tạp cấu trúc lệnh 12 1.5 Qui trình giải tốn máy tính 14 BÀI TẬP 15 CHƯƠNG SẮP XẾP VÀ TÌM KIẾM 16 2.1 Giới thiệu vấn đề 16 2.2 Các thuật toán xếp đơn giản 16 2.2.1 Thuật toán Selection-Sort 17 IT 2.2.2 Thuật toán Insertion Sort 17 3.2.3 Thuật toán Bubble Sort 19 2.3 Thuật toán Quick Sort 19 2.4 Thuật toán Merge Sort 21 PT 2.5 Thuật toán Heap Sort 22 2.6 Một số thuật toán tìm kiếm thơng dụng 24 2.6.1 Thuật tốn tìm kiếm tuyến tính (Sequential Serch) 24 2.6.2 Thuật tốn tìm kiếm nhị phân 25 2.6.3 Thuật tốn tìm kiếm nội suy 26 BÀI TẬP 27 CHƯƠNG MỘT SỐ LƯỢC ĐỒ THUẬT TOÁN KINH ĐIỂN 28 3.1 Mơ hình thuật tốn sinh (Generative Algorithm) 28 3.2 Mơ hình thuật tốn đệ qui (Recursion Algorithm) 34 3.3 Mơ hình thuật tốn quay lui (Back-track Algorithm) 36 3.4 Mơ hình thuật tốn tham lam (Greedy Algorithm) 43 3.5 Mơ hình thuật tốn chia trị (Devide and Conquer Algorithm) 52 3.6 Mơ hình thuật toán nhánh cận (Branch and Bound Algorithm) 53 3.7 Mơ hình thuật toán qui hoạch động (Dynamic Programming Algorithm) 54 BÀI TẬP 56 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT 61 4.1 Danh sách liên kết đơn (Single Linked List) 61 4.1.1 Định nghĩa danh sách liên kết đơn 61 4.1.2 Biểu diễn danh sách liên kết đơn 61 Nguyễn Duy Phương iii 4.1.3 Thao tác danh sách liên kết đơn 62 4.2 Danh sách liên kết kép (double linked list) 71 4.2.1 Định nghĩa 71 4.2.2 Biểu diễn 71 4.2.3 Các thao tác danh sách liên kết kép 72 4.2.4 Cài đặt danh sách liên kết kép 75 4.3 Ngăn xếp (Stack) 82 4.3.1 Định nghĩa ngăn xếp 82 4.3.2 Biểu diễn ngăn xếp 82 4.3.3 Các thao tác ngăn xếp 83 4.4 Hàng đợi (Queue) 86 4.4.1 Định nghĩa hàng đợi 86 4.4.2 Biểu diễn hàng đợi 87 4.4.3 Thao tác hàng đợi 87 4.4.4 Cài đặt hàng đợi dựa vào danh sách liên kết: 89 CHƯƠNG CÂY NHỊ PHÂN (BINARY TREE) 94 IT 5.1 Định nghĩa khái niệm 94 5.1.1 Định nghĩa 94 5.1.2 Một số tính chất nhị phân 95 5.1.3 Các loại nhị phân 96 PT 5.2 Biểu diễn nhị phân 99 5.2.1 Biểu diễn nhị phân mảng 99 5.2.2 Biểu diễn nhị phân danh sách liên kết 99 5.3 Các thao tác nhị phân 100 5.3.1 Định nghĩa khai báo nhị phân 100 5.3.2 Các thao tác thêm node vào nhị phân 101 5.3.3 Chương trình cài đặt thao tác nhị phân 103 5.4 Ứng dụng nhị phân 108 5.5 Cây nhị phân tìm kiếm (Binary Search Tree) 108 5.5.1 Định nghĩa nhị phân tìm kiếm 108 5.5.2 Biểu diễn nhị phân tìm kiếm 109 5.5.3 Các thao tác nhị phân tìm kiếm 109 5.5.4 Chương trình cài đặt nhị phân tìm kiếm 111 5.6 Cây nhị phân tìm kiếm cân 118 5.6.1 Định nghĩa nhị phân tìm kiếm cân 118 5.6.2 Biểu diễn nhị phân tìm kiếm cân 119 5.6.3 Các thao tác nhị phân tìm kiếm cân 119 5.6.4 Chương trình cài đặt nhị phân tìm kiếm cân 124 BÀI TẬP 132 Nguyễn Duy Phương iv CHƯƠNG ĐỒ THỊ (GRAPH) 133 6.1 Định nghĩa khái niệm 133 6.1.1 Một số thuật ngữ đồ thị 133 6.1.2 Một số thuật ngữ đồ thị vô hướng 134 6.1.3 Một số thuật ngữ đồ thị có hướng 134 6.1.4 Một số loại đồ thị đặc biệt 135 6.2 Biểu diễn đồ thị 136 6.2.1 Biểu diễn ma trận kề 136 6.2.2 Biểu diễn đồ thị danh sách cạnh 137 6.2.3 Biểu diễn đồ thị danh sách kề 138 6.2.4 Biểu diễn đồ thị danh sách kề dựa vào danh sách liên kết 138 6.3 Các thuật tốn tìm kiếm đồ thị 139 6.3.1 Thuật tốn tìm kiếm theo chiều sâu (Depth First Search) 139 6.3.2 Thuật tốn tìm kiếm theo chiều rộng (Breadth First Search) 141 6.3.3 Ứng dụng thuật toán DFS BFS 142 6.4 Đồ thị Euler 142 IT 6.4.1 Thuật tốn tìm chu trình Euler đồ thị vơ hướng 144 6.4.2 Thuật tốn tìm chu trình Euler đồ thị có hướng 145 6.4.3 Thuật tốn tìm đường Euler đồ thị vô hướng 146 6.4.4 Thuật toán tìm đường Euler đồ thị có hướng 146 PT 6.5 Bài toán xây dựng khung đồ thị 147 6.5.1 Xây dựng khung đồ thị thuật toán DFS 148 6.5.2 Xây dựng khung đồ thị thuật toán BFS 149 6.5.3 Xây dựng khung nhỏ đồ thị thuật toán Kruskal 150 6.5.4 Xây dựng khung nhỏ đồ thị thuật toán PRIM 151 6.6 Bài tốn tìm đường ngắn 152 6.6.1 Thuật toán Dijkstra 153 6.6.2 Thuật toán Bellman-Ford 154 6.6.3 Thuật toán Floyd-Warshall 156 BÀI TẬP 157 TÀI LIỆU THAM KHẢO 158 Nguyễn Duy Phương v Chương 1: Giới thiệu chung CHƯƠNG GIỚI THIỆU CHUNG Mục tiêu chương giải thích rõ tầm quan trọng việc phân tích, thiết kế thuật toán với mối liên hệ ảnh hưởng qua lại liệu thuật toán Để thực điều này, khái niệm định nghĩa liệu, thuật tốn sau mở rộng sang vấn đề quan trọng độ phức tạp thuật tốn, độ phức tạp chương trình Cuối cùng, xem xét đến qui trình giải vấn đề khoa học máy tính thuật tốn PT IT 1.1 Thuật toán số vấn đề liên quan Thuật toán hiểu phương pháp xử lý đối tượng liệu biểu diễn để đưa kết mong muốn Ta tổng qt hóa khái niệm thuật tốn sau Định nghĩa thuật toán (Algorithm): Thuật toán F giải toán P dãy thao tác sơ cấp F1, F2, ,FN tập kiện đầu vào (Input) để đưa kết (Output) F1F2 FN( Input ) Ouput • F = F1F2 FN gọi thuật tốn giải tốn P Trong đó, Fi phép tốn sơ cấp • Input gọi tập kiện đầu vào hay tập thông tin đầu vào • Output kết nhận sau thực thuật tốn F tập Input Ví dụ Thuật tốn tìm USCLN(a, b) int USCLN ( int a, int b) {//đầu vào số nguyên a, b while (b!=0 ) {//lặp b khác x = a % b; //lấy x a mode b a = b; //đặt a b b =x; //đặt b x } return(a);//kết thực thi thuật toán } Những đặc trưng thuật tốn: • Tính đơn định Ở bước thuật toán, thao tác sơ cấp phải rõ ràng, không tạo lộn xộn, nhập nhằng, đa nghĩa Thực bước thuật toán tập liệu đầu vào cho kết • Tính dừng Thuật tốn khơng rơi vào q trình vơ hạn Thuật tốn phải dừng lại cho kết sau số hữu hạn bước Nguyễn Duy Phương Chương 1: Giới thiệu chung Tính Sau thực tất bước thuật toán theo qui trình định, ta phải nhận kết mong muốn với liệu đầu vào Kết kiểm chứng yêu cầu tốn • Tính phổ dụng Thuật tốn phải dễ sửa đổi để thích ứng với toán lớp toán loại làm việc nhiều loại liệu khác • Tính khả thi Thuật tốn phải dễ hiểu, dễ cài đặt, thực máy tính với thời gian cho phép Đối với thuật toán ta cần quan tâm đến vấn đề sau: Biểu diễn thuật tốn: xác định ngơn ngữ để biểu diễn thuật toán Đánh giá độ phức tạp thuật toán: ước lượng thời gian không gian nhớ thực thuật toán Kiểm nghiệm thuật toán: kiểm nghiệm thuật toán với liệu thực khác Cài đặt thuật toán: cài đặt thuật toán ngơn ngữ lập trình cụ thể IT • PT 1.2 Biểu diễn thuật tốn Có ba ngơn ngữ để biểu diễn thuật tốn: ngơn ngữ tự nhiên, ngơn ngữ máy tính ngơn ngữ hình thức • Ngơn ngữ tự nhiên phương tiện giao tiếp người với người Ta sử dụng ngơn ngữ vào việc biểu diễn thuật tốn • Ngơn ngữ máy tính phương tiện giao tiếp máy tính máy tính Trong trường hợp ta sử dụng ngơn ngữ lập trình để biểu diễn thuật tốn (C, Pascal, Java…) • Ngơn ngữ hình thức Ngơn ngữ hình thức phương tiện giao tiếp trung gian người hệ thống máy tính Ví dụ ngơn ngữ sơ đồ khối, ngơn ngữ tựa tự nhiên, ngôn ngữ đặc tả Đặc điểm chung loại ngơn ngữ hình thức việc sử dụng gần gũi với ngơn ngữ tự nhiên, gần gũi với ngơn ngữ máy tính Tuy nhiên, ngơn ngữ hình thức lại khơng phụ thuộc vào ngôn ngữ tự nhiên, không phụ thuộc vào ngôn ngữ máy tính Chính lý này, ngơn ngữ hình thức sử dụng phổ biến biểu diễn thuật tốn Ví dụ minh họa cho ngơn ngữ biểu diễn thuật tốn Nguyễn Duy Phương Chương 1: Giới thiệu chung //Ví dụ 1.1 Biểu diễn thuật tốn ngơn ngữ tự nhiên Đầu vào (Input) Hai số tự nhiên a, b Đầu (Output) Số nguyên u lớn để a b chia hết cho u Thuật toán (Euclide Algorithm): Bước Đưa vào hai số tự nhiên a b Bước Nếu b chuyển đến bước 3, b=0 thực bước Bước Đặt r = a mod b; a = b; b = r ; Quay quay trở lại bước Bước (Output) Kết luận u=a số ngun cần tìm PT IT //Ví dụ 1.2 Biểu diễn thuật tốn ngơn ngữ máy tính (Java) int USCLN( int a, int b) { while ( b != ) {//lặp b khác r = a % b; //đặt r phần dư a/b a = b; // đặt a b b = r; //đặt b r } return(a);//trả lại giá trị a } //Ví dụ 1.3 Biểu diễn thuật tốn ngơn ngữ hình thức Thuật tốn Euclide: Đầu vào (Input): aN, aN Đầu (Output): s = max { u N : a mod u =0 and b mod u =0} Format : s = Euclide (a, b) Actions : while (b ) //lặp b khác r = a mod b; //đặt r a mod b a = b; //đổi giá trị a thành b b = r;// đổi giá trị b thành r endwhile;//kết thúc cấu trúc lặp while return(a);//giá trị trả hàm EndActions Một số lưu ý biểu diễn thuật toán ngơn ngữ hình thức: Khi biểu diễn ngơn ngữ hình thức ta phép sử dụng ngơn ngữ tự nhiên ngơn ngữ máy tính thơng dụng Mỗi bước thực thuật toán Nguyễn Duy Phương Chương 1: Giới thiệu chung không cần mô tả chi tiết mà cần mô tả cách hình thức miễn đầy đủ thơng tin để chuyển đổi thành ngơn ngữ lập trình Đối với thuật tốn phức tạp nặng nề tính tốn, công thức cần mô tả cách tường minh, có ghi rõ ràng Đối với thuật tốn kinh điển ta cần phải thuộc Khơng bắt buộc phải chứng minh lại độ phức tạp thuật toán kinh điển 1.3 Độ phức tạp thời gian thuật tốn Một tốn thực nhiều thuật toán khác Lựa chọn giải thuật nhanh để giải toán nhu cầu thực tế Vì ta cần phải có ước lượng cụ toán học để xác định mức độ nhanh chậm giải thuật PT IT 1.3.1 Khái niệm độ phức tạp thuật toán Thời gian thực giải thuật chương trình máy tính phụ thuộc vào yếu tố: • Kích thước liệu đầu vào: giải thuật hay chương trình máy tính thực tập liệu có kích thước lớn hiển nhiên nhiểu thời gian thuật tốn chương trình thực tập liệu đầu vào có kích thước nhỏ • Phần cứng hệ thống máy tính: hệ thống máy tính có tốc độ cao thực nhanh hệ thống máy tính có tốc độ thấp Tuy nhiên, ta quan niệm thời gian thực thuật toán số phép toán sơ cấp thực thuật tốn phần cứng máy tính khơng cịn yếu tố ảnh hưởng đến trình xác định thời gian thực thuật toán Với quan niệm này, độ phức tạp thời gian thực thuật tốn cịn phụ thuộc vào độ dài liệu đầu vào Gọi độ dài liệu đầu vào T(n) Khi đó, số lượng phép toán sơ cấp để giải toán P thực theo thuật toán F=F1F2 Fn độ dài liệu T(n) F(T(n)) Để xác định số lượng phép toán sơ cấp Fi (i=1, 2, , n) thực thuật toán F ta cần phải giải toán đếm để xác định F(T(n)) Đây toán vơ khó khơng phải lúc giải [] Để đơn giản điều này, người ta thường tìm đến phương pháp xấp xỉ để tính tốn độ phức tạp thời gian thuật toán Điều có nghĩa, ta khơng thể xây dựng cơng thức đếm F(T(n)), ta lại có khẳng định chắn F(T(n)) không vượt phiếm hàm biết trước G(n) ta nói F(T(n)) thực nhanh G(n) Tổng quát, cho hai hàm f(x), g(x) xác định tập số nguyên dương tập số thực Hàm f(x) gọi O(g(x)) tồn số C>0 n0 cho: |f(x)| ≤C.|g(x)| với x≥n0 Nguyễn Duy Phương Chương 1: Giới thiệu chung Điều có nghĩa với giá trị x ≥n0 hàm f(x) bị chặn số C nhân với g(x) Nếu f(x) thời gian thực thuật tốn ta nói giải thuật có cấp g(x) hay độ phức tạp thuật toán f(x) O(g(x)) Ghi Các số C, n0 thỏa mãn điều kiện không Nếu có đồng thời f(x) O(g(x)) h(x) thỏa mãn g(x) < h(x) với x>n0 ta có f(x) O(h(n)) Ví dụ 1.4 Cho 𝑓 (𝑥) = 𝑎𝑛 𝑥 𝑛 + 𝑎𝑛−1 𝑥 𝑛−1 + ⋯ + 𝑎1 𝑥 + 𝑎0 ; đó, số thực (i =0,1, 2, ,n) Khi f(x) = O(xn) Chứng minh Thực vậy, với x>1 ta có: |𝑓 (𝑥) = |𝑎𝑛 𝑥 𝑛 + 𝑎𝑛−1 𝑥 𝑛−1 + ⋯ + 𝑎1 𝑥 + 𝑎0 | ≤ |𝑎𝑛 |𝑥 𝑛 + |𝑎𝑛−1 |𝑥 𝑛−1 + ⋯ + |𝑎1 |𝑥 + |𝑎0 | ≤ |𝑎𝑛 |𝑥 𝑛 + |𝑎𝑛−1 |𝑥 𝑛 + ⋯ + |𝑎1 |𝑥 𝑛 + |𝑎0 |𝑥 𝑛 ≤ 𝑥 𝑛 (|𝑎𝑛 | + |𝑎𝑛−1 | + ⋯ + |𝑎1| + |𝑎0| ) IT ≤ 𝐶 𝑥 𝑛 = 𝑂(𝑥 𝑛 ) Trong đó, 𝐶 = (|𝑎𝑛 | + |𝑎𝑛−1 | + ⋯ + |𝑎1| + |𝑎0| ) PT 1.3.2 Một số qui tắc xác định độ phức tạp thuật toán Như đề cập trên, chất việc xác định độ phức tạp thuật toán giải toán đếm số lượng phép toán sơ cấp thực thuật toán Do vậy, tất phương pháp giải tốn đếm thơng thường áp dụng xác định độ phức tạp thuật toán Hai nguyên lý để giải toán đếm nguyên lý cộng nguyên lý nhân mở rộng ước lượng độ phức tạp thuật toán Nguyên tắc tổng: Nếu f1(x) có độ phức tạp O(g1(x)) f2(x) có độ phức tạp O(g2(x)) độ phức tạp (f1(x) + f2(x) O( Max(g1(x), g2(x)) Chứng minh Vì f1(x) có độ phức tạp O(g1(x) nên tồn số C1 k1 cho |f1(x)||g1(x)| với x k1 Vì f2(x) có độ phức tạp O(g2(x)) nên tồn số C2 k2 cho |f2(x)||g2(x)| với x k2 Ta lại có : |f1(x)+ f2(x)| |f1(x)| + |f2(x)| C1|g1(x)| + C2|g2(x)| C|g(x)| với x >k; Trong đó, C = C1 + C2; g(x) = max( g1(x), g2(x)); k = max (k1, k2) Tổng quát Nếu độ phức tạp f1(x), f2(x), , fm(x) O(g1(x)), O(g2(x)), , O(gn(x)) độ phức tạp f1(x) + f2(x) + +fm(x) O(max(g1(x), g2(x), ,gm(x)) Nguyễn Duy Phương 10 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT 6.4.1 Thuật tốn tìm chu trình Euler đồ thị vô hướng Để xác định đồ thị vơ hướng G = có phải đồ thị Euler hay khơng ta cần dựa vào tính chất ma trận kề, danh sách cạnh, danh sách kề biểu diễn đồ thị Thuật tốn thể Hình 6.9 Thuật tốn tìm chu trình Euler đồ thị vơ hướng liên thơng thể Hình 6.10 a) Biểu diễn thuật toán IT Thuật toán Check_Euler(G=): begin for each uV //duyệt tập đỉnh V if ( deg(u) mode ) //nếu bậc đỉnh lẻ return false; //trả lại giá trị false endif; endfor; return true;//nếu tất đỉnh có bậc chẵn end Hình 6.9 Thuật tốn kiểm tra đồ thị vơ hướng có Euler? PT Thuật toán Euler-Cycle(u): Bước (Khởi tạo) : stack = ; //khởi tạo stack bắt đầu CE = ; //khởi tạo mảng CE bắt đầu Push (stack, u) ; //đưa đỉnh u vào ngăn xếp Bước (Lặp ): while (stack ) { //lặp stack rỗng s = get(stack); //lấy s đỉnh đầu ngăn xếp if ( Ke(s) ) then { //nếu danh sách Ke(s) chưa rỗng t =< Đỉnh Ke(s)>; Push(stack, t)’ //đưa t vào stack E = E \ (s,t); // loại bỏ cạnh (s,t) } else { //trường hợp Ke(s)= s = Pop(stack);// đưa s khỏi ngăn xếp s CE; //đưa s sang CE } } Bước (Trả lại kết quả) : ; NGUYỄN DUY PHƯƠNG 144 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT Hình 6.10 Thuật tốn tìm chu trình Euler đồ thị b) Độ phức tạp thuật toán: Bạn đọc tự tìm hiểu chứng minh độ phức tạp thuật toán tài liệu tham khảo liên quan c) Kiểm nghiệm thuật tốn: Bạn đọc tự tìm hiểu phương pháp kiểm nghiệm thuật toán tài liệu tham khảo liên quan IT 6.4.2 Thuật tốn tìm chu trình Euler đồ thị có hướng Tìm chu trình Euler đồ thị vơ hướng đồ thị có hướng khác biệt việc kiểm tra đồ thị có hướng Euler hay khơng? Để kiểm tra đồ thị có hướng G= Euler ta cần kiểm duyệt bán bậc bán bậc vào đỉnh Nếu tất đỉnh có bán đỉnh bậc bán đỉnh bậc vào ta kết luận đồ thị Euler Nếu tồn đỉnh có bán bậc khác bán bậc vào ta kết luận đồ thị khơng Euler Thuật tốn kiểm tra đồ thị có hướng G= đồ thị Euler mơ tả Hình 6.11 Thuật tốn tìm chu trình Euler đồ thị có hướng bắt đầu đỉnh u giữ nguyên Hình 6.10 a) Biểu diễn thuật toán PT Thuật toán Check_Euler(G=): begin for each uV //duyệt tập đỉnh V if ( deg+(u) !=deg-(u)) //nếu bán bậc khác bán bậc vào u return false; //trả lại giá trị false endif; endfor; return true;//nếu tất đỉnh có bậc chẵn end Hình 6.11 Thuật tốn kiểm tra đồ thị vơ hướng có Euler? b) Độ phức tạp thuật tốn: Bạn đọc tự tìm hiểu chứng minh độ phức tạp thuật toán tài liệu tham khảo liên quan c) Kiểm nghiệm thuật toán: Bạn đọc tự tìm hiểu phương pháp kiểm nghiệm thuật toán tài liệu tham khảo liên quan NGUYỄN DUY PHƯƠNG 145 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT 6.4.3 Thuật tốn tìm đường Euler đồ thị vơ hướng Tìm đường Euler giống tìm chu trình Euler đồ thị vô hướng Điểm khác biệt hai thuật tốn đỉnh xuất phát để tìm đường hay chu trình Euler Đối với đồ thị Euler ta xây dựng chu trình Euler đỉnh thuộc tập đỉnh Đối với đồ thị nửa Euler không Euler, đỉnh để xây dựng đường Euler hai đỉnh có bậc lẻ Thuật tốn kiểm tra đồ thị vô hướng liên thông nửa Euler không Euler thể Hình 6.12 a) Biểu diễn thuật toán PT IT Thuật toán Check_Semi_Euler(G=): Begin int so_dinh_le=0; for each uV //duyệt tập đỉnh V if ( deg (u) %2!=0) //bậc đỉnh u lẻ so_dinh_le = so_dinh_le +1; //tăng số đỉnh bậc lẻ endif; endfor; if (so_dinh_le==2) //nếu số đỉnh bậc lẻ return true;//kết luận đồ thị nửa euler endif; return false;//kết luận đồ thị không nửa Euler end Hình 6.12 Thuật tốn kiểm tra đồ thị vơ hướng liên thông nửa Euler b) Độ phức tạp thuật tốn Bạn đọc tự tìm hiểu chứng minh độ phức tạp thuật toán tài liệu tham khảo liên quan c) Kiểm nghiệm thuật toán Bạn đọc tự tìm hiểu kiểm nghiệm thuật tốn tài liệu tham khảo liên quan 6.4.4 Thuật tốn tìm đường Euler đồ thị có hướng Tìm đường Euler giống tìm chu trình Euler đồ thị có hướng Điểm khác biệt hai thuật toán đỉnh xuất phát để tìm đường hay chu trình Euler Đối với đồ thị Euler ta xây dựng chu trình Euler đỉnh thuộc tập đỉnh Đối với đồ thị nửa Euler không Euler, đỉnh để xây dựng đường Euler m đỉnh u có deg+(u)-deg-(u) =1 Thuật tốn kiểm tra đồ thị có hướng liên thơng yếu nửa Euler khơng Euler thể Hình 6.13 NGUYỄN DUY PHƯƠNG 146 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT a) Biểu diễn thuật toán PT IT Thuật toán Check_Semi_Euler(G=): Begin int s, t, dem1 = 0, dem2 = 0; for each uV //duyệt tập đỉnh V if ( deg+(u)- deg-(u)==1){ //tìm hiệu bán bậc đỉnh u dem1++; s =u; //ghi nhận đỉnh u có deg+(u)- deg-(u)==1 endif; else if (deg-(u)- deg+(u)==1){ dem2++; t =u; //ghi nhận đỉnh u có deg-(u)- deg+(u)==1 endesle; endfor; if (dem1==1 && dem2==1) //nếu điều xảy return true;//kết luận đồ thị nửa euler endif; return false;//kết luận đồ thị không nửa Euler end Hình 6.13 Thuật tốn kiểm tra đồ thị có hướng nửa Euler b) Độ phức tạp thuật tốn Bạn đọc tự tìm hiểu chứng minh độ phức tạp thuật toán tài liệu tham khảo liên quan c) Kiểm nghiệm thuật toán Bạn đọc tự tìm hiểu kiểm nghiệm thuật tốn tài liệu tham khảo liên quan 6.5 Bài toán xây dựng khung đồ thị Trong mục ta đề cập đến loại đồ thị đơn giản Cây ứng dụng rộng rãi nhiều lĩnh vực khác tin học tổ chức thư mục, lưu trữ liệu, biểu diễn tính toán, biểu diễn định tổ chức truyền tin Ta tiếp cận lý thuyết đồ thị Định nghĩa Ta gọi đồ thị vơ hướng liên thơng khơng có chu trình Đồ thị khơng liên thơng gọi rừng Như vậy, rừng đồ thị mà thành phần liên thơng NGUYỄN DUY PHƯƠNG 147 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT IT Định lý Giả sử T= đồ thị vơ hướng n đỉnh Khi khẳng định sau tương đương a) T b) T khơng có chu trình có n-1 cạnh c) T liên thơng có n-1 cạnh d) T liên thơng cạnh cầu e) Giữa hai đỉnh T nối với đường đơn f) T khơng chứa chu trình thêm vào cạnh ta thu chu trình Định nghĩa Cho G = đồ thị vô hướng liên thông Ta gọi đồ thị H= khung G H TE Tiếp cận lý thuyết đồ thị, người ta qua tâm đến hai toán cây: Bài toán Cho đồ thị vô hướng G = Hãy xây dựng khung đồ thị bắt đầu đỉnh uV Bài toán Cho đồ thị vơ hướng G = có trọng số Hãy xây dựng khung có độ dài nhỏ Bài toán giải thuật tốn tìm kiếm bàn: tìm kiếm theo chiều rộng (BFS) thuật tốn tìm kiếm theo chiều sâu (DFS) Bài toán giải thuật toán Kruskal PRIM Dưới nội dung thuật toán PT 6.5.1 Xây dựng khung đồ thị thuật tốn DFS Khi ta thực thủ tục tìm kiếm theo chiều sâu bắt đầu đỉnh uV, ta nhận tập đỉnh vV có thành phần liên thơng với u Nếu DFS(u) = V ta kết luận đồ thị liên thông phép duyệt DFS(u) qua n-1 cạnh Nếu Nếu DFS(u) V ta kết luận đồ thị khơng liên thơng Chính vậy, ta sử dụng phép duyệt DFS(u) để xây dựng khung đồ thị Trong bước thuật toán DFS, xuất phát đỉnh u ta thăm đỉnh v ta kết nạp cạnh (u,v) vào tập cạnh khung Các bước tiến hành đỉnh v kết thúc thuật toán DFS Thuật toán xây dựng dựa vào ngăn xếp mô tả chi tiết Hình 6.14 NGUYỄN DUY PHƯƠNG 148 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT a) Biểu diễn thuật toán PT IT Thuật toán Tree-DFS(u): Begin Bước (Khởi tạo): T = ; //tập cạnh khung ban đầu stack = ; //thiết lập stack rỗng; Push(stack, u); //đưa u vào stack; chuaxet[u] = False;//bật trạng thái xét đỉnh u Bước (Lặp): while (stack ) { //lặp stack rỗng s = Pop(stack); //lấy s khỏi stack for each tKe(s) { //lặp danh sách Ke(s) if (chuaxet[t] ) then { //nếu đỉnh t chuaxet Push(stack, s);// đưa s vào stack trước Push(stack, s);// đưa t vào stack sau T = T(s,t); //kết nạp (s,t) vào khung chuaxet[t] = False; //ghi nhận t xét break ;//chỉ lấy đỉnh endif ; endfor ; endwwhile ; Bước (Trả lại kết quả) : if (| T | < n-1 ) ; else ; end Hình 6.14 Xây dựng khung đồ thị thuật toán DFS b) Độ phức tạp thuật toán Độ phức tạp thuật toán Tree-DFS(u) độ phức tạp thuật toán DFS(u) c) Kiểm nghiệm thuật tốn Bạn đọc tự tìm hiểu kiểm nghiệm thuật toán tài liệu tham khảo liên quan 6.5.2 Xây dựng khung đồ thị thuật tốn BFS Để tìm khung đồ thị vơ hướng liên thơng ta sử dụng kỹ thuật tìm kiếm theo chiều rộng Giả sử ta cần xây dựng bao trùm xuất phát đỉnh u Trong hai trường hợp, ta đến đỉnh v tức (chuaxet[v] = False) từ đỉnh u cạnh (u,v) kết nạp vào khung a) Biểu diễn thuật toán NGUYỄN DUY PHƯƠNG 149 CHƯƠNG NGĂN XẾP, HÀNG ĐỢI, DANH SÁCH LIÊN KẾT PT IT Thuật toán Tree-BFS(u): Begin Bước (Khởi tạo): T = ; //tập cạnh khung ban đầu Queue = ; //thiết lập hàng đợi ban đầu; Push(Queue, u); //đưa u vào hàng đợi; chuaxet[u] = False;//bật trạng thái xét đỉnh u Bước (Lặp): while (Queue ) { //lặp hàng đợi rỗng s = Pop(Queue); //lấy s khỏi hàng đợi for each tKe(s) { //lặp danh sách Ke(s) if (chuaxet[t] ) then { //nếu đỉnh t chuaxet Push(Queue, t);// đưa t vào hàng đợi T = T(s,t); //kết nạp (s,t) vào khung chuaxet[t] = False; //ghi nhận t xét endif ; endfor ; endwwhile ; Bước (Trả lại kết quả) : if (| T | < n-1 ) ; else