Tµi liÖu tham kh¶o hç trî häc tËp m«n häc
CÊu tróc d÷ liÖu vµ gi¶i thuËt TS. Phan §¨ng CÇu
Hµ néi, th¸ng 05/ 2006
(Tæng sè trang c¶ b×a: 70)
môc lôc Lêi nãi ®Çu..................................................................4 Ch¬ng 1.......................................................................1 ThuËt to¸n vµ thuËt gi¶i................................................1 1.1. ThuËt to¸n ...................................................................................1 1.1.1. §Þnh nghÜa vµ vÝ dô.............................................................1 1.1.2. C¸c ®Æc trng cña thuËt to¸n.................................................1 1.1.3. BiÓu diÔn thuËt to¸n .............................................................2 1.1.4. Ph©n tÝch thuËt to¸n.............................................................3 1.1.5. §é phøc t¹p cña thuËt to¸n.....................................................4 1.2. ThuËt gi¶i.....................................................................................8 1.2.1. §Ö quy....................................................................................8 1.2.2. Më réng kh¸i niÖm thuËt to¸n: thuËt gi¶i.............................11 1.2.3. ThuËt gi¶i vµ cÊu tróc d÷ liÖu.............................................12 1.3. Gi¶i quyÕt bµi to¸n b»ng m¸y tÝnh............................................13 1.3.1. Kh¸i niÖm vÒ vÊn ®Ò vµ bµi to¸n.......................................13 1.3.2. C¸c bíc gi¶i quyÕt bµi to¸n b»ng m¸y tÝnh..........................13
Ch¬ng 2.....................................................................15 Danh s¸ch...................................................................15 2.1. Danh s¸ch tæng qu¸t.................................................................15 2.1.1. §Þnh nghÜa..........................................................................15 2.1.2. C¸c phÐp to¸n c¬ b¶n..........................................................16 2.1.3. C¸c ph¬ng ph¸p cµi ®Æt danh s¸ch....................................16 2.2. Ng¨n xÕp (stack)........................................................................22 2.2.1. Giíi thiÖu stack.....................................................................22 2.2.2. øng dông cña stack..............................................................23 2.2.3. Cµi ®Æt stack......................................................................25 2.3. Hµng ®îi (queue).......................................................................27 2.3.1. Giíi thiÖu..............................................................................27 2.3.2. øng dông hµng ®îi...............................................................28 2.3.3. Cµi ®Æt hµng ®îi................................................................28
Ch¬ng 3.....................................................................32 C©y nhÞ ph©n...........................................................32 3.1. Më ®Çu......................................................................................32
3.2. Mét sè d¹ng ®Æc biÖt cña c©y nhÞ ph©n................................33 3.3. VÝ dô vÒ c©y nhÞ ph©n............................................................35 3.4. C©y nhÞ ph©n tæng qu¸t.........................................................36 3.4.1. DuyÖt c©y nhÞ ph©n..........................................................37 3.4.2. Cµi ®Æt c©y nhÞ ph©n b»ng ph¬ng ph¸p liªn kÕt.............38 3.5. C©y nhÞ ph©n t×m kiÕm.........................................................39 3.5.1. Thao t¸c chÌn (insert)...........................................................39 3.5.2. Thao t¸c xãa (remove).........................................................39 3.5.2. Cµi ®Æt c©y nhÞ ph©n t×m kiÕm.....................................41 3.6. C©y c©n b»ng chiÒu cao (Height balanced tree).....................44 3.6.1. Thao t¸c xoay c©y nhÞ ph©n..............................................44 3.6.1. ChØ sè c©n b»ng (balance factor) cña mét nót trªn c©y nhÞ ph©n t×m kiÕm............................................................................45 3.6.3. C©n b»ng l¹i c©y khi thªm nót............................................45 3.6.4. Xo¸ nót trªn c©y AVL..........................................................51 3.6.5. Vµi nhËn xÐt vÒ c©y AVL....................................................54
Ch¬ng 4.....................................................................56 S¾p xÕp vµ t×m kiÕm ..............................................56 4.1. Më ®Çu......................................................................................56 4.2. C¸c gi¶i thuËt s¾p xÕp hay dïng................................................57 4.2.1. S¾p xÕp b»ng lùa chän (Selection Sort)..............................57 4.2.2. S¾p xÕp næi bät (Bubble sort)............................................59 4.2.3. S¾p xÕp chÌn (Insertion sort) .............................................61 4.2.4. Ph¬ng ph¸p Shell Sort .........................................................62 4.2.5. S¾p xÕp nhanh (Quick Sort)................................................64 4.2.6. S¾p xÕp kiÓu xÕp chång (Heap sort) ................................67 4.2.7. S¾p xÕp trén (Merge sort)...................................................70 4.2.8. S¾p xÕp theo chØ sè...........................................................73 4.3. T×m kiÕm..................................................................................73 4.3.1. T×m kiÕm tuyÕn tÝnh vÞ trÝ cã néi dung x........................73 4.3.2. T×m kiÕm nhÞ ph©n vÞ trÝ cã néi dung x.........................73
C©u hái vµ bµi tËp.....................................................75 Tµi liÖu tham kh¶o.....................................................80 C©u hái lý thuyÕt vµ thùc hµnh dµnh cho thi hÕt m«n..81
Lêi nãi ®Çu Chóng t«i biªn so¹n tµi liÖu nµy nh»m hç trî c¸c b¹n trong qu¸ tr×nh «n tËp m«n häc "CÊu tróc d÷ liÖu vµ gi¶i thuËt". Cã thÓ nãi r»ng "cÊu tróc d÷ liÖu" lµ chuyªn ngµnh cña c«ng nghÖ th«ng tin nghiªn cøu c¸ch tæ chøc d÷ liÖu (trong bé nhí trong hoÆc trªn bé nhí ngoµi) mét c¸ch hîp lý trong viÖc thùc hiÖn c¸c bµi to¸n trªn m¸y tÝnh. Tríc ®©y ngêi ta vÉn nghÜ r»ng viÕt ch¬ng tr×nh thùc chÊt lµ cµi ®Æt c¸c thuËt to¸n trªn m¸y tÝnh, vµ ch¬ng tr×nh chÝnh lµ c¸c m· lÖnh thÓ hiÖn thuËt to¸n. Víi mét sè bµi to¸n khoa häc kü thuËt, khi mµ viÖc tæ chøc d÷ liÖu ®¬n gi¶n h¬n nhiÒu so víi thuËt to¸n th× quan niÖm nµy tá ra hîp lý. Tuy nhiªn cµng ngµy ngêi ta cµng gÆp nhiÒu vÊn ®Ò mµ c¸ch tæ chøc d÷ liÖu ¶nh hëng rÊt ®¸ng kÓ ®Õn hiÖu qu¶ cña øng dông. Trong nhiÒu dù ¸n tin häc, vÊn ®Ò khã cÇn gi¶i quyÕt kh«ng chØ lµ thuËt to¸n, mµ cßn lµ c¸ch tæ chøc d÷ liÖu. Còng v× thÕ mµ ngµy nay kh¸i niÖm ch¬ng tr×nh, nh nhµ to¸n häc vµ tin häc næi tiÕng thÕ giíi ngêi Thôy sÜ Niklaus Wirth ®· ph¸t biÓu, ®îc coi lµ bao gåm cÊu tróc d÷ liÖu vµ thuËt to¸n (Data structures + Algorithms = Programme). C¸ch tæ chøc d÷ liÖu ë ®©y ®îc hiÓu lµ c¸ch tæ chøc logic, v× vËy c¸c cÊu tróc d÷ liÖu thêng ®îc g¾n víi c¸c thuËt to¸n cô thÓ t¹o ra vµ thao t¸c trªn chóng. Còng dÔ hiÓu v× sao c¸c cÊu tróc d÷ liÖu quan träng l¹i ®îc tr×nh bµy trong c¸c tµi liÖu nh "CÈm nang thuËt to¸n", "NghÖ thuËt lËp tr×nh",... Mét trong nh÷ng bµi to¸n quan träng cña "cÊu tróc d÷ liÖu" lµ cµi ®Æt vµ thùc hiÖn c¸c thao t¸c víi c¸c môc d÷ liÖu. C¸c môc d÷ liÖu nµy cã thÓ lµ th«ng tin vÒ nh©n sù cña mét c¬ quan, th«ng tin vÒ c¸c chuyÕn bay cña mét h·ng hµng kh«ng, vÒ qu¶n lý kho, vÒ qu¶n trÞ m¹ng... Trong tin häc ngêi ta thêng gäi c¸c môc d÷ liÖu lµ c¸c nót (node). C¸c thao t¸c cÇn thùc hiÖn thêng lµ: thªm hoÆc xãa mét nót, t×m kiÕm hay s¾p xÕp theo mét trêng nµo ®ã vÝ dô ngµy sinh, hä tªn, gi¸ c¶... Môc ®Ých cña "cÊu tróc d÷ liÖu" lµ tæ chøc c¸c nót th«ng tin sao cho c¸c thao t¸c cËp nhËt, s¾p xÕp vµ t×m kiÕm ®îc thùc hiÖn nhanh nhÊt. MÆc dï nót th«ng tin cã thÓ chøa nhiÒu lo¹i d÷ liÖu kh¸c nhau, nhng ®Ó ®¬n gi¶n trong viÖc m« t¶ c¸c thuËt to¸n, thêng chóng ta chØ gi¶ thiÕt lµ c¸c nót chØ chøa mét trêng th«ng tin duy nhÊt vµ trêng nµy ®îc sö dông ®Ó s¾p xÕp vµ t×m kiÕm. Ta sÏ gäi trêng nµy lµ khãa (key). C¸ch gäi nµy cã kh¸c chót Ýt víi khãa trong c¬ së d÷ liÖu: trong csdl th× ngêi ta thêng hiÓu khãa lµ trêng cã gi¸ trÞ duy nhÊt trong tËp b¶n ghi, nghÜa lµ kh«ng cã 2 b¶n ghi nµo cã khãa trïng nhau. Nhng trong trêng hîp chóng ta xÐt th× ®«i khi cho phÐp ®iÒu ®ã. Khãa ë ®©y ®¬n gi¶n ®îc hiÓu lµ ®¹i lîng chóng ta ®ang quan t©m ®Ó s¾p xÕp t×m kiÕm. §ã cã thÓ lµ ngµy sinh, lµ hä tªn, ®Þa chØ... Th«ng thêng chóng ta xÐt c¸c khãa lµ c¸c sè thùc hoÆc sè nguyªn. Trong trêng hîp cã thÓ nhÇm lÉn víi kiÓu chØ sè, chóng ta sÏ xÐt khãa lµ c¸c sè thùc. Trong tµi liÖu nµy chóng t«i cã cµi ®Æt mét sè cÊu tróc d÷ liÖu vµ thuËt to¸n b»ng ng«n ng÷ C. Tuy nhiªn v× ng«n ng÷ sö dông thùc chÊt lµ C++ nªn chóng t«i tËn dông lu«n nh÷ng tÝnh n¨ng ®¬n gi¶n cña C++ vÝ dô nh cã thÓ cµi ®Æt struct mµ kh«ng cÇn tõ khãa typedef, cã thÓ khai b¸o biÕn ë bÊt cø ®©u trong ch¬ng tr×nh, cã thÓ truyÒn ®èi sè cho
hµm b»ng biÕn tham chiÕu, cã thÓ ®Þnh nghÜa chång hµm (hµm trïng tªn nhng cã c¸c ®èi sè cã kiÓu kh¸c nhau), dïng lÖnh new vµ delete thay cho malloc vµ free... Chóng t«i chØ xem b¶n th¶o nµy lµ mét c«ng cô hç trî thªm bªn c¹nh gi¸o tr×nh chÝnh thøc. Chóng t«i mong nhËn ®îc nh÷ng ý kiÕn gãp ý cña c¸c ®ång nghiÖp vµ c¸c em sinh viªn ®Ó bµi gi¶ng ®îc hiÖu qu¶ h¬n. Hµ néi, th¸ng 12/2005 TS. Phan §¨ng CÇu
Ch¬ng 1 ThuËt to¸n vµ thuËt gi¶i 1.1. ThuËt to¸n
1.1.1. §Þnh nghÜa vµ vÝ dô ThuËt to¸n (Algorithm) lµ kh¸i niÖm c¬ së cña To¸n häc vµ Tin häc, cã thÓ ®Þnh nghÜa mét c¸ch trùc gi¸c nh sau: ThuËt to¸n lµ mét d·y h÷u h¹n c¸c bíc, mçi bíc m« t¶ chÝnh x¸c c¸c phÐp to¸n hoÆc hµnh ®éng cÇn thùc hiÖn, ®Ó gi¶i quyÕt mét vÊn ®Ò nµo ®ã. ThuËt ng÷ “thuËt to¸n” (algorithm) cã xuÊt xø tõ tªn cña nhµ to¸n häc Ud¬bªck (Liªn x« cò) sèng vµo kho¶ng ®Çu thÕ kû thø 9 (kho¶ng n¨m 825) -Abu J¸far Mohammed ibn Musa Al - khowarizmi ( cha cña J¸fa, con cña Musa, gèc ngêi xø Khovarizmi - lµ c¸ch gäi cña ngêi Trung ¸ cæ). Ban ®Çu ngêi ta dïng thuËt ng÷ algorism, xuÊt ph¸t tõ côm tõ al - khowarizmi (gèc ngêi xø Khovarizmi), cßn Khovarizmi lµ tªn cæ cña thÞ trÊn Khiva cña Liªn x«. Suèt mét thêi gian dµi, thuËt ng÷ nµy ®îc dïng ®Ó chØ c¸c phÐp tÝnh sè häc trªn c¸c sè thËp ph©n. VÒ sau tõ algorism ®îc thay ®æi thµnh algorithm vµ mang ý nghÜa chung h¬n, bao hµm c¶ c¸c thñ tôc ®Ó gi¶i mét bµi to¸n nãi chung chø kh«ng chØ lµ c¸c thñ tôc ®Ó thùc hiÖn c¸c phÐp tÝnh sè häc. Mét vÝ dô ®iÓn h×nh vÒ thuËt to¸n lµ thuËt to¸n t×m ¦SCLN do nhµ to¸n häc Hy l¹p Euclid ph¸t minh tõ thêi cæ Hy l¹p (c¸ch ®©y h¬n 2000 n¨m) vµ ®îc gi¶i thÝch chi tiÕt trong luËn ¸n næi tiÕng cña «ng lµ “Elements”. C¸c vÝ dô ®¬n gi¶n kh¸c lµ c¸c phÐp tÝnh sè häc nh céng, trõ, nh©n, chia. Suèt trong mÊy chôc thÕ kû ph¸t triÓn cña to¸n häc, kh¸i niÖm thuËt to¸n vÉn ®îc hiÓu vµ ®îc dïng mét c¸ch trùc quan nh trªn ®©y. Cho ®Õn ®Çu thÕ kû 20, trong to¸n häc xuÊt hiÖn mét sè bµi to¸n mµ viÖc cã thuËt to¸n ®Ó gi¶i chóng lµ rÊt ®¸ng nghi ngê. Ngêi ta ®Æt vÊn ®Ò lµ liÖu cã thÓ chøng minh lµ kh«ng cã thuËt to¸n ®Ó gi¶i bµi to¸n ®ã hay kh«ng. NÕu nh kh¸i niÖm trùc gi¸c vÒ thuËt to¸n lµ ®ñ dïng khi ta chøng minh viÖc cã thuËt to¸n cô thÓ nµo ®ã, th× ngîc l¹i, nã kh«ng thÓ lµ c¬ së cho viÖc chøng minh cã thuËt to¸n ®Ó gi¶i bµi to¸n nµy hay bµi to¸n kh¸c hay kh«ng. Muèn chøng minh kh«ng cã thuËt to¸n th× tríc hÕt cÇn ph¶i cã mét ®Þnh nghÜa to¸n häc chÝnh x¸c cho kh¸i niÖm thuËt to¸n. Vµo kho¶ng nh÷ng n¨m ®Çu cña thËp kû 30, G«del, Kleene, Church, Turing vµ Post ®· ®a ra mét sè ®Þnh nghÜa nh»m chÝnh x¸c hãa kh¸i niÖm thuËt to¸n. Sau ®ã nhiÒu t¸c gi¶ kh¸c tiÕp tôc ®a ra mét sè ®Þnh nghÜa kh¸c vÒ thuËt to¸n. C¸c ®Þnh nghÜa ®ã nãi chung ®Òu t¬ng ®¬ng víi nhau, tuy mçi ®Þnh nghÜa cã mét sè thuËn lîi riªng, thÝch hîp víi viÖc nghiªn cøu mét líp vÊn ®Ò nµo ®ã. Cã thÓ liÖt kª mét sè m« t¶ h×nh thøc cho thuËt to¸n nh sau: - M¸y Turing (1936) - M¸y Post (1936) - Hµm ®Ö quy (G«del 1931, Church 1936, Kleene 1936) - ThuËt to¸n chuÈn Markov (1954) - V¨n ph¹m Chomsky kiÓu 0 (1959) - HÇu hÕt c¸c ng«n ng÷ lËp tr×nh (tõ 1950 ®Õn nay). Tuy nhiªn trong tµi liÖu nµy chóng ta chØ giíi h¹n kh¸i niÖm thuËt to¸n theo nghÜa trùc gi¸c.
1.1.2. C¸c ®Æc trng cña thuËt to¸n Cã thÓ liÖt kª 6 ®Æc trng quan träng sau ®©y cña thuËt to¸n: (1) §¹i lîng vµo (Input). C¸c thuËt to¸n thêng cã c¸c gi¸ trÞ nhËp (input values). (2) §¹i lîng ra (Output). ThuËt to¸n thêng t¹o ra c¸c gi¸ trÞ xuÊt (output values) thÓ hiÖn lêi gi¶i cho bµi to¸n hay vÊn ®Ò. (3) TÝnh x¸c ®Þnh (Definiteness). C¸c bíc trong thuËt to¸n ph¶i chÝnh x¸c
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
râ rµng. (4) TÝnh kÕt thóc (Finiteness). ThuËt to¸n ph¶i cho ra lêi gi¶i (hay kÕt qu¶) sau mét sè h÷u h¹n bíc. Chóng ta lu ý r»ng sè c¸c bíc m« t¶ trong thuËt to¸n lµ h÷u h¹n cha ®ñ ®Ó b¶o ®¶m vÒ tÝnh dõng cña thuËt to¸n. VÝ dô thuËt to¸n chuyÓn mét ph©n sè sang sè thËp ph©n chÝnh x¸c kh«ng cã sai sè lµ thuËt to¸n cã lóc kh«ng dõng. ThÝ dô nÕu ta muèn chuyÓn 1/3 thµnh sè thËp ph©n th× ta gÆp phÐp chia cã v« h¹n bíc kh«ng dõng. TÝnh dõng cña thuËt to¸n thêng ®îc chøng minh dùa trªn nh÷ng tri thøc to¸n häc. ThÝ dô khi chøng minh tÝnh dõng cña thuËt to¸n Euclid ta chØ ra r»ng d·y c¸c sè d gi¶m dÇn vµ bÞ chÆn bëi 0, do ®ã ph¶i dõng t¹i 0 sau h÷u h¹n bíc. (5) TÝnh hiÖu qu¶. Yªu cÇu ®Çu tiªn cña tÝnh hiÖu qu¶ cña thuËt to¸n lµ sù ®óng ®¾n, cô thÓ lµ: víi d÷ liÖu vµo cho tríc, thuËt to¸n ho¹t ®éng sau mét sè h÷u h¹n bíc sÏ dõng vµ cho kÕt qu¶ mong muèn. KÕt qu¶ mong muèn thêng ®îc x¸c ®Þnh qua ®Þnh nghÜa. B»ng c¸c phÐp thö ta chØ cã thÓ x¸c ®Þnh ®îc tÝnh sai cña thuËt to¸n. Muèn x¸c ®Þnh tÝnh ®óng ta ph¶i chøng minh. Yªu cÇu quan träng thø 2 cña tÝnh hiÖu qu¶ cña thuËt to¸n lµ tÝnh h÷u hiÖu hay tÝnh kh¶ thi. TÝnh h÷u hiÖu thêng ®îc ®¸nh gi¸ qua thêi gian thùc hiÖn, dung lîng lu tr÷ trªn thiÕt bÞ nhí khi thùc hiÖn thuËt to¸n trªn m¸y tÝnh. (6) TÝnh tæng qu¸t. ThuËt to¸n ph¶i ®îc ¸p dông ®îc cho tÊt c¶ c¸c bµi to¸n cã d¹ng nh mong muèn, chø kh«ng ph¶i chØ ¸p dông cho mét sè trêng hîp riªng lÎ. Theo ®Þnh nghÜa vµ c¸c ®Æc trng trªn ®©y ta cã thÓ thÊy thuËt to¸n Euclid, c¸c phÐp tÝnh sè häc lµ c¸c thuËt to¸n. TÝnh tæng qu¸t thêng ®îc quy íc tïy tõng trêng hîp cô thÓ, vµ trong thùc tÕ nhiÒu khi ta cã thÓ so s¸nh vÒ tÝnh tæng qu¸t cña c¸c thuËt to¸n. ThÝ dô ta gäi R1 lµ thuËt to¸n ®a khèi vu«ng Rubic tõ mét h×nh tr¹ng tuú ý trë vÒ h×nh tr¹ng nguyªn thñy, tøc lµ h×nh tr¹ng c¸c mÆt ®ång mÇu; cßn thuËt to¸n R2 ®a Rubic tõ h×nh tr¹ng A tïy ý sang h×nh tr¹ng B tïy ý, th× thuËt to¸n R2 tæng qu¸t h¬n. ThuËt to¸n R1 lµ trêng hîp riªng cña thuËt to¸n R2 khi B lµ h×nh tr¹ng ban ®Çu. §Ó hiÓu râ h¬n c¸c ®Æc trng cña thuËt to¸n, ta xÐt vÝ dô sau: Gi¶ sö khi nhËn mét líp häc míi, Ban gi¸m hiÖu yªu cÇu gi¸o viªn chñ nhiÖm chän líp trëng theo c¸c bíc sau: - LËp danh s¸ch sinh viªn trong líp. - S¾p thø tù danh s¸ch sinh viªn. - Chän sinh viªn ®øng ®Çu danh s¸ch ®Ó lµm líp trëng. Râ rµng c¸c bíc trªn ®©y cßn chøa nhiÒu ®iÒu kh«ng râ rµng, vµ gi¸o viªn kh«ng biÕt xö lý c¸c bíc nh thÕ nµo cho ®óng, nh vËy cha thÓ hiÖn mét thuËt to¸n. §Ó trë thµnh thuËt to¸n th× ta ph¶i thªm c¸c th«ng tin nh lËp danh s¸ch gåm nh÷ng th«ng tin g×, s¾p thø tù theo c¸i g×, thÕ nµo lµ ngêi ®øng ®Çu danh s¸ch...
1.1.3. BiÓu diÔn thuËt to¸n -
Ngêi ta thêng dïng c¸c ph¬ng ph¸p sau ®©y ®Ó biÓu diÔn thuËt to¸n: Ng«n ng÷ tù nhiªn. Lu ®å (s¬ ®å khèi). Tùa ng«n ng÷ lËp tr×nh (pseudo code = m· gi¶). Ng«n ng÷ lËp tr×nh.
2
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
Trong c¸ch biÓu diÔn thuËt to¸n b»ng ng«n ng÷ tù nhiªn ngêi ta liÖt kª c¸c bíc cña thuËt to¸n b»ng lêi. Nhîc ®iÓm cña c¸ch nµy lµ thêng chøa ®ùng nh÷ng ®iÒu mËp mê, kh«ng râ rµng do ®Æc tÝnh cña ng«n ng÷ tù nhiªn. BiÓu diÔn thuËt to¸n b»ng lu ®å gióp ta cã c¸ch nh×n tæng quan vÒ toµn c¶nh cña qu¸ tr×nh xö lý theo thuËt to¸n. Tuy nhiªn nã còng cã mét sè nhîc ®iÓm vÝ dô tèn c«ng søc vµ thêi gian khi so¹n th¶o b»ng phÇn mÒm nh word hay excel, ®Æc biÖt lµ víi thuËt to¸n phøc t¹p. Ngµy nay ngêi ta thêng kÕt hîp nhiÒu c¸ch biÓu diÔn. VÝ dô, ®Çu tiªn m« t¶ v¾n t¾t c¸c bíc cÇn thùc hiÖn b»ng ng«n ng÷ tù nhiªn. Sau ®ã dïng m· gi¶ ®Ó chØ râ cÇn thùc hiÖn nh÷ng lÖnh g× nÕu cµi ®Æt ch¬ng tr×nh. Cuèi cïng, nÕu m· gi¶ vÉn cha ®ñ râ rµng ®Ó ngêi lËp tr×nh cµi ®Æt trªn m¸y tÝnh th× ngêi ta dïng mét ng«n ng÷ lËp tr×nh cµi ®Æt cho trêng hîp ®¬n gi¶n, cha chó ý ®Õn giao diÖn, cèt ®Ó lét t¶ ®îc nh÷ng ®iÒu cèt lâi cña thuËt to¸n. Trong tµi liÖu nµy chóng t«i còng sÏ sö dông c¸ch phèi hîp nµy trong truêng hîp cÇn thiÕt.
1.1.4. Ph©n tÝch thuËt to¸n Mét thuËt to¸n thêng cã 6 ®Æc trng nãi trªn, trong ®ã tÝnh hiÖu qu¶ lµ mét ®Æc trng kh¸ quan träng trong viÖc ¸p dông thuËt to¸n vµo thùc tÕ. §Ó ®¸nh gi¸ tÝnh hiÖu qu¶ cña thuËt to¸n, th«ng thêng ngoµi tÝnh ®óng ®¾n, ngêi ta thêng dùa trªn 2 tiªu chuÈn sau ®©y: (a) ThuËt to¸n ®¬n gi¶n, dÔ hiÓu, dÔ cµi ®Æt (dÔ viÕt ch¬ng tr×nh) (b) ThuËt to¸n ch¹y nhanh vµ tiÕt kiÖm nhÊt c¸c nguån tµi nguyªn cña m¸y tÝnh. Khi ta viÕt ch¬ng tr×nh chØ ®Ó sö dông mét sè Ýt lÇn th× tiªu chuÈn (a) cã vÎ quan träng h¬n. Lo¹i bµi to¸n ta thêng gÆp trong thùc tÕ thÝ dô ta cÇn lËp ch¬ng tr×nh ®Ó nhËp sè liÖu cho nh÷ng cuéc ®iÒu tra x· héi häc. Mçi cuéc ®iÒu tra nh vËy cã mét khu«n d¹ng c©u hái riªng vµ ch¬ng tr×nh nhËp sè liÖu chØ dïng mét lÇn. Tuy vËy trong mäi trêng hîp chóng ta ®Òu ph¶i tr¶ gi¸ cho sù ®¬n gi¶n hãa. Dï cho ch¬ng tr×nh chØ dïng mét lÇn nhng nÕu ta viÕt qu¸ ®¬n gi¶n th× khi nhËp sè liÖu sÏ dÔ ph¹m nhiÒu lçi, sÏ tèn nhiÒu c«ng ®Ó söa hoÆc kÕt qu¶ ph©n tÝch sÏ kh«ng chÝnh x¸c. V× vËy theo chóng t«i chóng ta nªn lu ý ®Õn tiªu chuÈn (a) nhng kh«ng qu¸ chó ý vµo tiªu chuÈn nµy. Vµo thêi kú kü thuËt m¸y tÝnh cha ph¸t triÓn, tèc ®é tÝnh to¸n vµ kh¶ n¨ng lu tr÷ cña m¸y tÝnh cßn h¹n chÕ th× tiªu chuÈn (b) rÊt ®îc chó ý. Ngµy nay m¸y tÝnh c¸ nh©n ®· ®¹t ®Õn tèc ®é gÇn mét tû phÐp tÝnh / gi©y, dung lîng bé nhí trong lªn ®Õn hµng chôc thËm chÝ hµng tr¨m Mb, thiÕt bÞ nhí ngoµi lªn ®Õn hµng chôc Gb th× c¸c tiªu chuÈn trªn ®©y kh«ng cßn lµ vÊn ®Ò qu¸ cÊp thiÕt n÷a. ThËt vËy, nÕu nh cïng thùc hiÖn chøc n¨ng so¹n th¶o v¨n b¶n hay lµm c¸c trang tÝnh, c¸c phÇn mÒm Wordstar hay Lotus 123 tríc ®©y chØ n»m gän trªn mét ®Üa mÒm th× ngµy nay c¸c phÇn mÒm Microsoft Word hay Microsoft Excel ph¶i chøa trªn ®Üa CD-ROM. Ngay phong c¸ch lËp tr×nh còng thay ®æi. Chóng ta biÕt r»ng lËp tr×nh b»ng ng«n ng÷ bËc thÊp lµ tiÕt kiÖm tèt nhÊt tµi nguyªn m¸y tÝnh vµ b¶o ®¶m tèc ®é nhanh nhÊt. Tuy nhiªn ngêi lËp tr×nh sÏ rÊt vÊt v¶ khi viÕt c¸c c©u lÖnh. §Ó gi¶i quyÕt mét vÊn ®Ò ngêi ta ph¶i viÕt hµng v¹n dßng lÖnh, rÊt khã theo dâi vµ liªn kÕt chóng. Ngêi ta ®· dïng c¸c ng«n ng÷ bËc cao nh C++, Visual Basic... ®Ó lËp tr×nh theo kiÓu m« dun hãa hoÆc theo híng ®èi tîng. Nh vËy tuy cã l·ng phÝ vÒ dung lîng nhí hay lµm cho tèc ®é tÝnh to¸n bÞ chËm h¬n, nhng ®æi l¹i, c«ng viÖc lËp tr×nh cã thÓ chia cho nhiÒu ngêi vµ sau ®ã nèi ghÐp dÔ dµng.
3
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
VËy th× thùc ra cã cÇn tiªu tèn thêi gian ®Ó thiÕt kÕ c¸c thuËt to¸n hiÖu qu¶ kh«ng? VÝ dô sau ®©y sÏ tr¶ lêi cho c©u hái nµy. VÝ dô. TÝnh ®Þnh thøc ma trËn Gi¶ sö cho ma trËn vu«ng A = [aij] nxn Ta cã thÓ tÝnh ®Þnh thøc A theo c«ng thøc ®Ö quy sau: NÕu n=1 det(A) = a11 n
NÕu n>1 det(A) =
∑ (−1)
a1j det(M1j)
(1+j)
j =1
(M1j lµ ma trËn con cÊp n-1 nhËn ®îc sau khi xãa hµng i vµ cét j tõ ma trËn A vµ ®îc gäi lµ minor cña phÇn tö a1j) Cã thÓ chøng minh r»ng nÕu tÝnh ®Þnh thøc dùa vµo c«ng thøc ®Ö quy nµy th× cÇn thùc hiÖn n! phÐp nh©n. Mét con sè khæng lå víi n kh«ng lÊy g× lµm lín. Ngay c¶ víi tèc ®é cña m¸y tÝnh lín hiÖn ®¹i, ®Ó tÝnh ®Þnh thøc cña ma trËn cÊp n = 25 còng cÇn hµng triÖu n¨m. Hãa ra thuËt to¸n trªn ®©y hoµn toµn chØ cã ý nghÜa lý thuyÕt! Mét thuËt to¸n cæ ®iÓn kh¸c lµ thuËt to¸n Gauss - Jordan tÝnh ®Þnh thøc cÊp n trong thêi gian n3 . §Ó tÝnh ®Þnh thøc cÊp 100 b»ng thuËt to¸n nµy trªn m¸y tÝnh lín ngêi ta cÇn ®Õn 1 gi©y. NÕu nh trong c¸c bµi to¸n kinh tÕ x· héi hay mét sè lÜnh vùc khoa häc kü thuËt, mét thuËt to¸n ch¹y trong mét vµi giê hay l©u h¬n cã thÓ chÊp nhËn ®îc th× trong mét sè lÜnh vùc nh ®iÒu khiÓn tù ®éng, ®«i khi thuËt to¸n cÇn ®Õn vµi gi©y tÝnh to¸n ®· lµ qu¸ chËm. ThËt vËy, ngµy nay nhiÒu thiÕt bÞ ho¹t ®éng theo ch¬ng tr×nh ®iÒu khiÓn thêi gian thùc, nghÜa lµ víi mét bé d÷ liÖu vµo nµo ®ã m¸y ph¶i xö lý vµ cho kÕt qu¶ tøc kh¾c ®Ó ®iÒu khiÓn qu¸ tr×nh. V× vËy ta còng dÔ hiÓu v× sao phÐp biÕn ®æi Fourier rêi r¹c thêng ch¹y tèn Ýt thêi gian (tuyÕn tÝnh) nhng ngêi ta vÉn ¸p dông nh÷ng thuËt to¸n nhanh ®Ó tÝnh to¸n (vµ gäi lµ phÐp biÕn ®æi Fourier nhanh). §ã lµ v× phÐp biÕn ®æi Fourier ®îc dïng trong rÊt nhiÒu lÜnh vùc kü thuËt. Râ rµng viÖc t×m ra thuËt to¸n hiÖu qu¶ vµ cã thÓ thùc thi ®îc lu«n lu«n lµ bµi to¸n cÇn quan t©m.
1.1.5. §é phøc t¹p cña thuËt to¸n a. §Þnh nghÜa. Nh ta thÊy, yªu cÇu vÒ thêi gian vµ kh«ng gian ®Ó thùc hiÖn thuËt to¸n trong nhiÒu trêng hîp lµ nh÷ng tiªu chuÈn ®¸ng lu ý khi x©y dùng thuËt to¸n. Tuy nhiªn trong thùc tÕ kh«ng mÊy khi chóng ta cã ®îc gi¶i ph¸p trän vÑn cho 2 yªu cÇu nµy. ViÖc xem xÐt ®é phøc t¹p vÒ kh«ng gian phô thuéc phÇn lín vµo cÊu tróc d÷ liÖu ®îc sö dông trong cµi ®Æt thuËt to¸n. Trong ph¹m vi tµi liÖu nµy chóng t«i sÏ chØ xÐt ®Õn ®é phøc t¹p vÒ thêi gian cña thuËt to¸n. Víi mét bµi to¸n, thêng kh«ng chØ cã mét thuËt to¸n. VËy lÊy tiªu chuÈn g× ®Ó ta nãi r»ng thuËt to¸n nµy ch¹y nhanh h¬n thuËt to¸n kia? Cã lÏ ý nghÜ ®Çu tiªn ®Õn víi chóng ta lµ ta thö tÊt c¶ c¸c thuËt to¸n trªn m¸y tÝnh, thuËt to¸n nµo ch¹y Ýt thêi gian h¬n th× ta nãi r»ng thuËt to¸n ®ã ch¹y nhanh h¬n. Lµm nh vËy xem ra còng cã lý v× chÝnh thùc tiÔn lµ thíc ®o ch©n lý. Tuy nhiªn c¸ch lµm nµy sÏ cã mét sè khã kh¨n sau: - Ta ph¶i viÕt ch¬ng tr×nh cho tÊt c¶ c¸c thuËt to¸n vµ ®iÒu nµy rÊt khã thùc hiÖn v× ®«i khi tèn qu¸ nhiÒu c«ng søc. ThËm chÝ ®«i khi gÆp ph¶i thuËt to¸n nh bµi to¸n th¸p Hµ Néi víi n lín th× ta ®µnh ph¶i t¾t m¸y mµ kh«ng cã ®îc ®¸nh gi¸ vÒ thêi gian.
4
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
Ta kh«ng thÓ trao ®æi th«ng tin vÒ ®é nhanh chËm cña thuËt to¸n víi bªn ngoµi, v× cïng mét thuËt to¸n khi ch¹y ë c¸c m¸y víi cÊu h×nh kh¸c th× thêi gian tÝnh to¸n sÏ kh¸c. Râ rµng c¸ch ®¸nh gi¸ thêi gian tÝnh to¸n b»ng gi©y b»ng phót lµ kh«ng thÝch hîp khi ®¸nh gi¸ thêi gian tÝnh to¸n cña mét thuËt to¸n. Ngêi ta dïng mét tiªu chuÈn kh¸c lµ sè phÐp tÝnh s¬ cÊp cÇn thiÕt ®Ó thùc hiÖn thuËt to¸n. Tuy nhiªn còng kh«ng dÔ g× tÝnh to¸n ®îc sè phÐp tÝnh cÇn thiÕt ngay c¶ víi c¸c thuËt to¸n ®¬n gi¶n. Trong c¸c thÝ dô trªn ta thÊy sè phÐp tÝnh thêng phô thuéc vµo cì cña sè liÖu vµo. Trong thÝ dô tÝnh ®Þnh thøc, cì cña d÷ liÖu lµ cÊp cña ®Þnh thøc, trong bµi to¸n th¸p Hµ néi lµ sè ®Üa ®Æt t¹i cäc A...Ta cã thÓ nhËn xÐt r»ng sè phÐp tÝnh cÇn thiÕt thêng phô thuéc vµo cì d÷ liÖu, do vËy ta cã thÓ coi nã nh mét hµm cña n, tøc lµ T(n). MÆt kh¸c ta cã thÓ thÊy T(n) kh«ng ph¶i lµ hµm ®¬n trÞ ®èi víi mét thuËt to¸n. ThÝ dô ta xÐt bµi to¸n kiÓm tra xem sè x cho tríc cã mÆt trong d·y {a1, a2,..., an} hay kh«ng. ThuËt to¸n ë ®©y lµ so s¸nh a víi tõng phÇn tö cña d·y, nÕu gÆp ai = x th× dõng l¹i. Ta thÊy ngay nÕu a1 = x th× chØ cÇn 1 phÐp so s¸nh, cßn nÕu ai ≠ x, i = 1,...,n th× sè phÐp so s¸nh lµ n. VËy nãi chung ta chØ cã thÓ ®a ra ®¸nh gi¸ vÒ T(n) mµ th«i. -
§Þnh nghÜa: Cho 2 hµm f vµ g lµ c¸c hµm thùc kh«ng ©m cã miÒn x¸c ®Þnh trong tËp sè tù nhiªn. Ta nãi r»ng f(n) lµ ¤ lín cña g(n) vµ viÕt: f(n)=O(g(n)) nÕu tån t¹i h»ng sè C>0 vµ sè tù nhiªn n 0 sao cho f(n)
n0 . NÕu mét thuËt to¸n cã thêi gian thùc hiÖn T(n)=O(g(n)) ta nãi r»ng thuËt to¸n cã thêi gian thùc hiÖn cÊp cao nhÊt lµ g(n), ®«i khi ta còng nãi ®¬n gi¶n lµ thuËt to¸n cã thêi gian thùc hiÖn cÊp g(n) hay ®é phøc t¹p tÝnh to¸n cña thuËt to¸n lµ g(n). Ngêi ta còng thêng nãi ®Õn ®é phøc t¹p tÝnh to¸n cña thuËt to¸n trong trêng hîp xÊu nhÊt, trêng hîp tèt nhÊt, ®é phøc t¹p trung b×nh. b. C¸c quy t¾c ®Ó ®¸nh gi¸ thêi gian thùc hiÖn thuËt to¸n NÕu
T1(n) = O(f(n)), T2(n) = O(g(n)), khi ®ã
-
Qui t¾c tæng: T1(n)+ T2(n) = O(Max(f(n),g(n)))
(1)
-
Quy t¾c nh©n: T1(n)T2(n) = O(f(n)g(n))
(2)
Tõ c¸c quy t¾c trªn ®©y ta cã thÓ suy ra r»ng: Gi¶ sö thêi gian thùc hiÖn cña mét thuËt to¸n lµ T(n), vµ T(n) cã thÓ biÓu diÔn thµnh mét biÓu thøc chøa tæng vµ tÝch c¸c thµnh phÇn kh¸c, lóc ®ã khi biÕn ®æi T(n) ®Ó cã ®îc biÓu thøc g(n) mµ T(n)=O(g(n)) ta cã thÓ thùc hiÖn theo c¸ch sau: trong c¸c thµnh phÇn cña tæng ta cã thÓ bá ®i nh÷ng thµnh phÇn lu«n nhá h¬n nh÷ng thµnh phÇn kh¸c; víi mçi thµnh phÇn ta cã thÓ nh©n chia víi mét h»ng kh¸c kh«ng; víi tÝch ta cã thÓ ®¸nh gi¸ riªng tõng thõa sè råi nh©n kÕt qu¶ víi nhau. VÝ dô 1. Gi¶ sö ta sè phÐp to¸n cÇn thùc hiÖn ®èi víi mét thuËt to¸n nµo ®ã lµ: T(n) = 3nlog(n!) + (n3 + 3)logn h·y ®¸nh gi¸ ®é phøc t¹p tÝnh to¸n cña thuËt to¸n nµy díi d¹ng mét biÓu thøc ®¬n gi¶n h¬n.
5
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
Gi¶i: Theo ®Þnh nghÜa ®é phøc t¹p tÝnh to¸n th× b¶n th©n T(n) chÝnh lµ ®é phøc t¹p tÝnh to¸n cña chÝnh nã. Tuy nhiªn ta muèn biÕn ®æi vÒ d¹ng quen thuéc ®¬n gi¶n h¬n. Tríc hÕt ta ®¸nh gi¸ sè h¹ng thø nhÊt 3nlog(n!). §©y lµ mét tÝch vµ ta sÏ ®¸nh gi¸ riªng tõng thõa sè lµ 3n vµ log(n!). V× log(n!) ≤ log(nn) = nlogn, do ®ã log(n!) = O(nlogn). HiÓn nhiªn lµ 3n = O(n). Tõ ®©y ¸p dông (2), ta cã 3nlog(n!) = O(n2logn). TiÕp theo, ta ®¸nh gi¸ (n3 + 3)logn. V× víi n≥2 th× n3 >3 do ®ã n3 + 3 = O(n3). Theo (2) ta còng cã (n3 + 3)logn = O(n3logn). Theo (1) ta cã 3nlog(n!) + (n3 + 3)logn = O(max(n2logn, n3logn)) = O(n3logn) Hay thuËt to¸n cÇn kh¶o s¸t cã ®é phøc t¹p tÝnh to¸n lµ O(n3logn). VÝ dô 2. Gi¶ sö ta cÇn ®¸nh gi¸ ®é phøc t¹p tÝnh to¸n cña c¸c c©u lÖnh sau ®©y: (a) for(i=0;i< n;i++) {x=0; for(j=0;j
b. Sù ph©n líp c¸c thuËt to¸n Nh ®· nãi ®Õn ë trªn, hÇu hÕt c¸c thuËt to¸n ®Òu cã mét tham sè chÝnh lµ N, th«ng thêng lµ sè lîng c¸c phÇn tö d÷ liÖu ®îc xö lý mµ cã ¶nh hëng rÊt nhiÒu tíi thêi gian ch¹y. Tham sè N cã thÓ lµ bËc cña ®a thøc, kÝch thíc cña mét tËp tin cÇn s¾p xÕp hay t×m kiÕm, sè nót trong ®å thÞ,.v.v... HÇu hÕt c¸c thuËt to¸n th«ng dông cã thêi gian ch¹y tiÖm cËn tíi mét trong c¸c hµm sau: 1 HÇu hÕt c¸c chØ thÞ cña ch¬ng tr×nh ®Òu ®îc thùc hiÖn mét lÇn hay nhiÒu nhÊt chØ mét vµi lÇn. NÕu tÊt c¶ c¸c chØ thÞ cña mét ch¬ng tr×nh cã tÝnh chÊt nµy th× chóng ta sÏ nãi r»ng thêi gian ch¹y cña nã lµ h»ng sè. LgN Thêi gian ch¹y cña ch¬ng tr×nh lµ logarit, tøc lµ thêi gian ch¹y cña ch¬ng tr×nh tiÕn chËm khi N lín dÇn. Trêng hîp nµy thêng x¶y ra khi ta gi¶i mét bµi to¸n lín b»ng c¸ch chuyÓn nã thµnh bµi to¸n nhá h¬n cã kÝch thíc a*N víi a<1. C¬ sè cña logarit lµm thay ®æi h»ng sè C trong ®Þnh nghÜa ®é phøc t¹p tÝnh to¸n nhng kh«ng nhiÒu: khi N lµ 1000 (~ 210) th× log2N lµ 10, khi N 1 000 000 th× log2N lµ 20. NÕu N ®îc nh©n ®«i th× log2N ®îc céng thªm mét h»ng sè nhng kh«ng bÞ nh©n ®«i; chØ khi N t¨ng lªn ®Õn N2 th× log2N míi bÞ nh©n ®«i. Nãi c¸ch kh¸c, nÕu ta cho N t¨ng theo hµm mò th× log2N chØ t¨ng tuyÕn tÝnh. N Thêi gian ch¹y lµ tuyÕn tÝnh. §©y lµ trêng hîp mµ mét sè lîng nhá c¸c xö lý ®îc thùc hiÖn cho mçi phÇn tö d÷ liÖu nhËp. §©y lµ t×nh huèng tèi u cho mét thuËt to¸n mµ ph¶i xö lý N d÷ liÖu nhËp. NlogN Thêi gian ch¹y cña ch¬ng tr×nh lµ tuyÕn tÝnh logarit. Ta thêng gÆp khi gi¶i bµi to¸n b»ng c¸ch t¸ch nã thµnh c¸c bµi to¸n con nhá h¬n,
6
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
gi¶i quyÕt chóng mét c¸ch ®éc lËp vµ sau ®ã tæ hîp c¸c lêi gi¶i. Khi N ®îc nh©n gÊp ®«i th× NlogN bÞ nh©n lªn nhiÒu h¬n gÊp ®«i nhng kh«ng nhiÒu l¾m. 2 N Thêi gian ch¹y lµ bËc 2. Thêng gÆp trong c¸c thuËt to¸n mµ ta cÇn xö lý tõng cÆp phÇn tö d÷ liÖu (cã thÓ lµ 2 vßng lÆp lång nhau). 3 N T¬ng tù, mét thuËt to¸n xö lý c¸c bé ba phÇn tö d÷ liÖu thÝ dô ba vßng lÆp lång nhau. N 2 Mét sè Ýt thuËt to¸n cã thêi gian ch¹y lòy thõa l¹i thÝch hîp trong mét sè trêng hîp thùc tÕ, mÆc dï c¸c thuËt to¸n nh thÕ lµ “sù Ðp buéc th« b¹o” ®Ó gi¶i c¸c bµi to¸n. Thêi gian ch¹y cña mét ch¬ng tr×nh cô thÓ thêng lµ mét h»ng sè nh©n víi c¸c sè h¹ng trªn ®©y (“sè h¹ng dÉn ®Çu”) céng thªm mét sè h¹ng nhá h¬n. Gi¸ trÞ cña h»ng sè vµ c¸c sè h¹ng phô thuéc vµo kÕt qu¶ cña sù ph©n tÝch vµ c¸c chi tiÕt cµi ®Æt. HÖ sè cña sè h¹ng dÉn ®Çu liªn quan tíi sè chØ thÞ bªn trong vßng lÆp. Víi N lín th× c¸c sè h¹ng dÉn ®Çu ®ãng vai trß chñ chèt. Víi N nhá th× c¸c sè h¹ng cïng ®ãng gãp vµ viÖc so s¸nh thuËt to¸n sÏ khã kh¨n h¬n.
c. ý nghÜa cña ®é phøc t¹p thuËt to¸n trong thùc hµnh Ký hiÖu O rÊt cã Ých trong viÖc gióp ®ì c¸c nhµ ph©n tÝch ph©n lo¹i c¸c thuËt to¸n ®Ó t×m ra thuËt to¸n tèt nhÊt. Tuy nhiªn ph¶i v« cïng cÈn thËn khi ¸p dông c¸c kÕt qu¶ tõ ký hiÖu O v× 4 lý do sau ®©y: - Tríc tiªn nã lµ mét “chÆn trªn” vµ ®¹i lîng trong thùc tÕ cã thÓ thÊp h¬n nhiÒu. - D÷ liÖu nhËp trong trêng hîp xÊu nhÊt cã thÓ Ýt x¶y ra trong thùc tÕ. - H»ng sè C kh«ng ®îc biÕt vµ kh«ng cÇn nhá. - H»ng sè N0 kh«ng ®îc biÕt vµ kh«ng cÇn nhá. Thêng ngêi ta cè g¾ng t×m ra mét bé d÷ liÖu mµ thêi gian ch¹y lµ O(f(N)), nhng cã nhiÒu thuËt to¸n rÊt khã x©y dùng ®îc d÷ liÖu nhËp trong trêng hîp xÊu nhÊt. Còng cã nh÷ng thuËt to¸n v« cïng h÷u Ých nhng l¹i cã trêng hîp xÊu nhÊt rÊt tåi. ThÝ dô nh thuËt to¸n s¾p xÕp ®îc dïng réng r·i nhÊt lµ QuickSort cã thêi gian ch¹y lµ O(N 2) nhng cã thÓ dµn xÕp sao cho thêi gian ch¹y ®èi víi c¸c d÷ liÖu nhËp thêng gÆp trong thùc tÕ lµ NlgN. C¸c h»ng sè C vµ N0 trong ký hiÖu O thêng che dÊu c¸c chi tiÕt cµi ®Æt ®ãng vai trß quan träng trong thùc tÕ. HiÓn nhiªn khi ta nãi mét thuËt to¸n cã thêi gian ch¹y lµ O(f(N)) th× sÏ kh«ng bµn g× ®îc vÒ thêi gian ch¹y khi N nhá h¬n N0. Chóng ta thÝch mét thuËt to¸n ch¹y N2 nano gi©y h¬n thuËt to¸n ch¹y logN thÕ kû, nhng ký hiÖu O l¹i kh«ng lµm râ ®îc ®iÒu nµy. Mét tiÕp cËn kh¸c trong nghiªn cøu tÝnh n¨ng cña thuËt to¸n lµ kh¶o s¸t truêng hîp trung b×nh. Tuy nhiªn thêng th× viÖc ph©n tÝch nµy thêng cã nh÷ng ®ßi hái to¸n häc qu¸ khã, ®«i khi chóng ta kh«ng thÓ t×m ®îc d÷ liÖu nhËp ®Æc trng thêng gÆp trong thùc tÕ thÝ dô nh trêng hîp ®¸nh gi¸ thêi gian ch¹y trung b×nh cho ch¬ng tr×nh xö lý v¨n b¶n tiÕng Anh . HiÖn nay chóng ta cha biÕt ®îc tÝnh n¨ng trong trêng hîp trung b×nh cña rÊt nhiÒu thuËt to¸n. Thêng th× thuËt to¸n cã ®é phøc t¹p tÝnh to¸n ®a thøc ®îc coi lµ kh¶ thi trong thùc tÕ. Tuy nhiªn nh chóng t«i ®· nh¾c ®Õn, ngay trong trêng hîp nµy viÖc thuËt to¸n cã ý nghÜa hay kh«ng cßn tïy thuéc vµo thùc tÕ ¸p dông. ThÝ dô trong c¸c ®iÒu khiÓn thêi gian thùc ta ph¶i cã kÕt qu¶ gÇn nh tøc th×, vËy th× nÕu thuËt to¸n cã ®é phøc t¹p ®a thøc cha ch¾c ®· øng dông ®îc. Hay mét ch¬ng tr×nh nhËp sè liÖu ch¼ng h¹n, thuËt to¸n ph¶i b¶o ®¶m ®ñ nhanh ®Ó ngêi nhËp sè liÖu kh«ng ph¶i chê ®îi. §ã lµ ch-
7
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
a kÓ trong thùc tÕ viÖc ®¸nh gi¸ ®é phøc t¹p thuËt to¸n nhiÒu khi lµ bµi to¸n rÊt khã. VËy th× cã thÓ nãi r»ng ®é phøc t¹p tÝnh to¸n cã lÏ mang ý nghÜa lý thuyÕt nhiÒu h¬n. Do ®ã trong tµi liÖu nµy chóng t«i sÏ kh«ng qu¸ chó träng ®Õn viÖc ®¸nh gi¸ thuËt to¸n qua ®é phøc t¹p tÝnh to¸n. 1.2. ThuËt gi¶i
Trong thùc tÕ cµng ngµy chóng ta gÆp cµng nhiÒu nh÷ng vÊn ®Ò mµ rÊt khã t×m ®îc thuËt to¸n ®Ó gi¶i quyÕt, nÕu tu©n thñ ®óng c¸c ®Æc trng trªn ®©y. Tuy nhiªn nÕu ta lµm mÒm ®i 2 tÝnh chÊt quan träng vµ tëng nh kh«ng thÓ vi ph¹m cña thuËt to¸n lµ tÝnh x¸c ®Þnh vµ tÝnh hiÖu qu¶ th× cã thÓ t×m ®îc lêi gi¶i cho mét sè bµi to¸n phøc t¹p. V× vËy thuËt ng÷ thuËt to¸n trong mét sè trêng hîp ®· ®îc hiÓu theo mét nghÜa réng h¬n. ý nghÜa cña nã gÇn gièng víi c¸c kh¸i niÖm: qu¸ tr×nh, ph¬ng ph¸p, thñ tôc, kü thuËt... (recipe, proccess, method, technique, procedure, routine, rigmarole,....) Trong nhiÒu tµi liÖu, c¸c thuËt ng÷ "thuËt gi¶i" vµ "thuËt to¸n" ®îc dïng ®Õn mµ kh«ng cã sù ph©n biÖt. Trong tµi liÖu nµy tõ ®©y trë vÒ sau nÕu kh«ng nhÊn m¹nh g× thªm th× chóng t«i sÏ dïng thuËt ng÷ "thuËt gi¶i" hoÆc "gi¶i thuËt" hoÆc cã thÓ lµ "thuËt to¸n" ®Ó chØ sù më réng cña thuËt to¸n ®· ®îc ®Þnh nghÜa víi c¸c ®Æc trng tríc ®©y. Mét trong nh÷ng sù më réng lý thó nhÊt cña thuËt to¸n lµ ph¬ng ph¸p ®Ö quy (mét sè t¸c gi¶ gäi lµ thuËt to¸n ®Ö quy) mµ chóng ta sÏ xÐt sau ®©y.
1.2.1. §Ö quy a. Kh¸i niÖm ®Ö quy Trong c¸c môc trªn ®©y chóng ta ®· nªu vÝ dô vÒ ph¬ng ph¸p ®Ö quy nh tÝnh ®Þnh thøc, d·y sè Fibonacci. T tëng gi¶i bµi to¸n b»ng ®Ö quy lµ ®a bµi to¸n hiÖn t¹i vÒ mét bµi to¸n cïng lo¹i, cïng tÝnh chÊt nhng ë møc thÊp h¬n, vµ qu¸ tr×nh nµy tiÕp tôc cho ®Õn lóc ®îc ®a vÒ møc thÊp nhÊt cã thÓ gi¶i ®îc. Tõ kÕt qu¶ ë møc thÊp nhÊt nµy ta sÏ lÇn ngîc l¹i tõng bíc mét cho ®Õn khi nhËn ®îc kÕt qu¶ ë møc mong muèn. ChØ qua c¸ch thøc thùc hiÖn ®Ö quy ta cã thÓ thÊy ngay lµ ph¬ng ph¸p ®Ö quy nãi chung dµi h¬n c¸ch gi¶i trùc tiÕp. NÕu thùc hiÖn trªn m¸y tÝnh th× kh«ng nh÷ng thêi gian tÝnh to¸n mµ kh«ng gian lu tr÷ còng nhiÒu h¬n. ThËt vËy, ®Ó qu¸ tr×nh lÇn ngîc cã thÓ thùc hiÖn ®îc, trong qu¸ tr×nh ®i tõ møc cao ®Õn møc thÊp nhÊt ta ph¶i lu tr÷ l¹i tÊt c¶ c¸c bíc trung gian. VËy th× v× sao ph¶i sö dông ®Õn ®Ö quy, trong khi ph¬ng ph¸p nµy tá ra kÐm hiÖu qu¶ vÒ kh«ng gian vµ thêi gian so víi ph¬ng ph¸p trùc tiÕp? Cã mét sè vÊn ®Ò khi ta cè g¾ng tr×nh bµy mét c¸ch trùc tiÕp th× rÊt dµi dßng vµ khã hiÓu, nhng nÕu ta dïng ®Ö qui th× chØ cÇn tr×nh bµy ng¾n gän trong mét vµi dßng mµ vÉn chÆt chÏ vµ s¸ng sña. ThÝ dô ®Ó ®Þnh nghÜa n!, nÕu ®Þnh nghÜa trùc tiÕp th× ta cã thÓ diÔn ®¹t nh sau: n!= 1 nÕu n=0 hoÆc 1 n! = n*(n-1)*...*2*1 nÕu n>1 Nhng nÕu dïng ®Ö quy ta cã 0!=1 n!=n*(n-1)! §Þnh nghÜa b»ng ®Ö quy tho¹t ®Çu cho ta c¶m gi¸c thiÕu chÝnh x¸c. Theo t duy logic th«ng thêng th× kh«ng thÓ ®Þnh nghÜa mét kh¸i niÖm th«ng qua chÝnh nã. VËy mµ c¸ch lµm nµy l¹i cho ta c¸ch h×nh dung rÊt râ
8
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
rµng. H·y xem ®Þnh nghÜa th môc trong tin häc: Th môc (directory) lµ mét vïng trªn thiÕt bÞ nhí ®îc ®Æt tªn ®Ó lu tr÷ c¸c tËp tin vµ c¸c th môc kh¸c. §Þnh nghÜa trªn cã tÝnh ®Ö quy, vµ thËt khã mµ thay thÕ ®Þnh nghÜa nµy b»ng mét ®Þnh nghÜa kh¸c dÔ hiÓu h¬n mµ kh«ng qu¸ dµi dßng. Tõ ®Þnh nghÜa trªn ta suy ra r»ng lo¹i th môc ®¬n gi¶n nhÊt lµ n¬i lu tr÷ c¸c tËp tin hoÆc kh«ng chøa g× c¶. Trong trêng hîp nµy kh¸i niÖm th môc lµ râ rµng. Nh÷ng trêng hîp kh¸c ®îc suy ra dùa vµo trêng hîp c¬ b¶n nµy vµ ®Þnh nghÜa nãi trªn. §Ö quy thêng cã 2 thµnh phÇn: - Thµnh phÇn dõng: kh«ng chøa kh¸i niÖm ®ang ®Þnh nghÜa. - Thµnh phÇn ®Ö quy: cã chøa kh¸i niÖm ®ang ®Þnh nghÜa. Do tÇm quan träng cña ®Ö quy, hÇu hÕt c¸c ng«n ng÷ lËp tr×nh ®Òu trang bÞ c¬ chÕ gäi hµm ®Ö quy, tøc lµ trong th©n mét hµm cã thÓ cã c©u lÖnh gäi ®Õn chÝnh nã. ChÝnh ®iÒu thuËn lîi nµy ®· lµm cho c¸c øng dông ®Ö quy trë nªn dÔ dµng h¬n. Ngêi sö dông chØ cÇn viÕt c¸c dßng lÖnh t¬ng øng víi thuËt to¸n ®Ö quy, cßn mäi sù phøc t¹p bªn trong, nh qu¸ tr×nh chuyÓn tõ møc cao xuèng møc thÊp nhÊt råi lÇn ngîc trë l¹i ®Ó tÝnh trêng hîp tæng qu¸t lµ do m¸y tÝnh ®¶m nhiÖm. Bµi to¸n th¸p Hµ néi lµ bµi to¸n khã nÕu kh«ng dïng ®Ö quy. NÕu sö dông ph¬ng tiÖn nµy th× nh chóng ta ®· thÊy, ch¬ng tr×nh chØ cã vµi ba dßng mµ th«i. b. C¸c ch¬ng tr×nh ®Ö quy ho¹t ®éng nh thÕ nµo? Mäi ch¬ng tr×nh khi thi hµnh ®Òu cã mét vïng nhí ®Ó dïng lµm stack, tøc lµ phÇn bé nhí ®îc tæ chøc theo kiÓu vµo sau ra tríc (LIFO). Trong c¸c thÕ hÖ m¸y tÝnh cò stack cha ®îc thiÕt kÕ. Tõ c¸c bé vi xö lý 8088 ngêi ta ®· ®a ng¨n xÕp vµo bé nhí m¸y tÝnh vµ stack ®îc coi lµ mét trong nh÷ng phô tïng ®Æc s¾c nhÊt cña c¸c m¸y tÝnh hiÖn ®¹i. §ã lµ mét phÇn cña RAM ë phÇn ®Þa chØ cao nhÊt cha sö dông. Cã thÓ ®a sè liÖu vµo ng¨n xÕp b»ng lÖnh PUSH, vµ lÊy chóng ra b»ng lÖnh POP cña hîp ng÷ (assembly). Khi mét hµm ®îc gäi th× khung kÝch ho¹t (activation frame) cña nã ®îc t¹o ra trong bé nhí stack. Khung kÝch ho¹t chøa c¸c biÕn côc bé cña hµm vµ b¶n ghi ho¹t ®éng (active record). B¶n ghi ho¹t ®éng chøa ®Þa chØ trë vÒ cña hµm gäi nã vµ c¸c tham sè cña hµm ®ã. Sau khi hµm ®îc gäi thùc hiÖn xong th× ®iÒu khiÓn ®îc tr¶ vÒ cho hµm gäi nã vµ hµm nµy l¹i thùc hiÖn tiÕp c«ng viÖc tõ ®Þa chØ trë vÒ mµ b¶n ghi ho¹t ®éng cung cÊp, sau ®ã khung kÝch ho¹t ®îc xãa khái stack. Khi cã mét lêi gäi ®Ö quy th× viÖc g× sÏ x¶y ra? Ch¬ng tr×nh lóc nµy xem hµm cã lêi gäi ®Ö quy lµ mét hµm míi vµ t¹o mét mét khung kÝch ho¹t míi cho nã. Cø nh vËy cho ®Õn khi gÆp trêng hîp dõng th× hµm b¾t ®Çu ®îc tÝnh to¸n. Qu¸ tr×nh lÇn ngîc trë l¹i hµm chøa lêi gäi ®Çu tiªn vµ bé nhí stack ®îc gi¶i phãng dÇn. Nh vËy nÕu cÊp ®Ö quy cµng cao th× sè khung kÝch ho¹t trong stack cµng nhiÒu nªn cµng chiÕm dông bé nhí. §Ó minh häa, ta xÐt 2 vÝ dô sau: VÝ dô 1. Ch¬ng tr×nh ®Ö quy sau cho ta gi¸ trÞ cña n! víi n nguyªn: long giaithua(int n) {return(n == 0 ? 1 : n * giaithua(n-1)); } Ta nhËn xÐt r»ng trong th©n hµm chØ cã mét lêi gäi ®Ö quy duy nhÊt xuèng cÊp thÊp. Ngêi ta gäi d¹ng ®Ö quy nµy lµ ®Ö quy ®u«i. §èi víi d¹ng ®Ö quy ®u«i mµ hµm tr¶ vÒ gi¸ trÞ th× ta cã thÓ dÔ dµng thay b»ng thñ tôc lÆp ch¹y nhanh h¬n vµ tèn Ýt bé nhí h¬n. Thay cho viÖc xuÊt ph¸t tõ møc cao rót gän dÇn xuèng møc thÊp råi l¹i lÇn ngîc ®Õn møc cao, chóng
9
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
ta cã thÓ xuÊt ph¸t ngay tõ møc thÊp vµ lÇn lît ¸p dông ®Þnh nghÜa ®Ö quy ®Ó t×m gi¸ trÞ hµm t¹i c¸c sè nguyªn lín dÇn. C¸ch lµm nµy ®îc gäi lµ thñ tôc lÆp vµ ®îc thÓ hiÖn b»ng c¸c dßng lÖnh nh sau: long giaithua(int n) {if(n==0) return(1); long tmp=1; for(int i=1;i<=n;i++) tmp*=i; return(tmp); } Trong trêng hîp trªn ®©y thñ tôc lÆp hiÖu qu¶ h¬n nhng sù kh¸c biÖt gi÷a 2 ph¬ng ph¸p kh«ng lín l¾m. Mét ®iÓm cÇn lu ý lµ nÕu gäi ch¬ng tr×nh ®Ö quy trªn ®èi víi sè ©m ta sÏ bÞ mét vßng lÆp v« h¹n; ®©y lµ mét lçi thêng x¶y ra mµ cã thÓ xuÊt hiÖn tinh vi h¬n ®èi víi c¸c ch¬ng tr×nh ®Ö quy phøc t¹p. VÝ dô 2. D·y fibonacci lµ d·y c¸c sè nguyªn kh«ng ©m ®îc ®Þnh nghÜa bëi c«ng thøc: n = 0,1 n fn = n >1 f n −1 + f n −2 Ta cã thÓ viÕt ch¬ng tr×nh ®Ö quy tÝnh sè Fibonacci t¹i n nh sau: long fibo(int n) {if(n<=1) return 1; return (fibo(n-1)+fibo(n-2));} Ta thÊy r»ng trong th©n hµm cã 2 lêi gäi ®Ö quy. Ta gäi d¹ng ®Ö quy mµ cã Ýt nhÊt 2 lêi gäi ®Õn chÝnh nã trong th©n hµm lµ ®Ö quy nh¸nh. §Ö quy nh¸nh cã cÊu tróc c©y kh¸ phøc t¹p. Cã thÓ tÝnh ®îc chÝnh x¸c sè lÇn gäi hµm Fibo khi cÇn tÝnh to¸n f n : ta gäi sè lÇn gäi cÇn thiÕt ®Ó tÝnh fn lµ qn .Ta thÊy r»ng sè lÇn gäi hµm ®Ó tÝnh fn b»ng sè lÇn gäi ®Ó tÝnh fn-1 céng víi sè lÇn gäi tÝnh fn-2 trõ khi n=0 hay n=1 th× chØ cÇn mét lÇn gäi. VËy ta cã n = 0,1 1 qn = n >1 q n −1 + q n −2 Tõ ®©y ta cã qn = fn+1 .Tøc lµ d·y qn còng lµ d·y cã kiÓu Fibonacci. Ta ®· biÕt fn ~ an trong ®ã a ~ 1.61803... lµ “tû sè vµng”. VËy gi¶ sö mçi lÇn gäi cÇn kho¶ng C phÐp tÝnh th× ta cÇn sè phÐp tÝnh ®Ó tÝnh f n lµ Can . ThËt sù ®¸ng sî khi ch¬ng tr×nh ®¬n gi¶n trªn ®©y lµ mét thuËt to¸n thêi gian lòy thõa mµ chØ ®Ó tÝnh c¸c sè Fibonacci! Ch¬ng tr×nh ®Ö quy trªn cã thÓ thay b»ng mét ch¬ng tr×nh lÆp ®¬n gi¶n sau víi ®é phøc t¹p tuyÕn tÝnh: long fibonacci2(int N) {int i;long x,y,z; x=0;y=1; for(i=1;i
10
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
®Þnh nghÜa v¨n ph¹m, ®Þnh nghÜa có ph¸p ng«n ng÷, ®Þnh nghÜa mét sè cÊu tróc d÷ liÖu ... Khi ta thay c¸c gi¶i thuËt ®Ö quy b»ng c¸c gi¶i thuËt kh«ng tù gäi chóng, nh gi¶i thuËt lÆp nªu trªn, ta gäi lµ khö ®Ö quy.
c. §Ö quy vµ quy n¹p to¸n häc Cã mét quan hÖ kh¨ng khÝt gi÷a ®Ö quy vµ quy n¹p to¸n häc, vµ quy n¹p to¸n häc thêng ®îc dïng ®Ó chøng minh c¸c tÝnh chÊt liªn quan ®Õn thuËt gi¶i ®Ö quy. Ch¼ng h¹n b¹n ®äc kh«ng khã kh¨n g× cã thÓ chøng minh tÝnh ®óng ®¾n cña ch¬ng tr×nh giaihua nãi trªn vµ chøng minh c«ng thøc vÒ sè lÇn chuyÓn ®Üa trong bµi to¸n th¸p Hµ Néi. Trong c¸c phÇn sau cña tµi liÖu nµy chóng ta sÏ cßn trë l¹i t×m hiÓu vÒ ®Ö quy vµ c¸c øng dông cña nã.
d. §Ö quy cã ph¶i lµ thuËt to¸n víi s¸u ®Æc trng ®· ®Þnh nghÜa kh«ng? NÕu theo ®Þnh nghÜa th× thuËt to¸n bao gåm h÷u h¹n bíc ®Ó ®i ®Õn kÕt qu¶. VÒ nguyªn t¾c, mét bíc cña thuËt to¸n ph¶i ®îc x¸c ®Þnh ngay t¹i thêi ®iÓm bíc ®ã ®îc thi hµnh, nhng víi thuËt to¸n ®Ö quy, bíc thø n kh«ng ®îc x¸c ®Þnh ngay mµ ph¶i x¸c ®Þnh th«ng qua mét bíc thÊp h¬n. Ch¼ng h¹n ®Ó tÝnh sè Fibonacci f5 th× ta ph¶i tÝnh f4 + f3 nhng c¸c gi¸ trÞ nµy ta cha biÕt t¹i thêi ®iÓm nµy. Nh vËy ®Ö quy vi ph¹m tÝnh chÊt x¸c ®Þnh cña thuËt to¸n. Khi ta gäi thuËt to¸n ®Ö quy nghÜa lµ ta ®· hiÓu thuËt to¸n theo nghÜa më réng, trong ®ã tÝnh chÊt x¸c ®Þnh ®· ®îc "níi láng".
1.2.2. Më réng kh¸i niÖm thuËt to¸n: thuËt gi¶i Nh chóng ta võa xÐt ë trªn, c¸ch gi¶i ®Ö quy kh«ng ®¸p øng ®Çy ®ñ c¸c yªu cÇu ®èi víi mét thuËt to¸n. §ã lµ mét sù më réng kh¸i niÖm thuËt to¸n. Trong qu¸ tr×nh nghiªn cøu gi¶i quyÕt c¸c bµi to¸n vµ ¸p dông vµo thùc tÕ, ngêi ta nhËn thÊy cã c¸c t×nh huèng sau ®©y: a) Cã nh÷ng bµi to¸n cho ®Õn nay vÉn cha cã lêi gi¶i theo kiÓu thuËt to¸n vµ còng kh«ng biÕt cã tån t¹i thuËt to¸n hay kh«ng. b) Cã nh÷ng bµi to¸n ®· cã thuËt to¸n nhng kh«ng chÊp nhËn ®îc v× kh«ng ®¸p øng ®îc yªu cÇu thùc tÕ. c) Cã nh÷ng bµi to¸n ®îc gi¶i theo c¸ch gi¶i vi ph¹m thuËt to¸n nhng vÉn ®îc chÊp nhËn; thËm chÝ trong c¶ trêng hîp bµi to¸n ®ã cã lêi gi¶i theo kiÓu thuËt to¸n nhng kh«ng ®¸p øng ®îc yªu cÇu thùc tÕ. C¸c bµi to¸n thuéc nhãm a) cã thÓ thÊy rÊt nhiÒu trong c¸c tµi liÖu. Sau ®©y chóng t«i xin chØ ra mét sè vÝ dô minh häa cho b) vµ c): VÝ dô 1. Bµi to¸n ngêi b¸n hµng. Mét nh©n viªn ph©n phèi hµng cho mét c«ng ty ®îc giao nhiÖm vô ph¶i giao hµng cho c¸c ®¹i lý cña c«ng ty, sau ®ã trë vÒ c«ng ty. Bµi to¸n ®Æt ra lµ nh©n viªn nµy ph¶i chän hµnh tr×nh nh thÕ nµo ®Ó tæng qu¶ng ®êng ®i tõ khi xuÊt ph¸t ®Õn khi trë vÒ lµ ng¾n nhÊt. Gi¶ sö cã n ®¹i lý. Ta cã thÓ thÊy ngay c¸ch gi¶i chÝnh x¸c lµ liÖt kª tÊt c¶ c¸c hµnh tr×nh cã thÓ cã vµ chän hµnh tr×nh ng¾n nhÊt. Tuy nhiªn c¸ch gi¶i nµy l¹i cã ®é phøc t¹p tÝnh to¸n O(n!). Nh ta sÏ thÊy ë phÇn sau, ngêi ta ®· ¸p dông nguyªn lý "tham lam" ®Ó t×m mét lêi gi¶i kh¸ tèt cho bµi to¸n nµy víi ®é phøc t¹p chÊp nhËn ®îc. VÝ dô 2. §¸nh gi¸ chÊt lîng s¶n phÈm.
11
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
Gi¶ sö ngêi ta cÇn ®¸nh gi¸ mét l« hµng gåm c¸c kiÖn hµng chøa c¸c gãi t«m ®«ng l¹nh. Bµi to¸n ®Æt ra lµ ph¶i kiÓm tra l« hµng nµy vµ ®¸nh gi¸ bao nhiªu phÇn tr¨m ®¹t tiªu chuÈn quèc tÕ. NÕu tû lÖ ®ã lµ gÇn 100% th× hµng míi ®îc phÐp xuÊt khÈu. Gi¶ sö r»ng nÕu mét gãi t«m bÞ bãc ra ®Ó kiÓm tra th× chØ ®Ó tiªu thô trong níc. Râ rµng ta kh«ng thÓ kiÓm tra tÊt c¶ c¸c gãi t«m ®îc, mµ nÕu chØ chän mét sè gãi nµo ®ã th× cã thÓ c¸c gãi nµy kh«ng mang tÝnh ®¹i diÖn. Ngêi ta ®· dïng ph¬ng ph¸p chän ngÉu nhiªn. Trong sè mÉu lÊy ra mét c¸ch ngÉu nhiªn ngêi ta kiÓm tra vµ ®a ra kÕt luËn. Râ rµng c¸ch lµm nµy vi ph¹m c¸c ®Æc trng x¸c ®Þnh vµ hiÖu qu¶ cña thuËt to¸n. KÕt qu¶ cña tõng bíc kh«ng ®îc x¸c ®Þnh râ rµng, kÕt qu¶ còng kh«ng duy nhÊt vµ cha ch¾c ®· ®óng. Cïng mét l« hµng nÕu kiÓm tra nhiÒu lÇn cã thÓ cã c¸c kÕt luËn kh¸c nhau. Tuy nhiªn cã thÓ thÊy lµ khã cã c¸ch nµo kh¸c, vµ do vËy ngêi ta còng kh«ng hy väng cã ®îc kÕt qu¶ chÝnh x¸c tuyÖt ®èi mµ chØ ®óng víi x¸c suÊt nµo ®ã. DÜ nhiªn c¸c kÕt luËn vÒ l©u dµi ph¶i ®¹t ®îc ®é chÝnh x¸c cao thÝ dô 99 hay 99.5% ch¼ng h¹n. Nãi tãm l¹i trong thùc tÕ cµng ngµy chóng ta gÆp cµng nhiÒu nh÷ng vÊn ®Ò sau: NÕu ta ®ßi hái mét lêi gi¶i chÝnh x¸c th× chóng ta kh«ng thÓ lµm ®îc, nghÜa lµ chóng ta kh«ng ®îc g×. Ngîc l¹i nÕu chóng ta chÊp nhËn mét gi¶i ph¸p kÐm chÆt chÏ vÒ mÆt to¸n häc th× ta gi¶i quyÕt ®îc c«ng viÖc cña chóng ta ë mét møc ®é nµo ®ã. Râ rµng cã mét c¸i g× ®ã dï cha hoµn chØnh vÉn h¬n lµ kh«ng cã g×. VËy viÖc më réng kh¸i niÖm thuËt to¸n lµ mét yªu cÇu cña thùc tÕ. Chóng ta sÏ gäi c¸ch gi¶i chÊp nhËn ®îc nhng kh«ng hoµn toµn tu©n theo c¸c tiªu chuÈn cña thuËt to¸n lµ thuËt gi¶i. Trong c¸c tµi liÖu níc ngoµi, ngoµi thuËt ng÷ “Algorithm” ngêi ta cßn dïng c¸c thuËt nh÷ “Procedure”, “Method”; thÝ dô Recursive procedure, Monte - Carlo Method... Kh¸i niÖm më réng nµy cña thuËt to¸n ®· më réng cöa cho chóng ta trong viÖc t×m kiÕm ph¬ng ph¸p ®Ó gi¶i quyÕt c¸c bµi to¸n ®îc ®Æt ra.
1.2.3. ThuËt gi¶i vµ cÊu tróc d÷ liÖu Th«ng thêng chóng ta vÉn hiÓu viÖc gi¶i quyÕt mét bµi to¸n lµ t×m thuËt gi¶i cho bµi to¸n ®ã. Khi cã ®îc thuËt gi¶i ta míi thÓ hiÖn chóng b»ng c¸c c©u lÖnh vµ cµi ®Æt trªn m¸y tÝnh. Cã thÓ nãi thuËt to¸n lµ “chÊt liÖu” cña khoa häc m¸y tÝnh, lµ ®èi tîng nghiªn cøu trung t©m trong nhiÒu lÜnh vùc cña tin häc. HÇu hÕt c¸c thuËt to¸n quan träng cÇn ®Õn c¸c ph¬ng ph¸p tæ chøc d÷ liÖu trong lóc tÝnh to¸n. C¸c ®èi tîng ®îc t¹o ra theo c¸ch nµy ®îc gäi lµ c¸c cÊu tróc d÷ liÖu, vµ chóng còng lµ c¸c ®èi tîng trung t©m cÇn nghiªn cøu trong khoa häc m¸y tÝnh. V× vËy c¸c thuËt to¸n vµ cÊu tróc d÷ liÖu thêng ®i liÒn víi nhau. C¸c thuËt to¸n ®¬n gi¶n cã thÓ ph¸t sinh víi c¸c cÊu tróc d÷ liÖu phøc t¹p vµ ngîc l¹i, c¸c thuËt to¸n phøc t¹p cã thÓ chØ dïng c¸c cÊu tróc d÷ liÖu ®¬n gi¶n. VÒ mèi liªn quan gi÷a thuËt to¸n vµ cÊu tróc d÷ liÖu, Niklaus Wirth, nhµ to¸n häc vµ tin häc næi tiÕng ngêi Thôy sÜ , ngêi ®· s¸ng t¹o ra ng«n ng÷ lËp tr×nh Pascal, ®· tãm t¾t trong mét c©u næi tiÕng: CÊu tróc d÷ liÖu + Gi¶i thuËt = Ch¬ng tr×nh. Chóng ta ®· t×m hiÓu vÒ kh¸i niÖm gi¶i thuËt. B©y giê chóng ta sÏ xem xÐt kh¸i niÖm "cÊu tróc d÷ liÖu" mét c¸ch ®Çy ®ñ h¬n. ThuËt ng÷ "cÊu tróc d÷ liÖu" bao gåm hai thµnh phÇn: "cÊu tróc" vµ "d÷ liÖu". CÊu tróc ®îc hiÓu lµ c¸c thµnh phÇn vµ c¸ch thøc liªn kÕt gi÷a chóng ®Ó t¹o nªn mét chØnh thÓ nµo ®ã. VËy còng cã thÓ nãi ®¬n gi¶n lµ: cÊu tróc lµ mét chØnh thÓ ®îc t¹o nªn bëi nhiÒu thµnh phÇn vµ c¸c thµnh phÇn
12
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
nµy liªn kÕt víi nhau theo mét c¸ch thøc nµo ®ã. Ta nãi cÊu tróc cña ng«i nhµ chÝnh lµ nãi ng«i nhµ ®îc t¹o nªn bëi nh÷ng thµnh phÇn nµo vµ c¸ch thøc mµ c¸c thµnh phÇn nµy liªn kÕt víi nhau ra sao. NÕu lµ ng«i nhµ l¸ ë n«ng th«n th× ®ã lµ kÌo, cét,... Sù liªn kÕt gi÷a chóng lµ chèt hoÆc ®inh...Hay ta nãi cÊu tróc c©u nghÜa lµ nãi r»ng c©u ®îc t¹o thµnh bëi chñ ng÷, vÞ ng÷, tr¹ng ng÷... vµ c¸c thµnh phÇn nµy bæ nghÜa cho nhau nh thÕ nµo, phÇn nµo ®øng tríc, phÇn nµo ®øng sau... Trong tin häc thuËt ng÷ "cÊu tróc d÷ liÖu" lµ nãi vÒ cÊu tróc mµ thµnh phÇn cña nã lµ d÷ liÖu. NÕu nãi râ h¬n th× cÊu tróc d÷ liÖu lµ d÷ liÖu ®îc tæ chøc mét c¸ch hîp lý trªn thiÕt bÞ nhí sao cho phï hîp víi nhiÖm vô ®Æt ra (thêng lµ c¸c thao t¸c cËp nhËt, t×m kiÕm, truy xuÊt th«ng tin). Mét vµi ghi chó vÒ thuËt ng÷: hiÖn nay trong c¸c tµi liÖu tiÕng ViÖt cã t¸c gi¶ dïng thuËt ng÷ “thuËt gi¶i” còng cã t¸c gi¶ gäi lµ “gi¶i thuËt”. V× mét vµi tµi liÖu ®Çu tiªn vÒ lÜnh vùc nµy dïng thuËt ng÷ “gi¶i thuËt”, do ®ã tõ ®©y trë vÒ sau chóng ta sÏ thèng nhÊt dïng thuËt ng÷ “gi¶i thuËt”. Tõ ch¬ng 2 cña tµi liÖu nµy chóng ta sÏ t×m hiÓu c¸ch cµi ®Æt mét sè cÊu tróc d÷ liÖu hay dïng trong lËp tr×nh. 1.3. Gi¶i quyÕt bµi to¸n b»ng m¸y tÝnh
1.3.1. Kh¸i niÖm vÒ vÊn ®Ò vµ bµi to¸n Cã thÓ nãi, mäi c¸ nh©n còng nh mäi céng ®ång x· héi ph¶i liªn tôc gi¶i quyÕt nh÷ng vÊn ®Ò vµ bµi to¸n ®Æt ra trong qu¸ tr×nh tån t¹i vµ ph¸t triÓn. Nhµ to¸n häc cæ Hy l¹p Pitago ®· ph©n chia mäi vÊn ®Ò mµ con ngêi ph¶i gi¶i quyÕt thµnh 2 lo¹i: - Theorema lµ vÊn ®Ò cÇn ®îc kh¼ng ®Þnh ®óng-sai. Chóng ta thêng quen víi lo¹i vÊn ®Ò nµy qua viÖc chøng minh c¸c ®Þnh lý trong to¸n häc. - Problema lµ vÊn ®Ò cÇn t×m gi¶i ph¸p ®Ó ®¹t ®îc mét môc tiªu x¸c ®Þnh tõ nh÷ng ®iÒu kiÖn ban ®Çu nµo ®ã. NhiÒu nhµ nghiªn cøu ®· chØ ra r»ng, c¶ 2 lo¹i vÊn ®Ò mµ Pitago ®· nªu ra ®Òu cã thÓ diÔn ®¹t theo mét s¬ ®å chung: A -> B Trong ®ã: A cã thÓ lµ gi¶ thiÕt, ®iÒu kiÖn ban ®Çu. B cã thÓ lµ kÕt luËn, môc tiªu cÇn ®¹t. -> lµ suy luËn, gi¶i ph¸p cÇn x¸c ®Þnh. Theo s¬ ®å nµy, viÖc cho mét vÊn ®Ò cã nghÜa lµ cho A vµ B. ViÖc gi¶i quyÕt vÊn ®Ò cã nghÜa lµ xuÊt ph¸t tõ A sau mét sè h÷u h¹n c¸c bíc suy luËn cã lý hoÆc hµnh ®éng thÝch hîp ®Ó ®¹t ®îc B. §èi víi tin häc A ®îc hiÓu lµ ®¹i lîng vµo, B lµ ®¹i lîng ra, vµ -> lµ ch¬ng tr×nh m¸y tÝnh. Nh ta thÊy, ch¬ng tr×nh chØ lµ mét c¸ch m· hãa l¹i thuËt to¸n hoÆc thuËt gi¶i ®· ®îc x©y dùng ®Ó gi¶i quyÕt vÊn ®Ò ®· cho. §Ó cho ®¬n gi¶n trong c¸ch diÔn ®¹t, nhiÒu lóc trong c¸ch gäi ta kh«ng ph©n biÖt hai kh¸i niÖm trªn mµ chØ nãi ng¾n gän lµ bµi to¸n hoÆc vÊn ®Ò.
1.3.2. C¸c bíc gi¶i quyÕt bµi to¸n b»ng m¸y tÝnh Qu¸ tr×nh gi¶i quyÕt mét bµi to¸n trªn m¸y tÝnh ®«i khi rÊt ®¬n gi¶n, ®¬n thuÇn lµ c«ng viÖc lËp tr×nh, nhng nãi chung lµ mét qu¸ tr×nh phøc t¹p gåm nhiÒu bíc: 1) X¸c ®Þnh bµi to¸n.
13
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng I. ThuËt to¸n vµ thuËt gi¶i
Ph©n tÝch hÖ thèng, ph¸t biÓu chÝnh x¸c bµi to¸n, ph©n tÝch mèi liªn hÖ gi÷a c¸c d÷ kiÖn, x©y dùng m« h×nh, xÐt tÝnh kh¶ thi. 2) Lùa chän ph¬ng ph¸p gi¶i. Nªu nh÷ng ph¬ng ¸n cã thÓ, ph©n tÝch lùa chän ph¬ng ph¸p thÝch hîp. 3) X©y dùng thuËt gi¶i. X©y dùng m« h×nh chÆt chÏ, chÝnh x¸c h¬n vÒ ph¬ng ph¸p ®· lùa chän. X¸c ®Þnh d÷ liÖu vµo ra, thiÕt kÕ cÊu tróc d÷ liÖu, c¸c bíc c¬ b¶n ®Ó thùc hiÖn thuËt gi¶i. Nªn ¸p dông ph¬ng ph¸p thiÕt kÕ cã cÊu tróc, tõ thiÕt kÕ tæng thÓ råi tiÕn hµnh lµm mÞn dÇn tõng bíc. 4) Cµi ®Æt ch¬ng tr×nh. ViÕt ch¬ng tr×nh. C¸c ch¬ng tr×nh ph¶i ®îc cµi ®Æt sao cho chóng cã thÓ ®îc thay ®æi dÔ dµng, ®îc ®äc vµ hiÓu nhanh chãng bëi c¸c lËp tr×nh viªn kh¸c, vµ giao tiÕp tèt víi c¸c phÇn kh¸c cña hÖ thèng. 5) HiÖu chØnh ch¬ng tr×nh. Cµi ®Æt ch¬ng tr×nh lªn m¸y tÝnh vµ cho ch¹y thö. Cè g¾ng thö víi cµng nhiÒu bé d÷ liÖu cµng tèt. Ph¸t hiÖn vµ söa c¸c lçi có ph¸p (Syntax) vµ ng÷ nghÜa (Semantic). 6) Thùc hiÖn ch¬ng tr×nh. §a ch¬ng tr×nh vµo ¸p dông thùc tÕ vµ trong qu¸ tr×nh ®ã ph¸t hiÖn vµ söa c¸c sai sãt n¶y sinh.
14
Ch¬ng 2 Danh s¸ch 2.1. Danh s¸ch tæng qu¸t
2.1.1. §Þnh nghÜa Danh s¸ch tuyÕn tÝnh (linear list) hay cßn gäi ®¬n gi¶n lµ danh s¸ch, lµ mét cÊu tróc d÷ liÖu gåm mét d·y h÷u h¹n c¸c phÇn tö ®îc s¾p ®Æt theo mét trËt tù tuyÕn tÝnh, nghÜa lµ víi hai phÇn tö bÊt kú ta cã thÓ nãi r»ng phÇn tö nµo ®øng tríc, phÇn tö nµo ®øng sau. Mét danh s¸ch kh¸c rçng lu«n cã phÇn tö ®Çu tiªn: lµ phÇn tö ®øng tríc tÊt c¶ c¸c phÇn tö kh¸c, vµ phÇn tö cuèi cïng: lµ phÇn tö ®øng sau mäi phÇn tö kh¸c. Danh s¸ch lµ cÊu tróc d÷ liÖu ®¬n gi¶n nhÊt thêng gÆp trong tin häc. Th«ng thêng mét danh s¸ch L cã thÓ biÓu diÔn díi d¹ng sau: L = (a0,a1, a2,... ,an-1), n>=0
(2.1)
Ta gäi n lµ ®é dµi cña danh s¸ch. NÕu n = 0, tøc lµ danh s¸ch kh«ng cã phÇn tö nµo, th× danh s¸ch ®îc gäi lµ rçng. NÕu n>0 th× a0 ®îc gäi lµ phÇn tö ®Çu tiªn cßn an-1 lµ phÇn tö cuèi cïng cña danh s¸ch. Víi 2 phÇn tö ai vµ aj bÊt kú vµ i<j ta nãi r»ng phÇn tö ai ®øng tríc phÇn tö aj. Víi i ≥ 0 vµ i ≤ n-1 ta nãi r»ng ai lµ phÇn tö thø i cña danh s¸ch. Kh¸c víi c¸c cÊu tróc kh¸c nh m¶ng, c©y, ®å thÞ,... thuËt ng÷ “danh s¸ch” ®îc dïng thêng xuyªn trong ®êi sèng hµng ngµy. Ta vÉn hay nãi ®Õn danh s¸ch c¸c bµ mÑ ViÖt nam anh hïng, danh s¸ch thÝ sinh tróng tuyÓn vµo mét trêng ®¹i häc, danh s¸ch c¸c thiÕt bÞ cÇn thiÕt ®Ó l¾p ®Æt mét phßng thÝ nghiÖm... Ta h·y xÐt mét vÝ dô ®¬n gi¶n vÒ danh s¸ch sau ®©y: §Ó chuÈn bÞ cho mét b÷a liªn hoan “tù biªn tù diÔn”, chóng ta ph¶i ra chî víi mét danh s¸ch c¸c thø cÇn mua: 1 kÐt bia Halida 1 kÐt coca-cola 3 kg xóc xÝch 2 kg r¨m b«ng 0.5 kg b¬ 2 kg da chuét 30 b¸nh m× 5 b¸nh ga t« 3 kg cam Danh s¸ch trªn ®©y gåm nhiÒu môc, mçi môc gåm 2 ®¹i lîng ®Æc trng: sè lîng vµ m« t¶. §iÒu nµy nãi chung còng ®óng víi c¸c danh s¸ch kh¸c. Tïy tõng trêng hîp cô thÓ, mçi môc cã khi chØ chøa mét th«ng tin duy nhÊt vÝ dô danh s¸ch c¸c cÇu thñ bãng ®¸ tríc giê thi ®Êu, lóc nµy danh s¸ch chØ gåm tªn c¸c cÇu thñ; còng cã khi chøa kh¸ nhiÒu lo¹i th«ng tin, vÝ dô danh s¸ch c¸c vËn ®éng viªn muèn tham gia ®éi tuyÓn quèc gia. Lóc nµy ngoµi hä tªn ph¶i cã thªm nhiÒu th«ng tin kh¸c nh quª qu¸n, ngµy sinh, thµnh tÝch thi ®Êu...TÊt c¶ c¸c môc ph¶i chøa mét sè lo¹i th«ng tin cã kiÓu nh nhau vµ ®îc gäi lµ c¸c trêng (fields). Mçi môc cña
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
danh s¸ch thêng ®îc gäi b»ng nhiÒu thuËt ng÷ kh¸c nhau: nót (node), b¶n ghi (record), thùc thÓ (entity), h¹t (bead), kho¶n môc (item), phÇn tö (element). §Ó ®¬n gi¶n chóng t«i sÏ gäi c¸c môc lµ c¸c nót. C¸ch gäi nh vËy cã thÓ dïng cho c©y vµ ®å thÞ vµ cho ta mét h×nh ¶nh trùc quan h¬n. Trong ch¬ng nµy còng nh c¸c ch¬ng sau chóng t«i sÏ chØ h¹n chÕ sè trêng tèi thiÓu cho mçi môc, vÝ dô mçi môc chØ chøa mét sè thùc. Chóng t«i nghÜ r»ng nh vËy c¸c ch¬ng tr×nh minh häa sÏ ng¾n gän, dÔ ®äc ®Ó b¹n ®äc cã thÓ nhanh chãng nhËn ra b¶n chÊt khoa häc cña vÊn ®Ò. C¸c b¹n cã thÓ thùc hµnh víi nh÷ng sè liÖu phøc t¹p h¬n sau khi ®· n¾m ®îc kiÕn thøc, nh vËy c¸c b¹n cã thÓ hiÓu s©u h¬n vµ lµm quen dÇn víi c¸c øng dông thùc tÕ.
2.1.2. C¸c phÐp to¸n c¬ b¶n C¸c t¸c vô trªn danh s¸ch thêng phô thuéc øng dông cô thÓ. C¸c thao t¸c sau ®©y lµ nh÷ng thao t¸c thêng gÆp nhÊt: • Thªm mét nót vµo danh s¸ch. • Xãa mét nót trªn danh s¸ch. • S¾p xÕp l¹i c¸c nót theo thø tù t¨ng hoÆc gi¶m dÇn theo mét trêng nµo ®ã. • T×m kiÕm nót cã trêng mang th«ng tin cho tríc.
2.1.3. C¸c ph¬ng ph¸p cµi ®Æt danh s¸ch Danh s¸ch cã thÓ cµi ®Æt trªn tÖp hoÆc trong bé nhí. D÷ liÖu lu trªn tÖp cã thÓ lu gi÷ l©u dµi nhng thêi gian truy xuÊt chËm. NÕu cµi ®Æt trong bé nhí th× cã thÓ thao t¸c nhanh nhng l¹i cã nhîc ®iÓm lµ d÷ liÖu bÞ mÊt khi t¾t m¸y. Ngêi ta thêng dïng c¸ch kÕt hîp lµ danh s¸ch ®îc lu gi÷ trªn tÖp nhng khi thao t¸c th× mét phÇn hoÆc toµn bé danh s¸ch ®îc ®æ vµo bé nhí. Trong qu¸ tr×nh thao t¸c, d÷ liÖu cã thÓ ®îc lu vµo tÖp khi cÇn thiÕt. Cµi ®Æt ë bé nhí trong hay trªn tÖp ë thiÕt bÞ nhí ngoµi còng cã nhiÒu c¸ch thøc kh¸c nhau. Trong c¸c môc tiÕp theo chóng ta sÏ t×m hiÓu c¸c ph¬ng ph¸p cµi ®Æt danh s¸ch trong bé nhí. Hai ph¬ng ph¸p c¬ b¶n lµ dïng m¶ng (tÜnh hoÆc ®éng) hoÆc chuçi c¸c phÇn tö cã liªn kÕt. Dïng m¶ng hay m¶ng ®éng th× bé nhí sö dông ph¶i lµ mét vïng liªn tôc, vµ vïng nµy ph¶i ®îc x¸c ®Þnh tríc khi biªn dÞch ch¬ng tr×nh (m¶ng tÜnh) hoÆc tríc khi sö dông danh s¸ch (m¶ng ®éng). Nh÷ng lý do nµy lµm cho viÖc cµi ®Æt danh s¸ch b»ng m¶ng cã nhiÒu h¹n chÕ, ®Æc biÖt lµ viÖc sö dông bé nhí kh«ng hîp lý do kh«ng biÕt tríc ®îc chÝnh x¸c cì cña danh s¸ch. NÕu dïng ph¬ng ph¸p liªn kÕt th× c¸c phÇn tö cã thÓ n»m r¶i r¸c trong bé nhí, h¬n n÷a mçi phÇn tö cã thÓ t¹o ra vµ hñy bÊt cø khi nµo cho nªn bé nhí ®îc sö dông mét c¸ch phï hîp, kh«ng bÞ d thõa hoÆc thiÕu. §Æc ®iÓm cña ph¬ng ph¸p liªn kÕt lµ mçi phÇn tö ngoµi th«ng tin cÇn lu tr÷ cßn mét hoÆc vµi biÕn con trá ®Ó lu ®Þa chØ cña c¸c phÇn tö liªn kÕt víi nã. Cã hai c¸ch liªn kÕt thêng ®îc sö dông: liªn kÕt ®¬n chØ sö dông mét biÕn con trá chØ ®Õn phÇn tö tiÕp theo trong danh s¸ch (hoÆc chØ ®Õn NULL nÕu lµ phÇn tö cuèi cña danh s¸ch); liªn kÕt kÐp sö dông hai biÕn con trá, mét biÕn lu ®Þa chØ phÇn tö ®øng tríc, mét biÕn lu ®Þa chØ phÇn tö tiÕp theo. Dïng liªn kÕt kÐp th× viÖc truy xuÊt c¸c phÇn tö dÔ dµng h¬n nhng viÖc qu¶n lý hai biÕn con trá sÏ thªm thao t¸c vµ tèn bé nhí h¬n, v× vËy ngêi ta chØ sö dông liªn kÕt kÐp trong trêng hîp cÇn thiÕt. Trong tµi liÖu nµy chóng ta sÏ t×m hiÓu danh
16
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
s¸ch liªn kÕt ®¬n. Víi danh s¸ch nµy th× dÔ thÊy r»ng chØ cÇn mét con trá chØ ®Õn nót ®Çu tiªn trong danh s¸ch lµ ®ñ. Tuy nhiªn ®Ó tiÖn cho viÖc thªm phÇn tö ë cuèi danh s¸ch, ngêi ta thªm con trá plast chØ vµo nót cuèi danh s¸ch.
a. Cµi ®Æt danh s¸ch b»ng m¶ng Ta thÊy r»ng danh s¸ch lµ mét tËp hîp h÷u h¹n c¸c phÇn tö mµ trªn ®ã cã x¸c ®Þnh mét trËt tù tuyÕn tÝnh. C¨n cø vµo ®iÒu nµy ta cã thÓ ®¸nh chØ sè c¸c phÇn tö theo c¸ch sau: NÕu danh s¸ch gåm n phÇn tö th× phÇn tö ®Çu tiªn cã chØ sè 0 (ta ký hiÖu lµ a0), phÇn tö cuèi cïng cã chØ sè n-1 (ta ký hiÖu lµ an-1). Bëi v× c¸c phÇn tö ®Òu ®îc g¸n mét thø tù, nghÜa lµ víi phÇn tö bÊt kú, ta cã thÓ nãi r»ng phÇn tö ®ã ®øng thø mÊy trong danh s¸ch. Ta quy íc phÇn tö thø i ®îc g¸n chØ sè i vµ ký hiÖu lµ a i. B»ng c¸ch nµy ta nhËn ®îc c¸ch biÓu diÔn danh s¸ch theo (2.1) ®· nªu ra trªn ®©y: L = (a0,a1, a2,... ,an-1), n>=0 D¹ng nµy rÊt gièng mét m¶ng c¸c phÇn tö cµi ®Æt b»ng ng«n ng÷ lËp tr×nh. ThËt vËy, víi lÖnh float a[20]; trong C++, ta cã mét m¶ng gåm 20 sè thùc trong bé nhí vµ ®îc ®¸nh chØ sè lµ: a[0], a[1], ..., a[19] §iÒu kh¸c biÖt ë ®©y lµ sè phÇn tö cña danh s¸ch th× cã thÓ thay ®æi, cßn cì cña m¶ng trong bé nhí l¹i lµ mét sè cè ®Þnh. Ta cã thÓ kh¾c phôc ®iÒu nµy b»ng c¸ch dù ®o¸n tríc kho¶ng thay ®æi cña sè c¸c phÇn tö trong danh s¸ch, råi khai b¸o mét m¶ng cã cì lµ chÆn trªn cña sè c¸c phÇn tö. §Ó cã thÓ thay ®æi kÝch thíc cña m¶ng mét c¸ch dÔ dµng vµ chØ cÇn thay ®æi ë vÞ trÝ ®Çu ch¬ng tr×nh, ta cã thÓ dïng lÖnh #define, vÝ dô: #define nmax 100 ch¼ng h¹n. Thêng th× mçi nót th«ng tin lµ mét cÊu tróc phøc hîp gåm nhiÒu thµnh phÇn, vÝ dô nÕu danh s¸ch gåm c¸c sinh viªn th× cã thÓ cã d¹ng: struct SinhVien {char HoTen[30]; float DiemTB;}; Râ rµng danh s¸ch ®îc ®Æc trng bëi mét m¶ng vµ sè phÇn tö. Ta cã thÓ khai b¸o m¶ng vµ biÕn chØ sè phÇn tö mét c¸ch toµn côc, vÝ dô: SinhVien a[nmax]; int count; hoÆc nhãm vµo trong mét cÊu tróc, vÝ dô: struct DanhSach {SinhVien a[nmax];int count;}; M¶ng mµ kÝch cì ®îc x¸c ®Þnh ngay khi khai b¸o ®îc gäi lµ m¶ng tÜnh. M¶ng tÜnh cã nhîc ®iÓm lµ kÝch cì cña m¶ng ph¶i x¸c ®Þnh tríc khi ch¬ng tr×nh ®îc biªn dÞch. Trong thùc tÕ rÊt khã ®Þnh tríc lµ cì cña m¶ng lµ bao nhiÒu th× võa. H¬n n÷a kÝch thíc bé nhí dµnh cho tÊt c¶ c¸c biÕn tÜnh chØ lµ 64Kb (1 segment bé nhí). Ta cã thÓ kh¾c phôc t×nh tr¹ng nµy b»ng c¸ch dïng m¶ng ®éng. VÝ dô víi danh s¸ch sinh viªn nãi trªn, nÕu dïng m¶ng ®éng th× c¸c lÖnh ®îc viÕt l¹i lµ: SinhVien *a; int nmax,count; hoÆc struct DanhSach {SinhVien *a;int nmax,count;}; Lóc nµy nmax kh«ng cÇn lµ h»ng sè mµ cã thÓ g¸n gi¸ trÞ khi ch¹y ch¬ng tr×nh. Ta ph¶i cã hµm khëi t¹o ®Ó cÊp ph¸t bé nhí cho a. VÝ dô víi trêng hîp thø hai, hµm khëi t¹o cã thÓ cã d¹ng:
17
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
void KhoiTao(DanhSach &d, int size=20) {d.nmax = size; d.a=new SinhVien[nmax];count=0;}; Dïng m¶ng ®éng ®· cã nhiÒu u ®iÓm, vÝ dô chØ cÇn x¸c ®Þnh cì cña danh s¸ch khi ch¹y ch¬ng tr×nh hoÆc cã thÓ gi¶i phãng bé nhí khi cÇn thiÕt. Tuy nhiªn nã còng cÇn mét vïng nhí liªn tôc, vµ vÉn cßn h¹n chÕ lµ ph¶i cÊp ph¸t mét lÇn khi khëi t¹o, vµ nh vËy vÉn ph¶i dù ®o¸n tríc vÒ cì cña m¶ng. VÒ mÆt sö dông bé nhí th× ph¬ng ph¸p cµi ®Æt danh s¸ch b»ng ph¬ng ph¸p liªn kÕt mµ chóng ta sÏ xem xÐt trong môc sau lµ gi¶i ph¸p hîp lý h¬n c¶. C¸c nót chøa th«ng tin vÒ c¸c phÇn tö sÏ cã thªm mét thµnh phÇn lµ biÕn con trá chØ ®Õn phÇn tö tiÕp theo cña danh s¸ch. Nhê sù liªn kÕt nµy mµ c¸c nót cã thÓ n»m r¶i r¸c trong bé nhí, kh«ng cÇn ë mét vïng liÒn kÒ nhau nh trêng hîp dïng m¶ng. (B¹n ®äc quan t©m cã thÓ xem ch¬ng tr×nh 21A-DSKE.CPP cµi ®Æt danh s¸ch b»ng m¶ng tÜnh, 21B-DSKE.CPP cµi ®Æt danh s¸ch b»ng m¶ng ®éng).
b. Cµi ®Æt danh s¸ch b»ng ph¬ng ph¸p liªn kÕt ®¬n Chóng ta cã thÓ thÊy r»ng trong thùc tÕ cã nhiÒu m« h×nh cã d¹ng danh s¸ch liªn kÕt. Thùc vËy, mét ch¬ng tr×nh ng«n ng÷ m¸y gåm c¸c dßng lÖnh cã d¹ng TiÒn tè
PhÐp to¸n
To¸n h¹ng
§Þa chØ lÖnh tiÕp theo
Râ rµng c¸c dßng lÖnh nµy t¹o nªn danh s¸ch liªn kÕt. B¶ng FAT cña DOS còng cã d¹ng mét danh s¸ch liªn kÕt. Trªn c¸c ®Ò môc cña b¶ng FAT cã ghi ®Þa chØ vïng nhí trªn ®Üa lu trò phÇn phÇn tiÕp theo cña tÖp. Nhê vËy mÆc dï sè liÖu mét tÖp cã thÓ lu tr÷ ë c¸c vïng kh«ng liªn tôc trªn ®Üa, nhng DOS vÉn cã thÓ truy cËp ®îc nhê th«ng tin tõ b¶ng FAT. Trong c¸ch cµi ®Æt dïng danh s¸ch liªn kÕt ®¬n, mçi phÇn tö cña danh s¸ch sÏ gåm hai phÇn: mét phÇn chøa th«ng tin vÒ ®èi tîng trong thùc tÕ, phÇn kia lµ biÕn con trá next chØ ®Õn phÇn tö tiÕp theo trong danh s¸ch. V× phÇn tö cuèi cïng cña danh s¸ch kh«ng cã phÇn tö tiÕp theo nªn con trá next cña nã sÏ ®îc ®Æt b»ng NULL. Cã mét sè c¸ch cµi ®Æt danh s¸ch liªn kÕt: (1)Dïng mét con trá phead ®Ó trá vµo nót ®Çu tiªn. (2)Dïng mét con trá pfirst ®Ó trá vµo nót ®Çu tiªn vµ mét con trá plast chØ ®Õn nót cuèi cïng. Ngoµi ra chóng ta cã thÓ cµi ®Æt danh s¸ch cã 2 mèi liªn kÕt. Tuy nhiªn c¸ch cµi ®Æt nµy chØ dïng trong trêng hîp ®Æc biÖt, v× võa tèn bé nhí võa ph¶i thªm phÐp tÝnh. Râ rµng trong hai c¸ch trªn ®©y th× c¸ch (1) tiÕt kiÖm bé nhí h¬n v× kh«ng dïng biÕn con trá plast. DÔ thÊy r»ng víi danh s¸ch liªn kÕt th× chØ cÇn biÕt ®Þa chØ nót ®Çu tiªn lµ suy ra ®îc tÊt c¶ c¸c nót cßn l¹i (tõ nót 1 suy ®îc nót 2, råi nót 3,...). Tuy nhiªn nÕu thªm vµo con trá plast sÏ lµm cho mét sã thao t¸c ®¬n gi¶n h¬n. Ch¬ng tr×nh 22A-DSLK.CPP cµi ®Æt danh s¸ch liªn kÕt theo (1), cßn ch¬ng tr×nh 22B-DSLK.CPP cµi ®Æt theo (2). Sau ®©y lµ c¸c t¸c vô chÝnh cña ch¬ng tr×nh 22B-DSLK.CPP. plast
pfirs info next
info next
info next
...
info next •
18 NULL
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
H×nh 2.1
Danh s¸ch cµi ®Æt b»ng ph¬ng ph¸p liªn kÕt
®¬n • Khai b¸o cÊu tróc danh s¸ch CÊu tróc cña mét phÇn tö trong danh s¸ch gåm hai phÇn: biÕn info chøa th«ng tin cña phÇn tö, biÕn next lµ biÕn con trá chØ ®Õn phÇn tö tiÕp theo trong danh s¸ch hoÆc nhËn gi¸ trÞ NULL nÕu ®ã lµ phÇn tö cuèi cïng cña danh s¸ch. BiÕn info thêng lµ mét biÕn cã cÊu tróc, chøa nhiÒu thµnh phÇn vÝ dô nh cÊu tróc NhanSu ®îc khai b¸o nh sau: struct NhanSu {char HoTen[30]; int Luong, Thuong, ThuNhap;}; Tuy nhiªn víi môc ®Ých lµm næi bËt b¶n chÊt cña thuËt to¸n, chóng t«i chØ xÐt trêng hîp ®¬n gi¶n: info lµ mét biÕn sè thùc. VËy cÊu tróc mét phÇn tö cña danh s¸ch ®îc khai b¸o lµ: struct node {float info; node* next;}; Mét danh s¸ch sÏ ®îc x¸c ®Þnh bëi hai biÕn con trá kiÓu node lµ pfirst chøa ®Þa chØ cña phÇn tö ®Çu tiªn, vµ plast chøa ®Þa chØ phÇn tö cuèi cïng cña danh s¸ch. §Ó tiªn thao t¸c, ta gép hai biÕn con trá nµy vµo trong mét cÊu tróc vµ ®Æt tªn lµ DanhSach: struct DanhSach {node *pfirst,*plast;}; • Khëi t¹o danh s¸ch Hµm init víi ®èi sè d cã kiÓu DanhSach ®îc khai b¸o lµ biÕn tham chiÕu ®Ó nh÷ng thay ®æi cña d bªn trong hµm vÉn cã hiÖu lùc khi tho¸t ra khái hµm. Khi khëi t¹o, danh s¸ch cßn cha cã phÇn tö nµo nªn pfirst vµ plast chØ ®Õn ®Þa chØ 0 (NULL). void init(DanhSach &d) {d.pfirst=NULL;d.plast=NULL; } • Xãa danh s¸ch khái bé nhí Thao t¸c nµy cÇn ®Õn khi ta kh«ng cßn cÇn ®Õn danh s¸ch n÷a vµ gi¶i phãng nã khái bé nhí ®Ó tr¸nh sù l·ng phÝ. NÕu danh s¸ch rçng dÜ nhiªn lµ kh«ng cÇn ph¶i gi¶i phãng nã. NÕu kh«ng, ta dïng con trá p ®i qua tÊt c¶ c¸c nót cña danh s¸ch. Nót p1 lu ®Þa chØ nót ®øng tríc p. Mçi lÇn p chuyÓn ®Õn nót tiÕp theo th× hñy nót do p1 trá ®Õn. §iÒu nµy còng gièng nh khi ta cÇn th¸o c¸c tÊm v¸n lãt mÆt cÇu vËy: xuÊt ph¸t tõ mét ®Çu cÇu, ta ®øng trªn tÊm thø hai ®Ó th¸o tÊm thø nhÊt, xong råi l¹i ®øng trªn tÊm thø ba ®Ó th¸o tÊm thø hai vµ cho ®Õn khi bíc qua tÊm cuèi cïng (con trá p=NULL) th× th¸o nèt tÊm nµy vµ kÕt thóc. p1
...
info next
p info next
... 19
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
H×nh 2.2 LÇn lît gi¶i phãng c¸c nót trªn danh s¸ch void clear(DanhSach &d) {if(empty(d)) return; node *p,*p1; p=d.pfirst; while(p!=NULL) {p1=p; p=p->next; delete p1; } d.pfirst=NULL;d.plast=NULL; } • KiÓm tra xem danh s¸ch cã rçng kh«ng Danh s¸ch rçng khi con trá pfirst chØ vµo NULL int empty(DanhSach &d) {return(d.pfirst==NULL); } • T×m kiÕm khãa x trªn danh s¸ch B¾t ®Çu tø phÇn tö ®©u tiªn do pfirst trá ®Õn, ta duyÖt qua tÊt c¶ c¸c phÇn tö cña danh s¸ch (lÖnh p=p->next). NÕu gÆp khãa x th× tr¶ vÒ ®Þa chØ nót t×m thÊy vµ kÕt thóc. NÕu ®i ®Õn hÕt mµ kh«ng t×m thÊy th× tr¶ vÒ NULL, tøc lµ kh«ng t×m thÊy. node* search(DanhSach &d,float x) {node* p=d.pfirst; while(p!=NULL) {if(p->info==x) return(p); p=p->next; } return(NULL); • ChÌn khãa x vµo danh s¸ch §Ó chÌn khãa x vµo danh s¸ch tríc hÕt ta t×m kiÕm x. NÕu x ®· tån t¹i th× kÕt thóc, kh«ng chÌn n÷a, v× ta chØ xÐt danh s¸ch gåm c¸c khãa kh¸c nhau. NÕu kh«ng ta t¹o nót míi b»ng lÖnh pp=new node; g¸n phÇn th«ng tin nót nµy b»ng x (lÖnh pp->info=x;) vµ con trá next cña nã b»ng NULL (p->next=NULL). NÕu danh s¸ch cßn rçng, tøc lµ pfirst=NULL, th× ta ®Æt pfirst vµ plast trá vµo nót míi t¹o vµ kÕt thóc (c¸c lÖnh d.pfirst=pp; vµ d.plast=pp;). NÕu danh s¸ch ®· cã phÇn tö th× nót míi sÏ ®îc chÌn vµo cuèi danh s¸ch, do ®ã ta ®Æt plast->next=pp; ®Ó nèi nót cuèi cïng cña danh s¸ch víi nót míi t¹o ra. Sau ®ã chuyÓn plast vÒ nót cuèi b»ng lÖnh plast=pp; void insert(DanhSach &d,float x) {node *pp,*p,*p1; p=search(d,x);
20
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
if(p!=NULL) {printf("\nKhoa %4d da co, khong chen duoc!",x);return;} pp = new node; pp->info=x;pp->next=NULL; if(d.pfirst==NULL) {d.pfirst=pp;d.plast=pp;return;} d.plast->next = pp; d.plast=pp;//pp bay gio la nut cuoi cung }; • Xãa nót cã khãa x trªn danh s¸ch NÕu x cã trªn danh s¸ch vµ ë ngay trªn nót ®Çu tiªn (lÖnh if(d.pfirst>info==x)) th× ta chuyÓn pfirst ®Õn nót tiÕp theo sau ®ã xãa nót ®Çu tiªn (c¸c lÖnh p=d.pfirst;d.pfirst=d.pfirst->next;delete p;). Sau khi xãa xong ta cßn ph¶i xem, nÕu danh s¸ch rçng th× ®Æt l¹i plast=NULL vµ kÕt thóc. Trong trêng hîp cßn l¹i x chØ cã thÓ xuÊt hiÖn ë c¸c nót sau nót ®Çu tiªn. Ta xuÊt ph¸t tõ nót ®Çu tiªn vµ trong qu¸ tr×nh cho p ch¹y qua c¸c nót ®Ó t×m kiÕm nót cã phÇn th«ng tin b»ng x, ta dïng con trá p1 ®Ó ghi nhËn ®Þa chØ nót ®øng tríc p (c¸c lÖnh p1=p;p=p->next;). NÕu t×m thÊy x th× ta ghi nhËn vÞ trÝ p b»ng con trá q (q=p;) råi ®Æt mèi liªn kÕt tõ p1 tíi nót phÝa sau p (lÖnh p1->next=p->next;) sau ®ã xãa p (chÝnh lµ lÖnh delete q) nh trªn h×nh 2.3. sau: p1
...
info next
p info next
p>next
info next
...
H×nh 2.3 Xãa nót p cã khãa x trªn danh s¸ch void dele(DanhSach &d,float x) {node *p,*p1,*q; if(d.pfirst==NULL) return; if(d.pfirst->info==x) {p=d.pfirst;d.pfirst=d.pfirst->next;delete p; if(d.pfirst==NULL) d.plast=NULL;//Tuc la ds chi co mot phan tu return; } p1=d.pfirst;//p1 la nut dung truoc p p=d.pfirst->next; while(p!=NULL) {if(p->info==x) {q=p; p1->next=p->next; if (d.plast==p) d.plast=p1;//plast bi xoa, phai chuyen ve nut phia truoc delete q; return;} p1=p; p=p->next; } printf("\nKhoa %4.0f khong co, khong xoa duoc!",x); };
21
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
• S¾p xÕp danh s¸ch liªn kÕt b»ng ph¬ng ph¸p lùa chän trùc tiÕp C¸ch s¾p xÕp nµy ®îc thùc hiÖn gièng nh khi s¾p xÕp mét m¶ng: tríc hÕt ta t×m phÇn tö cã khãa nhá nhÊt råi chuyÓn vÒ vÞ trÝ ®Çu tiªn trong danh s¸ch, tiÕp theo trong c¸c phÇn tö cßn l¹i t×m phÇn tö cã khãa nhá nhÊt råi ®æi vÞ trÝ cho phÇn tö thø hai, ... cø nh thÕ cho ®Õn phÇn tö cuèi cïng trong danh s¸ch. Víi danh s¸ch liªn kÕt, viÖc ®æi hai nót sÏ lµm thay ®æi sù liªn kÕt, do ®ã ta dïng gi¶i ph¸p lµ chØ ®æi phÇn th«ng tin, cßn mèi liªn kÕt th× gi÷ nguyªn. Ta dïng con trá p1 ®Ó ghi nhËn nót thø nhÊt, nót thø hai, ... trong qu¸ tr×nh gi÷ nguyªn p1 th× ta dïng con trá p2 ®Ó duyÖt qua c¸c nót ®øng phÝa sau p1. Khëi ®Çu p1 trá vµo nót ®Çu tiªn (p1=d.pfirst;), sau ®ã sÏ lÇn lît ®i qua c¸c nót phÝa sau (lÖnh p1=p1>next;) cho ®Õn khi qua nót cuèi cïng (lÖnh while(p1!=NULL). Khi cè ®Þnh p1 th× ta dïng con trá p2 ®Ó duyÖt qua c¸c nót phÝa sau p1. Nh vËy khëi ®Çu lµ lÖnh p2=p1->next;, sau ®ã lµ lÖnh p2=p2->next; ®îc lÆp l¹i cho ®Õn khi p2 qua nót cuèi cïng (while(p2!=NULL)). Con trá p sÏ ghi nhËn vÞ trÝ cã khãa nhá nhÊt tõ p1 cho ®Õn cuèi danh s¸ch. Ban ®Çu dÜ nhiªn lµ p ®îc g¸n b»ng p1 (lÖnh p=p1;) sau ®ã trong qu¸ tr×nh p2 dÞch chuyÓn th× mçi lÇn ph¸t hiÖn ra phÇn tö cã khãa nhá h¬n th× p laÞ chØ ®Õn vÞ trÝ nµy (lÖnh if(p2->infoinfo) p=p2;). Sau khi p2 ®· ®i ®Õn nót cuèi cïng th× p chÝnh lµ vÞ trÝ chøa khãa nhá nhÊt (tõ p1 ®Õn cuèi). RÊt cã thÓ vÞ trÝ nµy vÉn lµ p1, nghÜa lµ p1 lµ vÞ trÝ nhá nhÊt trong c¸c vÞ trÝ tõ p1 cho ®Õn cuèi danh s¸ch. ChØ khi p trá vµo vÞ trÝ kh¸c (lÖnh if(p!=p1)) ta míi cÇn ph¶i ®æi th«ng tin cña nót p1 cho nót p. void SapXep(DanhSach &d) {node *p,*p1,*p2; float t,min; if(empty(d)) return; p1=d.pfirst; //pt truoc p,p1t truoc p1 while(p1!=NULL) {p=p1; min=p1->×no; p2=p1->next; while(p2!=NULL) {if(p2->info<min) {p=p2;min= p->info;} p2=p2->next; } if(p!=p1) {t=p1->info;p1->info=p->info; p->info = t;}//§æi gi¸ trÞ cña hai nót p vµ p1 p1=p1->next; } } C¸c thao t¸c cßn l¹i c¸c b¹n cã thÓ t×m hiÓu trong ch¬ng tr×nh 22BDSLK.CPP Trong c¸c môc sau ta xÐt hai trêng hîp ®Æc biÖt cña danh s¸ch cã nhiÒu øng dông, ®ã lµ ng¨n xÕp (Stack) vµ hµng ®îi (Queue). 2.2. Ng¨n xÕp (stack)
2.2.1. Giíi thiÖu stack Ng¨n xÕp lµ danh s¸ch trong ®ã c¸c nót ®îc thªm vµo hoÆc lÊy ®i chØ ®îc thùc hiÖn ë mét ®Çu gäi lµ ®Ønh cña ng¨n xÕp. MÆc dï trong thùc
22
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
tÕ cã rÊt nhiÒu h×nh ¶nh minh häa c¬ chÕ ho¹t ®éng cña stack, vÝ dô chång ®Üa ®îc xÕp vµo hép, b¨ng ®¹n ®îc n¹p vµo khÈu sóng m¸y, x©u chïm ruét ghim ë tay cÇm... nhng thùc ra stack lµ cÊu tróc d÷ liÖu chuyªn dông. Nã chñ yÕu ®îc c¸c nhµ lËp tr×nh dïng ®Õn khi viÕt ch¬ng tr×nh biªn dÞch. Nã cung cÊp c¬ chÕ c¬ b¶n cho viÖc gäi thñ tôc con vµ truyÒn tham sè. Stack còng ®îc dïng cho nhiÒu môc ®Ých kü thuËt kh¸c. Mét vµi vÝ dô chóng t«i nªu ra trong phÇn nµy nh chuyÓn ®æi mét sè nguyªn thËp ph©n sang sè nhÞ ph©n thùc ra còng chØ cã tÝnh chÊt minh häa. B¹n ®äc cã thÓ dÔ dµng thùc hiÖn phÐp chuyÓn ®æi mµ kh«ng dïng ®Õn stack. V× vËy b¹n còng ®õng lÊy lµm ng¹c nhiªn nÕu nh trong khi viÕt c¸c ch¬ng tr×nh øng dông b¹n cha dïng ®Õn stack bao giê. Stack thêng ®îc gäi b»ng nhiÒu tªn kh¸c nhau: danh s¸ch ®Èy xuèng (push-down list), bé nhí ngîc (reversion storage), kho chøa (cellar), ng¨n xÕp (nesting store), chång (pile), danh s¸ch vµo sau ra tríc (LIFO - last-in-first-out list), danh s¸ch yoyo (®å ch¬i trÎ con). Stack cã 2 t¸c vô chÝnh lµ thªm mét nót vµo ®Ønh vµ lÊy mét nót tõ ®Ønh.
2.2.2. øng dông cña stack Stack ®ãng vai trß ®Æc biÖt quan träng trong ho¹t ®éng cña m¸y tÝnh. Stack ®îc coi lµ mét trong nh÷ng phô tïng ®Æc s¾c nhÊt cña c¸c m¸y tÝnh hiÖn ®¹i. Tríc ®©y stack cha ®îc thiÕt kÕ cøng trong m¸y tÝnh. Ngay c¶ c¸c lo¹t m¸y IBM 360 lµ nh÷ng m¸y ®· ®em l¹i thµnh c«ng thÞ trêng to lín nhÊt cña IBM kÓ tõ ®Çu nh÷ng n¨m 60 vµ c¸c lo¹i m¸y 360 sau nµy ®Òu thiÕu ng¨n xÕp. DÇn dÇn v× thÊy ®îc tÇm quan träng cña ng¨n xÕp nªn b¾t ®Çu tõ c¸c bé vi xö lý 8088 ngêi ta ®· ®a ng¨n xÕp vµo bé nhí m¸y tÝnh. Ng¨n xÕp thùc ra kh«ng ph¶i lµ mét bé nhí riªng biÖt, nã chØ lµ mét phÇn cña RAM ë phÇn ®Þa chØ cao nhÊt cha sö dông, ®îc tæ chøc theo kiÓu vµo sau ra tríc (LIFO). §Þa chØ ®¸y cña ng¨n xÕp ®îc tr÷ trong thanh ghi SS (stack segment register), bªn c¹nh ®ã thanh ghi con trá ng¨n xÕp (SP - stack pointer register) ®¸nh dÊu ®Ønh ng¨n xÕp t¹i bÊt cø thêi ®iÓm nµo. Cã thÓ ®a sè liÖu vµo ng¨n xÕp b»ng lÖnh PUSH, vµ lÊy chóng ra b»ng lÖnh POP cña hîp ng÷ (assembly). Khi mét lÖnh ng¾t ®Õn, ®Þa chØ cña ch¬ng tr×nh ®ang ch¹y, n»m trong thanh ghi CS (code segment register) vµ IP (instruction pointer register), sÏ ®îc chuyÓn vµo ng¨n xÕp, sau ®ã ®Þa chØ cña ch¬ng tr×nh dÞch vô xö lý ng¾t sÏ ®îc chuyÓn vµo c¸c thanh ghi CS vµ IP , nghÜa lµ ch¬ng tr×nh dÞch vô sÏ ®îc thùc hiÖn. §»ng sau con trá ng¨n xÕp SP cã thÓ thÊy mäi c«ng viÖc bÞ treo tríc ®ã vµ b©y giê ®ang ®îi tiÕp tôc, trong khi phÝa tríc con trá SP cã mét vïng trèng mµ trong trêng hîp cÇn thiÕt ch¬ng tr×nh con dÞch vô ng¾t ®ang ch¹y cã thÓ dïng nã ®Ó lµm vïng nhí lµm viÖc. NÕu nh÷ng lÖnh ng¾t míi ®Õn tiÕp, ®Þa chØ ch¬ng tr×nh con hiÖn t¹i l¹i chui vµo ng¨n xÕp nhêng chç cho ch¬ng tr×nh con dÞch vô míi... Khi ch¬ng tr×nh kh«ng bÞ ng¾t ch¹y xong th× lÇn lît ®Þa chØ c¸c ch¬ng tr×nh ®ang bá dë tõ ®Ønh ng¨n xÕp ®îc ®æ trë l¹i c¸c thanh ghi CS vµ IP vµ ®îc thùc hiÖn; cø nh vËy theo chiÒu híng tõ ®Ønh ®Õn ®¸y ng¨n xÕp. Bé nhí ng¨n xÕp kh«ng chØ tham gia trong viÖc xö lý c¸c lÖnh ng¾t, mµ cßn cã mÆt khi mét ch¬ng tr×nh gäi mét ch¬ng tr×nh kh¸c. Khi gäi ch¬ng tr×nh con, cã 2 lo¹i sè liÖu ®îc ®a vµo ng¨n xÕp: c¸c tham sè vµ ®Þa chØ trë vÒ. Trong mäi trêng hîp nguyªn t¾c ®Òu nh nhau: cÊt nh÷ng c«ng viÖc cò ®i mét thêi gian t¹m thêi nhng an toµn vµ ®Ó ý ®Õn c«ng
23
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
viÖc míi. Khi c«ng viÖc míi ®· xong th× tiÕp tôc c«ng viÖc ®ang bá dë theo thø tù treo sau dì xuèng tríc. Sau khi t×m hiÓu nh÷ng ®iÒu trªn ®©y vÒ ng¨n xÕp, b¹n ®äc cã thÓ tù hái: trong m¸y tÝnh ®· cã ng¨n xÕp, vµ ta chØ cã thÓ can thiÖp vµo bé nhí ng¨n xÕp b»ng lÖnh hîp ng÷. VËy chóng ta häc c¸ch cµi ®Æt ng¨n xÕp b»ng C++ ®Ó lµm g×? Chóng t«i thö nªu 2 lý do sau: • Thùc ra bé nhí ng¨n xÕp ®îc t¹o ra vµ ®iÒu khiÓn bëi ch¬ng tr×nh. NÕu chóng ta häc thªm mét c¸ch cµi ®Æt ng¨n xÕp b»ng ng«n ng÷ bËc cao chóng ta sÏ hiÓu râ thªm c¬ chÕ ho¹t ®éng cña ng¨n xÕp, vµ nhê vËy nÕu sau nµy khi cã dÞp lËp tr×nh hÖ thèng liªn quan ®Õn ng¨n xÕp th× sÏ nhanh chãng lµm quen víi c«ng viÖc h¬n. • MÆc dÇu ch¬ng tr×nh chóng ta viÕt hÇu hÕt dïng ®Õn ng¨n xÕp, nhng chóng ta kh«ng thÓ hiÓu ®îc ng¨n xÕp ®· ®îc dïng cô thÓ nh thÕ nµo. Trong thùc tÕ chóng ta gÆp nh÷ng bµi to¸n mµ nÕu sö dông ng¨n xÕp mét c¸ch têng minh, nghÜa lµ chóng ta ph¶i biÕt râ ng¨n xÕp chøa th«ng tin g×, kÝch cì ng¨n xÕp lµ bao nhiªu..., th× ch¬ng tr×nh sÏ râ rµng, s¸ng sña h¬n. Trong trêng hîp nµy chóng ta ph¶i t¹o ra ng¨n xÕp trong ch¬ng tr×nh. Mét vµi trêng hîp ®iÓn h×nh lµ: - Trong mét sè bµi to¸n vÒ c©y hay ®å thÞ, thÝ dô phÐp duyÖt c©y theo thø tù tríc (NLR), thø tù gi÷a (LNR), duyÖt ®å thÞ theo chiÒu s©u, t×m ®êng ®i ng¾n nhÊt trong ®å thÞ, t×m ®êng ®i hoÆc chu tr×nh Euler... - Satck cßn ®îc dïng ®Ó khö ®Ö quy ®u«i.
24
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
2.2.3. Cµi ®Æt stack Stack cã thÓ cµi ®Æt theo kiÓu kÕ tiÕp dïng m¶ng ®éng hoÆc liªn kÕt.
a. Cµi ®Æt Stack theo kiÓu kÕ tiÕp (dïng m¶ng ®éng) Stack thêng ®îc dïng nh mét cÊu tróc d÷ liÖu trung gian hç trî cho viÖc sö dông c¸c cÊu tróc d÷ liÖu kh¸c, thÝ dô trong c¸c phÐp duyÖt c©y hoÆc ®å thÞ , stack ®îc dïng ®Ó lu c¸c nót trªn ®êng ®i nhng cha duyÖt ®Õn. Thêng kÝch cì vµ kiÓu cña c¸c phÇn tö cña stack phô thuéc vµo øng dông cô thÓ. V× vËy ®Ó stack cã thÓ dïng ®îc cho nhiÒu øng dông mµ kh«ng ph¶i söa ®æi, chóng ta sÏ x©y dùng stack sao cho kÝch cì vµ kiÓu c¸c phÇn tö cña nã cã thÓ ®îc ®Þnh ra khi sö dông. Ta sÏ lu tr÷ c¸c phÇn tö cña stack trong m¶ng a[0], a[1],...,a[ max-1], trong ®ã phÇn tö ë ®Ønh cña stack lµ a[top]. Hai t¸c vô chÝnh cña stack lµ push() - thªm mét nót vµ pop() - lÊy ®i mét nót ë ®Ønh. H×nh 2.1 sau ®©y m« t¶ sù thay ®æi cña stack qua mét lo¹t thao t¸c push vµ pop. push(A ) 5 4 3 2 1 0
A
push(B )
B A
pop
A
push(C )
push( D)
D C A
C A
push(E )
E D C A
pop
push(F )
F D C A
D C A
push( G) G F D C A
H×nh 2.4. Stack víi c¸c thao t¸c push vµ pop
b. Cµi ®Æt Stack theo kiÓu liªn kÕt Còng gièng nh danh s¸ch tæng qu¸t, trong c¸ch cµi ®Æt stack theo kiÓu liªn kÕt, mçi nót cña stack sÏ gåm 2 trêng: trêng info chøa th«ng tin vµ trêng next chØ phÇn tö kÕ tiÕp. Tuy nhiªn viÖc ®a phÇn tö vµo vµ lÊy phÇn tö ra khái stack chØ thùc hiÖn ë mét ®Çu ®îc gäi lµ ®Ønh cña stack. §Ønh cña stack cã thÓ chän ë ®Çu hoÆc cuèi danh s¸ch. Ta quy íc chän ®Çu danh s¸ch lµm ®Ønh. Cã thÓ thÊy r»ng con trá plast trë nªn kh«ng cÇn thiÕt. Ta sÏ gäi con trá chØ vµo phÇn tö ®Çu tiªn lµ phead. p info next
info next
info next
...
info next •
NULL
H×nh 2.5 Stack cµi ®Æt b»ng ph¬ng ph¸p liªn kÕt ®¬n • Khai b¸o cÊu tróc ng¨n xÕp Còng nh danh s¸ch tæng qu¸t, mçi nót trªn stack lµ mét cÊu tróc gåm hai thµnh phÇn: thµnh phÇn chøa th«ng tin cã tªn lµ info vµ mét thµnh phÇn lµ biÕn con trá next dïng ®Ó lu ®Þa chØ cña nót tiÕp theo trong stack hoÆc trá ®Õn NULL nÕu lµ nót cuèi cïng. BiÕn info cã thÓ lµ mét cÊu tróc phøc t¹p chøa nhiÒu thµnh phÇn. Tuy nhiªn víi môc ®Ých lµm næi bËt b¶n
25
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
chÊt cña thuËt to¸n, chóng t«i chØ xÐt trêng hîp ®¬n gi¶n: info lµ mét biÕn sè nguyªn. VËy cÊu tróc mét phÇn tö cña stack ®îc khai b¸o lµ: struct node {int info; node* next;}; Kh¸c víi danh s¸ch tæng qu¸t, ë ®©y info ®îc khai b¸o lµ biÕn nguyªn chø kh«ng ph¶i biÕn thùc, v× chóng t«i muèn thö l¹i stack b»ng c¸ch dïng nã ®Ó chuyÓn ®æi mét sè nguyªn thËp ph©n sang d¹ng sè nhÞ ph©n. ChØ cÇn con trá phead chØ vµo ®Ønh stack lµ cã thÓ suy ra c¸c phÇn tö cßn l¹i. VËy stack sÏ ®îc ®Æc trng bëi mét biÕn con trá phead. Tuy nhiªn ®Ó khái nhÇm l·n víi c¸c cÊu tróc kh¸c, chóng t«i vÉn dïng cÊu tróc NganXep ®Ó chøa biÕn con trá nµy: struct NganXep {node *phead;}; Víi stack th× chØ cã mét sè thao t¸c thêng sö dông lµ: khëi t¹o stack, xãa stack, kiÓm tra xem stack cã rçng kh«ng, ®a mét phÇn tö vµo ®Ønh stack, lÊy mét phÇn tö tõ ®Ønh stack, xem gi¸ trÞ phÇn tö ë ®Ønh stack. C¸c thao t¸c kh¸c t¬ng tù hoÆc kh¸ ®¬n gi¶n, do ®ã sau ®©y chóng t«i chØ gi¶i thÝch hai thao t¸c ®a phÇn tö vµo ®Ønh stack push(), lÊy mét phÇn tö tõ ®Ønh stack pop(). • §a mét phÇn tö cã khãa x vµo ®Ønh ng¨n xÕp Tríc hÕt ta t¹o mét nót míi, g¸n phÇn info cña nã b»ng x råi nèi víi nót ®Çu tiªn b»ng lÖnh: pp->next=s.phead; sau ®ã chuyÓn con trá phead vÒ nót míi t¹o ra v× nót nµy b©y giê trë thµnh ®Ønh cña stack. void push(NganXep &s,int x) {node *pp,*p,*p1; pp = new node; pp->info=x;pp->next=s.phead; s.phead=pp; }; • LÊy phÇn tö tõ ®Ønh ng¨n xÕp ChØ cã thÓ lÊy ®îc phÇn tö nÕu stack kh«ng rçng. LÖnh assert(!empty(s)); b¶o ®¶m ®iÒu nµy. B¹n nhí thªm lÖnh #include trong phÇn c¸c chØ thÞ tiÒn xö lý. Gi© trÞ biÕn info trong nót ë ®Ønh stack ®îc g¸n cho x, sau ®ã nót nµy ®îc gi¶i phãng khái bé nhí. Con trá phead ®îc chuyÓn ®Õn nót tiÕp theo. int pop(NganXep &s) {assert(!empty(s)); int x=s.phead->info; node* p = s.phead; s.phead=s.phead->next; delete p; return(x); };
26
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
• Thö l¹i ng¨n xÕp Cã thÓ thö l¹i xem ng¨n xÕp ho¹t ®éng cã tèt kh«ng b»ng c¸ch dïng nã ®Ó chuyÓn ®æi mét sè nguyªn thËp ph©n sang d¹ng sè c¬ sè 2. ThuËt to¸n chuyÓn mét sè nguyªn k sang d¹ng nhÞ ph©n: LÊy k chia liªn tiÕp cho 2 cho ®Õn khi th¬ng sè b»ng 0, phÐp chia thø i cã sè d bi, i=0,1,2,...,n , khi ®ã bn bn-1 bn-2... b0 lµ phÇn nguyªn cña sè b trong hÖ c¬ sè 2. VÝ dô. ChuyÓn ®æi sè 11 sang d¹ng nhÞ ph©n Chia D 2 11 1 5 1 2 0 1 1 0 KÕt qu¶ lµ 1011. Ta thÊy qu¸ tr×nh lÊy c¸c sè d ®Ó viÕt thµnh sè nhÞ ph©n ngîc víi qu¸ tr×nh t¹o ra nã. C¸ch lµm nµy gièng víi thao t¸c ®a phÇn tö vµo stack vµ lÊy phÇn tö ra khái stack. Hµm sau ®©y m« t¶ l¹i c¸c thao t¸c chuyÓn ®æi mét sè nguyªn thËp ph©n sang d¹ng nhÞ ph©n: void ChuyenNP(int n=11) {NganXep s; init(s); int m,t;m=n; while(m>0) {t=m%2; push(s,t); m=m/2; } printf("\n%d chuyen sang so nhi phan la: ",n); while(!empty(s)) {t=pop(s); printf("%d",t); } clear(s); } 2.3. Hµng ®îi (queue)
2.3.1. Giíi thiÖu Hµng ®îi lµ danh s¸ch gåm c¸c nót tr¶i dµi tõ nót ®Çu ®Õn nót cuèi, trong ®ã ta chØ cã thÓ thªm c¸c nót vµo cuèi hµng vµ lÊy ®i c¸c nót ë ®Çu hµng. V× ë hµng ®îi nót vµo tríc ®îc lÊy ra tríc nªn cÊu tróc nµy cßn cã tªn lµ vµo tríc - ra tríc (FIFO - first in first out). §©y lµ cÊu tróc phï hîp víi suy nghÜ tù nhiªn nhÊt: ®øng vµo hµng tríc th× ®îc phôc vô tríc. Ta cã thÓ thÊy m« h×nh hµng ®îi ë mäi n¬i: s¾p hµng mua vÐ xem phim, chê gäi ®iÖn tho¹i tù ®éng, s¾p hµng mua x¨ng... D·y xÕp hµng nhiÒu khi cßn biÓu hiÖn nÕp sèng v¨n hãa cña mét x· héi mµ mäi thµnh viªn ®Òu b×nh ®¼ng. Tuy nhiªn trong thùc tÕ nhiÒu khi ta kh«ng thÓ ¸p dông c¬ chÕ FIFO mét c¸ch m¸y mãc. VÝ dô cã mét sè bÖnh nh©n ®îc ®a ®Õn phßng cÊp cøu trong khi sè bÖnh nh©n nhiÒu h¬n sè b¸c sÜ trùc. DÜ nhiªn lµ bÖnh nh©n nguy kÞch nhÊt ph¶i ®îc u tiªn xö lý tríc. V× vËy chóng ta còng cÇn nghiªn cøu lo¹i hµng ®îi cã söa ®æi c¬ chÕ FIFO lµ
27
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
hµng ®îi cã u tiªn: kh«ng ph¶i phÇn tö ®Çu hµng mµ lµ phÇn tö cã ®é u tiªn cao nhÊt sÏ ®îc lÊy ra khái hµng ®îi.
2.3.2. øng dông hµng ®îi C¸c qu¸ tr×nh xö lý xÈy ra trong m¸y tÝnh thêng tu©n theo c¬ chÕ hµng ®îi. Trõ nh÷ng khi ch¬ng tr×nh t¹m ngõng ®Ó xö lý ng¾t hoÆc ch¹y ch¬ng tr×nh con, c¸c lÖnh ®Òu ®îc thùc hiÖn mét c¸ch tuÇn tù: lÖnh ®øng tríc sÏ ®îc xö lý tríc. Trong mét hÖ thèng ®a nhiÖm (multitasking), bé xö lý ®iÒu khiÓn nhiÒu ch¬ng tr×nh ®îc ch¹y ®ång thêi b»ng c¸ch chuyÓn tõ ch¬ng tr×nh nµy sang ch¬ng tr×nh kh¸c theo chu kú. ViÖc sö dông cÊu tróc hµng ®îi ®Ó theo dâi c¸c ch¬ng tr×nh ®ang ch¹y lµ rÊt h÷u Ých. Bé xö lý sÏ chó ý ®Õn ch¬ng tr×nh ®øng ®Çu queue. Ch¬ng tr×nh võa ®îc dµnh thêi gian ch¹y sÏ ®îc göi ra phÝa sau hµng ®îi ®Ó bé xö lý chuyÓn sù chó ý sang ch¬ng tr×nh kÕ tiÕp. Mét sè hÖ thèng phô nh m¸y in còng ho¹t ®éng theo c¬ chÕ hµng ®îi. Trong chÕ ®é in background, nÕu mét file ®îc göi ®Õn bé ®Öm trong khi bé ®Öm vÉn chøa c¸c file chê in, file nµy ®îc thªm vµo cuèi queue cña t¸c vô in. T¸c vô in kÕ tiÕp lÊy tõ file ®øng ®Çu queue khi t¸c vô in hiÖn thêi hoµn tÊt. Trong c¸c hÖ thèng giao diÖn ®å häa víi ngêi sö dông (GUI - graphical user interface), queue ®ãng vai trß trung t©m h¬n. PhÇn lín c¸c GUI ®îc ®iÒu khiÓn theo sù kiÖn (event driven), trong ®ã tÊt c¶ c¸c d÷ kiÖn nhËp tõ bªn ngoµi vµ mét sè sù viÖc x¶y ra bªn trong (vÝ dô cöa sæ ®ang më trªn mµn h×nh) ®îc xem nh c¸c sù kiÖn. V× kh«ng thÓ gi¶i quyÕt ®îc c¸c sù kiÖn mét c¸ch liªn tôc, c¸c sù kiÖn ®îc kÕt n¹p vµo queue theo ®é u tiªn vÒ nhiÖm vô ®Ó chê gi¶i quyÕt. Còng gièng nh trêng hîp stack, cã thÓ nªu hái: c¬ chÕ hµng ®îi lµ c¬ chÕ kh¸ tù nhiªn vµ ®îc sö dông nhiÒu trong c¸c ho¹t ®éng m¸y tÝnh. C¸c c¬ chÕ nµy ®îc ®iÒu khiÓn bëi hÖ ®iÒu hµnh vµ chóng ta kh«ng thÓ ®iÒu khiÓn ®îc th«ng qua ch¬ng tr×nh øng dông th«ng thêng. VËy th× v× sao cÇn x©y dùng cÊu tróc hµng ®îi? C©u tr¶ lêi lµ: CÊu tróc hµng ®îi do chóng ta tù x©y dùng ®«i khi rÊt h÷u Ých trong ch¬ng tr×nh øng dông do chóng ta x©y dùng. VÝ dô hµng ®îi cã thÓ sö dông cho phÐp duyÖt c©y theo møc, theo thø tù sau (LRN), duyÖt ®å thÞ theo bÒ réng...
2.3.3. Cµi ®Æt hµng ®îi a. Cµi ®Æt queue b»ng m¶ng Nh ta sÏ thÊy, cµi ®Æt queue cã h¬i phøc t¹p h¬n stack, nhÊt lµ khi ta cµi ®Æt b»ng m¶ng. Gi¶ sö ta dïng m¶ng a[max] ®Ó cµi ®Æt hµng ®îi. Trong mét hµng ®îi tù nhiªn, vÝ dô hµng ngêi mua vÐ tµu háa, cø mét ngêi rêi khái hµng ®îi th× c¶ dßng ngêi cïng chuyÓn lªn phÝa tríc mét vÞ trÝ. Trong trêng hîp nµy còng kh«ng thÓ lµm kh¸c v× cöa sæ b¸n vÐ lµ cè ®Þnh. Trong c¸ch thùc hiÖn cña m¸y tÝnh, viÖc di chuyÓn liªn tôc g©y nªn sù tiªu hao tµi nguyªn vµ lµ gi¶i ph¸p kh«ng cã lîi, nhÊt lµ khi queue dµi. ý tëng ®Çu tiªn lµ cµi ®Æt queue theo c¸ch sau ®©y theo kiÓu cµi ®Æt stack: Queue ban ®Çu LÊy ®i 2 phÇn tö
A
B
C C
28
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
Thªm vµo 2 phÇn tö
C
D
E
Ta thÊy vÞ trÝ cña phÇn tö ®Çu vµ phÇn tö cuèi kh«ng bao giê gi¶m. Do ®ã ngay c¶ nÕu chØ cã trung b×nh 2 môc trong queue th× ta còng cÇn mét d·y v« h¹n c¸c phÇn tö ®Ó duy tr× queue ho¹t ®éng. DÜ nhiªn c¸ch cµi ®Æt nµy lµ kh«ng phï hîp víi thùc tÕ. Chóng ta sÏ gi¶i quyÕt vÊn ®Ò nµy b»ng c¸ch nèi ®Çu hµng vµ cuèi hµng l¹i víi nhau. Ta gäi queue cµi ®Æt theo kiÓu nµy lµ queue vßng. Chóng t«i ®Ó l¹i vÊn ®Ò nµy ®Ó c¸c b¹n tù t×m hiÓu. Sau ®©y chóng ta sÏ cµi ®Æt queue b»ng danh s¸ch liªn kÕt ®¬n.
c. Cµi ®Æt queue b»ng danh s¸ch liªn kÕt Queue cã thÓ cµi ®Æt b»ng danh s¸ch liªn kÕt ®¬n, víi quy íc lµ thao t¸c lÊy phÇn tö lu«n thùc hiÖn ë ®Çu danh s¸ch (tøc lµ phÇn tö do pfirst trá ®Õn) vµ phÇn tö míi lu«n ®îc thªm vµo ë cuèi danh s¸ch (tøc lµ phÝa sau phÇn tö do plast trá ®Õn). plast
pfirs info next
info next
info next
...
info next •
NULL
H×nh 2.6. Queue cµi ®Æt b»ng ph¬ng ph¸p liªn kÕt ®¬n • Khai b¸o cÊu tróc hµng ®îi Còng nh danh s¸ch tæng qu¸t, mçi nót trªn Queue lµ mét cÊu tróc gåm hai thµnh phÇn: thµnh phÇn chøa th«ng tin cã tªn lµ info vµ mét thµnh phÇn lµ biÕn con trá next dïng ®Ó lu ®Þa chØ cña nót tiÕp theo trong queue hoÆc trá ®Õn NULL nÕu lµ nót cuèi cïng. BiÕn info cã thÓ lµ mét cÊu tróc phøc t¹p chøa nhiÒu thµnh phÇn. Tuy nhiªn víi môc ®Ých lµm næi bËt b¶n chÊt cña thuËt to¸n, chóng t«i chØ xÐt trêng hîp ®¬n gi¶n: info lµ mét biÕn sè nguyªn. VËy cÊu tróc mét phÇn tö cña queue ®îc khai b¸o lµ: struct node {int info; node* next;}; Kh¸c víi danh s¸ch tæng qu¸t, ë ®©y info ®îc khai b¸o lµ biÕn nguyªn chø kh«ng ph¶i biÕn thùc, v× chóng t«i muèn thö l¹i queue b»ng c¸ch dïng nã ®Ó chuyÓn ®æi mét sè thËp ph©n chØ cã phÇn lÎ sang d¹ng sè nhÞ ph©n. Queue sÏ ®îc ®Æc trng bëi hai biÕn con trá pfirst vµ plast: struct HangDoi {node *pfirst, *plast;}; Víi queue th× chØ cã mét sè thao t¸c thêng sö dông lµ: khëi t¹o queue, xãa queue, kiÓm tra xem queue cã rçng kh«ng, ®a mét phÇn tö vµo cuèi queue, lÊy mét phÇn tö tõ ®Çu queue, xem gi¸ trÞ phÇn tö ë ®Çu queue (hµm ViewFront()). C¸c thao t¸c kh¸c t¬ng tù hoÆc kh¸ ®¬n gi¶n, do ®ã sau ®©y chóng t«i chØ gi¶i thÝch hai thao t¸c ®a phÇn tö vµo cuèi put(), lÊy mét phÇn tö tõ ®Çu queue get().
29
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
• §a mét phÇn tö cã khãa x vµo cuèi hµng ®îi Tríc hÕt ta t¹o mét nót míi, g¸n phÇn info cña nã b»ng x vµ next=NULL. NÕu queue rçng (lÖnh if(q.pfirst==NULL)) th× ta ®Æt con trá pfirst vµ plast chØ vµo nót míi t¹o ra vµ kÕt thóc. NÕu kh«ng th× ta nèi nót cuèi cïng víi nót míi t¹o ra (lÖnh q.plast->next=pp;), sau ®ã chuuyÓn plast vÒ nót nµy vµ kÕt thóc (q.plast=pp;). void put(HangDoi &q,int x) {node *pp; pp = new node; pp->info=x;pp->next=NULL; if(q.pfirst==NULL) {q.pfirst=pp;q.plast=pp;return;}//HangDoi von bi rong q.plast->next=pp; q.plast=pp; }; • LÊy phÇn tö tõ ®Çu hµng ®îi ChØ cã thÓ lÊy ®îc phÇn tö nÕu queue kh«ng rçng. LÖnh assert(!empty(s)); b¶o ®¶m ®iÒu nµy. B¹n nhí thªm lÖnh #include trong phÇn c¸c chØ thÞ tiÒn xö lý. Gi© trÞ biÕn info trong nót ë ®Çu queue ®îc g¸n cho x, sau ®ã nót nµy ®îc gi¶i phãng khái bé nhí. Con trá pfirst ®îc chuyÓn ®Õn nót tiÕp theo. int get(HangDoi &q) {assert(!empty(q)); int x=q.pfirst->info; node* p = q.pfirst; q.pfirst=q.pfirst->next; delete p; if(q.pfirst==NULL) q.plast=NULL; return(x); }; • Thö l¹i hµng ®îi Cã thÓ thö l¹i xem queue ho¹t ®éng cã tèt kh«ng b»ng c¸ch dïng nã ®Ó chuyÓn ®æi mét sè thËp ph©n chØ cã phÇn lÎ sang d¹ng sè c¬ sè 2. ThuËt to¸n chuyÓn mét sè thËp ph©n v chØ cã phÇn lÎ sang d¹ng nhÞ ph©n: LÊy phÇn ph©n cña v nh©n liªn tiÕp víi 2 cho ®Õn khi kÕt qu¶ phÐp nh©n kh«ng cßn phÇn ph©n hoÆc ®¹t ®îc ®é chÝnh x¸c ta cÇn, mçi lÇn nh©n ta lÊy phÇn nguyªn cña kÕt qu¶ lµ ci , i=1,2,...,m. Khi ®ã sè 0. c1 c2 ...cm chÝnh lµ sè nhÞ ph©n cÇn t×m.(Chóng ta lu ý lµ sau mçi lÇn nh©n ta chØ lÊy phÇn ph©n ®Ó nh©n tiÕp víi 2, phÇn nguyªn ë ®©y ®îc hiÓu lµ phÇn bªn tr¸i dÊu chÊm ph©n).
30
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 2. Danh s¸ch
VÝ dô: 1. Cho sè thËp ph©n v = 0.125 t×m sè nhÞ ph©n t¬ng øng. 0.12 Nh©n PhÇn nguyªn 5 2 0.25 0 0.5 0 1.0 1 KÕt qu¶ lµ 0.001. Ta thÊy qu¸ tr×nh lÊy c¸c sè d ®Ó viÕt thµnh sè nhÞ ph©n gièng víi qu¸ tr×nh t¹o ra nã. C¸ch lµm nµy phï hîp víi c¬ chÕ hµng ®îi. Hµm sau ®©y m« t¶ l¹i c¸c thao t¸c sö dông queue chuyÓn ®æi mét sè thËp ph©n chØ cã phÇn lÎ sang d¹ng nhÞ ph©n: Theo ®óng tr×nh tù cña phÐp chuyÓn ®æi, ta nh©n phÇn ph©n cho 2 vµ lu phÇn nguyªn cña kÕt qu¶ vµo queue. Khi phÇn ph©n b»ng 0 hoÆc ®· ®¹t ®îc ®é chÝnh x¸c cÇn thiÕt th× ta b¾t ®Çu lÊy c¸c gi¸ trÞ trong queue ra vµ cho hiÖn trªn mµn h×nh. void ChuyenNP(float t=0.125) {HangDoi q; init(q); float v; int k,h;v=t; k=0;init(q); while(fabs(v)>0.00001 && k<10) {v=v*2; h=int(v); put(q,h); v=v-int(v);//chi lay phan thap phan sau khi nhan v voi 2 k++; } printf("\n%f chuyen sang dang thap phan la: 0.",t); while(!empty(q)) {k=get(q); printf("%d",k); } clear(q); }
31
Ch¬ng 3 C©y nhÞ ph©n 3.1. Më ®Çu
Trong ch¬ng tríc chóng ta ®· nghiªn cøu cÊu tróc danh s¸ch vµ c¸ch cµi ®Æt chóng. C¶ hai c¸ch cµi ®Æt kÒ hay liªn kÕt ®Òu béc lé nh÷ng nhîc ®iÓm khã kh¾c phôc. Cµi ®Æt theo kiÓu liªn kÕt tuy ®¬n gi¶n trong c¸c thao t¸c chÌn xãa nhng l¹i kh«ng thùc hiÖn ®îc ph¬ng ph¸p t×m kiÕm nhÞ ph©n. Cµi ®Æt b»ng m¶ng tuy thùc hiÖn ®îc thao t¸c t×m kiÕm nhÞ ph©n nhng mÊt nhiÒu thêi gian cho thao t¸c chÌn. §©y lµ 2 thao t¸c rÊt khã dung hßa. NÕu danh s¸ch kh«ng cÇn s¾p thø tù th× viÖc chÌn phÇn tö míi ®¬n gi¶n, nhng viÖc t×m kiÕm mÊt nhiÒu thêi gian v× trong trêng hîp xÊu nhÊt ph¶i ®i qua toµn bé danh s¸ch. Ngîc l¹i nÕu danh s¸ch cã s¾p thø tù th× viÖc t×m kiÕm thùc hiÖn nhanh, nhng viÖc chÌn vµo rÊt mÊt c«ng, v× ph¶i duyÖt danh s¸ch ®Ó t×m vÞ trÝ chÌn. Trong thùc tÕ nÕu chóng ta gÆp nh÷ng bµi to¸n mµ thao t¸c chÌn vµo Ýt dïng ®Õn thÝ dô qu¶n lý nh©n sù mét c¬ quan mµ sè c¸n bé gÇn nh æn ®Þnh th× cµi ®Æt danh s¸ch cã thø tù lµ thÝch hîp. §èi víi ®a sè c¸c bµi to¸n qu¶n lý kh¸c thÝ dô qu¶n lý c«ng v¨n ®Õn c«ng v¨n ®i, qu¶n lý viÖc xuÊt nhËp vËt t,... th× thao t¸c chÌn vµ t×m kiÕm gÇn nh ®îc thùc hiÖn thêng xuyªn, khã cã thÓ nãi thao t¸c nµo dïng nhiÒu h¬n. CÊu tróc lý tëng trong t×nh huèng nµy lµ ®¹t tèc ®é t×m kiÕm trªn danh s¸ch kÒ ®îc s¾p xÕp vµ tèc ®é chÌn cña danh s¸ch liªn kÕt. Chóng ta h·y xem l¹i qu¸ tr×nh t×m kiÕm nhÞ ph©n trªn danh s¸ch cã thø tù. T¹i mçi bíc t×m kiÕm chóng ta tr¶ lêi c©u hái "Nöa nµo cña danh s¸ch vÉn cßn chøa phÇn tö cÇn t×m?", vµ ta lo¹i bá nöa kh«ng chøa phÇn tö ®ã. Chóng ta muèn t¹o ra mét cÊu tróc d÷ liÖu sao cho khi chÌn thªm d÷ liÖu míi chóng ta nªu c©u hái "phÇn tö míi nªn chÌn vµo nöa nµo cña cÊu tróc?" DÜ nhiªn lµ cÊu tróc nµy kh«ng thÓ lµ danh s¸ch v× kh¸c víi thao t¸c t×m kiÕm, thao t¸c chÌn kh«ng thÓ thùc hiÖn ®éc lËp trªn tõng nöa sè liÖu. Khi chÌn sè liÖu vµo nöa díi ta vÉn ph¶i dÞch chuyÓn toµn bé nöa phÝa trªn. CÊu tróc c©y nhÞ ph©n cã thÓ tiÕp cËn ý tëng nµy. C©y nhÞ ph©n lµ cÊu tróc d÷ liÖu cã kh¶ n¨ng t×m kiÕm nhÞ ph©n tù ®éng, do c¸ch tæ chøc cña c¸c nót sè liÖu. C©y nhÞ ph©n ®îc cÊu tróc nh trong h×nh 3.1 sau: B
A
D
C
E
H×nh 3.1. C©y nhÞ ph©n CÊu tróc c©y nhÞ ph©n cã thÓ ®Þnh nghÜa mét c¸ch ®Ö quy nh sau: C©y nhÞ ph©n (binary tree) hoÆc rçng (kh«ng cã nót nµo) hoÆc gåm mét nót gèc vµ hai c©y con tr¸i vµ ph¶i, trong ®ã c¸c c©y con tr¸i vµ ph¶i còng lµ c©y nhÞ ph©n.
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
C¸c nót trªn c©y nhÞ ph©n ®îc ph©n lo¹i nh sau: • Nót gèc (root node): lµ nót ®Çu tiªn cña c©y nhÞ ph©n nh ®Þnh nghÜa trªn ®©y. Nh vËy nót gèc kh«ng ph¶i lµ con cña bÊt cø nót nµo kh¸c. • Nót cha (father node): lµ nót cã nót con kh¸c rçng. • Nót l¸ (leaf node): lµ nót kh«ng cã nót con kh¸c rçng. • Nót trung gian (internal node): lµ nót cã c¶ nót cha vµ nót con kh¸c rçng. • Nót tríc (ancestor): nót x gäi lµ nót tríc cña nót y nÕu c©y con gèc x cã chøa y. • Nót sau bªn tr¸i (left descendant): nót y gäi lµ nót sau bªn tr¸i cña nót x nÕu nót x cã c©y con tr¸i cã chøa y. T¬ng tù ta cã thÓ ®Þnh nghÜa nót sau ph¶i. • Nót anh em (brothers): hai nót gäi lµ anh em nÕu cã cïng mét cha. • BËc cña nót (degree of node): lµ sè nót con kh¸c rçng cña nót ®ã. C¸c nót cña c©y nhÞ ph©n cã bËc cao nhÊt lµ 2. Trªn h×nh 3.1 nót A cã bËc 0, nót D cã bËc 2. • BËc cña c©y (degree of tree): lµ bËc cao nhÊt cña c¸c nót trªn c©y. • Møc cña nót (level of node): møc cña nót ®îc ®Þnh nghÜa ®Ö quy nh sau: - Nót gèc cã møc lµ 0 - Møc cña cha lµ i th× møc cña nót con lµ: i + 1. Trªn h×nh 3.1 nót A vµ nót D cã møc lµ 1, c¸c nót C, E cã møc 2. Møc cao nhÊt cña nót trong c©y lµ chiÒu cao cña c©y. VËy c©y ë h×nh 3.1 cã chiÒu cao lµ 2. (Còng cã t¸c gi¶ ®Þnh nghÜa nót gèc cã møc 1) • §êng ®i (path) gi÷a 2 nót x, y trong ®ã x lµ nót tríc, y lµ nót sau, lµ d·y c¸c ®Ønh x=x0, x1, x2,..., xn= y, trong ®ã xi lµ cha cña xi+1 (i = 0,1,...,n-1). ChiÒu dµi ®êng ®i gi÷a x vµ y lµ sè c¸c c¹nh trong ®êng ®i ®ã. Nh vËy chiÒu dµi tõ nót gèc ®Õn mét nót nµo ®ã b»ng møc cña nót ®ã. 3.2. Mét sè d¹ng ®Æc biÖt cña c©y nhÞ ph©n
§Ó cã thÓ thùc hiÖn c¸c thao t¸c t×m kiÕm vµ chÌn theo ph¬ng ph¸p nhÞ ph©n trªn c©y nh ý tëng thiÕt kÕ chóng ta nªu ra trªn ®©y, chóng ta ph¶i tæ chøc c©y nhÞ ph©n theo mét c¸ch ®Æc biÖt, sao cho khi thùc hiÖn t×m kiÕm hoÆc chÌn ta lu«n cã thÓ quyÕt ®Þnh lµ hµnh ®éng tiÕp theo sÏ thùc hiÖn ë c©y con tr¸i hay c©y con ph¶i. ThÝ dô chóng ta sÏ tæ chøc c¸c nót sao cho t¹i mçi nót bÊt kú c¸c nót ë phÝa tr¸i bao giê còng kh«ng lín h¬n nót ®ã vµ tÊt c¶ c¸c nót phÝa ph¶i ®Òu kh«ng bÐ h¬n nót ®ã. C©y nhÞ ph©n tháa m·n tÝnh chÊt nµy ®îc gäi lµ c©y nhÞ ph©n t×m kiÕm. §iÒu nµy còng cho ta c¸ch chÌn mét phÇn tö míi: b¾t ®Çu tõ gèc, ta sÏ lÇn t×m vÞ trÝ thÝch hîp ®Ó chÌn phÇn tö ®ã. Chóng ta cã thÓ thÊy râ lµ hai c©y nhÞ ph©n chøa cïng d÷ liÖu cã thÓ ®îc tæ chøc hoµn toµn kh¸c nhau. Trong h×nh 3.1 nÕu chóng ta chÌn c¸c phÇn tö theo thø tù ®· s¾p s½n A,B,C,D,E ta sÏ ®îc mét c©y nhÞ ph©n suy biÕn thµnh danh s¸ch. A B C
33
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
D E
H×nh 3.2. C©y nhÞ ph©n suy biÕn Trong trêng hîp nµy mÆc dï danh s¸ch cã s¾p thø tù nhng viÖc t×m kiÕm hoÆc chÌn ®Òu cÇn thêi gian cã bËc tuyÕn tÝnh. C©y ®îc tæ chøc kÐm nh vËy ®îc gäi lµ kh«ng c©n b»ng (unbalanced). §iÒu kiÖn hiÓn nhiªn ®Ó c©y nhÞ ph©n ®îc c©n b»ng hoµn h¶o lµ c©y cã sè nót tèi ®a t¹i mçi møc. ThÝ dô c©y trong h×nh 3.3 lµ c©y nhÞ ph©n hoµn h¶o (cßn gäi lµ c©y nhÞ ph©n ®Çy ®ñ - complete binary tree): A B
C
D
E
F
G
H×nh 3.3. C©y nhÞ ph©n ®Çy ®ñ C©y nhÞ ph©n ®Çy ®ñ lu«n lu«n cã sè nót lµ 2 d+1 -1, trong ®ã d lµ sè møc cña c©y. VËy ®Ó t¹o cÊu tróc c©y nhÞ ph©n ®Çy ®ñ th× tríc hÕt d÷ liÖu ta kh¶o s¸t ph¶i cã ®óng 2 d+1 -1 phÇn tö, trong ®ã d lµ sè tù nhiªn. Râ rµng ®iÒu kiÖn nh vËy lµ qu¸ chÆt trong thùc tÕ. Tuy nhiªn chóng ta cã thÓ thÊy r»ng c©y kh«ng cÇn ph¶i c©n b»ng ®Õn møc hoµn h¶o nh vËy; cã nh÷ng d¹ng c©n b»ng níi láng h¬n vÉn cho ta cÊu tróc d÷ liÖu h÷u Ých vµ gÇn víi thùc tÕ. Tríc hÕt chóng ta sÏ ®Þnh nghÜa mét sè d¹ng ®Æc biÖt cña c©y nhÞ ph©n nh sau: • C©y nhÞ ph©n ®óng (strict binary tree): lµ c©y nhÞ ph©n mµ nót gèc vµ c¸c nót trung gian ®Òu cã 2 nót con. A C
B F
•
G
H×nh 3.4. C©y nhÞ ph©n ®óng Ta cã thÓ thÊy r»ng c©y nhÞ ph©n ®óng nãi chung cha ®ñ c©n b»ng ®Ó ®¸p øng ®îc yªu cÇu t×m kiÕm vµ chÌn nhanh. C©y nhÞ ph©n ®Çy ®ñ lµ c©y nhÞ ph©n ®óng mµ tÊt c¶ c¸c nót l¸ ®Òu cã cïng mét møc. C©y nhÞ ph©n gÇn ®Çy ®ñ (almost complete binary tree): c©y nhÞ ph©n cã ®é cao d ®îc gäi lµ gÇn ®Çy ®ñ nÕu c¸c nót ë c¸c møc nhá h¬n hoÆc b»ng d-1 cã ®Çy ®ñ c¸c nót, cßn ë møc d th× ®Çy tõ tr¸i qua ph¶i (xem h×nh 3.5). Ta cã thÓ thÊy r»ng víi mét tËp d÷ liÖu bÊt kú ta lu«n cã thÓ t¹o ®îc mét c©y gÇn ®Çy cã c¸c nót lµ c¸c phÇn tö cña tËp d÷ liÖu ®ã. A
34
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n B F
C G
H
H×nh 3.5. C©y nhÞ ph©n gÇn ®Çy • •
C©y nhÞ ph©n c©n b»ng chiÒu cao (height-balanced) lµ c©y mµ t¹i tÊt c¶ c¸c nót, chiÒu cao c©y con tr¸i vµ c©y con ph¶i chªnh lÖch nhau kh«ng qu¸ 1. C©y nhÞ ph©n t×m kiÕm vµ c©n b»ng chiÒu cao ®îc gäi lµ c©y AVL . (Do hai nhµ to¸n häc Nga G.M.Adelson Velsky vµ E.M.Landis ®a ra vµ n¨m 1962) Chóng ta sÏ thÊy r»ng lu«n lu«n t¹o ®îc mét c©y AVL øng víi mét tËp d÷ liÖu bÊt kú. PhÐp t×m kiÕm vµ xen vµo trªn c©y AVL lu«n ®îc thùc hiÖn trong thêi gian O(logn), ngay c¶ trong trêng hîp xÊu nhÊt. ViÖc chÌn phÇn tö vµo c©y cã thÓ ph¸ vì tÝnh c©n b»ng cña c©y. Trong trêng hîp nµy chóng ta cã thÓ thùc hiÖn phÐp biÕn ®æi ®Ó c©y trë l¹i c©n b»ng.
3.3. VÝ dô vÒ c©y nhÞ ph©n
Trong thùc tÕ cã rÊt nhiÒu vÝ dô minh häa cho cÊu tróc c©y nh c©y cam, c©y quýt... trong vên, c©y th môc trªn ®Üa cøng hay ®Üa mÒm, c©y gia ph¶ cña dßng hä, môc lôc cña mét cuèn s¸ch... §ã lµ nh÷ng c©y nhiÒu nh¸nh mµ chóng ta kh«ng kh¶o s¸t trong tµi liÖu nµy (Trong ch¬ng VII chóng ta sÏ nghiªn cøu mét lo¹i c©y nhiÒu nh¸nh ®Æc biÖt vµ cã rÊt nhiÒu øng dông lµ B-c©y). Mét vÝ dô kh¸ hay vÒ c©y nhÞ ph©n lµ c©y biÓu thøc. C©y biÓu thøc lµ c©y mµ c¸c nót gèc vµ nót trung gian chøa c¸c to¸n tö hay phÐp to¸n, cßn c¸c nót l¸ chøa c¸c to¸n h¹ng.
35
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
VÝ dô biÓu thøc sè häc x+y*(z-t)+u/v ®îc biÓu diÔn bëi c©y nhÞ ph©n sau: + + x
/ *
u
y
v
-
t
z
H×nh 3.6. C©y nhÞ ph©n biÓu diÔn biÓu thøc Tuy nhiªn nh chóng t«i ®· nãi ®Õn trong phÇn më ®Çu, cÊu tróc c©y ®îc t¹o ra kh«ng chØ ®Ó gi¶i quyÕt vÊn ®Ò thao t¸c vµ xö lý c¸c cÊu tróc d÷ liÖu cã d¹ng c©y mµ nã cßn cã nhiÒu øng dông kh¸c, thÝ dô trong kü thuËt nÐn sè liÖu. ThËm chÝ nh ta sÏ thÊy, c©y cã thÓ dïng ®Ó cµi ®Æt hµng ®îi cã ®é u tiªn hay c¶ danh s¸ch tæng qu¸t trong mét sè bµi to¸n qu¶n lý c¬ së d÷ liÖu. 3.4. C©y nhÞ ph©n tæng qu¸t
Còng nh cÊu tróc danh s¸ch, ta cã thÓ cµi ®Æt c©y nhÞ ph©n theo kiÓu kÕ tiÕp b»ng m¶ng (contiguous implementation) hoÆc theo kiÓu liªn kÕt (linked implementation). Víi c©y nhÞ ph©n ®Çy hoÆc gÇn ®Çy cã n nót ta cã thÓ dïng m¶ng cì n ®Ó lu tr÷. Ta cã thÓ ®¸nh sè c¸c nót cña nã theo tõng møc: møc 0 lµ nót gèc ®îc ®¸nh sè 0, møc 1 cã 2 nót ®îc ®¸nh sè 1 vµ 2, møc 2 cã 4 nót ®îc ®¸nh sè 3,4,5,6,... tæng qu¸t, møc m cã 2m nót ®îc ®¸nh sè tõ 2m-1, 2m, 2m+1,... ,2m+1-2. ë møc d cuèi cïng c¸c nót ®îc ®¸nh sè tõ 2d-1, 2d, 2d+1,... ,n-1. 0 2
1 3 7
4 8
5
6
9
H×nh 3.7. §¸nh sè c©y nhÞ ph©n gÇn ®Çy Nãi chung chóng ta cã thÓ nhËn thÊy r»ng: nÕu nót cha ®îc lu tr÷ ë phÇn tö p cña m¶ng th× nót con tr¸i ®îc lu tr÷ ë phÇn tö 2p+1 vµ nót con ph¶i ®îc lu tr÷ ë phÇn tö 2p+2. Víi c©y nhÞ ph©n bÊt kú cã n nót th× vÒ nguyªn t¾c ta vÉn cã thÓ lu tr÷ c¸c nót trong m¶ng cì n. Tuy nhiªn ta rÊt khã ®a ra mét quy luËt ®¸nh sè hîp lý ®Ó khái nhÇm lÉn. Trong trêng hîp nµy ngêi ta thªm c¸c nót gi¶ ®Ó c©y nhÞ ph©n trë thµnh
36
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
gÇn ®Çy vµ ¸p dông c¸ch ®¸nh sè trªn ®©y ®Ó cµi ®Æt. Nh vËy mçi nót sÏ ph¶i chøa thªm th«ng tin ®Ó nhËn biÕt ®ã lµ nót gi¶ hay nót thËt. Râ rµng c¸ch cµi ®Æt nµy cho trêng hîp c©y tæng qu¸t rÊt l·ng phÝ bé nhí. C¸ch cµi ®Æt theo kiÓu liªn kÕt dïng cÊp ph¸t bé nhí ®éng tá ra phï hîp h¬n. Mçi nót ngoµi th«ng tin h÷u Ých sÏ cã thªm 2 trêng ®Þa chØ trá tíi nót con tr¸i vµ nót con ph¶i. Ngoµi ra cã mét con trá proot trá tíi nót gèc lµm ®iÓm xuÊt ph¸t.
3.4.1. DuyÖt c©y nhÞ ph©n Còng gièng víi mét cÊu tróc d÷ liÖu bÊt kú, c¸c nót cña c©y nhÞ ph©n thêng chøa c¸c th«ng tin vµ nhiÒu khi ta ph¶i liÖt kª tÊt c¶ c¸c th«ng tin ®ã theo mét c¸ch nµo ®ã sao cho th«ng tin mçi nót chØ ®îc liÖt kª mét lÇn vµ kh«ng cã nót nµo bÞ bá sãt. §Ó lµm ®îc viÖc nµy râ rµng ta ph¶i lÇn lît th¨m c¸c nót cña c©y theo mét thø tù nµo ®ã sao cho mçi nót chØ ®îc th¨m ®óng mét lÇn. C¸ch lµm nµy gäi lµ phÐp duyÖt c©y. Cã nhiÒu c¸ch duyÖt c©y, thÝ dô ta cã thÓ th¨m c¸c nót theo tõng møc lÇn lît tõ tr¸i qua ph¶i. Tuy nhiªn nhiÒu khi phÐp duyÖt c©y kh«ng ®¬n thuÇn lµ liÖt kª th«ng tin c¸c nót mµ cßn nh»m mét môc ®Ých kh¸c. V× vËy 4 phÐp duyÖt c©y sau ®©y lµ ®îc dïng nhiÒu nhÊt trong thùc tÕ: •
Pretrav: duyÖt c©y theo thø tù tríc (NLR - Node Left Right) hay cßn ®îc gäi lµ duyÖt c©y theo ®é s©u. §Çu tiªn chóng ta th¨m (visit) nót gèc. Sau ®ã duyÖt nh¸nh c©y con tr¸i theo phÐp duyÖt pretrav. Cuèi cïng duyÖt nh¸nh c©y con ph¶i theo phÐp duyÖt pretrav.
•
Intrav: duyÖt c©y theo thø tù gi÷a (LNR - Left Node Right) DuyÖt nh¸nh c©y con tr¸i theo phÐp duyÖt intrav. Th¨m (visit) nót gèc. Cuèi cïng duyÖt nh¸nh c©y con ph¶i theo phÐp duyÖt intrav.
•
Posttrav: duyÖt c©y theo thø tù sau (LRN - Left Right Node) DuyÖt nh¸nh c©y con tr¸i theo phÐp duyÖt posttrav. DuyÖt nh¸nh c©y con ph¶i theo phÐp duyÖt posttrav. Th¨m (visit) nót gèc.
•
Breadthtrav: duyÖt c©y theo bÒ réng tøc lµ duyÖt c©y theo møc DuyÖt c¸c nót tõ tr¸i qua ph¶i, b¾t ®Çu tõ møc 0, møc 1, 2, ...
Sau ®©y lµ thø tù c¸c nót trong c¸c phÐp duyÖt c©y nhÞ ph©n ë h×nh 3.8. NLR: LNR: LRN: Breadth:
A
ABDEC DBEAC DEBCA ABCDE
B
D
C
E
H×nh 3.8. Bèn phÐp duyÖt c©y nhÞ ph©n
37
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
Chóng ta cã thÓ duyÖt c©y nhÞ ph©n dïng sù trî gióp cña stack, kh«ng dïng ph¬ng ph¸p ®Ö quy. DuyÖt c©y kh«ng dïng ®Ö quy phøc t¹p vµ khã theo dâi h¬n. Qua ®©y chóng ta còng cã thÓ thÊy u ®iÓm cña ph¬ng ph¸p ®Ö quy lµ rÊt ®¬n gi¶n vµ dÔ hiÓu. DuyÖt c©y theo thø tù gi÷a kh«ng dïng ®Ö quy: 1. §Ó duyÖt mét c©y con tríc hÕt chóng ta sÏ ®i tõ nót gèc cña c©y ®ã cho ®Õn nót tr¸i nhÊt, trong qu¸ tr×nh ®i qua c¸c nót ta push c¸c nót vµo stack. Th¨m nót tr¸i nhÊt cña c©y con b»ng t¸c vô pop. 2. Sau khi th¨m nót ®ã: NÕu nót ®ã cã nh¸nh c©y con ph¶i th× chóng ta ph¶i duyÖt nh¸nh c©y con ph¶i (vÒ bíc 1). NÕu nót ®ã kh«ng cã nh¸nh c©y con ph¶i th× th¨m tiÕp nót ®ang lu ë ®Ønh stack b»ng t¸c vô pop.
3.4.2. Cµi ®Æt c©y nhÞ ph©n b»ng ph¬ng ph¸p liªn kÕt • Khai b¸o cÊu tróc c©y nhÞ ph©n Cã thÓ dïng m¶ng ®Ó cµi ®Æt c©y nhÞ ph©n. Tuy nhiªn c¸ch cµi ®Æt nµy ngay tõ ®Çu ®· cã thÓ nh×n thÊy mét sù kh«ng têng hîp: m¶ng lµ cÊu tróc tuyÕn tÝnh, cßn c©y th× kh«ng. Dïng ph¬ng ph¸p liªn kÕt ®Ó cµi ®Æt c©y th× tiÕt kiÖm bé nhí vµ c¸c thao t¸c ®îc thùc hiÖn dÔ dµng h¬n. Mçi nót trªn c©y nhÞ phÇn gåm ba thµnh phÇn: thµnh phÇn chøa th«ng tin cã tªn lµ info, hai thµnh phÇn cßn l¹i lµ c¸c biÕn con trá left vµ right dïng ®Ó lu ®Þa chØ cña nót con tr¸i vµ con ph¶i. VËy cÊu tróc mét phÇn tö trªn c©y nhÞ ph©n ®îc khai b¸o lµ: struct node {int info; node* left, *right;}; Nãi chung trêng info cã thÓ lµ trêng phøc hîp chøa nhiÒu thµnh phÇn, nhng víi môc ®Ých lµm næi bËt b¶n chÊt cña thuËt to¸n, ta khai b¸o info lµ sè nguyªn. Mét c©y nhÞ ph©n sÏ ®îc x¸c ®Þnh nÕu ta biÕt ®îc ®Þa chØ nót gèc proot cña nã. V× vËy nót gèc sÏ lµ ®èi sè ®îc truyÒn theo kiÓu tham chiÕu cho c¸c hµm. Sau ®©y lµ mét sè hµm quan träng: •
Khëi t¹o c©y nhÞ ph©n void init(node *&proot) {proot=NULL; };
•
Xãa c©y nhÞ ph©n khái bé nhí b»ng ®Ö quy void clear(node* &proot) {//Dieu kien dung if(proot!=NULL) {clear(proot->left); clear(proot->right); delete proot;proot=NULL; } };
•
KiÓm tra xem c©y cã rçng kh«ng int empty(node *proot)
38
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
{return proot==NULL; } •
•
•
DuyÖt c©y theo thø tù tríc b»ng ®Ö quy void pretrav(node* proot) {if(proot!=NULL) {printf("%5d",proot->info); pretrav(proot->left); pretrav(proot->right); } } DuyÖt c©y theo thø tù gi÷a b»ng ®Ö quy void intrav(node* proot) {if(proot!=NULL) {inttrav(proot->left); printf("%5d",proot->info); inttrav(proot->right); } } DuyÖt c©y theo thø tù sau b»ng ®Ö quy void posttrav(node* proot) {if(proot!=NULL) {posttrav(proot->left); posttrav(proot->right); printf("%5d",proot->info); } }
3.5. C©y nhÞ ph©n t×m kiÕm
Do cÊu tróc ®Æc biÖt, viÖc thªm vµo vµ xãa nót trªn c©y nhÞ ph©n t×m kiÕm ®îc thùc hiÖn kh¸c víi c©y nhÞ ph©n thêng. Khi thªm vµo th× vÞ trÝ cÇn thªm nót ®îc x¸c ®Þnh duy nhÊt mµ kh«ng cÇn ph¶i chØ râ lµ lµ nót con tr¸i hay ph¶i cña mét nót nµo ®ã. Cã thÓ xãa nót bÊt kú trªn c©y, nhng ph¶i thùc hiÖn mét sè thao t¸c ®Ó b¶o ®¶m c©y míi vÉn lµ c©y nhÞ ph©n t×m kiÕm.
3.5.1. Thao t¸c chÌn (insert) T¸c vô nµy gióp chóng ta thªm nót míi vµo c©y nhÞ ph©n t×m kiÕm. Nót thªm vµo sÏ lµ nót l¸ ë vÞ trÝ thÝch hîp. XuÊt ph¸t tõ nót gèc, chóng ta so s¸nh nót ®· cho víi nót gèc, nÕu nót míi cã néi dung bÐ h¬n nót gèc th× chóng ta ®i vÒ tr¸i, ngîc l¹i ®i vÒ ph¶i (gi¶ thiÕt r»ng trªn c©y kh«ng cã nót trïng néi dung). Chóng ta sÏ dõng ë nót l¸ hoÆc nót trung gian cßn thiÕu con. So s¸nh víi nót nµy nÕu nót ®· cho bÐ h¬n th× thªm nót tr¸i, ngîc l¹i thªm nót ph¶i.
3.5.2. Thao t¸c xãa (remove) Thao t¸c xãa phøc t¹p h¬n thao t¸c chÌn. Khi ta xãa mét nót P, mét nót kh¸c trong vïng l©n cËn sÏ thay thÕ vµo vÞ trÝ nót bÞ xãa, ®ång thêi ta ph¶i ®Æt l¹i mèi liªn kÕt trong vïng l©n cËn nót bÞ xãa. Thay thÕ xong ta
39
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
ph¶i hñy nót P ®Ó khái l·ng phÝ bé nhí. Ta ph©n ra 3 trêng hîp sau: 1. NÕu nót P cÇn xãa lµ nót l¸, ta chØ cÇn hñy nót ®ã. Trong trêng hîp nµy nót thay thÕ (stand-for node) lµ NULL. PhÇn liªn kÕt cña nót cha cña nót P b©y giê trá ®Õn NULL 2. Nót P cÇn xãa chØ cã mét c©y con, ta chän nót con cña nót P lµm nót thay thÕ, t¹o l¹i mèi liªn kÕt tõ nót cha cña P víi nót thay thÕ, sau ®ã hñy nót P. 3. NÕu nót P cã 2 con. Chóng ta cã thÓ chän nót thay thÕ lµ mét trong 2 nót sau: - Nót tr¸i nhÊt cña c©y con bªn ph¶i nót P. - Nót ph¶i nhÊt cña c©y con bªn tr¸i nót P. Chóng ta quy íc chän nót chän nót thay thÕ lµ nót ph¶i nhÊt cña c©y con bªn tr¸i. Trêng hîp 1: A B
A C
B
C
D
H×nh 3.9. Xãa nót l¸ D.
40
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
Trêng hîp 2: 1
1
5
2
3
5 2
3 2
3
3
H×nh 3.10. Xãa nót 20 chØ cã mét nót con. Trêng hîp 3: 1
1 2
5 1
5 1
3
2
2
3
3 1
3
1
H×nh 3.11. Xãa nót 25 cã 2 nót con.
3.5.2. Cµi ®Æt c©y nhÞ ph©n t×m kiÕm CÊu tróc c¸c nót th«ng tin trªn c©y t×m kiÕm còng gièng víi trêng hîp c©y nhÞ ph©n thêng. Ta còng dïng ph¬ng ph¸p liªn kÕt ®Ó cµi ®Æt c©y. Mçi nót cña c©y gåm 3 trêng: trêng info mang th«ng tin, trêng left cã kiÓu con trá node ®Ó chØ ®Õn con tr¸i, trêng right chØ ®Õn con ph¶i. Con trá proot chØ gèc cña c©y. C¸c phÐp duyÖt trªn c©y nhÞ ph©n t×m kiÕm còng ®îc thùc hiÖn nh trªn c©y nhÞ ph©n thêng, nghÜa lµ còng cã c¸c phÐp duyÖt dïng ®Ö quy vµ kh«ng dïng ®Ö quy. Sau ®©y lµ mét sè thao t¸c c¬ b¶n:
T×m kiÕm th«ng tin x trªn c©y dïng ®Ö quy node* search(node* proot,int x) {//Dieu kien dung node* p; if(proot==NULL) return NULL; if(proot->info==x) return proot; //Buoc de quy if(x<proot->info) p=search(proot->left,x); else p=search(proot->right,x); return p; };
T×m kiÕm th«ng tin x trªn c©y kh«ng dïng ®Ö quy Ph¬ng ph¸p nµy thùc hiÖn t×m kiÕm kh«ng ®Ö quy. Ngoµi tham sè x, cßn cã mét tham sè fp cã kiÓu con trá node. NÕu t×m thÊy th× t¸c vô tr¶ vÒ nót t×m thÊy, fp chØ nót cha cña nót t×m thÊy. Khi thùc hiÖn thao
41
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
t¸c xãa nót x ta cÇn biÕt nót cha cña nã ®Ó ®Æt l¹i mèi liªn kÕt. V× ta muèn tham sè fp gi÷ nguyªn gi¸ trÞ khi ra khái thñ tôc nªn ta khai b¸o tham sè nµy theo kiÓu tham chiÕu. C¸c bíc t×m kiÕm ®îc thùc hiÖn nh sau: b¾t ®Çu tõ nót p = nót gèc, ta so s¸nh gi¸ trÞ x víi néi dung nót p. NÕu x trïng víi néi dung nót p th× t¸c vô t×m kiÕm kÕt thóc vµ tr¶ vÒ ®Þa chØ nót p. NÕu x kh¸c p->info th× ta ®Æt fp = p ®Ó ghi l¹i ®Þa chØ nót cha cña nót p tiÕp theo; nÕu x nhá h¬n th× ta ®Æt p = p ->left, x lín h¬n ®Æt p = p ->right. Cø nh vËy cho ®Õn khi t×m thÊy x hoÆc p b»ng NULL th× dõng l¹i vµ kÕt luËn lµ kh«ng t×m thÊy. node* search2(node *proot,node *&fp,int x) {node* p=proot;fp=NULL; while(p!=NULL) {if(x == p->info) return(p);// tim thay if(x < p->info) {fp=p;p = p->left;} else {fp=p;p = p->right;} } return(NULL);// khong tim thay } Thªm nót cã néi dung x vµo c©y t×m kiÕm b»ng ®Ö quy Tríc hÕt ta dïng t¸c vô search ®Ó t×m kiÕm xem nót x ®· tån t¹i trªn c©y cha, nÕu tån t¹i råi th× th«ng b¸o lµ nót ®· cã, kh«ng thªm n÷a. NÕu nót gèc lµ NULL th× ta t¹o nót gèc míi vµ g¸n néi dung x cho trêng info cña gèc nµy. NÕu gèc kh¸c rçng vµ x nhá h¬n néi dung nót gèc th× ta ¸p dông thao t¸c thªm x b»ng ph¬ng ph¸p ®Ö quy vµo c©y con tr¸i, ngîc l¹i th× thªm nót b»ng ph¬ng ph¸p ®Ö quy vµo c©y con ph¶i. void insert(node* &proot,int x) {if(proot==NULL) {proot=makenode(x); return;} if(search(proot,x)) {cout<<endl<<"Nut da co, khong them duoc!";return;} if(x<proot->info) insert(proot->left,x); else insert(proot->right,x); }
Thªm nót cã néi dung x vµo c©y t×m kiÕm kh«ng dïng ®Ö quy Tríc hÕt ta dïng t¸c vô search ®Ó t×m kiÕm xem nót x ®· tån t¹i trªn c©y cha, nÕu tån t¹i råi th× th«ng b¸o lµ nót ®· cã, kh«ng thªm n÷a. B¾t ®Çu tõ nót gèc, so s¸nh gi¸ trÞ x víi néi dung nót gèc ta lu«n x¸c ®Þnh ®îc cÇn thªm x vµo nh¸nh c©y con bªn tr¸i hay bªn ph¶i, tïy thuéc vµo kÕt qu¶ cña phÐp so s¸nh lµ x nhá h¬n hay lín h¬n néi dung nót gèc. Cø nh vËy ta ®i ®Õn mét nót fp lµ n¬i cã thÓ thªm nót cã néi dung x. Nót fp hoÆc lµ nót l¸, hoÆc lµ nót cßn thiÕu c©y con tr¸i hoÆc c©y con ph¶i. NÕu x nhá h¬n néi dung nót fp th× nót thªm vµo lµ nót con tr¸i, ngîc l¹i lµ nót con ph¶i cña fp. void insert2(node * &proot, int x) {if(proot==NULL) {proot=makenode(x);return;} if(search(proot,x)) {cout<<endl<<"Nut da co, khong them duoc!";return;} node *fp, *p, *q; // fp la nut cha cua p, q la nut them vao // Khoi dong cac gia tri fp = NULL;
42
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
p = proot; //tim nut fp, ya va fya, nut moi them vao la nut la con cua nut fp while(p!=NULL) {if(xinfo) {fp=p;p=p->left;} else {fp=p;p=p->right;} } //end of while(p!=NULL) /*Sau vong lap tren day thi nut p bi rong, con nut fp la nut can them nut co noi dung x.*/ //Them nut q co noi dung x la con cua fp. q = makenode(x); if(x < fp->info) fp->left = q; else fp->right = q; //Tao nut la moi co noi dung x } Xãa nót trªn c©y nhÞ ph©n t×m kiÕm Tríc hÕt ta dïng thñ tôc search2 ®Ó t×m kiÕm nót x trªn c©y. NÕu kh«ng t×m thÊy th× th«ng b¸o lµ nót kh«ng tån t¹i. Cßn nÕu t×m thÊy th× ta cã nót fp chÝnh lµ nót cha cña nót cÇn xãa p, ta cÇn nót fp ®Ó ®Æt l¹i mèi liªn kÕt sau khi xãa. Khi xãa nót p trªn c©y nhÞ ph©n t×m kiÕm, ta t×m mét nót ®Ó thay thÕ nót ®ã. NÕu p lµ nót l¸ th× nót thay thÕ lµ nót NULL. NÕu p chØ cã mét c©y con th× nót thay thÕ lµ nót con cña nã. NÕu p cã hai c©y con th× nót thay thÕ lµ nót tr¸i nhÊt cña c©y con bªn ph¶i hoÆc nót ph¶i nhÊt cña c©y con bªn tr¸i.Ta quy íc chän nót ph¶i nhÊt cña c©y con bªn tr¸i. void remove(node *&proot, int x) {node *fp,*p,*f,*rp,*q; /*rp la nut thay the cho nut p co noi dung x, f la nut cha cua nut thay the rp*/ p=search2(proot,fp,x); //fp la nut cha cua nut p if(p==NULL) {cout<<"Khong tim thay nut x";return;} //Nut la if(p->right==NULL && p->left==NULL) {if(p==proot) {delete proot;proot=NULL;return;} if(fp->left==p) {fp->left=NULL;delete p;return;} if(fp->right==p) {fp->right=NULL;delete p;return;} }; //Nut chi co mot cay con trai if(p->left!=NULL && p->right==NULL) {if(fp->left==p) {fp->left=p->left;delete p;return;} if(fp->right==p) {fp->right=p->left;delete p;return;} } //Nut chi co mot cay con phai if(p->left==NULL && p->right!=NULL) {if(fp->left==p) {fp->left=p->right;delete p;return;} if(fp->right==p) {fp->right=p->right;delete p;return;} }; //Nut p co 2 nut con //Tim nut thay the, la nut phai nhat cua cay con trai f=p; rp=p->left; while(rp->right!=NULL) {f=rp;rp=rp->right;} f->right=rp->left;/*rp la phai nhat, do do khong co con phai vi khong con rp nen nut cha phai chi den nut sau do*/
43
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
p->info=rp->info; //doi noi dung cua p va rp, roi xoa rp delete rp; } Mét sè nhËn xÐt vÒ c©y nhÞ ph©n t×m kiÕm: Khi x©y dùng c©y nhÞ ph©n t×m kiÕm ta rÊt khã h×nh dung vÒ h×nh d¹ng cña c©y, ta kh«ng tr¶ lêi ®îc c©u hái lµ liÖu c©y cã c©n b»ng hay kh«ng. DÔ dµng thÊy ®îc lµ trêng hîp xÊu nhÊt x¶y ra khi ta chÌn c¸c khãa vµo c©y theo thø tù t¨ng dÇn hoÆc gi¶m dÇn. NÕu ta chÌn khãa theo thø tù t¨ng dÇn th× sÏ ®îc mét c©y nhÞ ph©n t×m kiÕm suy biÕn thµnh danh s¸ch nh ë h×nh 3.2., tøc lµ c©y hoµn toµn bÞ lÖch ph¶i; nÕu ta chÌn theo thø tù gi¶m dÇn th× ®îc mét c©y nhÞ ph©n t×m kiÕm lÖch tr¸i. Trong nh÷ng trêng hîp nµy c¸c thñ tôc t×m kiÕm, chÌn, xãa... còng cã ®é phøc t¹p tÝnh to¸n lµ O(n) nh trªn danh s¸ch, nghÜa lµ cÊu tróc c©y kh«ng c¶i thiÖn ®îc chót nµo so víi cÊu tróc danh s¸ch, mµ chØ lµm cho c¸c thao t¸c cã phÇn phøc t¹p h¬n. Tuy nhiªn trong thùc tÕ th«ng thêng c¸c khãa ®îc chÌn vµo mét c¸ch ngÉu nhiªn. Ngêi ta ®· tÝnh ®îc thêi gian trung b×nh ®Ó thùc hiÖn c¸c phÐp to¸n trªn c©y nhÞ ph©n t×m kiÕm lµ O(logn). (Xem "§inh M¹nh Têng, CÊu tróc d÷ liÖu vµ thuËt to¸n", trang 118). 3.6. C©y c©n b»ng chiÒu cao (Height balanced tree)
Mét trêng hîp ®Æc biÖt cña c©y nhÞ ph©n t×m kiÕm lµ c©y c©n b»ng chiÒu cao hay cßn gäi lµ c©y AVL do hai nhµ to¸n häc X« ViÕt lµ Adelson Velsky vµ Landis ph¸t minh ra vµo n¨m 1962. C©y AVL ®îc xem lµ cÊu tróc d÷ liÖu næi tiÕng nhÊt vµ cæ ®iÓn nhÊt trong c¸c c©y c©n b»ng. ViÖc thªm nót hay xãa nót trªn c©y nhÞ ph©n AVL sÏ ®îc thùc hiÖn nh trªn c©y nhÞ ph©n t×m kiÕm. Tuy nhiªn sau mçi lÇn chÌn hoÆc xãa nót th× c©y cã thÓ mÊt c©n b»ng vµ ta ph¶i thùc hiÖn thao t¸c xoay c©y ®Ó c©n b»ng l¹i. C¸c thao t¸c t×m kiÕm, chÌn vµ xãa nót trªn c©y AVL chØ xÊp xØ O(log2n). Sau ®©y chóng ta t×m hiÓu c¸c thao t¸c c©n b»ng l¹i c©y.
3.6.1. Thao t¸c xoay c©y nhÞ ph©n Sau khi chÌn hoÆc xãa nót trªn c©y nhÞ ph©n AVL, cã thÓ c©y sÏ mÊt tr¹ng th¸i c©n b»ng. Trong trêng hîp nµy chóng ta ph¶i thùc hiÖn thao t¸c xoay tr¸i (rotateleft) hoÆc xoay ph¶i (rotateright) ®Ó c©n b»ng l¹i c©y. §Ó xoay tr¸i c©y nhÞ ph©n cã nót gèc lµ P , yªu cÇu lµ nót P ph¶i cã nót con bªn ph¶i Q. Sau khi xoay tr¸i nót P quanh nót con ph¶i Q cña nã, nót Q trë thµnh nót gèc míi cña c©y, nót P trë thµnh nót con bªn tr¸i cña nót Q (cßn nót con tr¸i cña Q sÏ thµnh nót con ph¶i cña P). P
a
Q
b
Q
Xoay tr¸i quanh nót P
c
P
a
c b
44
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
H×nh 3.12. Xoay tr¸i c©y nhÞ ph©n. Thao t¸c xoay ph¶i còng ®îc thùc hiÖn t¬ng tù khi thay nót con ph¶i b»ng nót con tr¸i. NhËn xÐt vÒ phÐp xoay c©y: Cã thÓ thÊy r»ng khi mét c©y bÞ lÖch ph¶i th× ta hy väng b»ng phÐp xoay tr¸i nót gèc quanh con ph¶i cña nã sÏ lµm cho c©y kh«ng cßn lÖch ph¶i n÷a. Tõ h×nh 3.12 ta cã thÓ thÊy r»ng phÐp xoay thùc sù ®¹t ®îc hiÖu qu¶ nÕu c©y a vµ c©y b ®Òu ng¾n h¬n c©y c, nghÜa lµ P vµ Q cïng lÖch ph¶i. NÕu Q lÖch tr¸i chiÒu víi P th× thêng ta ph¶i quay ph¶i Q råi sau ®ã míi quay tr¸i P.
3.6.1. ChØ sè c©n b»ng (balance factor) cña mét nót trªn c©y nhÞ ph©n t×m kiÕm §Ó cã thÓ x¸c ®Þnh vÞ trÝ ®Ó xoay l¹i c©y, t¹i mçi nót ta sÏ lu tr÷ thªm th«ng tin vÒ tÝnh c©n b»ng cña c©y ®ã. T¹i mét nót P bÊt kú ta sÏ ký hiÖu l(P) lµ chiÒu cao cña c©y con tr¸i, r(P) lµ chiÒu cao cña c©y con ph¶i. Ta sÏ ®Þnh nghÜa bal(P) lµ chØ sè c©n b»ng t¹i nót ®ã theo c«ng thøc: bal(P)=r(P)-l(P) VËy bal(P) cña mét nót bÊt kú trªn c©y AVL chØ cã thÓ nhËn mét trong 3 gi¸ trÞ 0,-1,+1, trong ®ã bal(P) = 0 c©y gèc P c©n b»ng c¶ hai bªn (tr¸i ph¶i b»ng nhau). bal(P) = -1 c©y gèc P lÖch tr¸i. bal(P) = +1 c©y gèc P lÖch ph¶i. Ghi chó. ë ®©y dÔ cã sù hiÓu nhÇm vÒ thuËt ng÷: C©y AVL ®îc coi lµ c©n b»ng nÕu chØ sè c©n b»ng cña tÊt c¶ c¸c nót thuéc tËp hîp {-1, 0, 1}, trong khi ®ã theo c¸ch nãi trªn ®©y th× sù lÖch cã nghÜa lµ chiÒu cao c¸c c©y bªn tr¸i vµ bªn ph¶i kh«ng b»ng nhau.
3.6.3. C©n b»ng l¹i c©y khi thªm nót Chóng ta cã thÓ thÊy r»ng cã nh÷ng vÞ trÝ khi thªm nót c©y vÉn c©n b»ng. Ngêi ta rót ra ®îc nh÷ng trêng hîp c©y bÞ mÊt c©n b»ng khi thªm nót nh sau: Trêng hîp 1: VÞ trÝ thªm nót lµ phÝa sau bªn tr¸i cña nót bÞ lÖch tr¸i (bal(P)=-1) -
0
0 0
P
0
U
H×nh 3.13.a. Khi thªm nót U c©y con sÏ mÊt c©n b»ng. Trêng hîp 2: VÞ trÝ thªm nót lµ phÝa sau bªn ph¶i cña nót bÞ lÖch ph¶i (bal(P)=+1)
45
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
P 1 0
0 0
0
U
H×nh 3.13.b. Khi thªm nót U c©y con sÏ mÊt c©n b»ng. Thùc hiÖn phÐp xoay c©y ®Ó c©n b»ng l¹i c©y: Mét ®iÒu kh¸ lý thó xÈy ra khi thªm nót vµo c©y AVL, lµ mÆc dï viÖc thªm nót x vµo c©y cã thÓ g©y ra mét lo¹t vÞ trÝ mÊt c©n b»ng trªn ®êng ®i tõ nót gèc ®Õn vÞ trÝ chÌn nót x, nhng ta l¹i chØ cÇn c©n b»ng nh¸nh c©y con cã gèc s ë vÞ trÝ cuèi cïng cã thÓ mÊt c©n b»ng trªn ®êng ®i tõ gèc ®Õn x. Lý do lµ v× nh ta sÏ thÊy, sau khi thªm nót x vµ thùc hiÖn thao t¸c c©n b»ng ta thÊy nh¸nh c©y con s cã chiÒu cao ®óng b»ng chiÒu cao cña nã tríc khi chÌn x. Do ®ã viÖc chÌn x kh«ng lµm ¶nh hëng ®Õn ®é cao cña c¸c c©y con trªn ®êng tõ gèc ®Õn x. Ta gäi s lµ nót tríc gÇn nhÊt (cña nót x) bÞ mÊt c©n b»ng do thªm nót x. Cã 2 trêng hîp: - Tríc khi thªm nót x bal(s)=-1 vµ nót l¸ x thªm vµo lµ nót sau bªn tr¸i cña s. (Xem h×nh 3.14.a) x
s 1
s
0
-
C
A
B
chiÒ u cao n
chiÒ u cao n
chiÒ u cao n
H×nh 3.14.a. Nh¸nh c©y con nót gèc s tríc khi thªm nót.
46
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
- Tríc khi thªm nót x bal(s) = +1 vµ nót l¸ x thªm vµo lµ nót sau bªn ph¶i cña s. (Xem h×nh 3.14.b) s x 1
A
0
chiÒ u cao n
s1
B
C
chiÒ u cao n
chiÒ u cao n
H×nh 3.14.b. Nh¸nh c©y con gèc s tríc khi thªm nót. V× 2 trêng hîp trªn lµ t¬ng tù nªn chóng ta chØ kh¶o s¸t trêng hîp 1, tøc lµ c©y s bÞ lÖch tr¸i. Chóng ta cã thÓ thÊy ba c©y A, B vµ C cã chiÒu cao nh nhau vµ b»ng n. NÕu c©y rçng ta ®Æt n=-1. Gäi s1 lµ con tr¸i cña s, ta xÐt c¸c trêng hîp sau: Trêng hîp a: C©y gèc s1 lÖch tr¸i, tøc lµ lÖch cïng phÝa víi s. s
s1
-
s1
c
-
b
n
n
s
Xoay ph¶i nót s quanh nót
n
a
0
0
a b
c
x
x
H×nh 3.15.a. Xoay tr¸i c©y s. Trong trêng hîp nµy ta chØ cÇn xoay ph¶i nót s quanh nót s1, ta ®îc c©y gèc s1 ®· c©n b»ng. H¬n n÷a ta cã thÓ thÊy chiÒu cao cña c©y s1 lµ n+1, tøc lµ ®óng b»ng chiÒu cao cña c©y s tríc khi chÌn nót x. Tõ ®©y ta suy ra r»ng hÖ sè c©n b»ng cña c¸c nót tríc nót s ®Òu gi÷ nguyªn nh tríc khi chÌn x. Trêng hîp b: C©y gèc s1 lÖch ph¶i, tøc lµ lÖch kh¸c phÝa víi s, nót x lµ nót sau bªn ph¶i cña nót s1. Lóc nµy ta ph¶i thùc hiÖn 2 phÐp quay, hay cßn gäi lµ thùc hiÖn phÐp quay kÐp. Trêng hîp b.1: s s 1 1
C s 2
A chiÒ u cao n
s
-
B1 chiÒ u cao
B2 chiÒ u cao
chiÒ u cao n
-
s2
Xoay tr¸i nót s1
s 1
A chiÒ u cao n
0 B1 chiÒ u cao
B2 chiÒ u cao
C chiÒ u cao n
47
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n x
x
48
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n 0
Xoay ph¶i nót s
s1
0
B1 chiÒ u cao
A chiÒ u cao n
s2 1 B2 chiÒ u cao
s
C chiÒ u cao n
x
H×nh 3.15.b.1. Xoay kÐp c©y s. Trêng hîp b.2: s
s
-
s1 1 1
A chiÒ u cao n
B1 chiÒ u cao
C
s2 B2 chiÒ u cao
-
Xoay tr¸i nót s1
chiÒ u cao n
s 1
0
A
chiÒ u cao n
B1 chiÒ u cao
-
s 2
C B2 chiÒ u cao
chiÒ u cao n
x
x
0
Xoay ph¶i nót s -
A chiÒ u cao n
s2
s1 B1 chiÒ u cao
0 B2 chiÒ u cao x
s
C chiÒ u cao n
H×nh 3.15.b.2. Xoay kÐp c©y s. Còng nh trong trêng hîp a, sau c¸c phÐp xoay c©y, nót s, s1, s2 ®· c©n b»ng. H¬n n÷a ta cã thÓ thÊy chiÒu cao cña c©y s2 lµ n+1, tøc lµ ®óng b»ng chiÒu cao cña c©y s tríc khi chÌn nót x. Tõ ®©y ta suy ra r»ng hÖ sè c©n b»ng cña c¸c nót tríc nót s ®Òu gi÷ nguyªn nh tríc khi chÌn x. B¶ng sau ®©y ph©n biÖt c¸c trêng hîp c©y bÞ mÊt th¨ng b»ng khi thªm nót vµ c¸c phÐp xoay c©y t¬ng øng ®Ó c©n b»ng l¹i c©y: Trêng hîp 1: C©y gèc s vèn lÖch tr¸i. Trêng Tríc khi Sau khi C¸c phÐp xoay vµ chØ sè hîp thªm nót thªm nót x c©n b»ng míi x
49
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
a
b1
b2
bal(s) = -1 bal(s1)= 0 bal(s) = -1 bal(s1) = 0 bal(s2)=0
bal(s)=-2 bal(s1)= -1
Xoay ph¶i nót s bal(s) = 0, bal(s1) = 0
bal(s)= -2 bal(s1)= +1 bal(s2)=-1
bal(s) = -1 bal(s1) = 0 bal(s2)=0
bal(s)= -2 bal(s1)= +1 bal(s2)=+ 1
Xoay kÐp: 1. Xoay tr¸i nót s1 2. Xoay ph¶i nót s bal(s)=+1,bal(s1) 0,bal(s2)=0 Xoay kÐp: 1. Xoay tr¸i nót s1 2. Xoay ph¶i nót s bal(s)=0,bal(s1) = bal(s2)=0
Trêng hîp 2: C©y gèc Trêng Tríc khi hîp thªm nót x a bal(s) = +1 bal(s1)= 0 b1 bal(s) = +1 bal(s1) = 0 bal(s2)=0 b2
bal(s) = +1 bal(s1) = 0 bal(s2)=0
=
-1,
s vèn lÖch ph¶i. Sau khi C¸c phÐp xoay vµ chØ sè thªm nót x c©n b»ng míi bal(s)=+2 bal(s1)= +1
Xoay tr¸i nót s bal(s) = 0, bal(s1) = 0
bal(s)= +2 bal(s1)= -1 bal(s2)=+ 1
Xoay kÐp: 1. Xoay ph¶i nót s1 2. Xoay tr¸i nót s bal(s)=-1,bal(s1) 0,bal(s2)=0 Xoay kÐp: 1. Xoay ph¶i nót s1 2. Xoay tr¸i nót s bal(s)=0,bal(s1) +1,bal(s2)=0
bal(s)= +-2 bal(s1)= -1 bal(s2)= -1
=
=
Nh vËy khi thªm nót vµo c©y AVL nÕu c©y mÊt c©n b»ng th× ta chØ cÇn c©n b»ng côc bé b»ng c¸ch xoay ®¬n hay xoay kÐp c©y con cã nót gèc s. Ta cã thÓ tãm t¾t l¹i qu¸ tr×nh chÌn vµ c©n b»ng c©y mét c¸ch ®¬n gi¶n nh sau: XuÊt ph¸t tõ gèc theo ®êng ®i D, ta t×m ®îc vÞ trÝ chÌn nót x. Sau khi chÌn x ta lÇn trë l¹i ®êng ®i tõ x trë vÒ gèc vµ tÝnh l¹i hÖ sè cÇn b»ng vµ dõng l¹i ë nót s ®Çu tiªn cã hÖ sè c©n b»ng -2 (lÖch tr¸i) hoÆc 2 (lÖch ph¶i). Gäi s1 lµ con cña s n»m trªn ®êng ®i D. DÜ nhiªn lµ hÖ sè c©n b»ng cña s1 kh«ng thÓ lµ 0. NÕu s lÖch cïng phÝa víi s1 th× chØ cÇn xoay c©y s theo nguyªn t¾c: lÖch tr¸i th× xoay
50
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
ph¶i vµ ngîc l¹i. Cßn nÕu s1 lÖch kh¸c phÝa th× tríc hÕt ph¶i xoay s1, sau ®ã xoay s.
3.6.4. Xo¸ nót trªn c©y AVL §Ó xãa mét nót khái c©y AVL ta ¸p dông thuËt to¸n lo¹i nót khái c©y t×m kiÕm. Tuy nhiªn khi xãa nót, c©y cã thÓ mÊt c©n b»ng vµ ta ph¶i c©n b»ng l¹i c©y b»ng thao t¸c xoay c¸c nh¸nh c©y liªn quan. Còng nh trêng hîp thªm nót, chØ cã mét sè trêng hîp viÖc xãa nót lµm cho c©y mÊt th¨ng b»ng vµ ta ph¶i c©n b»ng l¹i. §ã lµ trêng hîp c©y vèn lÖch ph¶i vµ ta xãa nót ë nh¸nh c©y bªn tr¸i hoÆc c©y vèn lÖch tr¸i mµ ta xãa nót trªn nh¸nh c©y bªn ph¶i. ViÖc c©n b»ng c©y khi xo¸ nót tr¸i ®îc thùc hiÖn t¬ng tù nh viÖc thªm nót trªn nh¸nh c©y bªn ph¶i vµ thao t¸c c©n b»ng khi xãa nót bªn ph¶i l¹i t¬ng tù nh thao t¸c c©n b»ng khi thªm nót trªn nh¸nh c©y bªn tr¸i. Tuy nhiªn nh chóng ta sÏ thÊy, nÕu trong thao t¸c thªm nót ta chØ cÇn nhiÒu nhÊt lµ mét phÐp xoay ®¬n hoÆc kÐp ®Ó c©n b»ng l¹i c©y th× trong thao t¸c xãa nót, trong trêng hîp xÊu nhÊt ta cÇn thùc hiÖn kho¶ng logn thao t¸c xoay c©y däc theo ®êng t×m kiÕm tõ nót thay thÕ trë vÒ nót gèc ®Ó c©n b»ng l¹i c©y. Thùc hiÖn phÐp xoay c©y ®Ó c©n b»ng l¹i c©y: Sau ®©y ta xÐt trêng hîp c©n b»ng l¹i c©y gèc s vèn lÖch tr¸i vµ ta thùc hiÖn xãa nót ë nh¸nh c©y bªn ph¶i, ®ång thêi ta gi¶ sö r»ng viÖc xãa nót ®· lµm cho nh¸nh c©y bªn ph¶i thÊp ®i 1 so víi tríc khi xãa. Ta cã c¸c trêng hîp sau: Gäi s1 lµ con tr¸i cña s, ta xÐt c¸c trêng hîp sau: Trêng hîp 1: Tríc khi xo¸ nót bal(s) = 1, tøc lµ c©y lÖch vÒ bªn ph¶i. Sau khi xãa nót th× bal(s)=0, c©y c©n b»ng hoµn toµn. Tuy nhiªn chiÒu cao cña c©y bÞ gi¶m ®i 1 so víi tríc khi xãa, do ®ã cã thÓ ¶nh hëng d©y chuyÒn ®Õn c¸c nót ®øng tríc. s
0
c
a
n
n
Trêng hîp 2: Tríc khi xo¸ nót bal(s) = 0, tøc lµ c©y kh«ng bÞ lÖch. Sau khi xãa nót th× bal(s)= -1, c©y vÉn c©n b»ng vµ chiÒu cao cña c©y kh«ng bÞ gi¶m, do ®ã kh«ng ¶nh hëng ®Õn c¸c nót ®øng tríc, gi¶i thuËt kÕt thóc. s
a n
-
c n1
51
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
Trêng hîp 3: Tríc khi xãa nót trªn nh¸nh c©y bªn ph¶i th× c©y lÖch tr¸i. Xãa nót xong th× c©y bªn ph¶i gi¶m ®i 1, do ®ã chØ sè c©n b»ng cña nót s sÏ b»ng -2. Ta ph¶i c©n b»ng l¹i. Tuy nhiªn kh¸c víi trêng hîp thªm nót, trong trêng hîp nµy chiÒu cao cña c©y bÞ gi¶m nªn cã thÓ ¶nh hëng d©y chuyÒn ®Õn c¸c nót ®øng tríc. Trêng hîp a: bal(s1)=0. s
s1
-
Xoay ph¶i nót s quanh nót s1
+
s
c
0
a
b
n
n
-
n1
a
s
Bal(s1)=0, xoay ph¶i
Xoay ph¶i nót s quanh nót s1
s, ®é cao c©y kh«ng
s1
0
s
c
-
b
n
n1
n1
n
-
a
c
b
n
H×nh 3.16.a. ®æi (=n+1). Trêng hîp b: bal(s1)=-1.
s1
s1
0
n1
a
c
b
n
n1
n1
H×nh 3.16.b. Bal(s1)=-1, xoay ph¶i s, c©y thÊp h¬n (nright, bal(s2)=0 s s 1
A chiÒ u cao n-1
s
-
C
1 0 B1 chiÒ u cao
s 2 B2 chiÒ u cao
chiÒ u cao n-1
-
s2 Xoay tr¸i nót s1
s 1
A chiÒ u cao n-1
0 B1 chiÒ u cao
B2 chiÒ u cao
C chiÒ u cao n-1
52
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n Xoay ph¶i nót s
0
s1
0
B1 chiÒ u cao
A chiÒ u cao n-1
s2 0 B2 chiÒ u cao
s
C n-1
H×nh 3.16.c.1. Bal(s1)=+1, bal(s2)=0,xoay kÐp, c©y thÊp h¬n (n
C
1
s 2
A chiÒ u cao n-1
s
-
B1 chiÒ u cao
B2 chiÒ u cao
chiÒ u cao n-1
-
s2 Xoay tr¸i nót s1
s 1
A chiÒ u cao n-1
0 B1 chiÒ u cao
B2 chiÒ u cao
C chiÒ u cao n-1
53
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n 0
Xoay ph¶i nót s
s1
0
1
B1 chiÒ u cao
A chiÒ u cao n-1
s2
B2 chiÒ u cao
s
C n-1
H×nh 3.16.c.2. Bal(s1)=+1, bal(s2)=-1,xoay kÐp, c©y thÊp h¬n (n
B1 chiÒ u cao
Xoay tr¸i nót s1
chiÒ u cao n-1
s 2
chiÒ u cao n-1
Xoay ph¶i nót s
0
A chiÒ u cao n-1
H×nh 3.16.c.3. (n
s 1
A
B2 chiÒ u cao
-
-
s2
C
1 1
A
s
-
B1 chiÒ u cao
B2 chiÒ u cao
C chiÒ u cao n-1
s2
s1 B1 chiÒ u cao
-
0 B2 chiÒ u cao
s
C n-1
Bal(s1)=+1, bal(s2)=1,xoay kÐp, c©y thÊp h¬n
Nh ta cã thÓ thÊy ë trªn, cã kh¸ nhiÒu trêng hîp sau khi ®¹t ®îc sù c©n b»ng th«ng qua phÐp xoay, th× ®é cao cña c©y bÞ thay ®æi, tøc lµ bÞ thÊp h¬n tríc. Sù thÊp h¬n nµy sÏ ¶nh hëng ®Õn c¸c nót ®øng tríc, v× vËy sau khi c©n b»ng xong c©y con ta l¹i ph¶i xÐt ®Õn c©y cha vµ c©n b»ng c©y cha. Qu¸ tr×nh sÏ dõng l¹i khi ta gÆp mét trêng hîp sau khi c©n b»ng th× c©y kh«ng bÞ thÊp ®i.
3.6.5. Vµi nhËn xÐt vÒ c©y AVL - Trung b×nh 2 lÇn thªm nót th× cÇn mét lÇn c©n b»ng l¹i c©y. - Trung b×nh 5 lÇn xãa nót th× cÇn mét lÇn c©n b»ng l¹i c©y. - Chóng ta sÏ chØ ra r»ng, trªn c©y AVL, trong trêng hîp xÊu nhÊt, thêi gian thùc hiÖn c¸c phÐp to¸n lµ O(logn). Tríc hÕt ta sÏ x¸c ®Þnh ®é cao cña c©y trong trêng hîp xÊu nhÊt.
54
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 3. C©y nhÞ ph©n
Thay cho viÖc x¸c ®Þnh ®é cao trong trêng hîp xÊu nhÊt, tøc lµ cho tríc n ta cÇn ph¶i x¸c ®Þnh ®é cao h trong trêng hîp xÊu nhÊt lµ bao nhiªu, ta sÏ x¸c ®Þnh sè nhá nhÊt c¸c ®Ønh mµ c©y AVL cã ®é cao h ph¶i cã. Gäi Th lµ c©y cã ®é cao h víi sè ®Ønh nhá nhÊt, vµ ta gäi D h lµ sè ®Ønh t¬ng øng. Nh vËy víi h cè ®Þnh cã thÓ cã nhiÒu c¸ch tæ chøc c©y nhng Dh lµ mét sè kh«ng ®æi. Khi ®ã mét trong 2 c©y con cña nã ph¶i cã ®é cao h-1, cßn c©y con kia cã ®é cao h-1 hoÆc h-2. Nhng v× Th lµ c©y cã ®é cao h víi sè ®Ønh nhá nhÊt, nªn ta suy ra r»ng 2 c©y con kia cã ®é cao lµ h-1 vµ h-2, v× nÕu c¶ 2 cã ®é cao h-1 th× ta cã thÓ thay mét trong 2 c©y b»ng c©y cã ®é cao h-2, vÉn ®¶m b¶o yªu cÇu AVL mµ l¹i cã sè ®Ønh nhá h¬n. B¶n th©n 2 c©y con l¹i lµ nh÷ng c©y cã sè ®Ønh nhá nhÊt. Ta cã Dh = Dh-1 + Dh-2 +1 tõ ®©y ta cã Dh +1 = Dh-1 +1 + Dh-2 +1 §Æt Gh = Dh +1, ta cã G0 = 2, G1 = 3, Gh = Gh-1 + Gh-2 , h=2,3,... D·y Gh chÝnh lµ thµnh phÇn h+2 cña d·y Fibonacci, tøc lµ Gh = Fh+2. Ta biÕt r»ng nÕu ®Æt n = Fk , khi ®ã n ~ ak víi a ~ 1.61803... lµ “tû sè vµng”. Tõ ®©y cã thÓ tÝnh ®îc k ~ 1.44log2n. §Æt n = Dh , ta cã n = Dh = Gh -1 = Fh+2 - 1 , tõ ®©y n+1 = Fh+2 , suy ra h+2 ~ 1.44log(n+1) vµ do ®ã cã thÓ xem h ~ 1.44logn Nh vËy, ®é cao cña c©y AVL trong trêng hîp xÊu nhÊt lµ O(logn). Tõ ®©y ta suy ra r»ng, thêi gian thùc hiÖn c¸c phÐp to¸n trªn c©y AVL trong trêng hîp xÊu nhÊt lµ O(logn).
55
Ch¬ng 4 S¾p xÕp vµ t×m kiÕm 4.1. Më ®Çu
S¾p xÕp vµ t×m kiÕm lµ hai thao t¸c ®îc sö dông thêng xuyªn trong c¸c øng dông tin häc. Hai thao t¸c nµy cã mèi liªn quan mËt thiÕt. Thêng nÕu d÷ liÖu ®îc s¾p xÕp th× thao t¸c t×m kiÕm ®îc thùc hiÖn dÔ dµng h¬n. VÝ dô nÕu mét m¶ng chøa d÷ liÖu ®îc s¾p xÕp th× ta cã thÓ ¸p dông thuËt to¸n t×m kiÕm nhÞ ph©n cã ®é phøc t¹p tÝnh to¸n log2n, nhanh h¬n rÊt nhiÒu so víi thuËt to¸n t×m kiÕm tuyÕn tÝnh (cã ®é phøc t¹p tÝnh to¸n n). Hay nh c©y nhÞ ph©n t×m kiÕm ch¼ng h¹n, nhê d÷ liÖu ®îc tæ chøc theo c¸ch thøc ®Æc biÖt (khãa t¹i mçi nót lín h¬n c¸c khãa trªn c©y con tr¸i vµ nhá h¬n c¸c khãa trªn c©y con ph¶i) nªn viÖc t×m kiÕm chØ cÇn thùc hiÖn trªn c¸c nót theo quan hÖ cha con, nghÜa lµ chØ cÇn ®i qua chiÒu cao cña c©y. S¾p xÕp danh s¸ch c¸c phÇn tö theo mét thø tù t¨ng hoÆc gi¶m dÇn theo mét khãa nµo ®ã lµ mét viÖc ®îc thùc hiÖn thêng xuyªn kh«ng nh÷ng trong tin häc mµ c¶ trong cuéc sèng thêng ngµy. Khi niªm yÕt danh s¸ch c¸c häc sinh thi ®ç vµo trêng ®¹i häc, ta thêng xÕp theo vÇn a,b,c ®Ó cho c¸c thÝ sinh dÔ t×m ra tªn m×nh. C¸c tõ trong mét cuèn tõ ®iÓn còng ®îc s¾p xÕp theo thø tù a, b,c, nhê vËy chóng ta cã thÓ nhanh chãng x¸c ®Þnh vïng chøa tõ cÇn tra, vµ dÔ dµng t×m ®îc tõ cÇn tra cøu. Cã thÓ thÊy r»ng kh¸i niÖm s¾p xÕp chØ ®îc sö dông cho nh÷ng tËp hîp mµ trªn ®ã cã x¸c ®Þnh mét trËt tù tuyÕn tÝnh, nghÜa lµ gi÷a hai phÇn tö bÊt kú bao giê còng cã thÓ nãi lµ phÇn tö nµo ®øng tríc, phÇn tö nµo ®øng sau. Nh vËy tËp hîp cã thÓ thùc hiÖn s¾p xÕp tríc hÕt ph¶i lµ mét d·y c¸c phÇn tö hay lµ mét cÊu tróc danh s¸ch (Ýt nhÊt lµ vÒ mÆt logic, vÝ dô sinh viªn trong mét líp cã thÓ ngåi kh«ng theo mét tr×nh tù nµo, nhng nÕu ta ®¸nh sè c¸c sinh viªn th× l¹i t¹o thµnh danh s¸ch). Nh thÕ ta lu«n cã thÓ g¸n chØ sè cho mçi phÇn tö, vÝ dô phÇn tö ®øng tríc tÊt c¶ c¸c phÇn tö kh¸c lµ a 0, phÇn tö tiÕp theo lµ a1, ...Khi ta dïng m¶ng ®Ó cµi ®Æt danh s¸ch th× c¸c chØ sè lµ têng minh, nghÜa lµ chóng còng chØ vÞ trÝ trong m¶ng vµ cã thÓ truy xuÊt trùc tiÕp. Cßn nÕu danh s¸ch ®îc cµi ®Æt b»ng ph¬ng ph¸p liªn kÕt trong bé nhí hay cµi ®Æt trªn tÖp ë bé nhí ngoµi, hoÆc thËm chÝ lµ cÊu tróc c©y víi phÐp duyÖt nµo ®ã th× kh«ng thÓ sö dông chØ sè ®Ó truy xuÊt trùc tiÕp c¸c phÇn tö. Bµi to¸n s¾p xÕp mét d·y c¸c phÇn tö thêng liªn quan ®Õn viÖc so s¸nh mét hoÆc nhiÒu gi¸ trÞ khãa. Tuy nhiªn ®Ó ®¬n gi¶n, ë ®©y ta t¹m coi khãa lµ chÝnh phÇn tö ®ã. Ta gäi d·y c¸c phÇn tö A = (a0, a1,..., an-1) lµ ®· ®îc s¾p xÕp t¨ng dÇn nÕu phÇn tö ®øng tríc kh«ng lín h¬n phÇn tö ®øng sau, tøc lµ nÕu i<j th× ai≤ aj. T¬ng tù d·y A ®îc gäi lµ gi¶m dÇn nÕu phÇn tö ®øng tríc kh«ng bÐ h¬n phÇn tö ®øng sau. Bµi to¸n s¾p xÕp mét d·y A lµ qu¸ tr×nh xö lý biÕn ®æi vÞ trÝ c¸c phÇn tö trong d·y sao cho tõ d·y ban ®Çu thêng cha ®îc s¾p xÕp trë thµnh ®îc s¾p xÕp. Gi¶ sö ta ®ang quan t©m ®Õn viÖc s¾p xÕp theo thø tù t¨ng dÇn. Khi ®ã râ rµng víi mäi cÆp bÊt kú (a i, aj) víi i<j th× ai≤ aj. Ta gäi cÆp nh thÕ nµy lµ cÆp s¾p thuËn. NÕu mét d·y cha ®îc s¾p th× sÏ tån t¹i nh÷ng cÆp kh«ng thuËn, nghÜa lµ i<j nhng ai> aj. Ta gäi cÆp nh thÕ nµy lµ cÆp s¾p ngîc hay nghÞch thÕ. Kh¸i niÖm nµy sÏ ®îc dïng
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
nhiÒu trong c¸c bµi to¸n s¾p xÕp. Trong khoa häc m¸y tÝnh cã hai lo¹i gi¶i thuËt s¾p xÕp ®îc dïng phæ biÕn lµ s¾p xÕp néi (hay cßn gäi lµ s¾p xÕp trong) vµ s¾p xÕp ngo¹i (hay cßn gäi lµ s¾p xÕp ngoµi). - S¾p xÕp trong lµ toµn bé d÷ liÖu cÇn s¾p xÕp ®îc ®a vµo bé nhí, nhê vËy tèc ®é s¾p xÕp ®îc thùc hiÖn nhanh nhng kÝch thíc d÷ liÖu bÞ h¹n chÕ theo dung lîng bé nhí. - S¨p xÕp ngoµi lµ chØ mét phÇn d÷ liÖu cÇn s¾p xÕp ®îc ®a vµo bé nhí, phÇn cßn l¹i ®îc lu ë bé nhí ngoµi. Tèc ®é s¾p xÕp ®îc thùc hiÖn chËm h¬n s¾p xÕp trong nhng kÝch thíc d÷ liÖu cã thÓ rÊt lín. Sau ®©y chóng ta nghiªn cøu c¸c gi¶i thuËt s¾p xÕp trong, vµ ta gi¶ thiÕt lµ ta cÇn s¾p xÕp danh s¸ch A= (a 0, a1,..., an-1) theo thø tù t¨ng dÇn. C¸c thuËt to¸n s¾p xÕp ®îc giíi thiÖu sau ®©y ®îc cµi ®Æt trong ch¬ng tr×nh 41SapXep.CPP. 4.2. C¸c gi¶i thuËt s¾p xÕp hay dïng
4.2.1. S¾p xÕp b»ng lùa chän (Selection Sort) a. M« t¶ thuËt to¸n Theo ph¬ng ph¸p nµy chóng ta lÇn lît chän nót nhá nhÊt cho c¸c vÞ trÝ 0,1,...,n-1 nh sau: - LÇn chän 0: T×m nót nhá nhÊt trong kho¶ng tõ 0 ®Õn n-1 b»ng c¸ch ®Æt gi¸ trÞ nhá nhÊt t¹m thêi b»ng a0, sau ®ã duyÖt tõ 1 ®Õn n-1, thùc hiÖn n-1 lÇn so s¸nh ®Ó x¸c ®Þnh vÞ trÝ nót nhá nhÊt, thÝ dô ®ã lµ vÞ trÝ k0, sau ®ã ®æi gi¸ trÞ 2 nót t¹i vÞ trÝ 0 vµ k0 . - LÇn chän 1: T×m nót nhá nhÊt trong kho¶ng tõ 1 ®Õn n-1 b»ng c¸ch ®Æt gi¸ trÞ nhá nhÊt t¹m thêi b»ng a1, sau ®ã duyÖt tõ 2 ®Õn n-1, thùc hiÖn n-2 lÇn so s¸nh ®Ó x¸c ®Þnh vÞ trÝ nót nhá nhÊt, thÝ dô ®ã lµ vÞ trÝ k1, sau ®ã ®æi gi¸ trÞ 2 nót t¹i vÞ trÝ 1 vµ k1 . ... - LÇn chän i: T×m nót nhá nhÊt trong kho¶ng tõ i ®Õn n-1 b»ng c¸ch ®Æt gi¸ trÞ nhá nhÊt t¹m thêi b»ng ai, sau ®ã duyÖt tõ i+1 ®Õn n-1, thùc hiÖn n-i lÇn so s¸nh ®Ó x¸c ®Þnh vÞ trÝ nót nhá nhÊt, thÝ dô ®ã lµ vÞ trÝ ki, sau ®ã ®æi gi¸ trÞ 2 nót t¹i vÞ trÝ i vµ ki . .... - LÇn chän n-2 (lÇn chän cuèi): T×m nót nhá nhÊt trong kho¶ng tõ n-2 ®Õn n-1 b»ng c¸ch so s¸nh an-2 vµ an-1 x¸c ®Þnh vÞ trÝ nót nhá h¬n, thÝ dô ®ã lµ vÞ trÝ kn-2, sau ®ã ®æi gi¸ trÞ 2 nót t¹i vÞ trÝ n-2 vµ kn-2 (kn-2 cã thÓ lµ n-2 hoÆc n-1) ThuËt to¸n nµy cã thÓ m« t¶ ng¾n gän h¬n nh sau: Víi mçi i (i = 0,1,2,...,n-2) ta sÏ chän trong d·y khãa ai, ai+1,..., an-1 khãa nhá nhÊt ak, råi ®æi chç cho ai (dÜ nhiªn lµ cã thÓ ai chÝnh lµ khãa nhá nhÊt vµ t¹i bíc nµy kh«ng cÇn ®æi chç). VÝ dô, gi¶ sö d·y A ban ®Çu lµ: a0 a1 a2 a3 a4 a5
57
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
14
2
1
13
12
11
C¸c bíc víi i=0, 1, 2 ®îc thùc hiÖn nh sau: a0 a1 a2 a3 a4 i=0 14 2 1 13 12 1 2 14 13 12
a5 11 11
i=1
1 1
2 2
14 14
13 13
12 12
11 11
i=2
1 1
2 2
14 11
13 13
12 12
11 14
Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt Selection sort: Tæng sè lÇn so s¸nh: Tæng sè lÇn so s¸nh lµ: C(n) = (n-1)+(n-2)+...+(n-k)+...+2+1=n(n-1)/2 Tæng sè lÇn ®æi chç Ýt h¬n tæng sè lÇn so s¸nh. VËy Selection sort cã bËc lµ O(n2), hay nãi mét c¸ch kh¸c, thuËt to¸n nµy cã ®é phøc t¹p tÝnh to¸n n2. NhËn xÐt: Gi¶i thuËt Selection sort ®¬n gi¶n, dÔ hiÓu nhng chËm, kh«ng tËn dông ®îc t×nh huèng d·y ®· ®îc s¾p xÕp hay gÇn s¾p xÕp.
b. Cµi ®Æt thuËt to¸n Selection Sort
M¶ng a[] vµ cì N cña m¶ng võa lµ ®Çu vµo võa lµ ®Çu ra cña hµm. ë ®Çu vµo, thêng m¶ng cha ®îc s¾p xÕp. §Çu ra lµ m¶ng a ®· ®îc s¾p xÕp b»ng ph¬ng ph¸p lùa chän. Trong qu¸ tr×nh cho i ch¹y tõ 0 ®Õn N-2, ta dïng mét biÕn k ghi l¹i chØ sè cña phÇn tö bÐ nhÊt vµ gi¸ trÞ min ghi l¹i gi¸ trÞ bÐ nhÊt trong d·y ai, ai+1,..., aN-1. Ban ®Çu ta gi¶ thiÕt r»ng ai lµ bÐ nhÊt (lÖnh k=i). Sau ®ã cho j ch¹y tõ i+1 cho ®Õn cuèi d·y, vµ mçi lÇn cã phÇn tö bÐ h¬n (lÖnh if(a[j]
c. Mét d¹ng t¬ng tù selection sort: ph¬ng ph¸p ®æi chç trùc tiÕp §èi víi c¸c b¹n sinh viªn míi lµm quen víi thuËt to¸n, cã thÓ ph¬ng ph¸p lùa
58
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
chän ®¬n gi¶n vÉn h¬i khã hiÓu. Cã mét d¹ng t¬ng tù thuËt to¸n nµy nhng dÔ hiÓu h¬n, lµ ph¬ng ph¸p ®æi chç trùc tiÕp nh sau: Víi mçi i (i = 0,1,2,...,n-2) ta còng biÕn ®æi d·y khãa Ai = (ai, ai+1,..., an1) sao cho ai lµ khãa nhá nhÊt. Thay v× xuÊt ph¸t tõ i råi t×m vÞ trÝ k sao cho ak cã gi¸ trÞ nhá nhÊt trong d·y con Ai, sau ®ã chØ cÇn ®æi ak cho ai (®æi mét lÇn), ta l¹i xuÊt ph¸t tõ j=i+1 vµ mçi lÇn nhËn thÊy aj < ai th× ta l¹i ®æi hai vÞ trÝ nµy. Nh vËy cã thÓ ph¶i qua rÊt nhiÒu lÇn ®æi chç ta míi cã ®îc d·y Ai tháa m·n ®iÒu kiÖn trªn. Nh vËy cho dï thuËt to¸n nµy còng cã ®é phøc t¹p tÝnh to¸n n2 nh ph¬ng ph¸p lùa chän ®¬n gi¶n, nhng trong thùc tÕ ta ph¶i thùc hiÖn nhiÒu phÐp tÝnh h¬n. Trong trêng hîp c¸c phÇn tö cã cÊu tróc phøc t¹p chøa nhiÒu lo¹i th«ng tin th× viÖc ®æi chç rÊt tèn thêi gian vµ bé nhí. Sau ®©y lµ ®o¹n ch¬ng tr×nh cµi ®Æt thuËt to¸n ®æi chç trùc tiÕp: void selectsort2(float a[],int N) {int i,j; for(i=0;i
4.2.2. S¾p xÕp næi bät (Bubble sort) a. M« t¶ thuËt to¸n Theo ph¬ng ph¸p nµy, danh s¸ch sÏ ®îc duyÖt nhiÒu lÇn, mçi lÇn duyÖt sÏ lÇn lît so s¸nh cÆp nót thø i vµ i+1 vµ ®æi chç 2 nót nµy nÕu kh«ng ®óng thø tù. Cã thÓ ®a ra mét sè nhËn xÐt nh sau: - Sau lÇn duyÖt thø nhÊt phÇn tö lín nhÊt sÏ ®îc xÕp ®óng chç, tøc lµ ®îc ®a vÒ phÝa cuèi cña d·y. Vµ nãi chung sau lÇn duyÖt thø i th× c¸c phÇn tö tõ n-i ®Õn n-1 ®îc ®Æt ®óng chç. Nãi c¸ch kh¸c nh÷ng phÇn tö lín, næi bät lªn trªn cïng th× sÏ ®îc g¹t ra tríc hÕt. - NÕu cã mét lÇn duyÖt mµ kh«ng cã cÆp phÇn tö nµo ®æi chç th× d·y ®· ®îc s¾p xÕp. Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt Bubble Sort: Tæng sè lÇn so s¸nh: Trong trêng h¬p xÊu nhÊt (khi ban ®Çu d·y lµ gi¶m dÇn), ta cÇn n-1 phÐp duyÖt (lÇn ®Çu duyÖt n phÇn tö, lÇn 2 duyÖt n-1 phÇn tö, lÇn n-1 duyÖt 2 phÇn tö). Mçi lÇn duyÖt cÇn n-1 phÐp so s¸nh. VËy Tæng sè lÇn so s¸nh lµ: C(n) = (n-1)2 = O(n2). Sè lÇn ®æi chç dÜ nhiªn nhá h¬n tæng sè lÇn so s¸nh, do ®ã thuËt to¸n nµy cã bËc lµ O(n2). NhËn xÐt: Gi¶i thuËt Bubble Sort tèt h¬n Selection sort vµ tËn dông ®îc t×nh huèng d·y ®· ®îc s¾p xÕp hay gÇn s¾p xÕp: d·y cµng gÇn ®îc s¾p xÕp th× cÇn cµng Ýt phÐp tÝnh. §Æc biÖt nÕu d·y ®· ®îc s¾p xÕp th× chØ cÇn n-1 lÇn so s¸nh, nghÜa lµ nÕu d·y ®· s¾p th× thêi gian thùc hiÖn cã bËc O(n).
b. Cµi ®Æt thuËt to¸n Bubble sort B¶n chÊt cña thuËt to¸n nµy lµ so s¸nh c¸c cÆp phÇn tö liÒn kÒ. NÕu chóng ngîc thø tù th× ®îc ®æi cho nhau. Mâi lÇn duyÖt nh thÕ th× chØ
59
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
cã mét sè cÆp ®îc s¾p xÕp ®óng, chø cha ph¶i toµn bé d·y. Tuy nhiªn nÕu cã mét lÇn duyÖt nµo ®ã mµ ta kh«ng ph¸t hiÖn ra cÆp s¾p ngîc thø tù th× cã nghÜa lµ d·y ®· s¾p xÕp. V× cha biÕt tríc sè lÇn duyÖt nªn ta sÏ dïng mét biÕn logic cã tªn lµ doicho ®Ó ghi nhËn t×nh tr¹ng cã sù ®æi chç hay kh«ng cho mét lÇn duyÖt. Khi b¾t dÇu duyÖt th× biÕn nµy nhËn gi¸ trÞ false. Trong qu¸ tr×nh duyÖt nÕu cã sù dæi chç th× nã nhËn gi¸ trÞ true, cã nghÜa lµ cã sù ®æi chç. NÕu qua mét lÇn duyÖt mµ doicho vÉn kh«ng bÞ thay ®æi gi¸ trÞ, cã nghÜa lµ vÉn nhËn gi¸ trÞ false th× kÕt thóc, v× ®iÒu ®ã cã nghÜa lµ d·y ®· s¾p xÕp. void bubblesort(float a[],int N) {int i,j,doicho; do {doicho=false; for(j=0;ja[j+1]) {swap(a[j],a[j+1]);doicho=true;} } while(!doicho); }
c. ThuËt to¸n Bubble Sort c¶i tiÕn Tõ nhËn xÐt r»ng víi lÇn duyÖt ®Çu tiªn i=1 phÇn tö lín nhÊt sÏ ®îc chuyÓn vÒ cuèi d·y, tøc lµ phÇn tö a n-1 ®· ë ®óng vÞ trÝ. V× vËy lÇn duyÖt tiÕp theo ta chØ cÇn ®i ®Õn vÞ trÝ n-2. Nãi chung t¹i lÇn duyÖt i th× chØ cÇn so s¸nh c¸c cÆp tõ vÞ trÝ 0 cho ®Õn vÞ trÝ N-i. Ta cã hµm cµi ®Æt thuËt to¸n nµy nh sau: void bubblesort2(float a[],int N) {int i,j,doicho; i=1; do {doicho=false; for(j=0;ja[j+1]) {swap(a[j],a[j+1]);doicho=true;} i++; } while(!doicho); }
60
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt Bubble Sort cã c¶i tiÕn: Tæng sè lÇn so s¸nh: Trong trêng hîp xÊu nhÊt (d· ban ®Çu ®îc s¾p gi¶m dÇn), cÇn n-1 lÇn duyÖt (k=1,2,...,n-1) lÇn duyÖt thø i cÇn n-i lÇn so s¸nh. Tæng sè lÇn so s¸nh lµ: C(n) = (n-1)+(n-2)+...+(n-k)+...+2+1 = n(n-1)/2 = O(n2). Tæng sè lÇn ®æi chç Ýt h¬n tæng sè lÇn so s¸nh, do ®ã thuËt to¸n nµy cã ®é phøc t¹p tÝnh to¸n lµ O(n2). NhËn xÐt: Gi¶i thuËt Bubble Sort c¶i tiÕn tèt h¬n Bubble Sort th«ng thêng, do ®ã tèt h¬n Selection sort.
4.2.3. S¾p xÕp chÌn (Insertion sort) a. M« t¶ thuËt to¸n ThuËt to¸n s¾p xÕp chÌn còng ®¬n gi¶n gÇn nh s¾p xÕp chän nhng mÒm dÎo h¬n, c¸ch thùc hiÖn nh sau: §Çu tiªn ta xem danh s¸ch ®· s¾p thø tù chØ cã mét phÇn tö lµ a 0. Ta b¾t ®Çu chÌn c¸c phÇn tö a1,..., an-1 vµo danh s¸ch sao cho tÝnh s¾p thø tù lu«n ®îc b¶o ®¶m. Gi¶ sö ta ®· t¹o ®îc danh s¸ch cã k phÇn tö a 0, a1,..., ak-1 . Ta sÏ chÌn phÇn tö ak vµo danh s¸ch nh sau: Ta cÇn mét biÕn trung gian x, ®Ó lu tr÷ t¹m thêi gi¸ trÞ ak, v× ta sÏ cÇn vÞ trÝ thø k, tøc lµ ak ®Ó kÐo c¸c phÇn tö sang ph¶i mét vÞ trÝ trong qu¸ tr×nh t×m mét vÞ trÝ thÝch hîp cho x. Sau khi x¸c ®Þnh ®îc vÞ trÝ thÝch hîp cho x, thÝ dô vÞ trÝ j, ta g¸n aj = x (gi¸ trÞ cò cña aj ®· ®îc chuyÓn sang vÞ trÝ j+1) Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt: Tæng sè lÇn so s¸nh: Sè lÇn so s¸nh tèi ®a trong lÇn chÌn 1 lµ 1 Sè lÇn so s¸nh tèi ®a trong lÇn chÌn 2 lµ 2 ... Sè lÇn so s¸nh tèi ®a trong lÇn chÌn n-1 lµ n-1 VËy C(n) ≤ 1+2+...+(n-1) = (n2 -n)/2 cã bËc lµ O(n2 ) V× qu¸ tr×nh so s¸nh vµ dÞch chuyÓn ®îc thùchiÖn ®ång thêi, nªn sè phÐp dÞch chuyÓn cïng cã bËc nh sè phÐp so s¸nh. V× vËy ta cã thêi gian thùc hiÖn gi¶i thuËt insertion sort cã bËc lµ O(n2). NhËn xÐt: Insertion sort lµ ph¬ng ph¸p dÔ hiÓu, dÔ cµi ®Æt. MÆc dÇu thêi gian thùc hiÖn gi¶i thuËt cã bËc O(n2) nhng trong vµi trêng hîp c¶i tiÕn, thuËt to¸n nµy cã thêi gian thùc hiÖn nhanh h¬n selection sort. §Æc biÖt khi danh s¸ch gÇn ®îc s¾p xÕp th× thêi gian tÝnh to¸n sÏ Ýt h¬n nhiÒu, nhÊt lµ trong trêng hîp danh s¸ch ®· s¾p xÕp th× thuËt to¸n cã bËc O(n).
b. Cµi dÆt thuËt to¸n insertion sort Ban ®Çu d·y ®îc xem chØ cã mét phÇn tö a[0] vµ dÜ nhiªn ®îc xem lµ ®· s¾p xÕp. Sau ®ã xuÊt ph¸t tõ i=1,2,...,N-1 ta chÌn phÇn tö a[i] vµo danh
61
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
s¸ch ®· s¾p xÕp a[0], a[1],...,a[i-1]. DÜ nhiªn lµ ta ph¶i t×m mét vÞ trÝ thÝch hîp trong d·y nµy. NÕu a[i-1]0 &&x0 && x=a[j-1] do do gia tri j dung la vi tri can chen x */ a[j]=x; } //end of for(i=1;i
4.2.4. Ph¬ng ph¸p Shell Sort a. M« t¶ thuËt to¸n Shell sort lµ mét d¹ng c¶i tiÕn kh¸c cña insertion sort. Nh ta thÊy, trong trêng hîp d·y cha s¾p thø tù th× sè lÇn so s¸nh vµ ®æi chç trong insertion sort rÊt lín. Khi chÌn mét phÇn tö míi ngêi ta ph¶i t×m ®îc vÞ trÝ cÇn chÌn vµ trong qu¸ tr×nh t×m kiÕm ph¶i dÞch chuyÓn tÊt c¶ c¸c phÇn tö ë vÒ phÝa ph¶i vÞ trÝ ®ã sang ph¶i mét vÞ trÝ. VÝ dô nÕu phÇn tö nhá nhÊt n»m ë cuèi danh s¸ch th× ngêi ta cÇn thùc hiÖn n lÇn dÞch chuyÓn míi ®Õn ®îc vÞ trÝ cÇn chÌn phÇn tö ®ã (vÞ trÝ ®Çu tiªn) Ngêi ta c¶i tiÕn b»ng c¸ch tríc khi thùc hiÖn simple insertion th× tiÕn hµnh vµi bíc chÌn víi bíc t¨ng lín h¬n 1 ®Ó danh s¸ch cã xu híng gÇn s¾p xÕp h¬n. Víi bíc t¨ng h, ngêi ta s¾p xÕp danh s¸ch hoÆc tËp tin sao cho víi mäi d·y con Ai = (ai, ai+h, ai+2h,... ,ai+kh) lµ d·y ®· s¾p thø tù. B»ng c¸ch s¾p xÕp theo ®é dµi bíc h víi gi¸ trÞ h kh¸ lín, chóng ta cã thÓ di chuyÓn c¸c phÇn tö c¸ch xa trong m¶ng vµ v× vËy khi s¾p xÕp víi c¸c bíc h nhá h¬n th× Ýt ph¶i dÞch chuyÓn. Th«ng thêng c¸c bíc h cã ®é lín gi¶m dÇn vµ ë bíc cuèi cïng víi h=1 ta ®îc danh s¸ch ®· s¾p xong. Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt : ViÖc ph©n tÝch ®¸nh gi¸ thêi gian tÝnh to¸n cña Shellsort rÊt khã kh¨n vµ phô thuéc vµo viÖc chóng ta chän d·y c¸c bíc t¨ng h nh thÕ nµo. Theo thùc tÕ th× thêi gian thùc hiÖn gi¶i thuËt nµy cã bËc kho¶ng O(n1.5).
62
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
NhËn xÐt: Shell Sort hiÖu qu¶ h¬n selection sort, bubble sort, insertion sort nhng kÐm hiÖu qu¶ h¬n Quick sort vµ Heap sort.
b. Cµi dÆt thuËt to¸n Shell Sort S¾p xÕp chÌn víi bíc t¨ng h. Môc ®Ých s¾p xÕp chÌn bíc t¨ng h lµ ta s¾p xÕp tËp tin sao cho víi mäi d·y con Ai = (ai, ai+h, ai+2h,... ,ai+kh), i = 0,1,2,... lµ d·y ®· s¾p thø tù. B»ng c¸ch s¾p xÕp theo ®é dµi bíc h víi gi¸ trÞ h kh¸ lín, chóng ta cã thÓ di chuyÓn c¸c phÇn tö c¸ch xa trong m¶ng vµ v× vËy khi s¾p xÕp víi c¸c bíc h nhá h¬n th× Ýt ph¶i dÞch chuyÓn. Th«ng thêng c¸c bíc h cã ®é lín gi¶m dÇn vµ ë bíc cuèi cïng víi h=1 ta cã danh s¸ch ®îc s¾p. T¬ng tù víi s¾p xÕp chÌn ®¬n gi¶n, ë bíc ®Çu tiªn ta còng xem d·y gåm mét phÇn tö a[0] lµ d·y ®îc s¾p xÕp, sau ®ã b¾t ®Çu chÌn vµo d·y nµy c¸c phÇn tö kh¸c cña danh s¸ch. Tuy nhiªn ®iÓm kh¸c biÖt lµ ta kh«ng b¾t ®Çu tõ a[1] mµ b¾t ®Çu tõ a[i] víi i = h, h+1, h+2,... §Ó chÌn a[i], tríc tiªn ta dïng mét biÕn trung gian x ®Ó lu gi¸ trÞ nµy vµ dïng vÞ trÝ i kÐo dÇn c¸c phÇn tö c¸ch i mét kho¶ng k*h vµ lín h¬n x dÞch sang ph¶i h vÞ trÝ , cho ®Õn khi gÆp vÞ trÝ j ®Çu tiªn nhá h¬n hoÆc b»ng x. Sau ®ã x (tøc lµ a[i] lóc ®Çu) sÏ ®îc chÌn vµo sau vÞ trÝ j nµy.
void insertsort(float a[],int N, int h=1) {int i,j;int x; for(i=h;i0 && x=a[j-h] do do gia tri j dung la vi tri can chen x */ a[j]=x; } //end of for(i=h;istep[1]>...>step[stepnum]. Trong ch¬ng tr×nh 41SapXep.CPP th× m¶ng nµy ®îc khai b¸o lµ: int step[3] = {5,3,1};
void shellsort(float a[],int N,int step[],int stepnum) {int s,i,j,h;int x; for(s=0;s<stepnum;s++) {h=step[s]; insertsort(a,N,h); } };
63
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
4.2.5. S¾p xÕp nhanh (Quick Sort) a. M« t¶ thuËt to¸n ThuËt to¸n Quicksort ®îc ph¸t minh bëi A.R.Hoare vµo n¨m 1960 vµ sau ®ã ®· ®îc nhiÒu ngêi nghiªn cøu ph¸t triÓn. §©y lµ ph¬ng ph¸p rÊt hiÖu qu¶ vµ th«ng dông, thêi gian ch¹y trung b×nh kho¶ng nlogn, trêng hîp xÊu nhÊt cÇn O(n2) thao t¸c. C¸ch thùc hiÖn ph¬ng ph¸p nµy nh sau:
Chän mét nót bÊt kú trong danh s¸ch lµm nót trôc (pivot node), th«ng
thêng lµ nót ®Çu tiªn. Ta sÏ thùc hiÖn mét sè thao t¸c ®Ó chuyÓn nót trôc ®Õn vÞ trÝ thÝch hîp trong d·y (gäi lµ vÞ trÝ pivot) sao cho c¸c phÇn tö bªn tr¸i nót trôc ®Òu ≤ nót trôc, c¸c nót bªn ph¶i ®Òu > nót trôc. Ta cã thÓ thùc hiÖn ®iÒu nµy b»ng c¸ch nh sau: (1) Gi¶ sö low lµ vÞ trÝ ®Çu danh s¸ch, up lµ vÞ trÝ cuèi danh s¸ch. Ta chän a[low] lµm nót trôc, tøc lµ pivotval = a[low]. (2) QuÐt tõ low lªn: con trá i xuÊt ph¸t tõ vÞ trÝ low t¨ng dÇn vÒ phÝa up, dõng l¹i khi gÆp nót ®Çu tiªn > pivotval, ghi nhËn vÞ trÝ nµy. (3) QuÐt tõ up xuèng: con trá j xuÊt ph¸t tõ vÞ trÝ up gi¶m dÇn vÒ phÝa low, dõng l¹i khi gÆp nót ®Çu tiªn ≤ pivotval, ghi nhËn vÞ trÝ nµy. (4) NÕu i<j th× ®æi gi¸ trÞ 2 nót t¹i 2 vÞ trÝ i vµ j. Sau khi ®æi xong ta cã a[i]<=pivotval vµ a[j]>pivotval, chuyÓn sang bíc (5). NÕu i>j th× chuyÓn sang bíc (6) (i kh«ng thÓ b»ng j, v× i t¬ng øng víi nót ≤ nót trôc, cßn j t¬ng øng víi nót > nót trôc. (5) Cho i ch¹y tiÕp vÒ phÝa up, vµ j ch¹y tiÕp vÒ phÝa low, tøc lµ thùc hiÖn c¸c bíc (2), (3), (4) víi c¸c vÞ trÝ xuÊt ph¸t lµ i vµ j. (6) Ta dõng l¹i khi i>j. Lóc nµy cã thÓ thÊy r»ng c¸c nót tõ vÞ trÝ j trë vÒ tríc ®Òu ≤ pivotval, cßn c¸c nót phÝa ph¶i j , tøc lµ c¸c nót tõ j+1 vÒ phÝa sau ®Òu > pivotval. (7) Ta trao ®æi gi¸ trÞ 2 nót a[low] vµ a[j] ®Ó chuyÓn nót trôc ®Õn ®óng vÞ trÝ trong d·y.
Sau bíc ®Çu tiªn danh s¸ch ®îc chia lµm 2 phÇn, trong ®ã nót trôc ®· ë ®óng vÞ trÝ. Ta tiÕp tôc ph©n ho¹ch 2 danh s¸ch con gåm c¸c phÇn tö tõ vÞ trÝ 0 ®Õn pivot-1 vµ tõ pivot+1 ®Õn up. Cø tiÕp tôc ph©n ho¹ch cho ®Õn khi danh s¸ch con chØ gåm 2 nót, ta ®æi chç nÕu cÇn thiÕt. Lóc nµy ta cã danh s¸ch ®· s¾p xÕp.
NhËn xÐt: Theo c¸ch m« t¶ trªn gi¶i thuËt Quicksort cã tÝnh ®Ö quy. Do ®ã ngêi ta thêng cµi ®Æt Quicksort b»ng ®Ö quy hoÆc b»ng stack. Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt : Tæng sè lÇn so s¸nh: Víi Quicksort, trêng hîp tèt nhÊt lµ nót trôc lóc nµo còng ë gi÷a danh s¸ch. Gi¶ sö sè nót lµ 2m (m = lgn), ta cã Víi 20 = 1 danh s¸ch ban ®Çu cÇn 2m lÇn so s¸nh trong mçi
64
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
danh s¸ch con. Víi 21 = 2 danh s¸ch tiÕp theo cÇn danh s¸ch con. ... Víi 2m-1 = n/2 danh s¸ch cuèi cïng cÇn 2 s¸ch con.
2m-1
lÇn so s¸nh trong mçi
lÇn so s¸nh trong mçi danh
VËy tæng sè lÇn so s¸nh lµ: 20 . 2m + 21 . 2m-1 + ... 2m-1 . 2 = 2m (m-1) ~ nlog2n Tæng sè lÇn ®æi chç lu«n nhá h¬n tæng sè lÇn so s¸nh, vËy thuËt to¸n Quicksort cã ®é phøc t¹p tÝnh to¸n lµ nlog 2n trong trêng hîp tèt nhÊt. Trêng hîp xÊu nhÊt lµ nót trôc khi nµo còng ë ®Çu hay cuèi danh s¸ch, thÝ dô trêng hîp danh s¸ch ®· ®îc s¾p xÕp. Lóc nµy ta cã: Víi danh s¸ch ban ®Çu cÇn n-1 lÇn so s¸nh. Víi danh s¸ch con tiÕp theo cÇn n-1 lÇn so s¸nh. ... Víi danh s¸ch cuèi cïng cÇn 1 lÇn so s¸nh. Tæng sè lÇn so s¸nh lµ: (n-1)+(n-2)+...+2+1 = n(n-1)/2 = O(n2) NhËn xÐt: Quicksort phøc t¹p nhng hiÖu qu¶ h¬n c¸c thuËt to¸n võa nªu trªn. Quicksort thÝch hîp cho danh s¸ch ban ®Çu cha cã thø tù. Quicksort kÐm hiÖu qu¶ khi danh s¸ch ban ®Çu gÇn cã thø tù. §Æc biÖt trêng hîp xÊu nhÊt l¹i lµ trêng hîp danh s¸ch ®· ®îc s¾p thø tù.
b. Cµi dÆt thuËt to¸n Quick Sort Thñ tôc partition Thñ tôc partition lµ h¹t nh©n cña thuËt to¸n s¾p xÕp ®Ö quy quick sort. Tham sè vµo cña thñ tôc lµ 2 biÕn nguyªn low vµ up chØ vÞ trÝ ®Çu vµ vÞ trÝ cuèi cña ®o¹n d÷ liÖu cÇn ph©n ho¹ch. PhÇn ra cña thñ tôc lµ biÕn pivot chØ vÞ trÝ chia danh s¸ch thµnh 2 phÇn: c¸c nót cã néi dung nhá h¬n hoÆc b»ng a[pivot] n»m bªn tr¸i pivot, c¸c nót cã néi dung lín h¬n a[pivot] n»m bªn ph¶i pivot. Nh vËy th× a[pivot] ®· n»m ®óng vÞ trÝ cña nã trong danh s¸ch. Thùc hiÖn tiÕp viÖc ph©n ho¹ch víi 2 danh s¸ch con ta cã thªm 2 phÇn tö n÷a n»m ®óng vÞ trÝ. Cø nh vËy t¹i bíc i ta cã ®îc 20 + 21 + ... + 2i = 2i+1 -1 phÇn tö ®îc ®Æt ®óng chç. Nh vËy trong kho¶ng log2n bíc ta cã ®îc danh s¸ch ®· s¾p xÕp. VÊn ®Ò lµ ë chç t¹i mçi bíc ta chän nót trôc nh thÕ nµo? DÜ nhiªn nót trôc ph¶i lµ hµm cña hai biÕn low vµ up. §Ó ®¬n gi¶n ta chän nót trôc pivotval = a[low]. VÞ trÝ nµy nãi chung cha ph¶i vÞ trÝ ®óng cña nót trôc. Ta cÇn t×m mét vÞ trÝ thÝch hîp tõ low ®Õn up ®Ó chuyÓn nót trôc ®Õn ®ã. Ta sÏ dïng 2 con trá lµ 2 biÕn nguyªn i vµ j ; i quÐt tõ low vÒ phÝa up, cßn j quÐt tõ phÝa up vÒ phÝa low. i sÏ bá qua c¸c vÞ trÝ mµ a[i] ≤ pivotval vµ dõng l¹i khi gÆp gi¸ trÞ a[i] > pivotval. Ngîc l¹i j sÏ bá qua c¸c vÞ trÝ mµ a[j] > pivotval vµ dõng l¹i khi gÆp gi¸ trÞ a[j] ≤ pivotval. Gi¶ sö i < j. VÞ trÝ mµ ta ®ang cÇn x¸c ®Þnh cho pivot sÏ n»m trong kho¶ng [i,j], vµ ®Ó cã ®îc a[i] ≤ pivotval cßn a[j] > pivotval th× ta ph¶i ®æi gi¸ trÞ t¹i 2 vÞ trÝ nµy cho nhau. Sau khi ®æi chç 2 phÇn tö sai chç, con trá i ®i tiÕp vÒ
65
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
phÝa up, j ®i tiÕp vÒ phÝa low. Cho ®Õn khi nµo ta cã j ≤ i th× dõng l¹i. T¹i ®©y ta kh«ng ph¶i ®æi gi¸ trÞ t¹i 2 vÞ trÝ, v× ta ®· cã a[j] ≤ pivotval < a[i]. Ta thÊy t¹i c¸c vÞ trÝ r ≥ j ta lu«n cã pivotval < a[r], do ®ã j chÝnh lµ vÞ trÝ cÇn ®Æt pivotval ®Ó b¶o ®¶m yªu cÇu ®Æt ra. Do ®ã ta chuyÓn a[j] vÒ vÞ trÝ low, cßn a[low] th× chuyÓn vÒ vÞ trÝ j, vµ j còng chÝnh lµ gi¸ trÞ pivot ®ang cÇn t×m. VÝ dô, gi¶ sö d·y A ban ®Çu lµ: a0 a1 a2 a3 a4 3 7 2 1 6 Ta chän gi¸ trÞ pivotval = a[0] = 3. Cho low = 0, up = 4. Cho i xuÊt ph¸t tõ low, dÞch chuyÓn qua ph¶i, ®i qua c¸c vÞ trÝ mµ a[i] ≤ pivotval vµ dõng l¹i vÞ trÝ ®Çu tiªn mµ ®iÒu nµy kh«ng ®óng, tøc lµ a[i] > pivotval. VÞ trÝ nµy chÝnh lµ a[1]=7. TiÕp theo, cho j xuÊt ph¸t tõ up, dÞch chuyÓn qua tr¸i, ®i qua c¸c vÞ trÝ mµ a[j] > pivotval vµ dõng l¹i vÞ trÝ ®Çu tiªn mµ ®iÒu nµy kh«ng ®óng, tøc lµ a[i] ≤ pivotva. VÞ trÝ nµy chÝnh lµ a[3]=1. Ta ®æi chç hai vÞ trÝ cho nhau vµ ®îc kÕt qu¶ nh h×nh sau: a0 a1 a2 a3 a4 3 7 2 1 6 3 1 2 7 6 v× i<j nªn ta l¹i dÞch chuyÓn tiÕp: i sang ph¶i cßn j sang tr¸i vµ ®îc kÕt qu¶ lµ: i dõng l¹i ë vÞ trÝ a[3], cßn j dõng l¹i ë vÞ trÝ a[2]. Ta thÊy r»ng vÞ trÝ pivot chÝnh lµ 2. a0 a1 a2 a3 a4 3 1 2 7 6 B©y giê ta ®æi chç a[low] víi a[pivot], tøc lµ a[0] víi a[2] vµ ®îc: a0 a1 a2 a3 a4 2 1 3 7 6 Nh vËy a[pivot] ®· ®øng ë vÞ trÝ ®óng trong d·y, nghÜa lµ a[2] ®· nhËn gi¸ trÞ thÝch hîp vµ kh«ng cÇn thay ®æi sau nµy. C«ng viÖc tiÕp theo lµ ph¶i s¾p xÕp hai d·y con n»m bªn tr¸i vµ bªn ph¶i vÞ trÝ nµy. void partition(float a[],int low,int up,int& pivot) {int pivotval=a[low];//Chon nut dau lam truc int i=low; int j=up; while(i<j) //Bat dau quet {while(a[i]<=pivotval && ipivotval while(a[j]>pivotval) j--; //a[j]<=pivotval if(i<j) swap(a[i],a[j]); //Doi cho cap nut sai vi tri }; swap(a[low],a[j]);pivot=j; } Thñ tôc ®Ö quy quicksort Sö dông thñ tôc partition ta cã thÓ dÔ dµng ®i tíi thñ tôc ®Ö quy s¾p xÕp nhanh sau ®©y:
void quicksort(float a[],int low,int up) {int pivot;
66
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
if(low>=up) return; partition(a,low,up,pivot); quicksort(a,low,pivot-1); quicksort(a,pivot+1,up); }
4.2.6. S¾p xÕp kiÓu xÕp chång (Heap sort) Trong insertion sort hay shell sort chóng ta ®· dÞch chuyÓn c¸c phÇn tö ®Õn c¸c vÞ trÝ tuyÕn tÝnh, tøc lµ c¸c vÞ trÝ c¸ch ®Òu. Cã thÓ xem Heap sort mµ chóng t«i sÏ giíi thiÖu sau ®©y còng lµ mét d¹ng c¶i tiÕn cña shell sort, nhng ë ®©y chóng ta dÞch chuyÓn c¸c phÇn tö kh«ng theo mét trËt tù tuyÕn tÝnh mµ theo mét cÊu tróc phi tuyÕn lµ c©y nhÞ ph©n.
a. CÊu tróc heap Heap lµ c©y nhÞ ph©n gÇn ®Çy (almost complete binary tree) ®îc cµi ®Æt b»ng m¶ng mét chiÒu víi nót gèc cã khãa lín nhÊt, vµ tÊt c¶ c¸c c©y con trong heap còng lµ heap. Heap nµy ®îc gäi lµ heap gi¶m, ta cã thÓ ®Þnh nghÜa heap t¨ng b»ng c¸ch t¬ng tù. 0 1 3
30
26
22
4
24
2 20
5
15
H×nh 4.1. CÊu tróc mét heap Ta cã thÓ ®¸nh sè c¸c nót trªn heap theo tõng møc vµ theo thø tù tõ tr¸i qua ph¶i nh h×nh 4.1. 0 30
1 26
2 24
3 22
4 20
5 15
H×nh 4.2. Dïng m¶ng ®Ó cµi ®Æt heap Heap cã thÓ cµi ®Æt b»ng m¶ng mét chiÒu, nót thø k trong c¸ch ®¸nh sè trªn ®©y sÏ ®îc lu ë phÇn tö k cña m¶ng. Gäi f lµ nót cha cña nót s, ta cã mèi liªn hÖ sau: f = (s-1)/2
trong ®ã phÐp chia ë ®©y ®îc hiÓu lµ phÐp chia sè nguyªn trong ng«n ng÷ C, tøc lµ chØ lÊy phÇn nguyªn, thÝ dô 1 = (31)/2 = (4-1)/2 Con tr¸i sl = 2f+1, con ph¶i sr = 2f+2 = sl +1.
b. S¾p xÕp b»ng heap ý tëng cña ph¬ng ph¸p nµy lµ biÕn ®æi m¶ng A= (a 0, a1,..., an-1) sao cho m¶ng A lµ cµi ®Æt cña heap cã c¸c nót theo thø tù a0, a1,..., an-1. Sau khi t¹o ®îc heap cã n nót ta sÏ lÇn lît chuyÓn nót gèc vÒ cuèi vµ chØnh l¹i heap. §Õn khi heap chØ cßn mét nót th× qu¸ tr×nh s¾p xÕp
67
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
hoµn tÊt vµ m¶ng A ®· ®îc s¾p xÕp. Cô thÓ h¬n ta thùc hiÖn c¸c bíc nh sau: BiÕn ®æi m¶ng A ®Ó t¹o cÊu tróc heap: §Çu tiªn ta xem heap chØ cã mét phÇn tö a0. Ta lÇn lît chÌn c¸c phÇn tö a1,..., an-1 vµo heap, sao cho cÊu tróc cña heap lu«n ®îc b¶o toµn. Gi¶ sö heap ®· cã k nót a1,..., ak-1, ta cÇn chÌn thªm nót ak . C¸ch thùc hiÖn rÊt gièng víi c¸ch chÌn trong insertion sort hoÆc shell sort, nghÜa lµ tríc hÕt ta lu l¹i gi¸ trÞ ak b»ng lÖnh x = ak, råi dïng vÞ trÝ cña ak lµm ®iÓm xuÊt ph¸t ®Ó dÞch chuyÓn c¸c nót theo c¸ch nót con = nót cha, cho ®Õn vÞ trÝ cã thÓ chÌn nót víi néi dung x. LÇn lît chuyÓn nót gèc vÒ cuèi m¶ng vµ chØnh l¹i heap: Bíc 1, ®Æt k = n-1: Heap cã k+1 nót lµ a0, a1,..., ak. Chóng ta sÏ xãa khái heap phÇn tö a0 , sao cho cÊu tróc heap vÉn ®îc b¶o toµn. Heap b©y giê chØ cßn k nót, vµ v× vËy vÞ trÝ ak kh«ng sö dông. Chóng ta sÏ lu tr÷ néi dung nót a0 cña heap ban ®Çu (gåm k+1 nót) vµo vÞ trÝ nµy. ak b©y giê trë thµnh phÇn tö lín nhÊt trong m¶ng. Bíc 2, ®Æt k = n-2: Heap cã k nót lµ a0, a1,..., ak-1. Chóng ta thùc hiÖn t¬ng tù nh bíc 1. Heap cã k-1 nót, ak-1 ≤ ak trë thµnh 2 phÇn tö lín nhÊt trong m¶ng . ... Bíc n-2, ®Æt k = 2: Heap cã 2 nót lµ a0, a1. Chóng ta thùc hiÖn t¬ng tù nh bíc 1. Heap chØ cßn l¹i mét nót vµ ta cã a0 ≤ a1 ≤ a2 ≤ ... ≤ ak vµ d·y ®· ®îc s¾p xÕp. Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt : V× heap lµ c©y nhÞ ph©n gÇn ®Çy, do ®ã chiÒu cao cña heap lµ log2(n+1)-1. Tõ ®©y cã thÓ tÝnh ®îc thêi gian thùc hiÖn gi¶i thuËt heap sort trong trêng hîp xÊu nhÊt lµ O(nlog2n). Heap sort lµ mét trong nh÷ng gi¶i thuËt s¾p xÕp trong hiÖu qu¶ nhÊt. øng dông cÊu tróc heap ®Ó cµi ®Æt hµng ®îi cã ®é u tiªn: Trong nhiÒu øng dông thùc tÕ, nhÊt lµ trong khoa häc m¸y tÝnh, c¸c mÉu tin cã khãa thêng ®îc xö lý theo thø tù, nhng kh«ng nhÊt thiÕt theo thø tù ®îc s¾p hoµn chØnh. Th«ng thêng c¸c mÉu tin ®îc tËp hîp l¹i råi xö lý mÉu tin cã khãa lín nhÊt, l¹i tËp trung nhiÒu mÉu tin vµ xö lý mÉu tin cã khãa lín nhÊt kÕ tiÕp vµ cø tiÕp tôc nh vËy. Trong ch¬ng 2 chóng ta ®· nghiªn cøu c¸ch cµi ®Æt hµng ®îi cã ®é u tiªn b»ng m¶ng cã s¾p thø tù, trong ®ã ph¬ng ph¸p ®îc dïng lµ ph¬ng ph¸p chÌn ®¬n gi¶n. Râ rµng chóng ta chØ cÇn quan t©m ®Õn viÖc lÊy ra phÇn tö cã khãa lín nhÊt (hoÆc bÐ nhÊt), chø kh«ng quan t©m ®Õn viÖc danh s¸ch ®îc s¾p thø tù hay kh«ng. CÊu tróc heap tá ra lµ cµi ®Æt cã hiÖu qu¶ h¬n cho hµng ®îi cã ®é u tiªn. Thao t¸c chÌn phÇn tö bÊt kú vµ lÊy ra phÇn tö lín nhÊt cã ®é phøc t¹p kho¶ng O(logn). B¹n ®äc cã thÓ viÕt ch¬ng tr×nh cµi ®Æt hµng ®îi cã ®é u tiªn b»ng heap, víi mét sè thao t¸c c¬ b¶n.
68
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
c. Cµi dÆt thuËt to¸n Heap Sort Qu¸ tr×nh s¾p xÕp ®îc thùc hiÖn qua 2 phÇn mµ b¹n ®äc cã thÓ nhËn biÕt ®îc tõ ch¬ng tr×nh: PhÇn 1: ChuyÓn danh s¸ch thµnh heap. Ban ®Çu ta xem heap chØ cã mét nót a[0], sau ®ã ta lÇn lît chÌn c¸c nót a[1], a[2],..., a[count1] vµo heap. V× heap lµ c©y nhÞ ph©n gÇn ®Çy, nªn khi thªm nót thø a[k] vµo mét heap cã k nót a[0], a[1], ..., a[k-1], th× nót a[k] sÏ lµ nót cuèi cïng trong c©y nÕu ta duyÖt c©y theo møc. Tuy nhiªn ta cÇn trao ®æi néi dung cña nót a[k] víi mét nót nµo ®ã trong c©y ®Ó cÊu tróc heap ®îc b¶o toµn. C¸c bíc thùc hiÖn còng gièng nh ph¬ng ph¸p chÌn, nghÜa lµ ®Çu tiªn ta còng dïng mét biÕn x trung gian ®Ó lu l¹i gi¸ trÞ cña a[k], sau ®ã dïng vÞ trÝ a[k] ®Ó dån mét sè phÇn tö tõ phÝa tríc ra phÝa sau, cho ®Õn khi t×m ®îc vÞ trÝ thÝch hîp chÌn x. §iÒu kh¸c biÖt cña ph¬ng ph¸p dïng heap lµ sù dÞch chuyÓn c¸c phÇn tö kh«ng theo mét trËt tù tuyÕn tÝnh nh ph¬ng ph¸p chÌn ®¬n gi¶n hoÆc chÌn bíc t¨ng h, mµ theo mét quan hÖ cha con trªn cÊu tróc c©y. Quan hÖ ®ã lµ f = (s-1)/2, trong ®ã f lµ vÞ trÝ nót cha, cßn s lµ vÞ trÝ nót con. Sù thay thÕ lµ: chõng nµo néi dung trong nót cha cßn nhá h¬n x th× nót cha sÏ ®îc kÐo lªn vÞ trÝ nót con. Khi qu¸ tr×nh dõng l¹i th× ta ®îc vÞ trÝ cÇn chÌn x. PhÇn 2: ChuyÓn dÇn c¸c nót gèc cña heap vÒ cuèi danh s¸ch ®Ó cã ®îc danh s¸ch ®· s¾p xÕp. §Æt k = count-1, ta cã ban ®Çu heap cã c¸c nót lµ a[0], a[1], a[2],..., a[k], trong ®ã a[0] lµ nót gèc, a[k] lµ nót cuèi cïng. V× a[0] lµ gi¸ trÞ lín nhÊt trong d·y, nªn vÞ trÝ ®óng cña nã sau khi s¾p xÕp ph¶i ë cuèi danh s¸ch, tøc lµ vÞ trÝ k. Do ®ã ta sÏ chuyÓn a[0] vÒ vÞ trÝ a[k], cßn c¸c nót a[1], a[2],..., a[k] sÏ chØnh thµnh heap míi lµ a[0], a[1],..., a[k-1]. §Ó lµm ®iÒu nµy, tríc hÕt ta dïng mét biÕn trung gian x ®Ó lu tr÷ gi¸ trÞ a[k], råi chuyÓn a[0] vÒ vÞ trÝ a[k], sau ®ã ta t×m c¸ch chÌn x vµo heap ®óng vµo vÞ trÝ cÇn thiÕt. C¸ch dÞch chuyÓn c¸c phÇn tö trong heap ®Ó cã chç trèng chÌn x ngîc l¹i víi c¸ch dÞch chuyÓn c¸c phÇn tö khi t¹o heap. Khi t¹o heap ta xuÊt ph¸t tõ vÞ trÝ k, b¾t ®Çu kÐo c¸c phÇn tö tõ vÞ trÝ cha vÒ vÞ trÝ con; cßn khi lÊy c¸c nót tõ heap ®Ó t¹o danh s¸ch th× ta l¹i xuÊt ph¸t tõ gèc vµ kÐo nót con vÒ phÝa cha. Nh vËy nót cha sÏ ®îc thay thÕ b»ng max cña 3 gi¸ trÞ: x, nót con tr¸i hoÆc nót con ph¶i. ViÖc thay thÕ kÕt thóc khi mµ x ®îc chän ®Ó thay thÕ nót cha cßn trèng. Thùc hiÖn chuyÓn c¸c nót cña heap vÒ cuèi danh s¸ch cho ®Õn khi heap chØ cßn mét nót th× nót ®ã còng lµ nót nhá nhÊt danh s¸ch, kh«ng cÇn dÞch chuyÓn n÷a vµ qu¸ tr×nh s¾p xÕp kÕt thóc. void heapsort(float a[],int N) {/*Chuyen danh sach thanh HEAP bang cach xem khoi dau heap gom nut a[0], sau do lan luot chuyen cac nut a[1],a[2],..., a[N-1] vao heap*/ int i,s,f;int x; for(i=1;i
69
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
{x=a[i];//Nut can them vao HEAP, ban dau heap co mot nut a[0]. /*Insert x vao vi tri thich hop cua HEAP: xuat phat tu i, di dan ve goc de tim mot vi tri nut cha thich hop. Vay f se giam dan*/ s=i; //s la nut con, hien tai tren heap chua co a[i] //f=(s-1)/2 la nut cha while(s>0 && x>a[(s-1)/2]) {a[s]=a[(s-1)/2]; //Keo nut < x xuong 1 muc s=(s-1)/2; }; a[s]=x; //Dien nut x vao vi tri phu hop }; //end of for(int i=1;i0;i--) {x=a[i];a[i]=a[0]; /*O buoc i heap co i+1 nut, la a[0], a[1],...,a[i] Muc dich cua chung ta la dua nut a[0] ve vi tri a[i], dong thoi, chen a[i] vao heap sao cho cau truc heap van bao toan. De lam dieu nay ta bat dau tu nut f = 0, theo con duong cha - con trai hoac phai, tim mot vi tri de chen nut a[i]. De co duoc nut trong de chen a[i], ta can dich cac nut tren duong di len mot muc, bang cong thuc nutgoc=max(contrai,conphai,a[i])*/ f=0; //f la nut cha, s la nut con lon hon s=2*f+1; //Gan s la nut con ben trai if(s+10;i--) };
4.2.7. S¾p xÕp trén (Merge sort) a. M« t¶ thuËt to¸n ý tëng cña ph¬ng ph¸p nµy lµ chia danh s¸ch thµnh nhiÒu danh s¸ch con, trén tõng 2 danh s¸ch mét thµnh mét danh s¸ch. TiÕp tôc nh vËy cho ®Õn khi chØ cßn 2 danh s¸ch con, ta trén tiÕp 2 danh s¸ch nµy thµnh danh s¸ch ®Çy ®ñ ®îc s¾p xÕp. Cô thÓ ta chia lµm c¸c bíc trén nh sau: Bíc 1:
Xem danh s¸ch n nót lµ n danh s¸ch 1 nót ®· s¾p thø tù. Trén tõng cÆp 2 danh s¸ch liªn tiÕp nhau ta ®îc n/2 danh s¸ch con cã thø tù ( n/2 ®îc hiÓu lµ phÐp chia nguyªn trong ng«n ng÷ C, nh vËy nÕu n lÎ th× cã 1 danh s¸ch cuèi cïng cha ®îc trén)
70
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
Bíc 2:
Xem danh s¸ch gåm n/2 danh s¸ch con. Trén tõng cÆp 2 danh s¸ch kÒ nhau nh ë bíc 1, ta nhËn ®îc n/4 danh s¸ch con.
... Bíc cuèi: Khi chØ cßn 2 danh s¸ch, ta thùc hiÖn trén vµ thu ®îc danh s¸ch ®Çy ®ñ ®îc s¾p xÕp. Ph©n tÝch thêi gian thùc hiÖn gi¶i thuËt : Sè bíc trén O(log2n), mçi bíc trén cÇn Ýt h¬n n lÇn so s¸nh. VËy thêi gian thùc hiÖn gi¶i thuËt merge sort cã bËc lµ O(nlogn). NhËn xÐt: Merge sort kh«ng tèi u bé nhí v× ph¶i dïng danh s¸ch t¹m. Merge sort cã thêi gian tÝnh to¸n cïng bËc víi heap sort, tøc lµ nhanh h¬n Quicksort, shell sort vµ c¸c ph¬ng ph¸p kh¸c mµ chóng ta võa kh¶o s¸t. Merge rÊt thÝch hîp cho viÖc s¾p xÕp c¸c khèi d÷ liÖu lín ë bé nhí ngoµi.
b. Cµi dÆt thuËt to¸n Merge Sort PhÇn chÝnh cña t¸c vô nµy lµ trén 2 danh s¸ch ®· s¾p xÕp [low1,up1] vµ [low2,up2] trong ®ã low2 = up1 +1, hai danh s¸ch nµy lµ 2 danh s¸ch con liªn tiÕp trªn danh s¸ch a. Khi trén xong ta cã danh s¸ch con ®· s¾p xÕp [low1,up2] trªn danh s¸ch t¹m Listtmp (Xem h×nh 4.3). Danh s¸ch cÇn s¾p xÕp a Danh s¸ch Danh s¸ch 1 2 Danh s¸ch t¹m Listtmp Ds trén tõ ds 1vµ ds 2 H×nh 4.3. Trén 2 danh s¸ch con C¸ch trén 2 danh s¸ch con ®îc thùc hiÖn nh sau: Ta dïng 3 con trá i,j,k ®Ó dÞch chuyÓn trong c¸c danh s¸ch. i quÐt tõ low1 ®Õn up1, j quÐt tõ low2 ®Õn up2, cßn k th× quÐt tõ low1 ®Õn up2. Tuy nhiªn gi¸ trÞ cña k chØ cÇn khëi ®Çu b»ng 0 tríc khi trén 2 danh s¸ch con ®Çu tiªn, sau ®ã sù dÞch chuyÓn cña k phô thuéc vµo sù dÞch chuyÓn cña i vµ j, mçi lÇn i hoÆc j t¨ng lªn 1 th× k còng t¨ng lªn 1. Trong qu¸ tr×nh i vµ j dÞch chuyÓn ta so s¸nh 2 gi¸ trÞ a[i] vµ a[j] vµ chän sè bÐ h¬n ®Ó ®a sang danh s¸ch Listtmp. NÕu i ®îc chän th× i t¨ng lªn 1, cßn nÕu j ®îc chän th× j t¨ng lªn 1. Ta dÔ thÊy r»ng nãi chung i vµ j kh«ng ®Õn ®Ých cïng mét lóc. Do ®ã khi mét trong 2 con trá i hoÆc j ®Õn ®Ých th× ta chuyÓn toµn bé phÇn cßn l¹i trong d·y con kia ®a sang Listtmp mµ kh«ng cÇn so s¸nh g× c¶. Trén tõng cÆp 2 danh s¸ch con ®Ó t¹o d·y Listtmp ®Çy ®ñ: B¾t ®Çu tõ ®Çu danh s¸ch, ta lÇn lît trén tõng 2 danh s¸ch con liªn tiÕp nhau ®Ó ®a sang danh s¸ch t¹m Listtmp. Trong trêng hîp sè danh s¸ch con lµ lÎ th× cuèi cïng sÏ cßn l¹i mét danh s¸ch cha trén. Danh s¸ch
71
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
nµy t¬ng øng víi [low1,up1], lóc nµy ta chuyÓn toµn bé danh s¸ch con nµy sang Listtmp. Sau ®ã ta copy Listtmp sang a ®Ó b¾t ®Çu mét ®ît trén míi víi cì cña c¸c danh s¸ch con ®îc t¨ng gÊp ®«i. Thùc hiÖn thao t¸c trén ®Ó cã ®îc danh s¸ch ®· s¾p xÕp: Ban ®Çu danh s¸ch cha s¾p xÕp, v× vËy ®Ó cã c¸c danh s¸ch con ®îc s¾p xÕp ta ph¶i xem c¸c danh s¸ch con chØ cã 1 phÇn tö, tøc lµ ta ®Æt size = 1. Ta sÏ thùc hiÖn mét vßng lÆp while víi ®iÒu kiÖn dõng lµ size ≥ count. T¹i mçi bíc lÆp, c¨n cø vµo size ta sÏ thiÕt lËp c¸c danh s¸ch con cã size phÇn tö, sau ®ã tiÕn hµnh trén tõng cÆp mét ®Ó t¹o nªn mét danh s¸ch mµ trong ®ã b¾t ®Çu tõ a[0], ta cã c¸c danh s¸ch con cã 2*size phÇn tö ®· ®îc s¾p xÕp. ë vßng lÆp tiÕp theo ta ®Æt size = 2*size , vµ cø nh vËy. Cuèi cïng ta ®îc danh s¸ch ®îc s¾p xÕp. void mergesort(float a[],int N) {int i,j,k,low1,up1,low2,up2;//Can duoi va tren cua 2 ds con int size; int *Listtmp=new int[N]; size=1;//Buoc tron 1: gan size bang 1 while(size
/*Cho i quet tu low1 den up1, j quet tu low2 den up2. Voi moi i va so sanh va chon phan tu nho hon chuyen sang danh sach tam.*/ for(i=low1,j=low2;i<=up1 && j<=up2;k++) if(a[i]<=a[j]) Listtmp[k]=a[i++]; else Listtmp[k]=a[j++];; /*Vi so phan tu duoc chon tu 2 ds khong nhu nhau nen co the i
hoac j se den dich truoc. Trong truong hop nay ta chuyen phan con lai cua day chua quet xong sang ds tam*/ for(; i <= up1; k++) Listtmp[k] = a[i++]; for(; j <= up2; k++) Listtmp[k] = a[j++]; low1 = up2+1; } //while(low1+size
}
/*Neu so ds con la so le thi khi tron tung cap se con lai ds cuoi cung. Ta phai chuyen danh sach nay sang ds tam*/ for(i = low1; k < N; i++) Listtmp[k++] = a[i]; for(i = 0; i < N; i++) a[i] = Listtmp[i]; size *= 2;//Tang co cua danh sach con len 2 lan. }//end of while(size
72
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
4.2.8. S¾p xÕp theo chØ sè Trong mét sè øng dông, c¸c nót ai thêng chøa rÊt nhiÒu th«ng tin, do ®ã viÖc dÞch chuyÓn c¸c nót sÏ tèn nhiÒu thêi gian, vµ trong mét sè trêng hîp cßn tèn c¶ bé nhí, thÝ dô trêng hîp merge sort ch¼ng h¹n, ta ph¶i dïng mét danh s¸ch t¹m trong qu¸ tr×nh s¾p xÕp. Râ rµng gi¸ trÞ cña nót ai hoµn toµn ®îc x¸c ®Þnh th«ng qua chØ sè i cña nã. Tõ ®©y chóng ta cã thÓ thÊy r»ng viÖc s¾p xÕp kh«ng nhÊt thiÕt ph¶i tiÕn hµnh trùc tiÕp trªn c¸c nót mµ ta cã thÓ biÕn ®æi d·y chØ sè sao cho tõ d·y ban ®Çu (0,1,2...,n-1) ta sÏ biÕn ®æi thµnh d·y (i0, i1, ... , in-1 ) ®Ó d·y c¸c nót t¬ng øng trë thµnh ®îc s¾p xÕp. Sau ®©y lµ ch¬ng tr×nh cµi ®Æt theo ý tëng ®ã (B¹n ®äc cã thÓ tù t×m hiÓu thuËt to¸n, vÒ b¶n chÊt c¸c thuËt to¸n còng hoµn toµn t¬ng tù nh trêng hîp dÞch chuyÓn c¸c phÇn tö. §iÒu kh¸c biÖt lµ thay v× dÞch chuyÓn hay thay ®æi néi dung c¸c nót, ta chØ cÇn thay ®æi c¸c chØ sè mµ th«i. 4.3. T×m kiÕm
C¸c thuËt to¸n t×m kiÕm cã rÊt nhiÒu. ë ®©y chóng t«i chØ gií thiÖu hai thuËt to¸n t×m kiÕm trªn m¶ng thêng sö dông lµ t×m kiÕm tuyÕn tÝnh vµ t×m kiÕm nhÞ ph©n. Ch¬ng tr×nh cµi ®Æt hai thuËt to¸n nµy ®îc lu trong tÖp 42TKIEM.CPP.
4.3.1. T×m kiÕm tuyÕn tÝnh vÞ trÝ cã néi dung x T¸c vô lsearch thùc hiÖn viÖc t×m kiÕm tuÇn tù tõ ®Çu danh s¸ch cho ®Õn khi b¾t gÆp phÇn tö cã néi dung x cÇn t×m. NÕu t×m thÊy th× t¸c vô tr¶ vÒ vÞ trÝ t×m thÊy Ngîc l¹i, gi¸ trÞ tr¶ vÒ gi¸ trÞ -1. Thao t¸c t×m kÝem ®îc thùc hiÖn theo mét tr×nh tù tuyÕn tÝnh. x ®îc lÇn lît so s¸nh víi c¸c phÇn tö trong danh s¸ch, b¾t ®Çu tõ phÇn tö ®Çu tiªn a[0]. NÕu trong qu¸ tr×nh so s¸nh cã phÇn tö trïng víi x th× tr¶ vÒ vÞ trÝ t×m thÊy vµ kÕt thóc. Trêng hîp xÊu nhÊt lµ trong danh s¸ch kh«ng cã phÇn tö nµo cã gi¸ trÞ b»ng x. Khi ®ã ta ph¶i duyÖt qua toµn bé danh s¸ch. int lsearch(float a[],int N,float x) {int i; for(i=0;i
4.3.2. T×m kiÕm nhÞ ph©n vÞ trÝ cã néi dung x T¸c vô bsearch thùc hiÖn viÖc t×m kiÕm nhÞ ph©n. §iÒu kiÖn ®Ó thùc hiÖn ph¬ng ph¸p nµy lµ danh s¸ch ®· ®îc s¾p xÕp. C¸ch thùc hiÖn ph¬ng ph¸p nµy nh sau: ®Çu tiªn ta ®Æt biÕn bottom b»ng 0, lµ vÞ trÝ phÇn tö ®Çu tiªn cña danh s¸ch, biÕn top b»ng N-1, lµ vÞ trÝ phÇn tö cuèi cïng cña danh s¸ch, vµ biÕn mid = (bottom+top)/2 lµ vÞ trÝ phÇn tö ë gi÷a. NÕu néi dung cña nót mid b»ng x th× vÞ trÝ mid chÝnh lµ vÞ trÝ cÇn t×m vµ qu¸ tr×nh t×m kiÕm kÕt thóc. NÕu x
73
CÊu tróc d÷ liÖu vµ gi¶i thuËt - Ch¬ng 4. S¾p xÕp vµ t×m kiÕmÞ
hµnh t×m kiÕm nhÞ ph©n néi dung x ë ®o¹n [bottom,mid-1]; ngîc l¹i ta thùc hiÖn t×m kiÕm nhÞ ph©n trªn ®o¹n [mid+1,top]. Cø nh vËy cho ®Õn khi t×m thÊy x hoÆc kh«ng t×m thÊy. Trong ch¬ngtr×nh sau thay v× ký hiÖu c¸c biÕn lµ bottom, top vµ mid, chóngt«i chØ ký hiÖu lµ i, j k. int bsearch(float a[],int N,float x) {//Kiem tra xem danh sach da sap xep chua if(!sorted(a,N)) {cout<<"Danh sach chua sap xep";return false;} int i,j,k; i=0,j=N-1; while(i<=j) {k=(i+j)/2; if(a[k]==x) return(k); if(x
74
C©u hái vµ bµi tËp Ghi chó. Trong phÇn nµy sÏ cã rÊt nhiÒu c©u hái yªu cÇu m« t¶ thuËt to¸n vµ viÕt ch¬ng tr×nh. C¸c b¹n cã thÓ sö dông mét trong nh÷ng ph¬ng ph¸p ®· biÕt ®Ó m« t¶ thuËt to¸n, vÝ dô nh: ng«n ng÷ tù nhiªn, m· gi¶, lu ®å hay ng«n ng÷ lËp tr×nh. Ng«n ng÷ lËp tr×nh ®îc yªu cÇu ë ®©y lµ C hoÆc C++. Nh vËy "yªu cÇu viÕt c¸c dßng lÖnh" ®îc hiÓu lµ "viÕt c¸c dßng lÖnh b»ng C hoÆc C++". NÕu c©u hái gåm c¶ hai phÇn lµ m« t¶ thuËt to¸n vµ viÕt ch¬ng tr×nh th× cã nghÜa lµ tríc hÕt ph¶i m« t¶ thuËt to¸n b»ng ng«n ng÷ tù nhiªn, sau ®ã lµ viÕt ch¬ng tr×nh. Khi m« t¶ thuËt to¸n ngêi ta thêng tr×nh bµy thµnh c¸c bíc cã ®¸nh sè (vÝ dô B0, B1,...) mét c¸ch chÆt chÏ. Tuy nhiªn còng cã trêng hîp c¸ch tr×nh bµy nµy lµm cho thuËt to¸n khã hiÓu. NÕu viÖc m« t¶ thuËt to¸n theo c¸ch nãi tù nhiªn dÔ hiÓu h¬n th× c¸c b¹n cã thÓ sö dông (®©y lµ c¸ch mµ mét sè tµi liÖu nh cuèn s¸ch "CÈm nang thuËt to¸n" thêng sö dông). Trong tµi liÖu nµy rÊt nhiÒu thuËt to¸n ®¬n gi¶n ®îc tr×nh bµy theo c¸ch nµy. VÝ dô khi m« t¶ thuËt to¸n s¾p xÕp b»ng lùa chän ta cã thÓ tr×nh bµy nh sau: Víi mçi i (i=0,1,2,..., n-2) ta t×m phÇn tö a[k] bÐ nhÊt trong d·y con (a[i], a[i+1],...,a[n1]) råi ®æi chç cho a[i] nÕu i≠k. §Ó lµm ®iÒu nµy ta dïng biÕn min ®Ó ghi nhËn gi¸ trÞ bÐ nhÊt. Ban ®Çu min ®îc ®Æt b»ng a[i], sau ®ã ta dïng mét biÕn j ®Ó duyÖt qua c¸c phÇn tö cßn l¹i trong danh s¸ch con, khëi ®Çu j=i+1 vµ kÕt thóc khi j=n-1. Mçi lÇn nhËn thÊy a[j]<min th× ta l¹i ®Æt min=a[j] vµ k=j. Nh thÕ khi j ®i ®Õn cuèi d·y th× ta cã min lµ gi¸ trÞ bÐ nhÊt vµ gi¸ trÞ bÐ nhÊt ®ã lµ a[k]. NÕu k ≠ i th× a[k] vµ a[i] ®îc ®æi chç cho nhau. Nh vËy a[i] ®· ë ®óng vÞ trÝ cña nã trong d·y cÇn s¾p xÕp. Khi i=n-2 th× d·y con chØ cßn mét phÇn tö duy nhÊt lµ a[n-1] vµ kh«ng cÇn ph¶i lùa chän n÷a.
NÕu cã ch¬ng tr×nh kÌm theo th× thuËt to¸n cã thÓ m« t¶ rÊt ng¾n, cèt nãi lªn ®îc b¶n chÊt vÊn ®Ò. Sau ®ã phÇn chi tiÕt sÏ ®îc thÓ hiÖn b»ng c¸ch gi¶i thÝch nh÷ng dßng lÖnh chÝnh. VÝ dô nÕu c©u hái lµ: m« t¶ thuËt to¸n s¾p xÕp b»ng lùa chän vµ viÕt ch¬ng tr×nh cµi ®Æt thuËt to¸n nµy th× cã thÓ lµm nh sau: M« t¶ thuËt to¸n:
§Çu vµo: M¶ng c¸c sè thùc a[], biÕn nguyªn N lµ cì cña m¶ng. Thêng m¶ng a cha ®îc s¾p xÕp. §Çu ra: M¶ng a[] ®· ®îc s¾p xÕp t¨ng dÇn. C¸ch thùchiÖn: Víi mçi i (i=0,1,2,...,N-2) t×m a[k] lµ phÇn tö bÐ nhÊt trong d·y con (a[i], a[i+1], ..., a[N-1] råi ®æi chç a[k] víi a[i] nÕu k ≠ i. Cµi ®Æt ch¬ng tr×nh: void selectsort(float a[],int N) {int i,j,k; float min; for(i=0;i
CÊu tróc d÷ liÖu vµ gi¶i thuËt - C©u hái vµ bµi tËp trÝ j+1 (lÖnh for(j=i+1;j
Trong trêng hîp b¹n kh«ng tr×nh bµy ®îc thuËt to¸n, kh«ng viÕt ®îc ch¬ng tr×nh hoÆc viÕt ®îc ch¬ng tr×nh nhng kh«ng biÕt c¸ch gi¶i thÝch, th× b¹n cßn mét gi¶i ph¸p lµ gi¶i thÝch thuËt to¸n th«ng qua vÝ dô cô thÓ (tÊt nhiªn lµ b¹n sÏ kh«ng nhËn ®îc sè ®iÓm tèi ®a v× b¹n kh«ng thùc hiÖn ®óng yªu cÇu bµi ra). VÝ dô víi ph¬ng ph¸p s¾p xÕp b»ng lùa chän b¹n cã thÓ ®a ra m« t¶ ng¾n gän råi minh häa b»ng vÝ dô nh sau: M« t¶ thuËt to¸n: Víi mçi i (i = 0,1,2,...,n-2) ta sÏ chän trong d·y khãa a i, ai+1,..., an-1 khãa nhá nhÊt ak, råi ®æi chç cho ai (dÜ nhiªn lµ cã thÓ ai chÝnh lµ khãa nhá nhÊt vµ t¹i bíc nµy kh«ng cÇn ®æi chç). VÝ dô, gi¶ sö d·y A ban ®Çu lµ: a0 a1 a2 a3 a4 a5 14 2 1 13 12 11 C¸c bíc víi i=0, 1, 2 ®îc thùc hiÖn nh sau: a0 a1 a2 a3 i=0 14 2 1 13 1 2 14 13
a4 12 12
a5 11 11
i=1
1 1
2 2
14 14
13 13
12 12
11 11
i=2
1 1
2 2
14 11
13 13
12 12
11 14
Tãm l¹i, ®iÒu quan träng nhÊt lµ b¹n ph¶i hiÓu ®îc vÊn ®Ò, sau ®ã nÕu tr×nh bµy ®îc theo chuÈn mùc lµ tèt nhÊt, nÕu kh«ng, b¹n cã thÓ tr×nh bµy theo c¸ch mµ b¹n hiÓu.
Ch¬ng 1. ThuËt to¸n vµ thuËt gi¶i (Ch¬ng nµy kh«ng cã trong ®Ò c¬ng «n tËp nhng cÇn hiÓu ®Ó ¸p dông cho c¸c phÇn sau)
1. Nªu ®Þnh nghÜa vµ c¸c ®Æc trng cña thuËt to¸n. H·y nªu mét vÝ dô vÒ thuËt to¸n vµ nãi râ c¸c ®Æc trng cña thuËt to¸n ®ã thÓ hiÖn nh thÕ nµo. 2. Nªu c¸c ph¬ng ph¸p biÓu diÔn thuËt to¸n vµ ph©n tÝch nh÷ng ®iÓm m¹nh, ®iÓm yÕu cña tõng ph¬ng ph¸p. 3. Gi¶i thÝch kh¸i niÖm ®é phøc t¹p tÝnh to¸n cña c¸c thuËt to¸n th«ng qua kh¸i niÖm ¤ lín (vÝ dô T(n) = O(g(n)) nghÜa lµ g×). Nªu quy t¾c c¸ch ®¸nh gi¸ mét biÓu thøc cã d¹ng tæng hoÆc tÝch qua viÖc ®¸nh gi¸ c¸c thµnh phÇn. ¸p dông ®Ó ®¸nh gi¸ biÓu thøc: T(n) = 7n2log(n!) + (n2 + 4)logn 4. Gi¶i thÝch t¹i sao nÕu T(n) = O(n) th× còng sÏ ®óng nÕu ta viÕt T(n) = O(n2 ). Tõ ®©y b¹n h·y nªu nh÷ng chó ý khi hiÓu vÒ ®é phøc t¹p tÝnh to¸n. 5. V× sao cÇn ph¶i më réng kh¸i niÖm thuËt to¸n? 6. Nªu mèi quan hÖ gi÷a thuËt gi¶i vµ cÊu tróc d÷ liÖu. 7. H·y nªu c¸c bíc cÇn thiÕt khi gi¶i quyÕt mét bµi to¸n b»ng m¸y tÝnh.
76
CÊu tróc d÷ liÖu vµ gi¶i thuËt - C©u hái vµ bµi tËp
Ch¬ng 2. Danh s¸ch (Xem c¸c ch¬ng tr×nh 22b-DSLK.CPP, 23-STACK,24-QUEUE.CPP)
1. Nªu ®Þnh nghÜa cÊu tróc danh s¸ch vµ mét sè c¸ch cµi ®Æt trªn m¸y tÝnh. 2. H·y m« t¶ (v¾n t¾t trong vµi ba c©u) cÊu tróc danh s¸ch liªn kÕt ®¬n (dslk®) ®îc cµi ®Æt trong bé nhí. 3. Gi¶ sö cÊu tróc c¸c nót trªn danh s¸ch ®îc khai b¸o b»ng lÖnh: struct node {float info; node* next;}; vµ lÖnh khai b¸o cÊu tróc danh s¸ch lµ: struct DanhSach {node *pfirst,*plast;}; Trong ®ã pfirst lµ con trá chØ ®Õn phÇn tö (nót) ®Çu tiªn, plast chØ ®Õn nót cuèi cïng trong danh s¸ch. H·y m« t¶ vµ cµi ®Æt c¸c thao t¸c sau ®©y trªn dslk®: - Khëi t¹o - Thªm mét nót cã khãa x - Hñy nót cã khãa x - S¾p xÕp dslk®. 4. Nªu ®Þnh nghÜa cÊu tróc ng¨n xÕp (Stack), mét vµi øng dông vµ mét sè c¸ch cµi ®Æt trªn m¸y tÝnh. 5. H·y m« t¶ (v¾n t¾t trong vµi ba c©u) cÊu tróc Stack ®îc cµi ®Æt b»ng danh s¸ch liªn kÕt ®¬n (dslk®) trong bé nhí. 6. Gi¶ sö cÊu tróc c¸c nót trªn Stack ®îc khai b¸o b»ng lÖnh: struct node {int info; node* next;}; vµ lÖnh khai b¸o cÊu tróc Stack lµ: struct NganXep {node *phead;}; Trong ®ã phead lµ con trá chØ ®Õn phÇn tö (nót) ®Çu tiªn trong danh s¸ch vµ còng ®îc quy íc lµ phÇn tö n»m ë ®Ønh Stack. H·y m« t¶ vµ cµi ®Æt c¸c thao t¸c sau ®©y trªn Stack: - Khëi t¹o - Thªm mét nót cã khãa x vµo ®Ønh Stack (thñ tôc push). - LÊy khãa x (vµ hñy nót chøa nã) tõ ®Ønh Stack. - Thö l¹i Stack b»ng c¸ch dïng Stack ®Ó chuyÓn ®æi mét sè nguyªn thËp ph©n sang d¹ng nhÞ ph©n. 7. Nªu ®Þnh nghÜa cÊu tróc hµng ®îi (Queue), mét vµi øng dông vµ mét sè c¸ch cµi ®Æt trªn m¸y tÝnh. 8. H·y m« t¶ (v¾n t¾t trong vµi ba c©u) cÊu tróc Queue ®îc cµi ®Æt b»ng danh s¸ch liªn kÕt ®¬n (dslk®) trong bé nhí. 9. Gi¶ sö cÊu tróc c¸c nót trªn Queue ®îc khai b¸o b»ng lÖnh: struct node {int info; node* next;}; vµ lÖnh khai b¸o cÊu tróc Queue lµ: struct HangDoi {node *pfirst, *plast;}; Trong ®ã pfirst lµ con trá chØ ®Õn phÇn tö (nót) ®Çu tiªn, plast chØ ®Õn nót cuèi cïng trong Queue. PhÇn tö ®îc lÊy ra khái Queue lu«n lµ phÇn tö ®Çu tiªn, cßn phÇn tö míi ®îc ®a vµo cuèi Queue. H·y m« t¶ vµ cµi ®Æt c¸c thao t¸c sau ®©y trªn Queue: - Khëi t¹o - Thªm mét nót cã khãa x vµo cuèi Queue (thñ tôc put). - LÊy khãa x (vµ hñy nót chøa nã) tõ Queue. - Thö l¹i Queue b»ng c¸ch dïng Queue ®Ó chuyÓn ®æi mét sè thËp ph©n chØ cã phÇn lÎ sang d¹ng nhÞ ph©n.
77
CÊu tróc d÷ liÖu vµ gi¶i thuËt - C©u hái vµ bµi tËp
Ch¬ng 3. C©y nhÞ ph©n (C¸c c©u hái tõ 1-8 c¸c b¹n lµm ®Ó hiÓu râ lý thuyÕt, kh«ng n»m trong ®Ò c¬ng «n thi tèt nghiÖp. C¸c b¹n chó ý h¬n tõ c©u sè 9. Xem ch¬ng tr×nh 31-CAYTK.CPP).
1. Nªu ®Þnh nghÜa c©y nhÞ ph©n vµ c¸c kh¸i niÖm nót gèc, nót cha, nót l¸,bËc cña nót, cña c©y, møc cña c©y,... ChØ râ nh÷ng kh¸i niÖm ®ã trªn c©y nhÞ ph©n sau ®©y b»ng c¸ch tr¶ lêi nh÷ng c©u hái sau: A
Nót nµo lµ nót gèc? C¸c nót nµo lµ nót nh¸nh? Cha cña nót G lµ nót nµo? D Møc cña nót F lµ bao nhiªu? BËc cña nót F lµ bao nhiªu? C©y cã chiÒu cao lµ bao nhiªu?
B
C E
F H
G I
J
H×nh 1. C©y nhÞ ph©n 2. H·y viÕt d·y c¸c nót ®îc th¨m khi duyÖt c©y nµy theo Thø tù tríc Thø tù gi÷a Thø tù sau. DuyÖt theo bÒ réng. V× sao ngêi ta nãi duyÖt c©y theo thø tù tríc lµ duyÖt theo ®é s©u? (thùc ra nãi lµ theo ®é cao th× chÝnh x¸c h¬n) 4. B¹n h·y thö nªu mét vµi lý do khi ngêi ta x©y dùng cÊu tróc c©y nhÞ ph©n. 5. B¹n h·y nªu mét sè d¹ng ®Æc biÖt cña c©y nhÞ ph©n: c©y nhÞ ph©n ®Çy ®ñ, c©y nhÞ ph©n gÇn ®Çy ®ñ, c©y nhÞ ph©n ®óng, c©y nhÞ ph©n t×m kiÕm, c©y nhÞ ph©n c©n b»ng chiÒu cao (c©y AVL). B¹n h·y vÏ h×nh biÓu diÔn c¸c lo¹i c©y nhÞ ph©n ®ã vµ nãi râ mèi quan hÖ gi÷a chóng, thÝ dô c©y nµo lµ trêng hîp riªng cña c©y kh¸c...C©y nhÞ ph©n ë h×nh 1 cã thuéc lo¹i nµo võa kÓ trªn kh«ng? 6. Cã thÓ thÊy r»ng c©y nhÞ ph©n ®Çy ®ñ lµ cÊu tróc tèt nhÊt trong c¸c cÊu tróc c©y nhÞ ph©n, nhng trong thùc tÕ lo¹i c©y nµy l¹i Ýt ®îc sö dông, v× sao? 7. Chøng minh r»ng sè nót trªn møc r cña c©y nhÞ ph©n ®Çy ®ñ lµ 2r , tõ ®©y suy ra r»ng c©y nhÞ ph©n ®Çy ®ñ chiÒu cao d cã tæng sè nót lµ 2d+1 - 1. Vµ tõ ®©y ta suy ra r»ng nÕu tæng sè nót trªn c©y lµ n th× ®é cao cña c©y ®îc tÝnh theo c«ng thøc d = log2(n+1)-1. 8. H·y ch¹y thö ch¬ng tr×nh cµi ®Æt c©y nhÞ ph©n b»ng ph¬ng ph¸p liªn kÕt trong tµi liÖu ®Ó hiÓu râ c¸c t¸c vô. Tù viÕt l¹i c¸c thñ tôc quan träng (cã thÓ gièng hoÆc kh«ng gièng c¸c thñ tôc trong tµi liÖu) thÝ dô duyÖt c©y theo ph¬ng ph¸p ®Ö quy hoÆc kh«ng ®Ö quy ®Ó n¾m ch¾c bµi h¬n. ============================================ ======================= 9. Nªu ®Þnh nghÜa cÊu tróc c©y nhÞ ph©n, mét vµi øng dông vµ mét sè c¸ch cµi ®Æt trªn m¸y tÝnh. V× sao ph¬ng ph¸p cµi ®Æt sö dông con trá ®Ó liªn kÕt c¸c nót tá ra tiÖn lîi h¬n ph¬ng ph¸p dïng m¶ng? 10. H·y m« t¶ (v¾n t¾t trong vµi ba c©u) cÊu tróc c©y nhÞ ph©n ®îc cµi ®Æt b»ng ph¬ng ph¸p liªn kÕt (dïng con trá) trong bé nhí.
78
CÊu tróc d÷ liÖu vµ gi¶i thuËt - C©u hái vµ bµi tËp
11. Gi¶ sö cÊu tróc c¸c nót trªn c©y nhÞ ph©n ®îc khai b¸o b»ng lÖnh: struct node {int info; node* left, *right;}; Khi ®ã mét c©y nhÞ ph©n ®îc x¸c ®Þnh bëi mét biÕn con trá proot chØ ®Õn nót gèc. H·y m« t¶ vµ cµi ®Æt c¸c thao t¸c sau ®©y trªn c©y nhÞ ph©n cã nót gèc proot: - Khëi t¹o c©y - DuyÖt c©y theo thø tù tríc. - DuyÖt c©y theo thø tù gi÷a. - DuyÖt c©y theo thø tù sau. 12. Nªu ®Þnh nghÜa cÊu tróc c©y nhÞ ph©n t×m kiÕm, mét vµi øng dông vµ cho vÝ dô. 13. M« t¶ vµ cµi ®Æt thao t¸c t×m mét nót cã khãa x trªn c©y nhÞ ph©n t×m kiÕm. 14. M« t¶ vµ cµi ®Æt thao t¸c thªm mét nót cã khãa x trªn c©y nhÞ ph©n t×m kiÕm. 15. M« t¶ thuËt to¸n xãa khãa x trªn c©y nhÞ ph©n t×m kiÕm. 16. Cho d·y c¸c khãa 15, 6, 7, 21, 25,42. H·y m« t¶ qu¸ tr×nh x©y dùng c©y nhÞ ph©n t×m kiÕm b»ng c¸ch lÇn lît chÌn c¸c khãa trªn ®©y vµo c©y vµ biÓu diÔn b»ng h×nh vÏ. Sau khi c©y ®îc x©y dùng, h·y m« t¶ c¸c thao t¸c lÇn lît xãa c¸c khãa 21 vµ 25. 17. Nªu ®Þnh nghÜa c©y c©n b»ng chiÒu cao (c©y AVL). 18. Cho d·y c¸c khãa lµ c¸c sè thùc nh sau: 5 13 9 7 6 4 8 11 H·y t¹o vµ vÏ c©y AVL b»ng c¸ch lÇn lît chÌn c¸c khãa trªn vµo c©y 19. H·y lËp luËn ®Ó ®a ra íc lîng cña c©y AVL cao nhÊt chøa n khãa , tõ ®ã suy ra ®¸nh gi¸ vÒ thêi gian t×m kiÕm c¸c khãa trªn c©y AVL cã n khãa.
Ch¬ng 4. S¾p xÕp vµ t×m kiÕm 1.
2.
H·y m« t¶, cµi ®Æt vµ ®¸nh gi¸ ®é phøc t¹p tÝnh to¸n c¸c thuËt to¸n s¾p xÕp néi m¶ng mét chiÒu sau ®©y: lùa chän (Selection Sort), chÌn (insertion Sort), næi bät (Bubble Sort), Quick Sort vµ Shell Sort. (Xem ch¬ng tr×nh 41SapXep.CPP). H·y m« t¶, cµi ®Æt vµ ®¸nh gi¸ ®é phøc t¹p tÝnh to¸n c¸c thuËt to¸n t×m kiÕm khãa x trªn m¶ng mét chiÒu trong bé nhí. (Xem ch¬ng tr×nh 42-TKIEM.CPP).
79
Tµi liÖu tham kh¶o
1. Alistair Mc Monnies & W. Stewart Mc. Sporran, Gi¸o tr×nh cÊu tróc d÷ liÖu b»ng ng«n ng÷ C, Nhµ xuÊt b¶n thèng kª, 1999 2. Donald E.Knuth, The Art of Computer Programming - Volume 1, Volume 3, Addison - Wesley Longman, Inc. Second printing, May 1998. 3. §inh M¹nh Têng, CÊu tróc d÷ liÖu vµ gi¶i thuËt, NXB KH&KT, 2000 4. §ç Xu©n L«i, CÊu tróc d÷ liÖu vµ Gi¶i thuËt, NXB KH&KT, 1998 5. §ç §øc Gi¸o, C¬ së to¸n trong lËp tr×nh, NXB KH&KT, 1998 6. Hoµng KiÕm, Gi¶i mét bµi to¸n trªn m¸y tÝnh nh thÕ nµo, tËp mét, NXB GD, 2000 7. Kenneth H. Rosen, To¸n häc rêi r¹c øng dông trong tin häc, NXB KH&KT, 2000 8. NguyÔn Hång Ch¬ng, CÊu tróc d÷ liÖu, øng dông vµ cµi ®Æt b»ng C, NXB TPHCM, 2000 9. NguyÔn Trung Trùc, CÊu tróc d÷ liÖu, §¹i häc B¸ch khoa TPHCM, 1997 10.NguyÔn Xu©n Huy, ThuËt to¸n, Nhµ xuÊt b¶n Thèng kª, 1988 11. 12.
Robert Sedgewick, CÈm nang thuËt to¸n, NXB KH&KT,1998 TrÇn H¹nh Nhi - D¬ng Anh §øc, Gi¸o tr×nh CÊu tróc d÷ liÖu vµ gi¶i thuËt, §¹i häc Quèc gia Hå ChÝ Minh, 2001.
C©u hái lý thuyÕt vµ thùc hµnh dµnh cho thi hÕt m«n I. PhÇn lý thuyÕt
1. H·y m« t¶ v¾n t¾t cÊu tróc Stack (ng¨n xÕp) vµ øng dông. H·y cho biÕt néi dung cña Stack sau mçi thao t¸c sau ®©y: EAS*Y**QUE***ST***I*ON Víi mçi ch÷ c¸i tîng trng cho thao t¸c thªm ch÷ c¸i t¬ng øng vµo Stack, dÊu * tîng trng cho thao t¸c lÊy néi dung mét phÇn tö trong Stack in lªn mµn h×nh. H·y cho biÕt sau khi hoµn tÊt chuçi thao t¸c, nh÷ng g× xuÊt hiÖn trªn mµn h×nh? 2. H·y m« t¶ v¾n t¾t cÊu tróc Queueu (hµng ®îi) vµ øng dông. H·y cho biÕt néi dung cña Queue sau mçi thao t¸c sau ®©y: EAS*Y**QUE***ST***I*ON Víi mçi ch÷ c¸i tîng trng cho thao t¸c thªm ch÷ c¸i t¬ng øng vµo Queue, dÊu * tîng trng cho thao t¸c lÊy néi dung mét phÇn tö trong Queue in lªn mµn h×nh. H·y cho biÕt sau khi hoµn tÊt chuçi thao t¸c, nh÷ng g× xuÊt hiÖn trªn mµn h×nh? 3. B¹n h·y thö nªu mét vµi lý do khi ngêi ta x©y dùng cÊu tróc c©y nhÞ ph©n. 4. Cho c©y nhÞ ph©n sau: A B
C D
G
E H
F I
H·y m« t¶ v¾n t¾t c¸c phÐp duyÖt c©y nhÞ ph©n theo: Thø tù tríc, Thø tù gi÷a, Thø tù sau vµ theo bÒ réng. råi viÕt d·y c¸c nót ®îc th¨m khi duyÖt c©y nµy theo tõng c¸ch duyÖt nãi trªn, trong ®ã gi¶i thÝch viÖc lùa chän 3 nót nµo ®ã (tuú b¹n lùa chän). 5. Th«ng tin vÒ b¹n ®äc ë th viÖn gåm (Tªn, Sè thÎ). Cho mét danh s¸ch nh sau: (A,25), (B,30), (C,26), (D, 20), (E,23), (F,29), (G,15), (H,35), (I,19), (J,44), (K,17). a. H·y khai b¸o cÊu tróc d÷ liÖu (d¹ng con trá) cña c©y nhÞ ph©n t×m kiÕm chøa danh s¸ch b¹n ®äc nãi trªn (b»ng ng«n ng÷ C). H·y gi¶i thÝch ý nghÜa cña khai b¸o mµ b¹n ®a ra. b. H·y vÏ (trªn giÊy) tõng bíc c©y nhÞ ph©n t×m kiÕm sau khi lÇn lît chÌn tõng b¹n ®äc trong danh s¸ch trªn vµo c©y víi khãa lµ Sè thÎ, trong ®ã t¹i mçi nót cña c©y ph¶i thÓ hiÖn ®Çy ®ñ Tªn vµ Sè thÎ. c. H·y m« t¶ thao t¸c xãa b¹n ®äc cã m· sè 20 vµ vÏ l¹i c©y sau khi
CÊu tróc d÷ liÖu vµ gi¶i thuËt - C©u hái vµ bµi tËp
xãa. 6. H·y m« t¶ vµ ®¸nh gi¸ ®é phøc t¹p tÝnh to¸n c¸c thuËt to¸n s¾p xÕp néi (m¶ng mét chiÒu) sau ®©y: lùa chän (Selection Sort), ®æi chç trùc tiÕp, chÌn (insertion Sort), næi bät (Bubble Sort), vµ trén (merge sort), sau ®ã minh häa b»ng c¸ch s¾p xÕp m¶ng ®îc cho díi ®©y: 5, 13, 9, 7, 6, 4, 8, 11 II. PhÇn thùc hµnh
PhÇn thùc hµnh dù kiÕn ®îc ph©n thµnh 3 møc: trung b×nh (A), lµ møc b¾t buéc, kh¸ (B) vµ giái (C) nh sau:
C¸c bµi tËp lo¹i A: •
HiÓu ®îc c¸c ch¬ng tr×nh mÉu sau: 21a-DSKE.CPP (cµi ®Æt danh s¸ch b»ng m¶ng) 22a-DSLK.CPP (cµi ®Æt danh s¸ch b»ng ph¬ng ph¸p liªn kÕt ®¬n) 23-STACK.CPP (cµi ®Æt stack b»ng ph¬ng ph¸p liªn kÕt ®¬n) 24-QUEUE.CPP (cµi ®Æt queue b»ng ph¬ng ph¸p liªn kÕt ®¬n) 41SAPXEP.CPP (cµi ®Æt c¸c ph¬ng ph¸p s¾p xÕp, cÇn hiÓu c¸c ph¬ng ph¸p lùa chän, chÌn vµ næi bät) • N¾m ch¾c ®îc mét ch¬ng tr×nh trong sè c¸c ch¬ng tr×nh trªn ®Ó cã thÓ viÕt l¹i ®îc mét sè hµm. Ghi chó. - Sinh viªn cã thÓ tù viÕt ch¬ng tr×nh kh¸c víi ch¬ng tr×nh mÉu. - Ch¬ng tr×nh 21a-DSKE.CPP cã thÓ thay b»ng ch¬ng tr×nh 21a1DSKE.CPP, 21b-DSKE.CPP hoÆc 21b1DSKE.CPP. - Ch¬ng tr×nh 22a-DSLK.CPP cã thÓ thay b»ng ch¬ng tr×nh 22a1DSLK.CPP, 22b-DSLK.CPP hoÆc 22b1DSLK.CPP
C¸c bµi tËp lo¹i B: 1. Th«ng tin vÒ mét mÆt hµng trong mét cöa hµng bao gåm: (M· hµng, Tªn hµng, §¬n gi¸), trong ®ã M· hµng lµ kiÓu chuçi cã ®é dµi 10, Tªn hµng lµ kiÓu chuçi cã ®é dµi 20, cßn §¬n gi¸ cã kiÓu sè thùc. H·y dïng cÊu tróc d÷ liÖu d¹ng con trá cña danh s¸ch liªn kÕt ®¬n cµi ®Æt b»ng ng«n ng÷ C ®Ó chøa danh s¸ch c¸c mÆt hµng nãi trªn víi c¸c thao t¸c nh trong ch¬ng tr×nh mÉu 22a-DSLK.CPP. Khãa ®Ó t×m kiÕm vµ s¾p xÕp lµ m· hµng. Ngoµi ra sinh viªn cã thÓ bæ sung thªm mét sè chøc n¨ng nh s¾p xÕp theo ®¬n gi¸, in danh s¸ch theo mét sè ®iÒu kiÖn nµo ®ã...nghÜa lµ c¸c chøc n¨ng mµ thùc tÕ yªu cÇu. 2. C¸c yªu cÇu t¬ng tù nh c©u 1, nhng víi c¬ së d÷ liÖu thùc tÕ lµ c¸c cuèn s¸ch trong th viÖn víi c¸c th«ng tin (M· s¸ch, Tªn s¸ch, Sè lîng). 3. C¸c yªu cÇu t¬ng tù nh c©u 1, nhng víi c¬ së d÷ liÖu thùc tÕ lµ c¸c nh©n viªn cña c¬ quan víi c¸c th«ng tin (M· nh©n viªn, Hä tªn, L¬ng). 4. C¸c yªu cÇu t¬ng tù nh c©u 1, nhng víi c¬ së d÷ liÖu thùc tÕ lµ c¸c b¹n ®äc trong th viÖn víi c¸c th«ng tin (Sè thÎ, Hä tªn, N¨m sinh).
C¸c bµi tËp lo¹i C: 82
CÊu tróc d÷ liÖu vµ gi¶i thuËt - C©u hái vµ bµi tËp
PhÇn c¬ së d÷ liÖu t¬ng tù nh lo¹i B, nhng ph¬ng ph¸p cµi ®Æt lµ dïng c©y nhÞ ph©n t×m kiÕm (xem ch¬ng tr×nh mÉu 31CAYTK.CPP).
83