Lý thuyết cấu trúc dữ liệu và giải thuật đầy đủ.
HC VIN CÔNG NGH BU CHÍNH VIN THÔNG CU TRÚC D LIU VÀ GII THUT (Dùng cho sinh viên h đào to đi hc t xa) Lu hành ni b HÀ NI - 2007 LI NÓI U Cu trúc d liu và gii thut là mt trong nhng môn hc c bn ca sinh viên ngành Công ngh thông tin. Các cu trúc d liu và các gii thut đc xem nh là 2 yu t quan trng nht trong lp trình, đúng nh câu nói ni ting ca Niklaus Wirth: Chng trình = Cu trúc d liu + Gii thut (Programs = Data Structures + Algorithms). Nm vng các cu trúc d liu và các gii thut là c s đ sinh viên tip cn vi vi c thit k và xây dng phn mm cng nh s dng các công c lp trình hin đi. Cu trúc d liu có th đc xem nh là 1 phng pháp lu tr d liu trong máy tính nhm s dng mt cách có hiu qu các d liu này. Và đ s dng các d liu mt cách hiu qu thì cn phi có các thut toán áp dng trên các d liu đó. Do v y, cu trúc d liu và gii thut là 2 yu t không th tách ri và có nhng liên quan cht ch vi nhau. Vic la chn mt cu trúc d liu có th s nh hng ln ti vic la chn áp dng gii thut nào. Tài liu “Cu trúc d liu và gii thut” bao gm 7 chng, trình bày v các cu trúc d liu và các gii thut c bn nh t trong tin hc. Chng 1 trình bày v phân tích và thit k thut toán. u tiên là cách phân tích 1 vn đ, t thc tin cho ti chng trình, cách thit k mt gii pháp cho vn đ theo cách gii quyt bng máy tính. Tip theo, các phng pháp phân tích, đánh giá đ phc tp và thi gian thc hin gii thut cng đc xem xét trong chng. Chng 2 trình bày v đ qui, mt khái nim rt c bn trong toán hc và khoa hc máy tính. Vi c s dng đ qui có th xây dng đc nhng chng trình gii quyt đc các vn đ rt phc tp ch bng mt s ít câu lnh, đc bit là các vn đ mang bn cht đ qui. Chng 3, 4, 5, 6 trình bày v các cu trúc d liu đc s dng rt thông dng nh mng và danh sách liên kt, ngn xp và hàng đi, cây, đ th. ó là các c u trúc d liu cng rt gn gi vi các cu trúc trong thc tin. Chng 7 trình bày v các thut toán sp xp và tìm kim. Các thut toán này cùng vi các k thut đc s dng trong đó đc coi là các k thut c s cho lp trình máy tính. Các thut toán đc xem xét bao gm các lp thut toán đn gin và c các thut toán cài đt phc tp nhng có thi gian thc hin ti u. Cui mi phn đu có các câu hi và bài tp đ sinh viên ôn luyn và t kim tra kin thc ca mình. Cui tài liu có các ph lc hng dn tr li câu hi, mã ngun tham kho và tài liu tham kho. V nguyên tc, các cu trúc d liu và các gii thut có th đc biu din và cài đt bng bt c ngôn ng lp trình hin đi nào. Tuy nhiên, đ có đc các phân tích sâu sc h n và có kt qu thc t hn, tác gi đã s dng ngôn ng lp trình C đ minh ho cho các cu trúc d liu và thut toán. Do vy, ngoài các kin thc c bn v tin hc, ngi đc cn có kin thc v ngôn ng lp trình C. Cui cùng, mc dù đã ht sc c gng nhng chc chn không tránh khi các thiu sót. Tác gi rt mong nhn đc s góp ý ca bn đc và đng nghip đ tài liu đc hoàn thin hn. Hà Ni, tháng 10/2007 3 CHNG 1 PHÂN TÍCH VÀ THIT K GII THUT Chng 1 trình bày các khái nim v gii thut và phng pháp tinh chnh tng bc chng trình đc th hin qua ngôn ng din đt gii thut. Chng này cng nêu phng pháp phân tích và đánh giá mt thut toán, các khái nim liên quan đn vic tính toán thi gian thc hin chng trình. Trong mi phn đu có các minh ho c th. Phn đu đa ra ví d v bài toán nút giao thông và phng pháp gii quyt bài toán t phân tích v n đ cho đn thit k gii thut, tinh chnh tng bc cho ti mc c th hn. Phn 2 đa ra mt ví d v phân tích và tính toán thi gian thc hin gii thut sp xp ni bt. hc tt chng này, sinh viên cn nm vng phn lý thuyt và tìm các ví d tng t đ thc hành phân tích, thit k, và đánh giá gii thut. 1.1 GII THUT VÀ NGÔN NG DIN T GII THUT 1.1.1 Gii thut Trong thc t, khi gp phi mt vn đ cn phi gii quyt, ta cn phi đa ra 1 phng pháp đ gii quyt vn đ đó. Khi mun gii quyt vn đ bng cách s dng máy tính, ta cn phi đa ra 1 gii pháp phù hp vi vic thc thi bng các ch ng trình máy tính. Thut ng “thut toán” đc dùng đ ch các gii pháp nh vy. Thut toán có th đc đnh ngha nh sau: Thut toán là mt chui hu hn các lnh. Mi lnh có mt ng ngha rõ ràng và có th đc thc hin vi mt lng hu hn tài nguyên trong mt khong hu hn thi gian. Chng hn lnh x = y + z là mt lnh có các tính cht trên. Trong mt thu t toán, mt lnh có th lp đi lp li nhiu ln, tuy nhiên đi vi bt k b d liu đu vào nào, thut toán phi kt thúc sau khi thc thi mt s hu hn lnh. Nh đã nói trên, mi lnh trong thut toán phi có ng ngha rõ ràng và có th đc thc thi trong mt khong thi gian hu hn. Tuy nhiên, đôi khi mt lnh có ng ngha rõ ràng đi vi ngi này nhng li không rõ ràng đi vi ngi khác. Ngoài ra, thng rt khó đ chng minh mt lnh có th đc thc hin trong 1 khong hu hn thi gian. Thm chí, k c khi bit rõ ng ngha ca các lnh, cng khó đ có th chng minh là vi bt k b d liu đu vào nào, thut toán s dng. Tip theo, chúng ta s xem xét mt ví d v xây dng thut toán cho bài toán đèn giao thông: Gi s ngi ta cn thit k mt h thng đèn cho mt nút giao thông có nhiu đng giao nhau phc tp. xây dng tp các trng thái ca các đèn giao thông, ta cn phi xây dng mt chng trình có đu vào là tp các ngã r đc phép ti nút giao thông (li đi thng cng đc xem nh là 1 ngã r) và chia tp này thành 1 s ít nht các nhóm, sao cho tt c các ngã r trong nhóm có th đc đi cùng lúc mà không xy ra tranh chp. Sau đó, chúng ta s gn trng thái ca các đèn giao thông vi mi nhóm va đc phân chia. Vi cách phân chia có s nhóm ít nht, ta s xây dng đc 1 h thng đèn giao thông có ít trng thái nht. 4 Chng hn, ta xem xét bài toán trên vi nút giao thông đc cho nh trong hình 1.1 di. Trong nút giao thông trên, C và E là các đng 1 chiu, các đng còn li là 2 chiu. Có tt c 13 ngã r ti nút giao thông này. Mt s ngã r có th đc đi đng thi, chng hn các ngã r AB (t A r sang B) và EC. Mt s ngã r thì không đc đi đng thi (gây ra các tuyn giao thông xung đt nhau), chng hn AD và EB. H thng đèn ti nút giao thông phi hot đ ng sao cho các ngã r xung đt (chng hn AD và EB) không đc cho phép đi ti cùng mt thi đim, trong khi các ngã r không xung đt thì có th đc đi ti cng 1 thi đim. Hình 1.1 Nút giao thông Chúng ta có th mô hình hóa vn đ này bng mt cu trúc toán hc gi là đ th (s đc trình bày chi tit chng 5). th là mt cu trúc bao gm 1 t p các đim gi là đnh và mt tp các đng ni các đim, gi là các cnh. Vn đ nút giao thông có th đc mô hình hóa bng mt đ th, trong đó các ngã r là các đnh, và có mt cnh ni 2 đnh biu th rng 2 ngã r đó không th đi đng thi. Khi đó, đ th ca nút giao thông hình 1.1 có th đc biu din nh hình 1.2. Hình 1.2 th ngã r A B C D E ACAB AD BCBA BD DBDA DC EBEA EC ED 5 Ngoài cách biu din trên, đ th còn có th đc biu din thông qua 1 bng, trong đó phn t hàng i, ct j có giá tr 1 khi và ch khi có 1 cnh ni đnh i và đnh j. AB AC AD BA BC BD DA DB DC EA EB EC ED AB 1 1 1 1 AC 1 1 1 1 1 AD 1 1 1 BA BC 1 1 1 BD 1 1 1 1 1 DA 1 1 1 1 1 DB 1 1 1 DC EA 1 1 1 EB 1 1 1 1 1 EC 1 1 1 1 ED Bng 1.1 Biu din đ th ngã r bng bng Ta có th s dng đ th trên đ gii quyt vn đ thit k h thng đèn cho nút giao thông nh đã nói. Vic tô màu mt đ th là vic gán cho mi đnh ca đ th mt màu sao cho không có hai đnh đc ni bi 1 cnh nào đó li có cùng mt màu. D thy rng v n đ nút giao thông có th đc chuyn thành bài toán tô màu đ th các ngã r trên sao cho phi s dng s màu ít nht. Bài toàn tô màu đ th là bài toán đã xut hin và đc nghiên cu t rt lâu. Tuy nhiên, đ tô màu mt đ th bt k vi s màu ít nht là bài toán rt phc tp. gii bài toán này, ngi ta thng s dng phng pháp “vét cn” đ th tt c các kh nng có th . Có ngha, đu tiên th tin hành tô màu đ th bng 1 màu, tip theo dùng 2 màu, 3 màu, v.v. cho ti khi tìm ra phng pháp tô màu tho mãn yêu cu. Phng pháp vét cn có v thích hp vi các đ th nh, tuy nhiên đi vi các đ th phc tp thì s tiêu tn rt nhiu thi gian thc hin cng nh tài nguyên h thng. Ta có th tip cn vn đ theo hng c gng tìm ra mt gii pháp đ tt, không nht thit phi là gii pháp ti u. Chng hn, ta s c gng tìm mt gii pháp tô màu cho đ th ngã r trên vi mt s màu khá ít, gn vi s màu ít nht, và thi gian thc hin vic tìm gii pháp là khá nhanh. Gii thut tìm các gii pháp đ tt nhng cha phi ti u nh vy gi là các gii thut tìm theo “cm tính”. i vi bài toán tô màu đ th, mt thut toán cm tính thng đc s dng là thut toán “tham n” (greedy). Theo thut toán này, đu tiên ta s dng mt màu đ tô nhiu nht s đnh có th, tho mãn yêu cu bài toán. Tip theo, s dng màu th 2 đ tô các đnh cha đc tô trong bc 1, ri s dng đn màu th 3 đ tô các đnh cha đc tô trong bc 2, v.v. 6 tô màu các đnh vi màu mi, chúng ta thc hin các bc: - La chn 1 đnh cha đc tô màu và tô nó bng màu mi. - Duyt qua các đnh cha đc tô màu. Vi mi đnh dng này, kim tra xem có cnh nào ni nó vi mt đnh va đc tô bi màu mi hay không. Nu không có cnh nào thì ta tô màu đnh này bng màu mi. Thut toán này đc gi là “tham n” vì ti mi bc nó tô màu t t c các đnh có th mà không cn phi xem xét xem vic tô màu đó có đ li nhng đim bt li cho các bc sau hay không. Trong nhiu trng hp, chúng ta có th tô màu đc nhiu đnh hn bng 1 màu nu chúng ta bt “tham n” và b qua mt s đnh có th tô màu đc trong bc trc. Ví d, xem xét đ th hình 1.3, trong đó đnh 1 đã đc tô màu đ. Ta thy rng hoàn toàn có th tô c 2 đnh 3 và 4 là màu đ, vi điu kin ta không tô đnh s 2 màu đ. Tuy nhiên, nu ta áp dng thut toán tham n theo th t các đnh ln dn thì đnh 1 và đnh 2 s là màu đ, và khi đó đnh 3, 4 s không đc tô màu đ. Hình 1.3 th Bây gi ta s xem xét thut toán tham n đc áp dng trên đ th các ngã r hình 1.2 nh th nào. Gi s ta bt đu t đnh AB và tô cho đnh này màu xanh. Khi đó, ta có th tô cho đnh AC màu xanh vì không có cnh ni đnh này vi AB. AD cng có th tô màu xanh vì không có cnh ni AD vi AB, AC. nh BA không có cnh ni ti AB, AC, AD nên cng có th đc tô màu xanh. Tuy nhiên, đnh BC không tô đc màu xanh vì tn ti cnh ni BC và AB. Tng t nh vy, BD, DA, DB không th tô màu xanh vì tn ti cnh ni chúng ti mt trong các đnh đã tô màu xanh. Cnh DC thì có th tô màu xanh. Cui cùng, cnh EA, EB, EC cng không th tô màu xanh trong khi ED có th đc tô màu xanh. 1 5 3 4 2 a) th ban đu 1 5 3 4 2 b) Tô màu theo thut toán tham n 1 5 3 4 2 c) Mt cách tô màu tt hn 7 Hình 1.4 Tô màu xanh cho các đnh ca đ th ngã r Tip theo, ta s dng màu đ đ tô các đnh cha đc tô màu bc trc. u tiên là BC. BD cng có th tô màu đ, tuy nhiên do tn ti cnh ni DA vi BD nên DA không đc tô màu đ. Tng t nh vy, DB không tô đc màu đ còn EA có th tô màu đ. Các đnh cha đc tô màu còn li đ u có cnh ni ti các đnh đã tô màu đ nên cng không đc tô màu. Hình 1.5 Tô màu đ trong bc 2 Bc 3, các đnh cha đc tô màu còn li là DA, DB, EB, EC. Nu ta tô màu đnh DA là màu lc thì DB cng có th tô màu lc. Khi đó, EB, EC không th tô màu lc và ta chn 1 màu th t là màu vàng cho 2 đnh này. ACAB AD BCBA BD DBDA DC EBEA EC ED ACAB AD BCBA BD DBDA DC EBEA EC ED 8 Hình 1.6 Tô màu lc và màu vàng cho các đnh còn li Nh vy, ta có th dùng 4 màu xanh, đ, lc, vàng đ tô màu cho đ th ngã r hình 1.2 theo yêu cu nh đã nói trên. Bng tng hp màu đc mô t nh sau: Màu Ngã r Xanh AB, AC, AD, BA, DC, ED BC, BD, EA Lc DA, DB Vàng EB, EC Bng 1.2 Bng tng hp màu Thut toán tham n không đm bo cho ra kt qu ti u là s màu ít nht đc dùng. Tuy nhiên, ngi ta có th dùng mt s tính cht ca đ th đ đánh giá kt qu thu đc. Tr li vi vn đ nút giao thông, t kt qu tô màu trên, ta có th thit k h thng đèn giao thông theo bng tng hp màu trên, trong đó m i trng thái ca h thng đèn tng ng vi 1 màu. Ti mi trng thái, các ngã r nm ti hàng tng ng vi màu đó đc cho phép đi, các ngã r còn li b cm. 1.1.2 Ngôn ng din đt gii thut và k thut tinh chnh tng bc Sau khi đã xây dng đc mô hình toán hc cho vn đ cn gii quyt, tip theo, ta có th hình thành mt thu t toán cho mô hình đó. Phiên bn đu tiên ca thut toán thng đc din t di dng các phát biu tng đi tng quát, và sau đó s đc tinh chnh dn tng bc thành chui các lnh c th, rõ ràng hn. Ví d trong thut toán tham n trên, ta mô t bc thc hin mc tng quát là “La chn 1 đnh cha đc tô màu”. Vi phát biu nh vy, ta hy vng rng ngi đc có th nm đc ý tng thc hin thao tác. Tuy nhiên, đ chuyn các phát biu đó ACAB AD BCBA BD DBDA DC EBEA EC ED 9 thành chng trình máy tính, cn phi qua 1 s bc tinh chnh cho ti khi đt đn mc các phát biu đu có th đc chuyn đi trc tip sang các lnh ca ngôn ng lp trình. Tr li ví d v bài toán tô màu đ th bng thut toán tham n. Ta s xem xét vic mô t thut toán t mc tng quát cho ti mt s mc c th hn. Ti bc nào đó, gi s ta có đ th G có 1 s đnh đã đc tô màu theo quy tc đã nói trên. Th tc Tham_an di đây s xác đnh 1 tp các đnh cha đc tô màu thuc G mà có th cùng đc tô bi 1 màu mi. Th tc này s đc gi đi gi li nhiu ln cho ti khi tt c các đnh ca G đã đc tô màu. mc tng quát, th t c đc mô t nh sau: void Tham_an(GRAPH: G, SET: Mau_moi) { Mau_moi = Tp rng; For mi đnh v cha đc tô màu thuc G If v không đc ni ti đnh nào trong tp Mau_moi { Tô màu mi cho đnh v; a v vào tp Mau_moi; } } Trong th tc trên, ta s dng mt ngôn ng din đt gii thut ta nh ngôn ng lp trình C. Trong ngôn ng này, các lnh đc mô t di dng ngôn ng t nhiên nhng vn tuân theo cú pháp ca ngôn ng lp trình. Ta nhn thy rng các phát biu trong th tc trên còn rt tng quát, và cha tng ng vi các lnh trong ngôn ng lp trình, chng hn các điu kin ki m tra trong câu lnh For và If mc mô t hin ti là không thc hin đc trong C. th tc có th thc thi đc, ta cn phi tinh chnh mt s bc đ có th chuyn đi v chng trình trong ngôn ng lp trình C thông thng. u tiên, ta xem xét lnh If trên. kim tra xem đnh v có ni ti mt đnh nào đó trong tp Mau_moi hay không, ta xem xét tng đnh w trong Mau_moi và s dng đ th G đ kim tra xem có tn ti cnh ni v à w không. lu gi kt qu kim tra, ta s dng mt bin ton_tai. Khi đó, th tc đc tinh chnh nh sau: void Tham_an(GRAPH: G, SET: Mau_moi) { int ton_tai; Mau_moi = Tp rng; For mi đnh v cha đc tô màu thuc G { ton_tai = 0; For mi đnh w thuc Mau_moi If tn ti cnh ni v và w trong G ton_tai = 1; If ton_tai = = 1 { 10 Tô màu mi cho đnh v; a v vào tp Mau_moi; } } } Nh vy, ta có th thy rng điu kin kim tra trong phát biu If đã đc mô t c th hn bng các phát nh hn,và các phát biu này có th d dàng chuyn thành các lnh c th trong C. Tip theo, ta s tinh chnh các vòng lp For đ duyt qua các đnh thuc G và thuc Mau_moi. làm điu này, tt nht là ta thay For bng mt vòng lp While, bin v ban đu đc gán là phn t đu tiên cha tô màu trong tp G, và ti mi bc lp, bin v s đc thay bng phn t cha tô màu tip theo trong G. Vòng lp F bên trong có th thc hin tng t. Void Tham_an(GRAPH: G, SET: Mau_moi) { int ton_tai; int v, w Mau_moi = Tp rng; v = đnh cha tô màu đu tiên trong G ; While v != NULL { ton_tai = 0; w = đnh đu tiên trong Mau_moi; While w != NULL{ If tn ti cnh ni v và w trong G ton_tai = 1; w = đnh tip theo trong Mau_moi ; } If ton_tai = = 1 { Tô màu mi cho đnh v; a v vào tp Mau_moi; } v = đnh cha tô màu tip theo trong G; } } Nh vy, ta thy các phát biu trong th tc đã khá c th, tuy nhiên, đ chuyn đi thành chng trình trong ngôn ng C thì cn ti vài bc tinh chnh na. Bn đc hãy xem nh đó là bài tp và t gii đ hiu rõ v ngôn ng din đt gii thut cng nh k thut tinh chnh tng bc. 1.2 PHÂN TÍCH THUT TOÁN Vi mi vn đ c n gii quyt, ta có th tìm ra nhiu thut toán khác nhau. Có nhng thut toán thit k đn gin, d hiu, d lp trình và sa li, tuy nhiên thi gian thc hin ln và tiêu tn . liu “Cu trúc d liu và gii thut” bao gm 7 chng, trình bày v các cu trúc d liu và các gii thut c bn nh t trong tin hc. Chng 1 trình bày. ca chng trình không ph thuc vào giá tr d liu đu vào mà ph thuc vào kích thc ca d liu đu vào. Do vy thi gian chy ca chng trình nên