Bài giảng Phân tích thiết kế và đánh giá thuật toán (Phần 1)

pdf 39 trang phuongnguyen 2851
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phân tích thiết kế và đánh giá thuật toán (Phần 1)", để 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:

  • pdfbai_giang_phan_tich_thiet_ke_va_danh_gia_thuat_toan.pdf

Nội dung text: Bài giảng Phân tích thiết kế và đánh giá thuật toán (Phần 1)

  1. BỘ GIAO THÔNG VẬN TẢI TRƯỜNG ĐẠI HỌC HÀNG HẢI N H HỌC T NH H C NG NGHỆ TH NG TIN ÀI GIẢNG PHÂN T CH THIẾT Ế VÀ Đ NH GI THUẬT T N TÊN HỌC PHẦN : Phân tích thiết kế và đánh giá thuật toán MÃ HỌC PHẦN : 17208 TRÌNH ĐỘ ĐÀO TẠO : ĐẠI HỌC CH NH QU DÙNG CHO SV NGÀNH : C NG NGHỆ TH NG TIN HẢI PHÒNG - 2010
  2. Tên học phần P Loại học phần 2 ộ môn phụ trách giảng dạy K a ọ M y hoa phụ trách CNTT ã học phần 17208 Tổng số TC: 3 TS Lý y T ự /Xem a Tự ọ B p lớ Đồ mô ọ 60 45 15 0 0 0 Điều kiện tiên quyết S ê p ả ọ x ọ p ầ sa mớ ượ ă ý ọ p ầ y: K l p C l T ục tiêu của học phần - C p ả l . - C p lượ x y ự - Rè l y ư y a ọ . Nội dung chủ yếu Gồm 4 p ầ : - C ả . - C ả sắp x p m m l . - C lượ : lượ a lượ ay l lượ ộ lượ am lam - K ả ộ p p . Nội dung chi tiết của học phần PHÂN PHỐI SỐ TIẾT TÊN CHƯƠNG ỤC TS LT TH/Xemina BT KT Ch ng I Các khái niệm c ản 5 4 0 1 0 1.1. G ớ 1 1.1.1 K m . 1.1. . C p ư p p 1.1.3. C ụ s ồ ố 1. . Độ p p 2 1 1. .1. C ý m ộ p p 1. . . C lớp 0,5 1.3. Mố a a l ả 0,5 1.4. Mộ số ụ Ch ng II S p ếp và t m kiếm 15 7 5 2 1 .1. B sắp x p 0,5 .1.1. Sắp x p .1. . Sắp x p .1.3. Đ sắp x p . . C sắp x p ả 3 2,5 1 . .1. Sắp x p ọ Sele S . . . Sắp x p ự p x a e S . .3. Sắp x p è I se S . .4. Sắp x p ọ B le S . . . S s sắp x p ả i
  3. PHÂN PHỐI SỐ TIẾT TÊN CHƯƠNG ỤC TS LT TH/Xemina BT KT .3. Sắp x p ố 2,5 1,5 1 .3.1. C Heap .3. . T x y ự Heap .3.3. T sắp x p ố .4. T m m y 1 1 .4.1. B m m .4. . T m m y Ch ng III Đệ qui và chiến c v t cạn 11 6 3 2 0 3.1. K m quy 1 1 3.1.1. G ả y ủ ụ y 3.1. . T ả y 3.1.3. H lự ủa y. 3.1.4. Đ y y p ọ . 3. . C lượ B e e 0,5 1 3.3. C lượ ay l a a 2 3.3.1. Ve m 1 3.3. . T ủ ụ 1 3.3.3. C 1 3.3.4. Đ p 0,5 3.3. . Mộ số a a 1 1 Ch ng IV Chiến c chia đ tr 11 6 3 1 1 4.1. C s ủa lượ a 0,5 4. . T sắp x p ộ 1,5 1 4. .1. T ộ a R 4. . . Sắp x p ộ 4.3. Sắp x p a s 1,5 1 4.3.1. C lượ p 4.3.2. Quick sort 4.4. T m m p 1 1 4. . T số yê 1 4. .1. T ay 4. . . T a 4. . Mộ số 0,5 1 Ch ng V Qui hoạch động 12 6 3 2 1 .1. C lượ ộ 1,5 5.1.1. C p ụ .1. . C ướ ộ .1.3. C ộ . . B y số a 1 0,5 . .1. T . . . T ộ .3. B y 1 1 1 .4. B ma 1,5 1 . . Mộ số ụ 1 0,5 1 Ch ng VI Chiến c tham am 6 4 1 1 0 .1. N yê ắ am lam 0,5 . . B 1 .3. B sắp l sự 2 1 .3.1. T ii
  4. PHÂN PHỐI SỐ TIẾT TÊN CHƯƠNG ỤC TS LT TH/Xemina BT KT .3. . T e lượ am lam .4. S s lượ am lam ớ lượ 0,5 1 ộ Nhiệm vụ của sinh viên T am ự y ủa ê ự ọ ự l m p do giáo viên giao, am ự m a ỳ ố ỳ. Tài iệu học tập - N y H Đ Giáo trình một số vấn đề về thuật toán NXB G ụ 2003 - Đ M Tư . Cấu trúc dữ liệu và thuật toán. NXB Đ ọ ố a H ộ . 00 . - N y ố Lượ H Đ Hả . Cấu trúc dữ liệu + giải thuật = chương trình. NXB G ụ . 199 - R a Neap l a Kumarss Naimipour, Foundations of Algorithms Using C++ Pseudocode, Third Edition, Jones and Bartlett Publishers, 2004. - Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, Introduction to Algorithms, Second Edition, MIT Press, 2001. H nh thức và tiêu chuẩn đánh giá sinh viên - H ố ỳ : T p. - S ê p ả ảm ả e y ủa N ư ủa Bộ Thang đi m Thang đi m chữ , , C, D, F Đi m đánh giá học phần Z = 0,3X + 0,7 B ả y l l chính thức và thống nhất ủa Bộ mô K a ọ M y K a Cô T ô ượ ù ả y cho sinh viên. Ngày phê duyệt / /20 Tr ởng ộ môn ThS Nguyễn Hữu Tuân (ký và ghi rõ họ tên) iii
  5. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật ỤC LỤC LỜI NÓI ĐẦU 1 CH NG I: C C KH I NI M C BẢN 2 1. T ả - Algorithm 2 1.1. Đ a 2 1. . Đ ư ủa 2 . B 2 .1. Mô ả ướ ự 2 . . S ụ s ồ lư ồ ả l a 3 3. Độ p p – Algorithm Complexity 4 3.1. C ê 4 3. . Đ a ự 4 3.3. C a ộ p p 5 3.4. C lớp 7 4. C l – Data structure 9 . C lượ . 9 .1. D y ộ x a s e sea 9 . . Đ ay l – Backtracking 9 .3. C a D e a C e 9 .4. C lượ am lam G ee y 10 . . ộ Dy am P amm 11 . B p 11 CH NG II: S P X P SORTING VÀ TÌM KI M S ARCHING 13 1. B sắp x p 13 1.1. Sắp x p I e al S 13 1. . Sắp x p x e al S 13 1.3. Sắp x p p 13 1.3. C ê ẩ mộ sắp x p 14 . C p ư p p sắp x p ả 15 .1. Sắp x p ọ Sele s 15 . . Sắp x p ự p x a e s 17 .3. Sắp x p è I se s 19 .4. Sắp x p ọ B le s 21 iv
  6. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật . . S s sắp x p ả 23 3. C l Heap sắp x p ố Heap s . 24 4. T m m y 31 . C 33 . B p 33 CH NG III: Đ UI VÀ CHI N L C V T CẠN 34 1. K m 34 2. C lượ B e e 34 3. C lượ ay l Ba a / y a e 35 CH NG IV: CHI N L C CHIA Đ TR 38 1. C s ủa lượ a D e a C e 38 2. Sắp x p ộ Me e s 38 3. Sắp x p a s 43 4. T m m p 46 5. B p 48 CH NG V: UI HOẠCH ĐỘNG 49 1. C lượ ộ 49 2. B 1: D y a 49 3. B : B y ma 51 4. P ư p p ộ 53 5. B y 53 6. B p 57 CH NG VI: CHI N L C THAM LAM GR D ) 60 1. N yê ắ am lam 60 2. B 60 3. Bài t l p l 61 4. S s lượ am lam ộ 64 TÀI LI U THAM KHẢO 65 ĐỀ THI THAM KHẢO 66 v
  7. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật LỜI NÓI ĐẦU C l lượ l l ự ê ắ l ớ a l mộ l ự ê l ủa a ọ m y . Hầ ư ượ a y ê m y ù lớ ay ù ả ay p p p ả s ụ l e ự l m l ả . V ê lượ x y ự p p l p ê a ọ m y ả lý y ắ lựa ọ ưa a ả p p ự . V y ọ p mô ọ P ả l mộ a ọ . T l y ựa ê m ê m ả p ả y mô ọ C l ả a Cô T ô Đ ọ H ả V am ù ớ sự am ả ủa l ủa ồ p ả ướ ự y pe a. Vớ ẩy ư ượ a ủ a m ả ớ sắp x p m m lượ ư ay l ộ am lam y ọ s p em s ê ộ ả mộ l . M ù ố ắ s ẫ ô mộ số s y ọ s ượ è ồ p em s ê ộ ả p ý ô a l y. X l ảm ớ è ồ p Ba ủ m a Cô T ô p ỡ l y . Hải phòng, tháng 04 năm 2010 Tác giả Nguyễn Hữu Tuân 1
  8. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật CHƯƠNG I C C H I NIỆ CƠ ẢN 1. Thuật toán (giải thuật) - Algorithm 1.1. Đ nh ngh a thuật toán C a ư p a a ủa . T e ư ố s a l “Introduction to Algorithms Se ủa T mas H. C me C a les . Le se s R al L. R es Cl S e ượ a ư sa : “mộ l mộ ủ ụ x ell- e e mộ p ọ l p s a a mộ mộ p ượ ọ l p . N mộ ố ư l mộ ô ụ x ell- e e . V mộ m ư p ầ ủa y số a l mộ ủa mộ ụ . T m mộ m ả ộ a số l mộ m ù l mộ ả . 1 2 Đ c tr ng của thuật toán T ắ : T ầ p ả ảm ả mộ ả sa ự ố ớ ộ l ầ . Đ y l ư a ọ ố ớ mộ . T : ầ p ả ảm ả s sa mộ số ướ . T x : C ướ ủa p ả ượ p ụ y p ầm lẫ ố ớ ư ọ . T ả: ượ xem l ả ư ả ă ả y ả a a p p ê ự p ượ yê ầ ủa ư ù . T p : ượ ọ l p ố p ả y ượ mộ lớp ư ự. N a m e a ầ ượ ọ l l Input. K ả ủa ư l mộ ả ụ ùy e ụ ượ ọ l O tput. 2. i u diễn thuật toán T ư ng có hai cách bi u di n một thu t toán, cách th nh t là mô tả ước thực hi n của thu t toán, cách th hai là s dụ s ồ giải thu t. 2.1. ô tả các ớc thực hiện Đ bi u di n thu ư i ta mô tả x ước thực hi n của thu t toán, ngôn ng ù mô tả thu t toán có th là ngôn ng tự nhiên ho c một ngôn ng lai ghép gi a ngôn ng tự nhiên với một ngôn ng l p ọ l n giả mã l nh. 2
  9. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật Ví dụ: mô tả thu m ước số chung lớn nh t của hai số nguyên. Input: Hai số nguyên a, b. O p : ớ số lớ ủa a . Thuật toán: Bướ 1: N a USCLN(a, b)=a. Bướ : N a m USCLN của a-b và b, quay l i ướ 1 Bướ 3: N u a < b thì tìm USCLN của a và b-a, quay l i ướ 1 2 2 Sử dụng s đ ( u đ ) giải thuật (flowchart) Mộ p l s ụ s ồ (Algorithm Flowchart). S ồ s ụ ý ố ả mộ mô ả ma y s ớ mô ả ướ ự ủa . C a s ụ s ồ ả mô ả ố ư ù ả mô ả ủa a . C ố ả ủa mộ s ồ Bắ ầu 1 Câu l nh 3 K t c 2 4 Đ u ki n Đ S 5 Nh p xu t d li u hối 1 K ố ắ ầ y mộ ư a hối 2 K ố ư Khối 3 T ự l l mộ l ồm mộ ư mộ ư a Khối 4: R m a u ki B lea u th s e Đ T e u th sa s e Sa (False). 3
  10. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật hối C l p x l . 3. Độ phức tạp thuật toán – Algorithm Complexity 3 1 Các tiêu chí đánh giá thuật toán T ô ư m ộ tốt, x u và so sánh các thu t toán cùng lo i, có th dựa trên ha ê ẩ : + T ả . + Dựa vào th i gian thực hi n và tài nguyên mà thu t toán s dụ thực hi n trên các bộ d li u. Trên thực t các thu t toán hi u quả thì không d hi t hi u quả ô d dàng thực hi n và hi ược một cách nhanh chóng. Và mộ u có vẻ ngh ch lý là các thu t toán càng hi u quả thì càng khó hi t càng ph c t p l i càng hi u quả (không phả l . V nh giá và so sánh các thu ư a ư ng dựa ê ộ ph c t p v th i gian thực hi n của thu t toán, gọ l ộ ph c t p thu t toán (algorithm complexity). V bản ch ộ ph c t p thu t toán là mộ m ướ lượng (có th không chính xác) số phép tính mà thu t toán cần thực hi n (t dàng suy ra th i gian thực hi n của thu ối với một bộ d li p ước N. N có th là số phần t của mả ư ng hợp bài toán sắp x p ho c tìm ki m, ho c có th l ộ lớn của số trong bài toán ki m tra số nguyên tố chẳng h n. 3.2. Đánh giá th i gian thực hiện thuật toán Đ minh họa vi ộ ph c t p thu t toán ta xem xét ví dụ v thu t toán sắp x p chọn (selection sort) và sắp x p i ch trực ti p ex a e s ư sa : Cài t của thu t toán sắp x p chọn: for(i=0;i<n;i++) { min_idx = i; for(j=i+1;j<n;j++) if(a[j]<a[min_idx]) min_idx = j; if(min_idx!=i) { temp = a[i]; a[i] = a[min_idx]; a[min_idx] = temp; } 4
  11. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật } Số phép tính thu t toán cần thực hi n ượ ư sau: (N-1) + (N- + + + 1 N* N-1)/2. Phân tích chi ti N* N-1)/2 là số phép toán so sánh cần thực hi n, còn số lần thực hi i ch hai phần t (số nguyên) tố a ủa thu t toán là N. C t của thu t toán sắp x p i ch trực ti p: for(i=0;i<n;i++) for(j=i+1;j<n;j++) if(a[j] < a[i]) { temp = a[i]; a[i] = a[j]; a[j] = temp; } Tư ự ối với thu t toán sắp x p chọn ta có số p p ự l : (N-1) + (N-2) + + +1 N* N-1)/2. Chi ti N* N-1)/2 là số lần so sánh thu t toán thực hi n, và l số lần i ch hai phần t (hai số nguyên) tố a ủa thu t toán. T ư ng hợp trung bình, thu t toán sắp x p chọ x ướng tố s ới sắp x p i ch trực ti p vì số a i ch ư ng hợp tốt nh ư a ư ng hợp tồi nh t thì chắc chắn thu n sắp x p chọn tố k t lu n thu t toán sắp x p chọ a s ới thu t toán sắp x p i ch trực ti p. 3 3 Các đ nh ngh a h nh thức về độ phức tạp thuật toán Gọ l m ô ảm a ê p số yê ư . ý l ả m a a m y . C a m N l O N ọ l : l O lớ ủa ư ồ mộ số N0: N N;().() f N c g N 0 P l ư sa : N l O N ồ sa ầ p ầ ồ ủa m m ướ p ầ ồ ủa m * . C ý l m ă l a m * . T ay N l O N a ư l N O N . C ý ẳ y ô ố x a l a ượ l O N N ư ô s y a N O(f(N)). Đ a ê ượ ọ l ý O lớ -O a ư ượ s ụ ê ủa m ă . 5
  12. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật C ẳ ố ớ ụ sắp x p ọ ta f(N) = N*(N-1)/2 = 0.5N2 – 0. N a l N O(N2 . C a l m ô ă a m N2. C ý m m x ô ư ô a ả l x ủa “C ư a ự l a l ê m y ủa ô . N ư a ọ l a a ượ m a ự ủa l m a . N a ă ướ p lê lầ a ự ủa ư s ă lê x p x 4 lầ ô p ụ ộ ố ộ ủa m y. C ê N O(N2 a ả ầ ư – ảm ả ộ ă ủa m a l a . D a s s ụ ý p p O lớ mô ả a ự ủa ô ả ộ ớ m s ụ . Đố ớ ụ a “ ộ p p a ủa l O(N2 ắ ọ l “ l O(N2 . Tư ự a a  (omega)v  (theta): C a m N l N ư N O N ay m ă l a m . V m N l N ư N O N N O N ay ả a m x p x ư a ộ ă . H ê l l a ướ l a mộ ớ ủa mộ m. C ớ a ư y l ớ m a ay p . ột vài ví dụ 0.5N2 – 0.5N = O(N2) 47 N*log(N) = O(N*log(N)) N*log(N) + 1000047N = (N*log(N)) T ả m a l O(Nk) Độ p p a ủa sắp x p ọ sắp x p ự p l (N2) N mộ l O(N2 l O(N5) M sắp x p ựa ê s s ộ p p ố ư l (N*log(N)) T sắp x p Me eS số a s s l N*l N . D ộ p p a ủa Me eS l N*l N a l Me eS l m ớ sắp x p ố ư . K xem x s s ù l ư a ư x ộ p p ủa ư ợp: a e a e ase ư ợp x e s ase ư ợp ố e est case). 6
  13. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 3.4. Các ớp thuật toán K a ộ p p a / ô a ớ ủa mộ ay s ụ ý  a ả p ớ lớp ủa m . V ụ f(N) = N a s l y l ea . C am ả êm: N 1: số s a f(N) = (log(N)): logarit f(N) = N : y l ea f(N) = (N*log(N)): N log N f(N) = (N2 : a a a f(N) = (N3 : 3 f(N) = O(Nk ớ l mộ số yê ư : a p ly m al f(N) =  (bN : m m exp e al Đố ớ ồ ộ p p V+ a l “ y ố ớ ướ ủa ồ . X a ự mộ ớ m Đố ớ ầ a p số e O b ư l . C ă ộ p p l (N2 a s m m ố x ộ p p a l 10N2 ô p ả l 107N2. C a l số l lớ ư l e mộ l ê a ớ mộ số ủa . T ư ợp y ố l mộ ê ưa ý m ủa số . Ví dụ: m số lầ x ủa m ý ự mộ x N ý ự. Mộ ả l y a ộ x ố ớ m ý ự ự m xem ý ự x a ê lầ . K ướ ủa ả l ố l ố ớ ô l p C l y ố ớ N. N ư s l ố l ộ p p ủa l S*N S l số p ầ ủa ả s ụ . C ý l mộ ố ả y ớ ộ p p l (S + N). Trong ộ l p mộ ự 1000000000 p p ô a m ộ a . C a am ả ả sa êm: Độ phức tạp Giá tr N ớn nhất (N) 100 000 000 (N log N) 40 000 000 (N2) 10 000 (N3) 500 7
  14. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật  (N4) 90 (2N) 20 (N!) 11 Th i gian thực hiện của các thuật toán c độ phức tạp khác nhau O(Log(N)) 10-7 giây O(N) 10-6 giây O(N*Log(N)) 10-5 giây O(N2) 10-4 giây O(N6) 3 p O(2N) 1014 ăm O(N!) 10142 ăm Ch ý về phân tích thuật toán. T ô ư a y mộ ố ộ p p a ủa l s ụ . T y ê ê ự a ay ù ý p p -O – ô lắm y ượ ư . N ư ê l -O l ê ư a s m mô ê ố . Ví dụ: C mộ mả ượ sắp A. H y x xem mả A a p ầ m ủa D ay ô . H y xem m ư sa : int j=0; for (int i=0; i D) ) j++; if (A[i]-A[j] == D) return 1; } R ê l O(N2 : l p le ê ượ ọ N lầ m lầ ă lê ố a N lầ . N ư mộ p ố s a y l O(N) ả a ự ủa l ă ô y N lầ . 8
  15. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật N a l O(N2 a ẫ ư l l O N a ưa a ượ ô x . 4. Cấu tr c dữ iệu – Data structure Niklaus Wirth, một l p trình viên và nhà khoa họ m y ư i phát minh ra ngôn ng l p Pas al ng nói một câu nói n i ti l ực l p : C ư (Programs) = C u trúc d li u (Data Structures) + Giải thu t (Algorithms). Câu nói này nói lên bản ch t của vi c l p l m một c u trúc d li u phù hợp bi u di n d li u của bài toán và t x y ựng giải thu t phù hợp với c u trúc d li chọn. Ngày nay với sự phát tri n của các k thu t l p trình, câu nói của Wirth không hẳ y ối n a ư ẫn phản ánh sự gắn k t và tầm quan trọng của các c u trúc d li u và giải thu t. C u trúc d li ược s dụ bi u di n d li u còn các giải thu ược s dụ thực hi n các thao tác trên các d li u của bài toán nh m hoàn thành các ch ă ủa ư trình Các chiến c thiết kế thuật toán K ô mộ p ư p p p a x y ự ê ả l . C a ọ m y ê ưa a lượ ả p ụ l a . 5.1. Duyệt toàn ộ (E hausted search) C lượ y ộ l lượ m m l p ê p ả ầ ê ả y . T p ư p p y ộ a s xem x ả ê ộ mộ ô a ủa xem p ả l m ủa ay ô . P ư p p y yê ầ mộ m m a xem mộ ê p ả l m ủa ay ô . M ù s p ư p p y ô p ả l ự l ô ả ố ớ m ướ p lớ . C p ư p p ả ă ủa p ư p p y ộ a s xem x ư 3. 5.2. Đệ qui quay ui – Backtracking C lượ ay l l mộ lượ x y ự ựa ê a qui. N m ủa ượ mô a ướ mộ e m p ầ ủa e m s mộ p s ướ p ầ ủa m x m ủa . M ù ô p ả p ụ s ả ựa ê p ư p p ay l l ô ẻ ẹp sự ắ ọ s m ma l . 3 Chia đ tr (Divide and Conquer) C lượ a l mộ lượ a ọ ả . ư ủa lượ y e ả y l : ầ ả y mộ 9
  16. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật a s a ả sa ợp m ủa l m ủa a ầ . T y ê ă y m a y ố: l m a mộ ợp lý l ượ ả y a s p p y ố a l ợp l ả ủa s ượ ự ư . C sắp x p ộ me e s sắp x p a s ộ l a y ượ y ư 3 . Ví dụ[6, trang 57]: T ụ y a s xem x aN . Đ a ý ô sa : 1 nÕu N = 0 aN (a N/2 ) 2 nÕu N ch½n a*(aN/2 ) 2 nÕu N lÎ T ô ê a s y a ủa ư sa : int power(int a, int n) { if(n==0) return 1; else{ int t = power(a, n/2); if(n%2==0) return t*t; else return a*t*t; } } Chiến c tham am (Greedy) C lượ am lam l mộ lượ x y ự m m ố ư ụ ộ ố ư m ượ m ố ư ụ ả ư ợp . T ư ợp m l ả ủa lượ am lam ư ă a ộ p p p . Ch ý: T mộ số x y ự ượ m ọ ợp m ố ư . T am ă m ầ ớ m ố ư . 10
  17. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 5.5. Qui hoạch động (Dynamic Programming) ộ l lượ x y ự ả y ố ư ủa ô p ả l m lớ / l a ê ô ụ ượ . Trong lượ ộ a s x y ự a ủa ố s l ả ựa ê s p lems ựa ê a . C qui ộ ư s ụ mả lư l m ủa a p : m p p . ài tập ài tập 1: X y ự s ồ ả số a N y số a ượ a ư sa : 0 1 1 N N-1 + N- ớ N . ài tập 2 X y ự s ồ ả : x x x ớ N số x ự m ă a N x p p m. ài tập 3 T mộ ma a p MxN mộ p ầ a ượ ọ l m yê ựa ủa ma sa le p ư l p ầ ê p ầ lớ ê ộ ủa ma . C ẳ a 0 l mộ p ầ yê ựa ma sa : 1 2 3 456 7 8 9 H y ư m ả m yê ựa ủa mộ ma p p m ưa a ộ p p ủa . ài tập C mộ ma ướ MxN ồm số yê ả số m ư . H y ư m ma ủa ma sa p ầ ma lớ ượ max m m s m pla ea . H y ưa a ộ p p ủa s ụ . ài tập V ư p số ủa mộ a ả s số l yê a x l mộ số yê mộ x0. H y ủa a e ô H e sa : n n-1 N x an*x + an-1*x + +a1*x + a0 f(x) = a0 + x*(a1+x*(a2+x* .+x an-1+an*x Cô H e . ài tập C 4 ộp ướ a m m ủa ộp ượ ô 1 4 m xa m . H y ưa a ả x p ộp 1 y sa e p a ê x ố ướ sa ủa y ủ ả 4 m xa m . 11
  18. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật ài tập 7 H y ư a ượ a ả số yê số a số. ài tập 8 p ụ s a ả số yê ố N. 12
  19. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật CHƯƠNG II: S P XẾP (S RTING) VÀ T IẾ (SE RCHING) 1. Bài toán s p ếp 1 1 S p ếp trong (Interna Sorting) Sắp x p ược xem là một trong nh l ực nghiên c u c n của khoa học máy . T ướ t toán chi ti t chúng ta cần nắm v ng một số khái ni m ản sau: + Mộ ư ng (field) là mộ d li ẳng h ư ê i, số n tho i của mộ ư i + Một bản ghi (record) là một t p hợp ư ng + Một file là một t p hợp các bản ghi Sắp x p (sorting) là một quá trình x p t các bản ghi của một file theo một th tự nào . V c x p y ược thực hi n dựa trên một hay nhi ư ô y ược gọi là khóa xắp x p (key). Th tự của các bả ượ x nh dựa trên các khóa khác nhau và vi c sắp x p ố ược thực hi ối với m i khóa theo các th tự khác nhau. Chúng ta s t p trung vào các thu t toán xắp x p và giả s khóa ch gồm 1 ư ng duy nh t. Hầu h t các thu t toán xắp x p ược gọi là các thu t toán xắp x p so sánh: chúng s dụng hai a ả l s s i ch (swap) các phần t cần sắp x p. C sắp x p ả ượ a l m a . Sắp x p (internal sorting): D l ầ sắp x p ượ lư ầy ủ ộ ớ trong ự sắp x p. 1 2 S p ếp ngoài (E terna Sorting) Sắp x p ex e al s : D l ầ sắp x p ướ lớ ô lư ộ ớ sắp x p a y p l m a . T p m ủa mô ọ y a xem x sắp x p . Cụ l sắp x p s l mộ mả ả ồm a ư l ư l ư a p a xem x ư a ủa ả y ụ m ọa ượ ự ê mả số yê ư l ư a ủa ả . 1 3 S p ếp gián tiếp Khi các bả ước lớn vi i các bản ghi là r t tố m giảm p ư i ta có th s dụ p ư p p sắp x p gián ti p. Vi c này có th ược thực hi n theo nhi u cách khác nhau và môt trong nh p ư p p l o ra một file mới ch a ư ng khóa của le a ầu, ho c con tr tới ho c là ch số của các bản ghi ban ầu. Chúng ta s sắp x p trên file mới này với các bả ước nh sa y c p vào các bả le a ầu thông qua các con tr ho c ch số y l l m ư ng th y ối với các h quản tr s d li u). 13
  20. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật Ví dụ: chúng ta muốn sắp x p các bản ghi của le sa y: Index Dept Last First Age ID number 1 123 Smith Jon 3 234-45-4586 2 23 Wilson Pete 4 345-65-0697 3 2 Charles Philip 9 508-45-6859 4 45 Shilst Greg 8 234-45-5784 Sau khi sắp x p x truy c p vào các bản ghi theo th tự sắp x p chúng ta s dụng th tự ược cung c p b i cột index (ch số . T ư ng hợp này là 3, 2, 4, 1. (chúng ta không nh t thi t phả i các bả a ầu). 1.3 Các tiêu chuẩn đánh giá một thuật toán s p ếp Các thu t toán sắp x p có th ược so sánh với nhau dựa trên các y u tố sa y: + Th i gian thực hi n (run-time): số các thao tác thực hi ư ng là số các phép so s i các bản ghi). + Bộ nhớ s dụ Mem y : l lượng bộ nhớ cần thi thực hi n thu t toán lượng bộ nhớ s dụ ch a d li u cần sắp x p. + Một vài thu t toán thuộc lo “ pla e ô ần (ho c cần một số cố nh) thêm bộ nhớ cho vi c thực hi n thu t toán. + Các thu ư ng s dụng thêm bộ nhớ t l thu n theo hàm tuy n tính ho c m m ớ ước file sắp x p. + T t nhiên là bộ nhớ s dụng càng nh càng tốt m c dù vi ối gi a th i gian và bộ nhớ cần thi t có th là có lợi. + Sự nh (Stability):Một thu ược gọi là nh n ư gi ược quan h th tự của các khóa b a ô l m ay i th tự của các khóa b ng nhau). C a ư ng lo lắng nhi u nh t là v th i gian thực hi n của thu t toán vì các thu t toán mà chúng ta bàn v ư ng s dụ ước bộ nhớ ư ư a . Ví dụ v sắp x p nh: Chúng ta muốn sắp x p le sa y ự trên ký tự ầu của các bả ướ y l t quả sắp x p của các thu t toán nh và không nh: 14
  21. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật Chúng ta s xem xét t i sao tính nh trong các thu t toán sắp x p l ượ quan trọ ư y. 2. Các ph ng pháp s p ếp c ản 2.1. S p ếp chọn (Selection sort) Mô ả : Tìm phần t có khóa lớn nh t (nh nh sa sắp x p phần còn l i của mảng. S ồ : 15
  22. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật Bắ ầu Nh p n, a[0 n-1] i=0 S i<n Đ vtmin=i j=i+1 S j<n Đ S a[j]<a[vtmin] Đ vtmin=j j=j+1 S vtmin!=i Đ Đ i ch a[i], a[vtmin] i=i+1 K t c Đ n mã sau minh họa cho thu t toán: void selection_sort(int a[], int n) { int i, j, vtmin; 16
  23. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật for(i=0; i<n-1;i++) { vtmin = i; // m lư p ầ a -1] for(j=i+1;j<n;j++) if(a[j] < a[vtmin]) vtmin = j; swap(a[vtmin], a[i]); // m a m a } } Ví dụ: Với m i giá tr của i thu t toán thực hi n (n – i – 1) phép so sánh và vì i ch y t 0 cho tới (n–2), thu t toán s cần (n-1) + (n- + + 1 -1)/2 t c là O(n2) phép so sánh. T mọ ư ợp số lầ s s ủa l ô . M lầ y ủa l p ố ớ mộ lầ a p ầ ê số lầ ủa l . N ư y ư ợp ố ầ 0 lầ ầ / lầ ồ ầ lầ . 2 2 S p ếp đổi ch trực tiếp (E change sort) Tư ự ư sắp x p ọ ư ầm ớ sắp x p è l sắp x p ự p mộ số l ọ l I e a e s ay S a Sele S . Mô ả: Bắ ầ x p ầ ầ ê a ớ 0 a x ả p ầ sa a ọ l a ớ y +1 ớ -1 ố ù . Vớ m p a a ý l a l p ầ sa a a a l xảy a sa a s a a[j]. Ví dụ minh họa G ả s mả a ầ l a 1 19 3 1 . C ướ ủa s ượ ự ư sa : i=0, j=2: 1, 6, 2, 19, 3, 12 17
  24. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật i=1, j=2: 1, 2, 6, 19, 3, 12 i=2, j=4: 1, 2, 3, 19, 6, 12 i=3, j=4: 1, 2, 3, 6, 19, 12 i=4, j=5: 1, 2, 3, 6, 12, 19 K ả ố ù : 1 3 1 19. S ồ : Bắ ầu Nh p n, a[0 n-1] i=0 S i<n Đ j=i+1 S j<n Đ S a[j]<a[i] Đ Đ i ch a[i], a[j] j=j+1 i=i+1 K t c C ủa : void exchange_sort(int a[], int n) { int i, j; int tam; for(i=0; i<n-1;i++) 18
  25. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật for(j=i+1;j<n;j++) if(a[j] < a[i]) { // a a tam = a[i]; a[i] = a[j]; a[j] = tam; } } Độ p p ủa : C y s ớ sắp x p ọ sắp x p ự p ầ số ướ s s ư ư : l * -1 / lầ s s . N ư số ướ a p ầ ớ số lầ s s : * -1 / . T ư ợp x số ướ ủa ớ số lầ s s ư ợp số ướ l * -1 /4. C ư ợp ố số ướ 0. N ư y sắp x p ự p l m s ớ sắp x p ọ số lầ . 2.3. S p ếp ch n (Insertion sort) Mô ả : T ựa a l hèn m i khóa vào mộ y ược sắp x p của dãy cần sắp. P ư p p y ư ược s dụng trong vi c sắp x p các cây bài trong . S ồ ả ủa ư sa : 19
  26. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật Bắ ầu i=1 i =0 S i=i+1 Đ S S a[j]>tam Đ a[j]=a[j-1] j=j-1 K t c C mô ả l ư sa : a ầ a ư mả a 0 -1 ồm p ầ ư ợp ầ ê 1 l ượ sắp ướ ủa a s è a mả a 0 -1] sao c sa è p ầ ẫ e ự ă ầ . Bướ p e s è a +1 mả a 0 mộ ư ự. T ớ mả è a -1 mả a 0 -2]). Đ è a mả a 0 -1 a ù mộ m lư a sa ù mộ số -1 ớ ầ mả a am s py a a +1 a l lù mả l mộ è am mả . V l p s a am -1 a a +1 tam. Đ m ư ư sa : void insertion_sort(int a[], int n) { int i, j, temp; for(i=1;i<n;i++) 20
  27. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật { int j = i; temp = a[i]; while(j>0 && temp < a[j-1]) { a[j] = a[j-1]; j = j-1; } a[j] = temp; } } Ví dụ: T sắp x p è l mộ sắp x p s a le l a số sắp x p ả . Với m i i chúng ta cần thực hi n so sánh khóa hiên t i (a[i]) với nhi u nh t là i khóa và vì i ch y t 1 tới n-1 nên chúng ta phải thực hi n nhi u nh : 1 + + + -1 = n(n-1)/2 t c là O(n2 p p s s ư ự ư t toán sắp x p chọn. Tuy nhiên l p le ô p ả l ượ ự ự ô l l p lầ ê ê ự sắp x p è a s ớ sắp x p ọ . T ư ợp ố ầ s ụ lầ s s 0 lầ . T ê ự mộ mả ỳ ồm mả ượ sắp ê è ộ ả. T sắp x p è l a sắp x p ả ộ p p O(n2)). 2.4. S p ếp nổi ọt ( u e sort) Mô ả : 21
  28. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật T sắp x p ọ ựa ê s s a p ầ a : + Duy t qua danh sách các bản ghi cần sắp theo th tự i ch hai phần t k nhau n u chúng không theo th tự. + L p l u này cho tới khi không có hai bản ghi nào sai th tự. K ô th y r ng n pha thực hi l ủ ự x . Thu y ư ự ư t toán sắp x p chọn ngo i tr vi c có thêm nhi u a i ch hai phần t . S ồ : Bắ ầu Nh p n, a[0 n-1] i=0 S i i Đ S a[j]<a[j-1] Đ Đ i ch a[j], a[j-1] j=j-1 i=i+1 K t c C : void bubble_sort1(int a[], int n) { int i, j; 22
  29. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật for(i=n-1;i>=0;i ) for(j=1;j a[j]) swap(a[j-1],a[j]); } void bubble_sort2(int a[], int n) { int i, j; for(i=0;i i;j ) if(a[j-1]>a[j]) swap(a[j-1],a[j]); } T ộ p p l O(N*(N-1)/2) = O(N2), số lầ s s số lầ ủa ư ợp ồ . T sắp x p ọ l m số sắp x p ả m sắp x p ự p m ù số lầ s s a ư a p ầ a ê số lầ . 2.5 So sánh các thuật toán s p ếp c ản S p xếp chọn: + T i n2/ p p s s ướ i ch . + T ư ng hợp x u nh ư ự. S p xếp chèn: + Trung bình cần n2/4 phép so sánh, n2/8 ướ i ch . + X u nh t cần g p ô ước so vớ ư ng hợp trung bình. + Th i gian là tuy ối với các file hầ ư sắp l a số sắp x p ả . S p xếp nổi bọt: + Trung bình cần n2/2 phép so sánh, n2/ a i ch . + X u nh ư ự. 23
  30. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 3. Cấu tr c dữ iệu Heap, s p ếp vun đống (Heap sort). 3.1. Cấu tr c Heap T ướ m eap s a s m mộ ọ l Heap eap a a s e ay ọ l ố . Heap l mộ y p ầy ủ m a ey l ey pa e . H y ớ l mộ y p ầy ủ l mộ y p ầy ả ầ ủa y ầ ố ù ầy p a ủa y . C mô ả l mộ y p m m sa : l mộ ủa y ô m ố ù s l mộ m ố ù s ô a em ê ủa ô 1 s 1 ư a em ê ủa ủ m l l m ố ù mộ s số số ủa a em ê ủa . Ví dụ 3 7 4 5 1 2 6 7 7 9 1 1 3 Chiều cao của một heap Mộ eap s a l O l . Chứng minh G ả s l số ủa mộ eap a l . h V mộ y p số ố a l 2 -1 nên suy ra: h 1 2 -1 L y l a a ủa ẳ a ượ : h – 1 l T êm 1 ủa ẳ l l y l a a a l ượ : log(n + 1) T ê s y a: 24
  31. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật l + 1 l (n) + 1 Các ví dụ về cấu tr c Heap: Heap ớ a 3: eap ớ a 4 i u diễn Heap C a mộ y p ê mộ eap ô ư ự ố ư mộ y p mộ mả . Đố ớ mộ eap lư mộ mả a a sa ả s a ắ ầ 0): Left(i) = 2*i + 1 Right(i) = 2*i + 2 Parent(i) = (i-1)/2 Ví dụ 25
  32. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật Thủ tục heapri y Đ y l ủ ụ ả ả ủ ụ a ê eap Input: + Mộ mả A mộ số mả + G ả s a y Le R l eap + A p ỡ Heap y ớ Le R . Output: + Mả A y ố l l mộ Heap K ô a y ộ p p l O(log n). C a s y y l mộ ủ ụ m y ư ượ l a ay ủa mộ a eap ủa eap s p ỡ y p ả sự s a . Sa y l C ủa ủ ụ : void heaprify(int *A, int i, int n) { l = Left(i); /* l = 2*i +1*/ r = Right(i); /* r = 2*i + 2 */ if(l A[i]) largest = l; 26
  33. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật else largest = i; if(r A[largest]) largest = r; if(lagest !=i) { swap(A[i], A[largest]); heaprify(A, largest, n); } } V ả y l mộ ủ ụ ả s ớ a ảm . T ủ ụ y ả ớ ướ ư sa : + X p ầ lớ 3 p ầ A A Le A R . + N A ô p ả l p ầ lớ 3 p ầ ê A ớ A la es A la es s l A Le A R . + Gọ ủ ụ ớ la es l m ay ủa eap l A la es . Ví dụ 27
  34. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật Thủ tục ui dheap T ủ ụ l eap s y mộ mả ỳ mộ eap. V ả ủ ụ y ự ọ ớ ủ ụ eap y ê e ự ượ l . V y e ự ượ l ê a y ố l eap. N a ố ủa mả ư ớ l ê a ô ầ p ả ự ủ ụ eap ố ớ . Đ m C ự l eap: void buildheap(int *a, int n) { int i; for(i=n/2; i>=0; i ) heaprify(a, i, n); } Dựa y y eap mả ộ p p l O(n*log n . T ê ự eap ộ p p l O . T a ự ủa eap y ê mộ y ướ mộ ụ l mố a a p ầ a a Le a R l O 1 . Cộ êm ớ a ủ ụ y ự ê mộ y ố mộ l ủa . Số y ủa 28
  35. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật ủa l ố l /3. S y a a ô ộ p p ủa l : T T /3 + O 1 T O l y s y a ộ p p ủa l eap l *l . C lý l ư sa : K ướ ủa p ủa y l : /4 /8 /1 1 l số ủa y. T a ự eap y ố ớ ướ y l 1 3 l – 1 a s x p x l : 1*n/4 + 2 * n/8 + 3 * /1 + + l -1) * 1 < n/4(1 + 2* ½ + 3 * ¼ + 4 * 1/8 + ) = O(n). Ví dụ Các thao tác trên heap khác N eap a sa y ư ự ố ớ mộ eap: + Insert() + Extract_Max() C a ô a y y ư a y ô ự ớ s ụ ủ ụ eap y m a ê . Vớ a y a s ụ mộ eap mộ ợ ư ê . Mộ ợ ư ê l 29
  36. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật mộ l ớ a ả l se max m m ex a max m m a s p ầ sa ủa a ọ . 3.2. S p ếp vun đống (Heap sort) T Heap s ý ư ả : + T ự ủ ụ l eap mả A mộ eap + V A l mộ eap ê p ầ lớ s l A 1 . + Đ A 0 A -1], A[n-1 m ủa a a ư mả y ướ l -1 ay l xem x p ầ ầ ủa mả ô l mộ eap a. + V A 0 l ê a s ọ ủ ụ eap y ố ớ l mả mộ eap. + L p l a ê ớ mộ p ầ eap mả ượ sắp. C C ủa : void heapsort(int *A, int n) { int i; buildheap(A, n); for(i=n-1;i>0;i ) { swap(A[0], A[i]); heaprify(A, 0, i-1); } } Ch ý: Đ ọ sắp x p ê mả a n p ầ ọ m eaps ư sa : heapsort(a, n); Độ phức tạp của thuật toán heapsort T ủ ụ l eap ộ p p l O . T ủ ụ eap y ộ p p l O l . Heaps ọ ớ l eap 1 lầ -1 lầ ọ ớ eap y s y a ộ p p ủa l O(n + (n-1)logn) = O(n*log n). T ê ự eaps ô a quicksort. 30
  37. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 4. T m kiếm tuyến tính 4.1 ài toán t m kiếm T m m l mộ ộ l ự ê ủa a ọ m y ượ ụ ộ ê ự . Bả m ư a p ư p p ma ự ự m m. T ô y a ư x yê p ả m m: m m mộ ố s ọ mộ ầ a m m mộ l lư ê m y ê m m mộ m mộ ả a m mộ s l m m ê m I e e . T mô ọ y a a m ớ m m ê mộ mả mộ a s p ầ ù . T ô ư p ầ y l mộ ả ượ p a a ư ê : ư lư l mộ ư p p ầ ớ a ô ư l ố a ọ l ư a p p ầ y ượ ọ l ô a m m ủa m m ô a m m ượ lư ê ộ ớ ủa m y m m. K ả m m l v trí của phần tử th a mãn điều kiện t m kiếm: ư a ớ mộ a ướ a m m . T m y y a y p ớ ô ượ a ư l ủa p ầ m y. N ả l ô m y ư ợp y ẫ ô ả s ượ mộ ư ư ớ ô ồ p ầ : ẳ ư -1 ố ớ mả NULL ố ớ a s l ê . C m m : m m m m ầ ự m m p ớ m m ựa ê l ư l y ư y m m p y y e T y ê p ầ y a s xem x a p ư p p m m ượ p ụ ớ l mả l m m ượ a ộ ớ ủa m y . Đ ầ ê m a ầ lư ý l ố ớ mả y y p ớ p ầ a l ư a ựa số p a s p ê ư m p ầ ư a l số yê . 4.2 T m kiếm tuần tự (Sequentia search) ư ủa m m ầ ự ả : y a ả p ầ ủa mả y m y p ầ a ớ a m m ả ủa p ầ . C y ớ mả m ẫ ô p ầ a ớ a m m ả -1 ô m y . T s ồ ả ư sa : 31
  38. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật Begin mả a[0 n-1] a i = 0 k==a[i] return i; sai i = i + 1; sai i >= n return -1; End C C ủa : int sequential_search(int a[], int n, int k) { int i; for(i=0;i<n;i++) if(a[i]==k) return i; return -1; } D a s ả ả l ủa p ầ ầ ê a m m m ồ p ầ . Độ p p ư ợp ồ : O(n). T ư ợp ố ộ p p O(1). C m p ầ lớ m p ầ ủa mộ mả a s l m m ầ ự. Mộ y l số p ầ ủa mả ỡ 10000000 l m ố ộ p ượ ư số p ầ ủa mả lê ẳ ư m ê mộ ư số ê ư ủa ả ớ a ô ả. 32
  39. ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 5 Các vấn đề khác N ượ y ê ẫ mộ số m a am ả : ẳ ư sắp x p S ell s sắp x p m Counting sort sắp x p số Ra x s . C y ượ xem ư p ầ ự m ủa s ê . 6. ài tập ài tập 1: C sắp x p ả ô l p C ê 1 mả số yê l ủa ư ượ p le ex ượ s ẫ ê số p ầ ả 10000 s s a ự ự ủa . ài tập 2: C sắp x p a ô C ớ mộ mả s ê ê : x ý ự ộ ố a l 0 : số yê m : số a sắp x p l ư ê . S s a ự ủa s s ớ m s s ủa C. ài tập 3[6, trang 52]: C ủa sắp x p ự e a . H y m p l mả a 0 p ầ số 0 ớ số -1 ượ sắp x p ă ầ a ô a p ầ mộ số x è x mả a 0 -1 sa sa è ả ượ l a 0 l mộ mả ượ sắp x p. S ụ m a x y ự sắp x p è . G i ý C è p ầ mả ư p ầ ủa sắp x p è ượ y s ụ p ư p p . 33