Cau Truc Du Lieu Va Giai Thuat1

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Cau Truc Du Lieu Va Giai Thuat1 as PDF for free.

More details

  • Words: 40,568
  • Pages: 89
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

Related Documents