IT Ebooks - Trang Minh Truc''''s website CautrucDL> tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn...
u trúc d li u gi i thu t U TRÚC D LI U VÀ GI I THU T (5 VHT: 60LT + 30TH) Ch ng 0.1 Xác M u - Các b c gi i toán máy tính nh tốn Trang 0.2 Tìm c u trúc d li u bi u di n toán 0.3 Tìm thu t tốn 0.4 L p trình 0.5 Ki m th 0.5.1 Ch y th tìm l i 0.5.2 Xây d ng b Test 0.6 T i u ch Ch ng ng trình T ng quan v c u trúc d li u gi i thu t 1.1 Vai trò c a c u trúc d li u m t án tin h c 1.2 Các tiêu chu n ánh giá c u trúc d li u 1.2.1 Ph n ánh úng th c t 1.2.2 Phù h p v i thao tác ó 10 1.2.3 Ti t ki m tài nguyên h th ng 10 1.3 Ki u d li u c u trúc d li u 10 1.3.1 nh ngh a ki u d li u 10 1.3.2 Các thu c tính c a m t ki u d li u 11 1.3.3 Các ki u d li u c b n 11 1.3.4 Các ki u d li u có c u trúc 12 Ch 2.1 ng Phân tích ánh giá gi i thu t ph c t p tính tốn ký pháp 2.1.1 Th i gian th c hi n ch 2.1.2 2.2 Xác ánh giá 16 ng trình 16 ph c t p c a gi i thu t 16 nh ph c t p tính tốn c a gi i thu t 17 2.2.1 Quy t c t ng 17 2.2.2 Quy t c nhân 17 2.2.3 M t s tính ch t 18 2.2.4 Phép tốn tích c c 19 2.3 ph c t p tính tốn v i tình tr ng d li u vào 20 Trang u trúc d li u gi i thu t 2.4 Chi phí th c hi n thu t toán 20 Ch ng quy gi i thu t 3.1 Khái ni m v 3.2 Gi i thu t quy quy 21 quy 21 3.3 Thi t k gi i thu t quy 21 3.4 Hàm n! 21 3.4.1 Dãy Fibonacci 22 3.4.2 Bài toán Tháp Hà N i 22 3.5 Hi u l c c a Ch ng quy 23 Tìm ki m s p x p 4.1 Gi i thi u 25 4.2 Các gi i thu t tìm ki m (tìm ki m n i) 25 4.2.1 Tìm ki m tu n t (Sequential Search) 25 4.2.2 Tìm ki m nh phân (Binary Search) 27 4.3 Các gi i thu t s p x p c b n 29 4.3.1 S p x p ki u l a ch n (Selection Sort) 30 4.3.2 S p x p ki u chèn (Insertion Sort) 32 4.3.3 S p x p i ch tr c ti p (Interchange Sort) 34 4.3.4 S p x p n i b t (Bubble Sort) 37 4.3.5 S p x p chèn v i 4.3.6 S p x p ki u phân 4.4 Ch dài b c gi m d n (Shell Sort) 40 n (Quick Sort) 42 ánh giá, nh n xét 44 ng C u trúc d li u ng 5.1 Gi i thi u 46 5.2 Bi u di n danh sách máy tính 46 5.2.1 u tr k ti p v i danh sách n tính 46 5.2.2 u tr móc n i v i danh sách n tính (danh sách liên k t) 49 5.2.3 Các phép toán danh sách liên k t 50 5.3 S p x p danh sách liên k t 57 5.4 Các d ng khác c a danh sách liên k t 59 Trang u trúc d li u gi i thu t Ch ng Ng n x p hàng i 6.1 Ng n x p (Stack) 62 6.1.1 nh ngh a 62 6.1.2 u tr Stack b ng m ng 62 6.1.3 u tr Stack b ng danh sách liên k t 64 6.1.4 ng d ng c a Stack 66 6.2 Hàng i (Queue) 69 6.2.1 nh ngh a 69 6.2.2 u tr Queue b ng m ng 69 6.2.3 u tr Queue b ng danh sách liên k t 71 6.2.4 ng d ng c a Queue 74 ng Cây Ch 7.1 nh ngh a 75 7.2 Cây nh phân (Binary Tree) 75 7.2.1 Bi u di n nh phân 76 7.2.2 Duy t nh phân 77 7.2.3 Bi u di n t ng quát b ng nh phân 79 7.3 Cây nh phân tìm ki m 79 7.4 ánh giá 85 7.5 Cây nh phân cân b ng 85 Trang u trúc d li u gi i thu t Ch ng 0.1 Xác u - Các b c gi i tốn máy tính D li u vào X lý nh toán K t qu Vi c xác nh toán ph i xác nh xem ta ph i gi i quy t v n gì? v i gi thi t a cho c n t nh ng yêu c u Khác v i toán thu n túy toán h c ch c n xác nh rõ gi thi t k t lu n ch không c n xác nh yêu c u v l i gi i, nh ng tốn tin h c ng d ng th c t ch c n tìm l i gi i t t t i m c ó, th p chí t i m c ch p nh n c B i l i gi i t t nh t có th òi h i nhi u th i gian chi phí Xác nh úng u c u tốn r t quan tr ng b i nh h ng t i cách th c gi i quy t ch t l ng l i gi i M t toán th c t th ng cho b i nh ng thơng tin m h v hình th c, ta ph i phát bi u l i m t cách xác ch t ch hi u úng tốn Ví d : • Bài tốn: M t d án có n ng i tham gia th o lu n, h mu n chia thành nhóm m i nhóm th o lu n riêng v m t ph n c a d án Nhóm có ng i c trình lên b y nhiêu ý ki n N u l y m i nhóm m t ý ki n em ghép l i c m t b ý ki n tri n khai d án Hãy tìm cách chia s b ý ki n cu i thu c l n nh t • Phát bi u l i: Cho m t s nguyên d ng n, tìm phân tích n thành t ng s nguyên d ng cho tích c a s ó l n nh t Trên th c t , ta nên xét m t vài tr ng h p c th thơng qua ó hi u c tốn rõ h n th y c thao tác c n ph i ti n hành i v i nh ng tốn n gi n, ch c n qua ví d ta có th a v m t tốn quen thu c gi i 0.2 Tìm c u trúc d li u bi u di n toán Khi gi i m t toán, ta c n ph i nh ngh a t p h p d li u bi u di n tình tr ng c th Vi c l a ch n tùy thu c vào v n gi i quy t thao tác s ti n hành d li u vào Có nh ng thu t tốn ch thích ng v i m t cách t ch c d li u nh t nh, i v i nh ng cách t ch c d li u khác s hi u qu ho c không th th c hi n c Chính v y nên b c xây d ng c u trúc d li u không th tách r i b c tìm ki m gi i thu t gi i quy t v n Các tiêu chu n l a ch n c u trúc d li u: Ch − C u trúc d li u tr xu t c a toán − C u trúc d li u ph i phù h p v i thao tác c a thu t toán mà ta l a ch n gi i quy t toán − C u trúc d li u ph i cài d ng ng Các b c h t ph i bi u di n t c y thông tin nh p c máy tính v i ngơn ng l p trình ang s c gi i tốn máy tính Trang u trúc d li u gi i thu t trình nh i v i m t s toán, tr c t ch c d li u ta ph i vi t m t kh o sát xem d li u c n l u tr l n t i m c n ch ng 0.3 Tìm thu t tốn Thu t tốn m t h th ng ch t ch rõ ràng quy t c nh m xác nh m t dãy thao tác c u trúc d li u cho: v i b d li u vào, sau m t s h u h n b c th c hi n thao tác ã ch ra, ta t c m c tiêu ã nh Các c tr ng c a thu t tốn: v Tính n nh: m i c c a thu t toán, thao tác ph i th t rõ ràng , không gây nên s nh p nh ng, l n x n, tùy ti n, a ngh a Th c hi n úng b c c a thu t tốn v i m t d li u vào, ch cho nh t m t k t qu v Tính d ng: Thu t tốn khơng m t s h u h n b c v Tính úng c r i vào q trình vơ h n, ph i d ng l i cho k t qu sau n: Sau th c hi n t t c b c c a thu t toán theo úng trình ã nh, ta ph i c k t qu mong mu n v i m i b d li u vào K t qu ó c ki m ch ng b ng u c u tốn v Tính ph d ng: Thu t toán ph i d s a i thích ng c v i b t k toán m t l p tốn có th làm vi c d li u khác v Tính kh thi: Kích th c nh , m t thu t tốn s có tính hi u qu b ng n u l yêu c u v t kh n ng l u tr c a máy tính ng b nh mà Thu t tốn ph i c máy tính th c hi n th i gian cho phép, u khác v i l i gi i toán (ch c n ch ng minh k t thúc sau h u h n b c) Ví d nh x p th i khóa bi u cho m t h c k khơng th cho máy tính ch y t i h c k sau m i c D hi u d cài t Ví d : Input: s nguyên d Output: c s chung l n nh t c a a b Thu t toán s ti n hành B ng a b c mơ t nh sau (thu t tốn Euclide): c (Input): Nh p s nguyên a b c 2: N u b > qua b c 3: t r:= a mod b; c (Output): c 3, ng t a:=b; c l i chuy n qua b t b:=r; quay l i b c c c s chung l n nh t ph i tìm giá tr c a a K t thúc thu t toán u Ch thu t toán: ng Các b c gi i toán máy tính Trang u trúc d li u gi i thu t u ý: Khi mô t thu t tốn b ng ngơn ng t nhiên, ta khơng c n ph i chi ti t c ti n trình th c hi n mà ch c n mơ t m t cách hình th c chuy n thành ngơn ng l p trình Ví d vi t s thu t toán quy i v i thu t toán ph c t p n ng v tính tốn, b c cơng th c c n c mô t m t cách t ng minh thích rõ ràng l p trình ta có th nhanh chóng tra c u i v i nh ng thu t toán kinh n ph i thu c Khi gi i m t toán l n m t th i gian gi i h n, ta ch ph i thi t k t ng th nh ng ch ã thu c c l p vào Tính úng n c a nh ng modun ã thu c ta không c n quan tâm n a mà ph i t p trung gi i quy t ph n khác 0.4 L p trình Sau ã có thu t tốn, ta ph i ti n hành l p trình th hi n thu t tốn ó Mu n l p trình t c hi u qu cac, c n ph i có k thu t l p trình t t K thu t l p trình t t th hi n k n ng vi t ch ng trình, kh n ng g r i thao tác nhanh L p trình t t khơng ph i ch n m v ng ngơn ng l p trình , ph i bi t cách vi t ch ng trình uy n chuy n, khôn khéo phát tri n d n d n chuy n ý t ng thành ch ng trình hồn ch nh.Th c t cho th y, m t thu t toán hay nh ng cài t v ng v nên ch y l i cho k t qu sai ho c t c ch m Thông th ng, ta không nên c th hóa tồn b ch hành theo ph ng pháp tinh ch t ng b c Ch ng trình mà nên ti n − Ban u, ch ng trình c th hi n b ng ngơn ng t nhiên, th hi n thu t toán v i b c t ng th , m i b c nêu lên m t công vi c ph i th c hi n − M t công vi c n gi n ho c m t n ch ng trình ã ti n hành vi t mã l nh b ng ngơn ng l p trình − M t s cơng vi c ph c t p ta l i chia thành nh ng công vi c nh h n ti p t c v i nh ng cơng vi c nh h n ó ng Các b c gi i tốn máy tính c h c thu c ta l i Trang u trúc d li u gi i thu t Trong trình tinh ch t ng b c, ta ph i a nh ng bi u di n d li u Nh v y v i s tinh ch công vi c, d li u c ng c tinh ch d n, có c u trúc h n, th hi n rõ h n m i liên h gi a d li u Ph ng pháp tinh ch t ng b c m t th hi n c a t gi i quy t v n t xu ng, giúp cho ng i l p trình có c m t nh h ng th hi n phong cách vi t ch ng trình Tránh vi c mò m m, xóa i vi t l i nhi u l n, bi n ch ng trình thành t gi y nháp… 0.5 Ki m th 0.5.1 Ch y th tìm l i Ch ng trình n i vi t ra, mà ã ng i c ng có th nh m l n M t ch ng trình vi t xong ch a ch c ã c ch y máy tính cho k t qu mong mu n K n ng tìm l i, s a l i, u ch nh l i ch ng trình c ng m t k ng quan tr ng c a ng i l p trình K n ng ch có c b ng kinh nghi m tìm s a ch a l i c a Có ba lo i l i: v L i cú pháp: l i th ng g p nh t nh ng d s a nh t, ch c n n m v ng ngôn ng l p trình M t ng i c coi khơng bi t l p trình n u khơng bi t s a l i cú pháp v L i cài t: vi c cài t th hi n khơng úng thu t tốn ã nh, i v i l ph i xem l i t ng th ch ng trình, k t h p v i ch c n ng g r i s a l i cho úng v L i thu t toán: l i g p nh ng nguy hi m nh t, n u nh ph i u ch nh l i thu t toán, n u n ng có ph i lo i b hồn tồn thu t tốn sai làm l i t u 0.5.2 Xây d ng b Test Có nhi u ch ng trình r t khó ki m tra tính úng n Nh t khơng bi t n k t qu úng th Vì v y n u nh ch ng trình vãn ch y k t qu (không bi t úng sai th nào) vi c tìm l i r t khó kh n Khi ó ta nên làm b test th ch ng trình c a Các b test nên t file v n b n, b i vi c t o m t file v n b n r t nhanh m i l n ch y th ch c n thay tên file d li u vào xong, không c n gõ l i b test t bàn phím Kinh nghi m làm b test là: − B t u v i m t b test nh , n gi n, làm b ng tay c ng có sánh v i k t qu ch ng trình ch y − Các b test ph i a d ng, tránh l p i l p l i b test t − Có m t vài b test l n ch ki m tra tính ch u ng c a ch ng trình mà thơi K t qu có úng hay khơng a s tr ng h p khơng th ki m ch ng c v i b test c áp s so ng t u ý r ng ch ng trình ch y qua c h t test khơng có ngh a ch ng trình ó ã úng B i có th ta ch a xây d ng c b test làmcho ch ng trình ch y sai Vì v y n u có th , ta nên tìm cách ch ng minh tính úng n c a thu t tốn ch ng trình, i u th ng r t khó Ch ng Các b c gi i toán máy tính Trang u trúc d li u gi i thu t 0.6 T i u ch ng trình M t ch ng trình ã ch y úng khơng có ngh a vi c l p trình ã xong, ta ph i s a i l i m t vài chi ti t ch ng trình có th ch y nhanh h n, hi u qu h n Thơng th ng, tr c ki m th ta nên t m c tiêu vi t ch ng trình cho n gi n, mi n ch y k t qu úng c, sau ó t i u ch ng trình, ta xem l i nh ng ch vi t ch a t t t i u l i mã l nh ch ng trình ng n g i h n, ch y nhanh n Không nên vi t t i âu t i u mã n ó, b i ch ng trình có mã l nh t i u th ng ph c t p, khó ki m sốt Ta nên t i u ch ng trình theo tiêu chu n sau: v Tính tin c y: Ch ng trình ph i ch y úng nh d nh, mô t úng m t gi i thu t úng Thông th ng vi t ch ng trình, ta ln có thói quen ki m tra tính úng n c a b c m i có th v Tính uy n chuy n: Ch ng trình ph i d s a i B i có ch ng trình vi t ã hồn h o c mà v n ph i s a i l i Ch ng trình vi t d s a i s làm gi m b t công s c c a l p trình viên phát tri n ch ng trình v Tính sáng: Ch ng trình vi t d làm gì, n u có ti n hay bi n i c ch ch ng trình ph thu c r t nhi c d hi u, sau m t th i gian dài, c l i hi u u ki n có th s a sai (n u phát hi n l i m i), c i ng trình gi i quy t tốn khác Tính sáng c a u vào cơng c l p trình phong cách l p trình v Tính h u hi u: Ch ng trình ph i ch y nhanh t n b nh , t c ti t ki m c c v không gian th i gian có m t ch ng trình h u hi u, c n ph i có gi i thu t t t nh ng ti u x o l p trình Tuy nhiên, vi c áp d ng nhi u ti u x o có th n ch ng trình tr nên r i r m, khó hi u s a i Tiêu chu n h u hi u nên d ng l i m c ch p nh n c, không quan tr ng b ng ba tiêu chu n B i phàn c ng phát tri n r t nhanh, yêu c u h u hi u không c n t n ng T nh ng phân tích trên, nh n th y r ng vi c làm m t ch ng trình òi h i r t nhi u công n tiêu t n nhi u công s c Ch m t công n khơng h p lý s làm t ng chi phí vi t ch ng trình Ngh cách gi i quy t v n ã khó, bi n ý t ng ó thành hi n th c c ng khơng d chút Ch ng Các b c gi i tốn máy tính Trang u trúc d li u gi i thu t Ch ng ng quan v c u trúc d li u gi i thu t 1.1 Vai trò c a c u trúc d li u m t án tin h c Th c hi n gi i m t toán tin h c chuy n tốn th c t thành tốn có th gi i quy t máy tính M t tốn th c t b t k u bao g m i t ng d li u yêu c u x lý i t ng ó Vì th , xây d ng tốn tin h c ph n ánh c toán th c t c n tr ng n hai v n : v T ch c bi u di n it ng th c t : Các thành ph n d li u th c t a d ng, phong phú th ng ch a ng nh ng quan h ó v i nhau, ó tốn tin h c c n ph i t ch c, xây d ng c u trúc d li u thích h p nh t cho v a có th ph n ánh xác d li u th c t này, v a có th d dàng dùng máy tính x lý Cơng vi c g i xây d ng c u trúc d li u cho toán v Xây d ng thao tác x lý d li u: T nh ng yêu c u x lý th c t , c n tìm gi i thu t t ng ng xác nh trình t thao tác máy tính ph i thi hành cho k t qu mong mu n, ây c xây d ng gi i thu t cho toán Tuy nhiên gi i quy t m t tốn máy tính, th ng có khuynh ng ch tr ng n vi c xây d ng gi i thu t mà quyên i t m quan tr ng c a vi c t ch c d li u toán Gi i thu t ph n ánh phép x lý, i t ng x lý c a gi i thu t l i d li u Chính d li u ch a ng thơng tin c n thi t th c hi n gi i thu t xác nh c gi i thu t phù h p c n ta c n ph i bi t tác ng n lo i d li u l a ch n c u trúc d li u c ng c n ph i hi u rõ nh ng thao tác tác ng lên d li u ó Nh v y m t toán tin h c, c u trúc d li u gi i thu t có m i quan h ch t ch v i nhau, c th hi n qua công th c: C u trúc d li u + Gi i thu t = Ch ng trình V i m t c u trúc d li u ã ch n, s có nh ng gi i thu t t ng ng, phù h p Khi c u trúc d li u thay i th ng gi i thu t c ng ph i thay i theo tránh vi c x lý ng ép, thi u t nhiên m t c u trúc không phù h p H n n a, m t c u trúc d li u t t s giúp gi i thu t x lý ó có th phát huy tác d ng t t h n, v a nhanh v a ti t ki m v t t , gi i thu t c ng n gi n d hi u h n 1.2 Các tiêu chu n ánh giá c u trúc d li u Do t m quan tr ng c a c u trúc d li u vi c gi i toán máy tính, nên nh t thi t ph i tr ng n vi c l a ch n m t ph ng án t ch c d li u thích h p M t c u trúc d li u t t ph i tho mãn tiêu chu n sau: 1.2.1 Ph n ánh úng th c t ây tiêu chu n quan tr ng nh t, quy t nh tính úng n c a tồn b toán C n xem xét k l ng c ng nh d trù tr ng thái bi n i c a d li u chu trình ho t ng có th l a ch n c u trúc d li u l u tr th hi n xác i t ng th c t Ch ng T ng quan v c u trúc d li u gi i thu t Trang u trúc d li u gi i thu t Ví d : M t s tình hu ng ch n c u trúc l u tr sai − Ch n bi n s nguyên integer l u tr ti n th ng bán hàng ( c tính theo cơng th c ti n th ng bán hàng = tr giá hàng *5%), v y làm tròn m i giá tr ti n th ng s gây thi t h i cho nhân viên bán hàng Tr ng h p ph i s d ng bi n s th c ph n ánh úng k t qu c a cơng th c tính th c t − Trong tr ng trung h c, m i l p có th nh n t i a 25 h c sinh L p hi n có 20 h c sinh, m i tháng, m i h c sinh óng h c phí 15.000 ng Ch n m t bi n s nguyên (kh n ng -32768 ÷ 32767) l u tr t ng s h c phí c a l p h c tháng, n u x y tr ng h p có thêm h c sinh n a vào l p giá tr t ng h c phí thu c 375000 ng, v t kh n ng l u tr c a bi n ã ch n, gây tình tr ng tràn, sai l ch 1.2.2 Phù h p v i thao tác ó Tiêu chu n giúp t ng hi u qu c a toán, vi c phát tri n thu t toán gi n, t nhiên h n, ch ng trình t hi u qu cao h n v t c x lý n 1.2.3 Ti t ki m tài nguyên h th ng C u trúc d li u ch nên s d ng tài nguyên v a m nhi m c ch c n ng c a Thơng th ng có hai lo i tài nguyên c n l u ý nh t: CPU b nh Tiêu chu n nên cân nh c tu vào tình hu ng c th th c hi n toán N u t ch c s d ng tốn c n có nh ng x lý nhanh ch n c u trúc d li u y u t ti t ki m th i gian x lý ph i t n ng h n tiêu chu n s d ng t i a b nh , ng c l i Ví d : M t s tình hu ng ch n c u trúc l u tr lãng phí − S d ng bi n integer (2 bytes) l u tr m t giá tr cho bi t tháng hi n hành Trong tình hu ng ta ch c n s d ng bi n ki u byte − l u tr danh sách h c viên m t l p, s d ng m ng 60 ph n t (gi i h n s h c viên l p t i a 60) N u s l ng h c viên th t s h n 60, gây lãng phí b nh H n n a, s h c viên có th thay i theo t ng k , t ng n m Trong tr ng h p ta c n có m t c u trúc d li u linh ng h n m ng nh danh sách liên k t… 1.3 Ki u d li u c u trúc d li u Máy tính th c s ch có th l u tr d ng nh phân thô s N u mu n ph n ánh c d li u th c t a d ng phong phú, c n ph i xây d ng nh ng phép ánh x , nh ng qui t c t ch c ph c t p che lên t ng d li u thô, nh m a nh ng khái ni m logic v hình th c l u tr khác th ng c g i ki u d li u Nh ã phân tích ph n u, gi a hình th c l u tr thao tác x lý ó có quan h m t thi t v i T ó có th a m t nh ngh a cho ki u d li u nh sau: 1.3.1 nh ngh a ki u d li u Ki u d li u T c xác nh b i b , v i : − V: t p giá tr h p l mà − O : t p thao tác x lý có th thi hành it ng ki u T có th l u tr ; it ng ki u T Ví d : Ch ng T ng quan v c u trúc d li u gi i thu t Trang 10 u trúc d li u gi i thu t 7.2.3 Bi u di n t ng quát b ng nh phân Nh c m c a c u trúc t ng quát b c c a nút có th dao ng m t biên l n ⇒ vi c bi u di n g p nhi u khó kh n lãng phí H n n a, vi c xây d ng thao tác t ng quát ph c t p h n nh phân nhi u Vì v y, th ng n u khơng q c n thi t ph i s d ng t ng quát, ng i ta chuy n t ng quát thành nh phân Ta có th bi n i m t b t k thành m t nh phân theo qui t c sau: − Gi l i nút trái nh t làm nút trái − Các nút l i chuy n thành nút ph i − Nh v y, nh phân m i, trái th hi n quan h cha ph i th hi n quan h anh em t ng qt ban u Ví d : Gi s có t ng quát Cây nh phân t ng ng 7.3 Cây nh phân tìm ki m Cây nh phân tìm ki m (CNPTK) nh phân ó t i m i nút, khóa c a nút ang xét l n h n khóa c a t t c nút thu c trái nh h n khóa c a t t c nút thu c ph i Ví d : Ch ng C u trúc Trang 79 u trúc d li u gi i thu t Nh ràng bu c v khóa CNPTK, vi c tìm ki m tr nên có nh h ng H n n a, c u trúc vi c tìm ki m tr nên nhanh k N u s nút N chi phí tìm ki m trung bình ch kho ng log2N v Duy t Thao tác t nh phân tìm ki m hoàn toàn gi ng nh nh phân Ch có m t l u ý nh t theo th t gi a, trình t nút t qua s cho ta m t dãy nút theo th t t ng d n c a khóa v Tìm m t ph n t x NODE* searchNode(TREE T, DATA X) { if (T != NULL) { if (T->key == X) return T; if (T->key > X) return searchNode(T->pLeft, X); else return searchNode(T->pRight, X); } return NULL; } Ta có th xây d ng m t hàm tìm ki m t ng ng không qui nh sau: NODE * searchNode(TREE Root, DATA x) { NODE *p = Root; while (p != NULL) { if(x == p->key) return p; else if(x < p->key) p = p->pLeft; else p = p->pRight; Ch ng C u trúc Trang 80 u trúc d li u gi i thu t } return NULL; } D dàng th y r ng s l n so sánh t i a ph i th c hi n tìm ph n t X h, v i h chi u cao c a Nh v y thao tác tìm ki m CNPTK có n nút t n chi phí trung bình kho ng O(log2n) Ví d : Tìm ph n t 55 v Thêm m t ph n t x vào Vi c thêm m t ph n t X vào ph i b o m u ki n ràng bu c c a CNPTK Ta có th thêm vào nhi u ch khác cây, nh ng n u thêm vào m t nút s ti n l i nh t ta có th th c hiên trình t ng t thao tác tìm ki m Khi ch m d t trình tìm ki m c ng lúc tìm c ch c n thêm Hàm insert tr v giá tr –1, 0, không b nh , g p nút c hay thành công: int insertNode(TREE &T, DATA X) { if (T != NULL) { if (T->key == X) return 0; // ã có nút ch a d li u X if (T->key > X) return insertNode(T->pLeft, X); else return insertNode(T->pRight, X); } T = new NODE; if (T == NULL) return -1; // thi u b nh T->key = X; T->pLeft =T->pRight = NULL; return 1; // thêm vào thành công } Ví d : Thêm ph n t 50 Ch ng C u trúc Trang 81 u trúc d li u gi i thu t v H y m t ph n t có khóa x Vi c h y m t ph n t CNPTK Có tr X kh i ph i b o u ki n ràng bu c c a ng h p h y nút X có th x y ra: − X nút − X ch có (trái ho c ph i) − X có c o Tr ng h p th nh t: ch khác o Tr ng h p th hai: tr c a Ch m ng C u trúc n gi n h y X khơng móc n i n ph n t c h y X ta móc n i cha c a X v i nh t Trang 82 u trúc d li u gi i thu t o Tr ng h p cu i cùng: ta không th h y tr c ti p X có ⇒ Ta s h y gián ti p Thay h y X, ta s tìm m t ph n t th m ng Y Ph n t có t i a m t Thơng tin l u t i Y s c chuy n lên l u t i X Sau ó, nút b h y th t s s Y gi ng nh tr ng h p u V n ph i ch n Y cho l u Y vào v trí c a X, v n CNPTK Có ph n t th a mãn yêu c u: − Ph n t nh nh t (trái nh t) ph i − Ph n t l n nh t (ph i nh t) trái Vi c ch n l a ph n t ph n t th m ng hồn tồn ph thu c vào ý thích c a ng i l p trình ây, cháng tơi s ch n ph n t (ph i nh t trái làm phân t th m ng Hãy xem ví d d i ây hi u rõ h n: Sau h y ph n t X=18 kh i tình tr ng c a s nh hình d ây (ph n t 23 ph n t th m ng): i Hàm delNode tr v giá tr 1, h y thành công ho c khơng có X cây: int delNode(TREE &T, DATA X) { if (T==NULL) return 0; if (T->key > X) Ch ng C u trúc Trang 83 u trúc d li u gi i thu t return delNode (T->pLeft, X); else if(T->key < X) return delNode (T->pRight, X); else { //T->key == X NODE* p = T; if(T->pLeft == NULL) T = T->pRight; else if(T->pRight == NULL) T else { = T->pLeft; //T có c NODE* q = T->pRight; searchStandFor(p, q); } delete p; } return 1; } Trong ó, hàm searchStandFor c vi t nh sau: void searchStandFor(TREE &p, TREE &q) { if(q->pLeft) searchStandFor(p, q->pLeft); else { p->key = q->key; p = q; q = q->pRight; } } v T o m t CNPTK Ta có th t o m t nh phân tìm ki m b ng cách l p l i trình thêm ph n t vào m t r ng v H y toàn b CNPTK Vi c tồn b có th c th c hi n thông qua thao tác t theo th t sau Ngh a ta s h y trái, ph i r i m i h y nút g c void removeTree(TREE &T) { if(T!=NULL) { Ch ng C u trúc Trang 84 u trúc d li u gi i thu t removeTree(T->pLeft); removeTree(T->pRight); delete(T); } } 7.4 ánh giá T t c thao tác searchNode, insertNode, delNode CNPTK t p trung bình O(h), v i h chi u cao c a u có ph c Trong tr ng h p t t nh t, CNPTK có n nút s có cao h = log2(n) Chi phí tìm ki m ó s t ng ng tìm ki m nh phân m ng có th t Tuy nhiên, tr ng h p x u nh t, có th b suy bi n thành DSLK (khi mà m i nút u ch có tr nút lá) Lúc ó thao tác s có ph c t p O(n) Vì v y c n có c i ti n c u trúc c a CNPTK t c chi phí cho thao tác log2(n) 7.5 Cây nh phân cân b ng 7.5.1 Cây nh phân cân b ng hoàn toàn Cây nh phân cân b ng hoàn toàn nh phân tìm ki m mà t i m i nút c a nó, s nút c a trái chênh l ch không m t so v i s nút c a ph i − M t r t khó t c tr ng thái cân b ng hoàn toàn c ng r t d m t cân b ng thêm hay h y nút có th làm m t cân b ng (xác su t r t l n), chi phí cân b ng l i l n ph i thao tác toàn b − Tuy nhiên n u cân i vi c tìm ki m s nhanh i v i cân b ng hoàn toàn, tr ng h p x u nh t ta ch ph i tìm qua log2n ph n t (n s nút cây) Sau ây ví d m t cân b ng hồn tồn (CCBHT): − CCBHT có n nút có chi u cao h ≥ log2n ây lý cho phép b o kh n ng tìm ki m nhanh CTDL m − Do CCBHT m t c u trúc n nh nên th c t không th s d ng Nh ng u i m c a l i r t quan tr ng Vì v y, c n a m t CTDL khác có c tính gi ng CCBHT nh ng n nh h n Ch ng C u trúc Trang 85 u trúc d li u gi i thu t − Nh v y, c n tìm cách t ch c m t t tr ng thái cân b ng y u h n vi c cân b ng l i ch x y ph m vi c c b nh ng v n ph i b o m chi phí cho thao tác tìm ki m t m c O(log2n) 7.5.2 Cây nh phân cân b ng (AVL) Cây nh phân tìm ki m cân b ng mà t i m i nút c a trái c a ph i chênh l ch không m t cao c a AVL tên vi t t t c a tác gi ng i Nga ã a nh ngh a c a cân b ng Adelson-Velskii Landis (1962) Vì lý này, ng i ta g i nh phân cân ng AVL Tù v sau, s dùng thu t ng AVL thay cho cân b ng T c gi i thi u, AVL ã nhanh chóng tìm th y ng d ng nhi u toán khác Vì v y, mau chóng tr nên th nh hành thu hút nhi u nghiên c u T AVL, ng i ta ã phát tri n thêm nhi u lo i CTDL h u d ng khác nh - en (Red-Black Tree), B-Tree, … i ây ví d cân b ng (l u ý, không ph i cân b ng hoàn toàn): − D dàng th y CCBHT cân b ng u ng c l i không úng v Ch s cân b ng c a m t nút: Ch s cân b ng c a m t nút hi u c a chi u cao ph i trái c a i v i m t cân b ng, ch s cân b ng (CSCB) c a m i nút ch có th mang m t ba giá tr sau ây: − CSCB(p) = cao trái (p) = cao ph i (p) − CSCB(p) = cao trái (p) < cao ph i (p) − CSCB(p) =-1 cao trái (p) > cao ph i (p) kh o sát cân b ng, ta c n l u thêm thông tin v ch s cân b ng t i m i nút Lúc ó, cân b ng có th c khai báo nh sau: typedef struct AVLNode { char balFactor; //Ch s cân b ng DATA key; struct AVLNode* pLeft; Ch ng C u trúc Trang 86 u trúc d li u gi i thu t struct AVLNode* pRight; }; typedef struct AVLNode AVLNODE; typedef AVLNODE *AVLTREE; Bài t p: Cài t ch ng trình mơ ph ng tr c quan thao tác nh phân, nh phân tìm ki m Vi t hàm xác nh thông tin c a nh phân T: • S nút • S nút có úng • S nút có úng • S nút có khóa nh h n x (gi s T CNPTK) • S nút có khóa l n h n x (gi s T CNPTK) • S nút có khóa l n h n x nh h n y (T CNPTK) • Chi u cao c a • In t t c nút t ng (m c) th k c a T • In t t c nút theo th t t t ng chi u cao c a T) n t ng th h-1 c a T (h • Ki m tra xem T có ph i cân b ng hồn tồn khơng • l ch l n nh t ( l ch c a m t nút l ch gi a chi u cao c a trái ph i c a l ch l n nh t l ch c a nút có l ch l n nh t) Xét thu t gi i t o nh phân tìm ki m N u th t khóa nh p vào nh sau: 20 11 30 18 hình nh t o c nh th ? Sau ó, n u h y l n l t nút theo th t nh sau : 18, 20 s thay i nh th t ng b pháp h y nút có c trái ph i) c h y, v s (nêu rõ ph ng Gi s A m t m ng s th c ã có th t t ng Hãy vi t hàm t o m t nh phân tìm ki m có chi u cao th p nh t t ph n t c a A Ch ng C u trúc Trang 87 BÀI TẬP LỚN MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐỀ TÀI 1: CÀI ĐẶT CƠNG CỤ KIỂM TRA CHÍNH TẢ SPELL CHECKER Sơ lược tốn Kiểm tra lỗi tả qui trình kiểm tra từ có tả hay khơng dựa từ điển có sẵn Đây qui trinh sử dụng nhiều ứng dụng phần mềm soạn thảo văn từ điển điện tử Việc cài đặt chương trình kiểm tra lỗi tả dựa túy việc kiểm tra từ điển xây dựng sẵn cấu trúc liệu Tuy nhiên có chương trình thực thao tác từ đưa vào khơng tả đưa số từ tả , gợi ý để người dùng nhanh chóng sửa lại lỗi Việc làm đòi hỏi thêm số thao tác kiểm tra Yêu cầu • Yêu cầu tập lựa chọn cấu trúc liệu thích hợp để cài đặt từ điển lưu trữ số lượng lớn từ Khai báo cài đặt thuật toán cho phép thêm từ vào từ điển, xóa từ có sẵn từ điển • Cài đặt chương trình cho phép sử dụng từ điển có sẵn lưu trữ cấu trúc vừa xây dựng thực công việc kiểm tra xem từ đưa vào có tả hay khơng • Tìm hiểu giải thuật để thực việc đưa số từ gợi ý sửa lỗi tả cài đặt giải thuật Chú ý • Ngơn ngữ lập trình : Tùy chọn, ưu tiên sử dụng Java C++ • Sinh viên cần phải viết chương trình để kiểm thử kết hoạt động thao tác cài đặt • SInh viên nên cung cấp giao diện để người dung tự nhập liệu đầu vào kiểm thử thao tác cài đặt Cấu trúc liệu Giải thuật – TTM & KTMT K51 – Khoa CNTT – ĐHBKHN BÀI TẬP LỚN MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐỀ TÀI 2: CÁC GIẢI THUẬT SẮP XẾP Yêu cầu: Trong chương trình mơn học Cấu trúc liệu giải thuật, có xem xét số giải thuật khác để thực việc xếp dãy số theo chiều tăng dần hay giảm dần Hãy tìm hiểu phương pháp xếp kiểu phân đoạn , xếp kiểu vun đống , xếp kiểu hòa nhập So sánh phương pháp xếp Cài đặt số phương pháp xếp đó, thiết lập giao diện đồ họa để minh họa phương pháp xếp Đưa qui trình kiểm thử để đánh giá giải thuật cài đặt phương pháp thực nghiệm Khi cài đặt phương pháp, ý đến việc cho phép hiển thị rõ bước thực giải thuật để thấy đặc trưng giải thuật Chú ý • Ngơn ngữ lập trình : Tùy chọn • Sinh viên cần phải viết chương trình để kiểm thử kết hoạt động thao tác cài đặt • SInh viên nên cung cấp giao diện để người dùng tự nhập liệu đầu vào kiểm thử thao tác cài đặt Cấu trúc liệu Giải thuật – TTM & KTMT K51 – Khoa CNTT – ĐHBKHN BÀI TẬP LỚN MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐỀ TÀI 3: CẤU TRÚC ĐỒ THỊ VÀ BÀI TỐN TÌM ĐƯỜNG ĐI NGẮN NHẤT Sơ lược toán Hãy xem xét toán thực tế việc chuyển gói liệu mạng máy tính Một mạng máy tính bao gồm nhiều router nối với thơng qua dây cáp Một router nguồn, đích trạm trung chuyển gói liệu mạng Một mạng hình dung đồ thị với router đỉnh đồ thị đường nối router đóng vai trò cung nối đỉnh đồ thị Một mạng máy tính tuân thủ theo giao thức OPSF tức sử dụng đường ngắn xác định sử dụng giải thuật Dijkstra Trong phạm vi tập lớn này, hình dung mạng đồ thị trọng số, vô hướng Các cung đồ thị gắn trọng số coi thời gian để chuyển gói liệu hai router biểu diễn hai đỉnh đầu cung Yêu cầu : Các yêu cầu tập lớn sau • Khai báo cài đặt cấu trúc liệu ĐỒ THỊ cho phép tạo lập cập nhật đồ thị trọng số vô hướng Mỗi đỉnh đồ thị đặc trưng tên xâu ký tự chứa chữ chữ số Mỗi cung đồ thị xác lập cặp đỉnh trọng số số thực • Cài đặt thao tác đồ thị sau o Khởi tạo đồ thị ban đầu rỗng o InsertEdge(Vertex s, Vertex d, float weight) : bổ sung cung có trọng số w hai đỉnh s, d o InsertVertex(name) : thêm đỉnh vào đồ thị o GetWeight(Vertex s, Vertex d): lấy trọng số cạnh o ShortestPath (Vertex s, Vertex d) : Tìm đường ngắn từ s đến d ngữ cảnh đồ thị (cài đặt giải thuật Dijkstra) o Print: hiển thị trạng đồ thị Để sử dụng cho ứng dụng tìm đường truyền mạng, cài đặt thao tác sau: o EdgeDown(Vertex s, Vertex d) : đánh dấu cạnh sử dụng, khơng dùng o EdgeUp(Vertex s, Vertex d) Giải phóng việc sử dụng cạnh o VertexDown(name) : Đánh dấu đỉnh sử dụng o VertexUp(name) : Giải phóng việc sử dụng đỉnh, đỉnh trở nên dùng Chú ý • Ngơn ngữ lập trình : Tùy chọn, ưu tiên sử dụng Java C++ • Sinh viên cần phải viết chương trình để kiểm thử kết hoạt động thao tác cài đặt • SInh viên nên cung cấp giao diện để người dung tự nhập liệu đầu vào kiểm thử thao tác cài đặt Cấu trúc liệu Giải thuật – TTM & KTMT K51 – Khoa CNTT – ĐHBKHN BÀI TẬP LỚN MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐỀ TÀI 4: CẤU TRÚC ĐỒ THỊ VÀ BÀI TỐN TÌM CÂY KHUNG CỰC TIỂU Sơ lược tốn Bài tốn tìm khung cực tiểu cấu trúc đồ thị toán áp dụng nhiều thực tế Trong ngữ cảnh cấu trúc đồ thị , T đồ thị hai đỉnh đồ thị nối với đường Cho đồ thị G, khung T1 G phần G mà chứa tất đỉnh đồ thị G Một đồ thị có nhiều khung Nếu đồ thị cho ban đầu đồ thị trọng số tính trọng số khung tổng tất trọng số cạnh Một khung có trọng số nhỏ gọi khung cực tiểu đồ thị Yêu cầu : Các yêu cầu tập lớn sau • Khai báo cài đặt cấu trúc liệu ĐỒ THỊ cho phép tạo lập cập nhật đồ thị trọng số vô hướng Mỗi đỉnh đồ thị đặc trưng số tự nhiên có giá trị đồ thị Mỗi cung đồ thị xác lập cặp đỉnh trọng số số thực • Cài đặt thao tác đồ thị sau o Khởi tạo đồ thị ban đầu rỗng o InsertEdge(Vertex s, Vertex d, float weight) : bổ sung cung có trọng số w hai đỉnh s, d o InsertVertex(name) : thêm đỉnh vào đồ thị o GetWeight(Vertex s, Vertex d): lấy trọng số cạnh o Print: hiển thị trạng đồ thị • Tìm hiểu hai thuật tốn Kruskal Prim để tìm khung cực tiểu đồ thị trọng số cho trước, so sánh hai giải thuật mặt hiệu • Cài đặt hai giải thuật tìm hiểu • Xây dựng chương trình nhận đầu vào file text chứa thông tin đồ thị cho trước, tạo lập đồ thị rõ bước hoạt động giải thuật tìm khung cực tiểu cài đặt đồ thị tạo lập Chú ý • Ngơn ngữ lập trình : Tùy chọn, ưu tiên sử dụng Java C++ • Sinh viên cần phải viết chương trình để kiểm thử kết hoạt động thao tác cài đặt • SInh viên nên cung cấp giao diện để người dung tự nhập liệu đầu vào kiểm thử thao tác cài đặt Cấu trúc liệu Giải thuật – TTM & KTMT K51 – Khoa CNTT – ĐHBKHN BÀI TẬP LỚN MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐỀ TÀI 5: CẤU TRÚC CÂY NHỊ PHÂN TÌM KIẾM CÂN BẰNG Sơ lược tốn • Cây nhị phân tìm kiếm cấu trúc đặc biệt, sử dụng tốn tìm kiếm Mơ tả nhị phân tìm kiếm tham khảo sách giáo trình môn học Cây AVL dạng đặc biệt nhị phân tìm kiếm , mơ tả AVL có sách giáo trình u cầu Hãy khai báo lớp đối tượng dạng nhị phân tìm kiếm có tên BST chấp nhận nút nhận giá trị số nguyên sử dụng kiểu lưu trữ móc nối Cài đặt thao tác sau nhị phân tìm kiêm: a Create(): Khởi tạo rỗng, thủ tục trả trỏ trỏ tới gốc cây, trỏ ban đầu có giá trị khơng xác định b Contain(T,x) : Thực việc tìm kiếm , xác định xem có nút có giá trị x cho trước hay khơng? Nếu có, số nút chứa giá trị c Insert(T, x) : Bổ sung nút có giá trị x cho trước vào T Trong trình bổ sung có thực tìm kiếm, giá trị x có cây, khơng cần tiến hành bổ sung d Delete(T,x): Loại bỏ nút có giá trị x cho trước khỏi T e Print(T) : Thủ tục cho phép hiển thị T lên hình f IsAVL(T) : Kiểm tra xem T có phải AVL khơng? Phần mở rộng: Mở rộng thủ tục Insert để đáp ứng yêu cầu AVL (thực thao tác quay để đảm bảo tính cân cây) Chú ý • Ngơn ngữ lập trình : Tùy chọn, ưu tiên sử C, Java C++ • Sinh viên cần phải viết chương trình để kiểm thử kết hoạt động thao tác cài đặt • SInh viên nên cung cấp giao diện để người dung tự nhập liệu đầu vào kiểm thử thao tác cài đặt Cấu trúc liệu Giải thuật – TTM & KTMT K51 – Khoa CNTT – ĐHBKHN BÀI TẬP LỚN MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐỀ TÀI 6: Các giải thuật cho toán đối sánh mẫu Sơ lược toán Đối sánh mẫu ( Pattern matching) toán tìm xuất xâu ký tự mẫu (pattern) văn Bài tốn áp dụng số lĩnh vực tìm kiếm thông tin, xử lý văn , chương trình soạn thảo văn Yêu cầu Tìm hiểu giải thuật cho toán đối sánh mẫu - Giải thuật Naïve - Giải thuật Knutt-Morris-Pratt (KMP) - Giải thuật Boyer-Moore (BM) So sánh giải thuật Cài đặt chương trình demo số giải thuật trên, Chương trình demo cần cho phép người sử dụng nhập liệu đầu vào cách linh hoạt cho người sử dụng nhìn thấy bước xử lý giải thuật trình xác định vị trí xuất mẫu văn đầu vào Cấu trúc liệu Giải thuật – TTM & KTMT K51 – Khoa CNTT – ĐHBKHN ... > %d", x, y); else { Move(n - 1, x, - x - y); // Chuy n n - Move(1, x, y); // Chuy n a t x sang v trí l i a to nh t t x sang y Move(n - 1, - x - y, y); // Chuy n n - a t v trí l i sang v trí y... ng chuy n n - a gi a hai v trí ta c n 2n-1 - phép chuy n a, ó chuy n n a t v trí x sang v trí y, nhìn vào gi i thu t quy ta có th th y r ng t ng h p c n (2n-1 - 1) + + (2n-1 - 1) = n - phép chuy... a[5] = (1, 7, -3 , 8, 19); Trong tr ng h p C cho phép ta khai báo m t cách ti n l i h n: int a[] = (1, 7, -3 , 8, 19); int b[ ][ ]={{1, 7, -3 , 8, 19}, {4, 5, 2, 8, 9}, {21, -7 , 45, -3 , 4}}; (m ng