1. Trang chủ
  2. » Luận Văn - Báo Cáo

Algorithm tai lieu ve cac thuat toan co ban

97 0 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

lOMoARcPSD|16336432 Algorithm - Tài liệu thuật toán kiến trúc máy tính (Học viện Cơng nghệ Bưu Viễn thơng) Studocu is not sponsored or endorsed by any college or university Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT Tài liáu thuật toán c¡ bÁn MĀC LĀC Contents Bài Sắp xếp Tìm kiếm – tìm kiếm nhị phân I Các ph°¡ng pháp xếp Sắp xếp bọt Sắp xếp chọn 3.Sắp xếp trộn Sắp xếp nhanh 11 Bài tập áp dāng 14 II Thuật tốn tìm kiếm nhị phân 15 Tìm kiếm tìm kiếm nhị phân 15 T° t°ởng thuật toán 15 Minh họa thuật toán 15 Code tham khÁo 16 Bài tập áp dāng : 17 Bài 2: Các ph°¡ng pháp sinh 18 I Gißi thiáu 18 II C¿u trúc thuật toán sinh 18 III Gißi thiáu bốn ph°¡ng pháp sinh 19 Sinh nhị phân 19 Sinh hoán vị 20 Sinh tổ hÿp 23 Sinh chỉnh hÿp 25 Bài tập āng dāng 26 Bài 3: Đá quy quay lui kỹ thuật nhánh cận 27 I Đá quy 27 Khái niám đá quy 27 GiÁi thuật đá quy 27 Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT Một số ví dā c¡ bÁn đá quy 28 Một số tập áp dāng 30 II Quay lui 30 Gißi thiáu quay lui 30 Mơ hình thuật toán quay lui 31 Các ví dā quay lui 32 III Một số toán đặc tr°ng sử dāng thuật toán Đá quy – Quay lui 35 Bài tốn tìm đ°áng ma trận 35 Bài toán ng°ái du lịch 36 Bài toán xếp hậu 38 Bài toán quân mã tuÁn 41 IV Kỹ thuật nhánh cận 44 Bài toán tối °u bùng nổ tổ hÿp 44 Mơ hình kỹ thuật nhánh cận 44 Một số toán sử dāng kỹ thuật nhánh cận 45 Bài 4: C¿u trúc liáu STACK – QUEUE 50 I STACK – Ngăn xếp 50 II QUEUE – Hàng đÿi 53 III Priority_Queue_Hàng đÿi °u tiên 54 Khái niám: 54 C¿u trúc Heap: 55 Cách sử dāng priority queue th° vián STL: 56 Bài : Quy ho¿ch động 59 I Quy ho¿ch động gì? 59 Đá quy quy ho¿ch động : 59 Quy ho¿ch động ? 59 ¯u nh°¡c điểm : 59 II Hai cách tiếp cận quy ho¿ch động 59 Top-down (Từ xuống): 60 Bottom-up (Từ d°ßi lên) 61 Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT Ph°¡ng pháp giÁi tốn quy ho¿ch động : 62 III Một số tốn, ví dā quy ho¿ch động 62 Bài toán dãy đ¡n điáu dài nh¿t 62 Bài toán xâu chung dài nh¿t 66 Bài toán túi – quy ho¿ch động 69 Bài 6: Đồ thị - Các ph°¡ng pháp duyát đồ thị 72 I Lý thuyết c¡ bÁn đồ thị 72 1.Định nghĩa đồ thị: 72 Phân lo¿i 73 Các khái niám 74 Các cách biểu dißn l°u trữ đồ thị 75 II.Các thuật tốn dut đồ thị khơng trọng số 81 1.Thuật toán duyát đồ thị theo chiều sâu (Depth-First Search - DFS) 81 Thuật toán duyát đồ thị theo chiều rộng (Breadth-First Search - BFS) 90 III Bài tập áp dāng 95 TÀI LIàU THAM KHÀO 96 Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT LàI NĨI ĐÀU Thay mặt cho ng°ßi biên so¿n tập tài liáu này, tơi có đơi lßi mn nói vái b¿n Tr°ác hÁt, ng°ßi so¿n tài liáu KHƠNG phÁi GIÁO S¯, TIÀN S)… Hay có mßt trình đß học vÃn uyên bác Nh°ng tÃt cÁ kiÁn thāc đ°ợc tích cóp từ ngn đánh tin cậy từ aki -1 Tùy theo u cÅu tốn tính chÃt cÿa dãy sß,ta có ph°¡ng pháp xÁp khác Tuy nhiên, s¿ giái thiáu ph°¡ng pháp phổ thơng nhÃt là: xÁp bọt,sắp xÁp chọn, xÁp trßn xÁp nhanh Sắp xếp bọt Ý t°ởng : XuÃt phát từ đÅu dãy, so sánh phÅn tử c¿nh để đ°a phÅn tử nhỏ h¡n lên tr°ác, sau l¿i xét cặp tiÁp theo cho đÁn tiÁn đÅu dãy Nhß vậy, lÅn xử lý thā i s¿ tìm đ°ợc phÅn tử vá trí đÅu dãy i Giải thuật :  B°ác 1: i=1 // LÅn xử lý đÅu tiên  B°ác 2: j=N // Duyát từ ci dãy trá vá trí Trong (j > i) thực hián: NÁu a[j] < a[j-1]: hoán vá a[j] a[j-1] j=j-1;  B°ác 3: i=i+1 // LÅn xử lý tiÁp theo NÁu I > N-1 dừng Ng°ợc l¿i, lặp l¿i b°ác Nhận xét : LÅn duyát đÅu tiên ta cÅn duyát n phÅn tử,lÅn duyát thā cÅn duyát n-1 phÅn tử,…cā duyát nh° cho đÁn lÅn duyát cußi phÅn tử.Vậy sß lÅn duyát cÿa ph°¡ng pháp n + (n-1) + (n-2) + +1 = n(n+1)/2 t°¡ng đ°¡ng vái đß phāc t¿p O(n^2) Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT Ví dụ : Cho mÁng a[5]={ 5, 1, 12, -5, 16 } Chúng ta cÅn xÁp mÁng tăng dÅn theo giá trá Khi đó, thuật tốn Bubble Sort s¿ đ°ợc trình bày nh° sau: Code : Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT Sắp xếp chọn Ý t°ởng : Chọn phÅn tử nhỏ nhÃt n phÅn tử ban đÅu, đ°a phÅn tử vá trí đÅu tiên cÿa dãy hián hành Sau khơng quan tâm đÁn nữa, xem dãy hián hành chß cịn n-1 phÅn tử cÿa dãy ban đÅu, bắt đÅu từ vá trí thā Lặp l¿i q trình cho dãy hián hành đÁn dãy hián hành chß cịn phÅn tử Giải thuật :  B°ác : Đặt i=1,min=1 vái biÁn dùng để tìm vá trí phÅn tử nhỏ nhÃt dãy xét  B°ác : Tìm phÅn tử a[min] nhỏ nhÃt dãy xét từ i đÁn n  B°ác : Hoán vá a[min] a[i]  B°ác : NÁu i -> -> ĐÁn hÁt đßnh kề thực hián quay lui tiÁp tục duyát tiÁp: -> - > 6, đÁn dừng thuật tốn thăm đÿ n đßnh thực hián quay lui về, ch°¡ng trình s¿ tự đßng quay lui không thực hián sâu qua hÁt đßnh D°ái giÁi thích cách ho¿t đßng : - GiÁ sử chọn đßnh 1: Duyát (1) DFS_Dequy (1) - For (1-> 6) tìm đßnh ch°a đ°ợc đánh dÃu đÁn từ Gặp thỏa mãn: Duyát (2) DFS_Dequy (2) - For (1-> 6) tìm đßnh ch°a đ°ợc đánh dÃu đÁn từ Gặp thỏa mãn: Duyát (4) DFS_Dequy (4) - For (1-> 6) tìm đßnh ch°a đ°ợc đánh dÃu đÁn từ Gặp thỏa mãn: Duyát (3) DFS_Dequy (3) - For (1-> 6) tìm đßnh ch°a đ°ợc đánh dÃu đÁn từ Khơng tìm thÃy -> Dừng DFS_Dequy (3) TiÁp tục DFS_Dequy (4) Gặp thỏa mãn: Duyát (5) DFS_Dequy (5) For (1-> 6) tìm đßnh ch°a đ°ợc đánh dÃu đÁn từ Gặp thỏa mãn: Duyát (6) DFS_Dequy (6) For (1-> 6) tìm đßnh ch°a đ°ợc đánh dÃu đÁn từ Khơng tìm thÃy -> Dừng DFS_Dequy (6) TiÁp tục DFS_Dequy (5) Khơng tìm thÃy -> Dừng DFS_Dequy (5) TiÁp tục DFS_Dequy (4) Khơng tìm thÃy -> Dừng DFS_Dequy (4) TiÁp tục DFS_Dequy (2) Khơng tìm thÃy -> Dừng DFS_Dequy (2) Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 84 lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT - TiÁp tục DFS_Dequy (1) Khơng tìm thÃy -> Dừng DFS_Dequy (1)  Hồn thiện Code : b Cài đặt thuật toán c¿u trúc liáu Stack : Nh° biÁt mßt āng dụng cÿa Stack khử đá quy, đßi vái toán duyát đá thá thuật toán DFS, sß đßnh cÿa đá thá rÃt lán ( cỡ 10^6) s¿ có mßt sß vÃn đề tràn bß nhá đá quy để cÁi thián điều sử dụng Stack mßt cách rÃt tßt  Nhập liệu đồ thị : ( Giống phần cài đặt DFS _ Đệ quy ) Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 85 lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT  Cài đặt DFS_Stack : Trên t° t°áng khử đá quy, pop() đßnh ra, nÁu đßnh cịn sâu vào ta phÁi thực hián push l¿i đßnh vào để lÅn pop phía sau đem đßnh r¿ nhánh sang nhánh khác – nh° t° t°áng quay lui  STT 10 11  Kiểm nghiệm thuật tốn cho ví dụ : Tr¿ng thái stack 1, 1, 2, 1, 2, 3, 1, 2, 3, 1, 2, 3, 5, 1, 2, 3, 1, 2, 1, Rỗng  kÁt thúc (pop(4) ) (pop(6) ) (pop(5) ) (pop(3) ) (pop(2) ) (pop(1) ) Các đỉnh đ°ÿc duyát 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, Hoàn thiện Code : Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 86 lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT c Āng dāng cho DFS – Bài tốn tìm thành phÁn liên thông Định nghĩa thành phÁn liên thông: - Đá thá vô h°áng đ°ợc coi liên thông nÁu ln tìm đ°ợc đ°ßng hai đßnh bÃt kỳ cÿa - Trong tr°ßng hợp đá thá G khơng liên thơng, ta phân G thành mßt sß đá thá liên thơng mà chúng đơi mßt khơng có đßnh chung Mỗi đá thá nh° mßt thành phÅn liên thơng cÿa G Nh° vậy, đá thá liên thơng chß sß thành phÅn liên thơng cÿa Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 87 lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT - Đßi vái đá thá vơ h°áng, đ°ßng từ đßnh u đÁn đßnh v gißng nh° đßnh đ°ßng từ đßnh v đÁn đßnh u Chính vậy, nÁu tán t¿i u V cho u có đ°ßng đÁn tÃt cÁ đßnh cịn l¿i cÿa đá thá ta kÁt luận đ°ợc đá thá liên thơng Ví dā : Cho đá thá nh° hình v¿ xác đánh sß thành phÅn liên thơng: 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Dß thÃy ta có thành phÅn liên thơng là: {1, 2, 3, 4, 5, 6}; {7, 8} {9}; Áp dāng DFS tìm thành phÁn liên thơng:  Ý t°ởng: Mßt đá thá liên thông không liên thông NÁu đá thá liên thông sß thành phÅn liên thơng cÿa Điều t°¡ng đ°¡ng vái phép duyát theo thā tự DFS (u) đ°ợc gọi đÁn lÅn Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 88 lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT  Mơ tả thuật tốn: NÁu đá thá khơng liên thơng (sß thành phÅn liên thơng lán h¡n 1) tách chúng thành đá thá liên thơng Điều có ngh*a phép duyát đá thá, sß thành phÅn liên thơng cÿa sß lÅn gọi tái thÿ tục DFS ( ) Để xác đánh sß thành phÅn liên thông cÿa đá thá, sử dụng thêm biÁn solt để ghi nhận đßnh cÿa mßt thành phÅn thơng  Hồn thiện Code : Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 89 lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT Thuật toán duyát đồ thị theo chiều rộng (Breadth-First Search - BFS) Định nghĩa BFS (Breadth-First Search) tên gọi cho thuật tốn tìm kiÁm đá thá dựa theo °u tiên chiều rßng Có ngh*a là, xuÃt phát từ mßt nút, ta bắt đÅu duyát tÃt cÁ nhánh tÅng liền kề nó, rái từ nhánh duyát tiÁp tÅng liền kề tiÁp theo, cā nh° cho tái hÁt vùng liên thông Trên hình ví dụ cÿa mßt đá thá đ°ợc duyát từ nút theo ph°¡ng pháp BFS Cách cài đặt BFS Đặc tr°ng cÿa BFS để phân biát vái thuật tốn tìm kiÁm đá thá khác viác sử dụng cÃu trúc liáu hàng đợi (queue) Nguyên lý ho¿t đßng s¿ là: ban đÅu, nút đÅu tiên cÿa đá thá s¿ đ°ợc truyền vào hàng đợi Từ trá đi, tái mßt nút nút s¿ đ°ợc xt khỏi hàng đợi, đáng thßi chèn vào hàng đợi nút liền kề vái nút mà ch°a đ°ợc duyát qua Do cÃu trúc hàng đợi LIFO – mßt đÅu vào, đÅu ra, nên đßnh láp tr°ác s¿ đ°ợc lÃy đßnh mái duyát tái s¿ đ°ợc cho vào phía sau hàng đợi, đÁm bÁo ln dut đá thá từ láp gÅn vái đßnh xuÃt phát h¡n tr°ác Thuật toán kÁt thúc hàng đợi rỗng Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 90 lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT Bài tốn cụ thể : Cho đá thá vơ h°áng khơng trọng sß nh° hình v¿ Vái điểm xuÃt phát 1, yêu cÅu duyát qua đßnh cho đßnh lÅn thuật toán BFS Áp dụng thuật toán BFS : Thuật tốn tìm kiÁm theo chiều rßng (BFS) bắt đÅu từ mßt đßnh bÃt kì u dut đÁn đßnh v kề đ°ợc mßt tập đßnh, tiÁp tục chọn đßnh tập đßnh vừa lÃy đ°ợc đem đßnh tìm đßnh ch°a xét đ°a vào hàng đợi nÁu chọn đßnh đÅu tiên: Ta có cách dut :  2,3 : đ°ợc {2,3}  : đ°ợc {3,4}  Ø : đ°ợc {4}  5,6 : đ°ợc {5,6}  : đ°ợc {5,6,7} Danh sách đßnh đ°ợc duyát lÅn l°ợt : , , , 4, , 6, Cài đặt thuật toán BFS :   Nhập liáu biểu dißn đá thá : nh° DFS,á s¿ nhập vào cặp c¿nh (u, v) biểu dißn đá thá danh sách kề Cài đặt thuật toán BFS : - ĐÅu tiên khái t¿o hàng đợi chāa mßt đßnh bắt đÅu đánh dÃu đßnh đ°ợc xét, đßnh cịn l¿i ch°a xét - Mỗi b°ác thực hián lÃy mßt đßnh khỏi hàng đợi thực hián duyát đÁn đßnh kề vái đßnh mà ch°a đ°ợc xét, rái thực hián push lÅn l°ợt đßnh vào hàng đợi đáng thßi đánh dÃu xét - Các b°ác lặp l¿i cho đÁn hàng đợi rỗng Code C++ : BFS(1) s¿ cho phép duyát đá thá từ đßnh Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 91 lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT Kiểm nghiệm thuật toán :  B°ác Queue 2,3 3,4 5,6 6,7 Ø Đßnh chọn KÁt thúc Đßnh duyát 2,3 Ø 5,6 Ø Ø Āng dụng BFS vào tốn tìm đ°ờng ngắn đồ thị khơng trọng số: Phát biểu tốn : Cho đ¡n đá thá vơ h°áng khơng trọng sß gám n đßnh, m c¿nh, đßnh s, t thußc tập đßnh Cho m cặp c¿nh, tìm đ°ßng có tổng sß c¿nh qua nhỏ nhÃt từ s  t Nhận xét: + Khi thực hián duyát đá thá theo chiều rßng, đßnh đ°ợc duyát s¿ phân thành láp, đßnh láp có khoÁng cách tái đßnh xuÃt phát + Các đßnh nằm láp lán h¡n khơng thể có cách dut để nằm láp bé h¡n từ láp tr°ác s¿ duyát đ°ợc tÃt cÁ đßnh nằm láp sau  KhoÁng cách đßnh bắt đÅu đßnh bÃt kỳ đá thá sử dụng ph°¡ng pháp duyát BFS đ°ßng có tổng sß c¿nh nhỏ nhÃt Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 92 lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT + Mỗi đßnh đ°ợc cập nhật vào hàng đợi theo đßnh khác láp tr°ác  Ta từ đßnh đích dÅn lÅn vÁt để in đ°ßng ngắn nhÃt từ st cho tr°ác Ý t°ởng: - Thuật toán BFS bắt đÅu từ đßnh s duyát s¿ cho ta đ°ßng nhỏ nhÃt đÁn đßnh t - Sử dụng mÁng truoc[1 n] : truoc[v] l°u đßnh cha cÿa v u duyát đá thá từ u  v để phục vụ cho trình lÅn vÁt Truy vết: Code hoàn chỉnh : Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 93 lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 94 lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT III Bài tập áp dāng http://www.spoj.com/PTIT/problems/BCACM11D/ http://vn.spoj.com/problems/MTWALK/ http://vn.spoj.com/problems/VMUNCH/ http://vn.spoj.com/problems/QBBISHOP/ http://vn.spoj.com/problems/NKGUARD/ http://vn.spoj.com/problems/PBCWATER/ Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 95 lOMoARcPSD|16336432 CLB Lập trình PTIT - ProPTIT TÀI LIàU THAM KHÀO Giải thuật lập trình - thầy Lê Minh Hồng Tài liệu giáo khoa chuyên tin KC-BOOK (Quy hoạch động) Một số vấn đề đáng ý môn tin học DP-SpeedUp - admin Ngô Minh Đức KC-BOOK3 Page Downloaded by Võ Minh Trung (quoc.trung0963@gmail.com) 96

Ngày đăng: 12/07/2023, 22:48

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w