ch¬ng idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. do...

203
1 GIíI THIÖU M¤N HäC Trong ng«n ng÷ lËp tr×nh, d÷ liÖu bao gåm hai kiÓu chÝnh lµ : - KiÓu d÷ liÖu ®¬n gi¶n : char, int, long, float, enumeration, subrange. - KiÓu d÷ liÖu cã cÊu tróc : struct, array, file (kiÓu d÷ liÖu cã kÝch thíc kh«ng ®æi)... Gi¸o tr×nh nµy tËp trung vµo viÖc nghiªn cøu c¸c kiÓu d÷ liÖu cã cÊu tróc cã kÝch thíc kh«ng ®æi hoÆc thay ®æi trong ng«n ng÷ lËp tr×nh, m« t¶ th«ng qua ng«n ng÷ C. Ngoµi ra cßn giíi thiÖu c¸c gi¶i thuËt chung quanh c¸c cÊu tróc d÷ liÖu nµy nh c¸ch tæ chøc, thùc hiÖn c¸c phÐp to¸n t×m kiÕm, s¾p thø tù néi, s¾p thø tù ngo¹i... §iÒu kiÖn ®Ó cã thÓ t×m hiÓu râ rµng vÒ m«n häc nµy lµ häc viªn ®· biÕt c¸c kh¸i niÖm vÒ kü thuËt lËp tr×nh trªn ng«n ng÷ C. Trong phÇn më ®Çu, bµi gi¶ng nµy sÏ giíi thiÖu c¸ch thøc ph©n tÝch & thiÕt kÕ mét gi¶i thuËt tríc khi t×m hiÓu vÒ c¸c cÊu tróc d÷ liÖu cô thÓ. Vµo cuèi khãa häc, sinh viªn cã thÓ: - Ph©n tÝch ®é phøc t¹p cña c¸c ch¬ng tr×nh cã kÝch thíc nhá vµ trung b×nh. - NhËn thøc ®îc sù cÇn thiÕt cña viÖc thiÕt kÕ cÊu tróc d÷ liÖu. - Lµm quen víi c¸c kh¸i niÖm stacks, queues, danh s¸ch ®Æc, danh s¸ch liªn kÕt, c©y nhÞ ph©n, c©y nhÞ ph©n t×m kiÕm, .... - HiÓu ®îc nguyªn lý cña viÖc x©y dùng mét ch¬ng tr×nh m¸y tÝnh. - Cã thÓ chän lùa viÖc tæ chøc d÷ liÖu phï hîp vµ c¸c gi¶i thuËt xö lý d÷ liÖu cã hiÖu qu¶ trong khi x©y dùng ch¬ng tr×nh. Sinh viªn cÇn lu ý r»ng, tïy vµo c«ng viÖc cô thÓ mµ ta nªn chän cÊu tróc d÷ liÖu nµo lµ thÝch hîp theo híng tèi u vÒ thêi gian thùc hiÖn hay tèi u vÒ bé nhí.

Upload: others

Post on 12-Feb-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

1

GIíI THIÖU M¤N HäC

Trong ng«n ng÷ lËp tr×nh, d÷ liÖu bao gåm hai kiÓu chÝnh lµ :

- KiÓu d÷ liÖu ®¬n gi¶n : char, int, long, float, enumeration, subrange.

- KiÓu d÷ liÖu cã cÊu tróc : struct, array, file (kiÓu d÷ liÖu cã kÝch th­íc kh«ng ®æi)...

Gi¸o tr×nh nµy tËp trung vµo viÖc nghiªn cøu c¸c kiÓu d÷ liÖu cã cÊu tróc cã kÝch th­íc kh«ng ®æi hoÆc thay ®æi trong ng«n ng÷ lËp tr×nh, m« t¶ th«ng qua ng«n ng÷ C. Ngoµi ra cßn giíi thiÖu c¸c gi¶i thuËt chung quanh c¸c cÊu tróc d÷ liÖu nµy nh­ c¸ch tæ chøc, thùc hiÖn c¸c phÐp to¸n t×m kiÕm, s¾p thø tù néi, s¾p thø tù ngo¹i...

§iÒu kiÖn ®Ó cã thÓ t×m hiÓu râ rµng vÒ m«n häc nµy lµ häc viªn ®· biÕt c¸c kh¸i niÖm vÒ kü thuËt lËp tr×nh trªn ng«n ng÷ C. Trong phÇn më ®Çu, bµi gi¶ng nµy sÏ giíi thiÖu c¸ch thøc ph©n tÝch & thiÕt kÕ mét gi¶i thuËt tr­íc khi t×m hiÓu vÒ c¸c cÊu tróc d÷ liÖu cô thÓ.

Vµo cuèi khãa häc, sinh viªn cã thÓ:

- Ph©n tÝch ®é phøc t¹p cña c¸c ch­¬ng tr×nh cã kÝch th­íc nhá vµ trung b×nh.

- NhËn thøc ®­îc sù cÇn thiÕt cña viÖc thiÕt kÕ cÊu tróc d÷ liÖu.

- Lµm quen víi c¸c kh¸i niÖm stacks, queues, danh s¸ch ®Æc, danh s¸ch liªn kÕt, c©y nhÞ ph©n, c©y nhÞ ph©n t×m kiÕm, ....

- HiÓu ®­îc nguyªn lý cña viÖc x©y dùng mét ch­¬ng tr×nh m¸y tÝnh.

- Cã thÓ chän lùa viÖc tæ chøc d÷ liÖu phï hîp vµ c¸c gi¶i thuËt xö lý d÷ liÖu cã hiÖu qu¶ trong khi x©y dùng ch­¬ng tr×nh. Sinh viªn cÇn l­u ý r»ng, tïy vµo c«ng viÖc cô thÓ mµ ta nªn chän cÊu tróc d÷ liÖu nµo lµ thÝch hîp theo h­íng tèi ­u vÒ thêi gian thùc hiÖn hay tèi ­u vÒ bé nhí.

Page 2: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

2

Ch­¬ng I

PH¢N TÝCH & THIÕT KÕ

GI¶I THUËT

I. më ®Çu

HÇu hÕt c¸c bµi to¸n ®Òu cã nhiÒu gi¶i thuËt kh¸c nhau ®Ó gi¶i quyÕt chóng. VËy lµm thÕ nµo chän ®­îc mét gi¶i thuËt tèt nhÊt ?

ViÖc chän lùa phô thuéc vµo nhiÒu yÕu tè nh­ : §é phøc t¹p tÝnh to¸n cña gi¶i thuËt, chiÕm dung l­îng bé nhí, tÇn suÊt sö dông, tÝnh ®¬n gi¶n, tèc ®é thùc hiÖn...

Th«ng th­êng môc tiªu chän lùa lµ :

1. Gi¶i thuËt râ rµng, dÔ hiÓu, dÔ m· hãa vµ hiÖu chØnh.

2. Gi¶i thuËt sö dông cã hiÖu qu¶ tµi nguyªn cña m¸y tÝnh vµ ®Æc biÖt ch¹y cµng nhanh cµng tèt.

Do ®ã khi viÕt ch­¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu 1 lµ quan träng h¬n c¶.

Ng­îc l¹i khi viÕt ch­¬ng tr×nh ®Ó ch¹y nhiÒu lÇn th× phÝ tæn ch¹y ch­¬ng tr×nh cã thÓ v­ît qu¸ phÝ tæn lËp ch­¬ng tr×nh, nhÊt lµ khi ph¶i nhËp nhiÒu sè liÖu. Nãi chung, ng­êi lËp tr×nh ph¶i biÕt chän lùa, viÕt, ®¸nh gi¸ c¸c gi¶i thuËt ®Ó cã ®­îc gi¶i thuËt tèi ­u cho bµi to¸n cña m×nh.

II. ®¸nh gi¸ thêi gian ch¹y cña ch­¬ng tr×nh

Thêi gian ch¹y cña ch­ong tr×nh phô thuéc vµo :

1. Input cho ch­¬ng tr×nh

2. ChÊt l­îng m· sinh ra cña ch­¬ng tr×nh dÞch.

3. Tr¹ng th¸i vµ tèc ®é cña c¸c lÖnh ch¹y trªn m¸y.

4. §é phøc t¹p thêi gian cña gi¶i thuËt.

§iÒu 1 lµ chøc n¨ng nhËp. KÝch th­íc cña input (vÝ dô lµ n) vµ ta th­êng ký hiÖu T(n) lµ ®¹i l­îng thêi gian cÇn thiÕt ®Ó gi¶i bµi to¸n kÝch th­íc n.

§iÒu 2, 3 th­êng ®¸nh gi¸ khã kh¨n v× phô thuéc vµo phÇn mÒm ch­¬ng tr×nh dÞch vµ phÇn cøng cña m¸y.

§iÒu 4 lµ ®iÒu mµ ng­êi lËp tr×nh cÇn kh¶o s¸t ®Ó lµm t¨ng tèc ®é cña ch­¬ng tr×nh.

Page 3: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

3

III. ký hiÖu o(n) vµ (n) :

Ta ®¸nh gi¸ tû lÖ ph¸t triÓn c¸c hµm T(n) qua ký hiÖu O(n).

Ta nãi thêi gian ch¹y T(n) cña ch­¬ng tr×nh lµ O(n2) cã nghÜa lµ :

c > 0 vµ n0 sao cho n n0 ta cã T(n) c.n2.

VÝ dô : Gi¶ sö T(0) = 1, T(1) = 4, v v...

Tæng qu¸t T(n) = (n +1)2 th× ta nãi T(n) lµ O(n2) v× cã thÓ ®Æt c1 = 4, n0 = 1, th× khi n 1 ta cã (n +1)2 4n2.

Nh­ng kh«ng thÓ lÊy n0 = 0 v× T(0) = 1 kh«ng nhá h¬n c.02 = 0,c; gi¶ thiÕt r»ng n 0 vµ T(n) 0.

Ta nãi T(n) lµ O(f(n)) nÕu const c vµ n0 sao cho T(n) c.f(n), n n0.

Ch­¬ng tr×nh ch¹y víi thêi gian O(f(n)) ta nãi nã ph¸t triÓn tû lÖ víi f(n). Khi nãi T(n) lµ O(f(n)) th× f(n) lµ chÆn trªn cña T(n).

§Ó nãi chÆn d­íi cña T(n) ta dïng ký hiÖu .

Ta nãi T(n) lµ (g(n)) nÕu const c, n0 sao cho T(n) c.g(n), n n0.

VÝ dô : §Ó kiÓm tra T(n) = n3 + 2n2 lµ (n3) ta ®Æt c = 1 th× T(n) c.n3, n = 0, 1,... (no= 0).

* Sù tr¸i ng­îc cña tû lÖ ph¸t triÓn :

Ta gi¶ sö c¸c ch­¬ng tr×nh cã thÓ ®¸nh gi¸ b»ng c¸ch so s¸nh c¸c hµm thêi gian cña chóng víi c¸c h»ng tû lÖ kh«ng ®¸ng kÓ. Khi ®ã ta nãi ch­¬ng tr×nh cã thêi gian ch¹y O(n2). NÕu ch­¬ng tr×nh 1 ch¹y mÊt 100.n2 thêi gian (mili gi©y) th× ch­¬ng tr×nh 2 ch¹y mÊt 5.n3 thêi gian, th× ta cã tû sè thêi gian cña 2 ch­¬ng tr×nh lµ 5.n3/100.n2 = n/20, nghÜa lµ khi n = 20 th× thêi gian ch¹y 2 ch­¬ng tr×nh lµ b»ng nhau, khi n < 20 th× ch­¬ng tr×nh 2 ch¹y nhanh h¬n ch­¬ng tr×nh 1. Do ®ã khi n > 20 th× nªn dïng ch­¬ng tr×nh 1.

VÝ dô : Cã 4 ch­¬ng tr×nh cã 4 ®é phøc t¹p kh¸c nhau ®­îc biÓu diÔn trong b¶ng d­íi ®©y.

Thêi gian ch¹y T(n)

KÝch th­íc bµi to¸n tèi ®a cho 103s

KÝch th­íc bµi to¸n tèi ®a cho 104s

Tû lÖ t¨ng vÒ kÝch th­íc

100.n 10 100 10.0 lÇn 5.n2 14 45 3.2 lÇn n3/2 12 27 2.3 lÇn 2n 10 13 1.3 lÇn

Gi¶ sö trong 103s th× 4 ch­¬ng tr×nh gi¶i c¸c bµi to¸n cã kÝch th­íc tèi ®a trong cét 2. NÕu cã m¸y tèt tèc ®é t¨ng lªn 10 lÇn th× kÝch th­íc tèi ®a t­¬ng øng

Page 4: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

4

cña 4 ch­¬ng tr×nh tr×nh bµy ë cét 3. TØ lÖ hai cét 1,2 ghi ë cét 4. Nh­ vËy nÕu ®Çu t­ vÒ tèc ®é 10 lÇn th× chØ thu lîi cã 30% vÒ kÝch th­íc bµi to¸n nÕu dïng ch­¬ng tr×nh cã ®é phøc t¹p O(2n).

IV. c¸ch tÝnh thêi gian ch¹y ch­¬ng tr×nh :

1. Qui t¾c tæng:

Gi¶ sö T1(n) vµ T2(n) lµ thêi gian ch¹y ch­¬ng tr×nh P1 vµ P2 t­¬ng øng ®­îc ®¸nh gi¸ lµ O(f(n)) vµ O(g(n)). Khi ®ã T1(n) + T2(n) sÏ lµ O(max(f(n),g(n))) (ch¹y xong ch­¬ng tr×nh P1 th× ch¹y P2).

Chøng minh:

Theo ®Þnh nghÜa O(f(n)) vµ O(g(n)) th× c1, n1, c2, n2 sao cho

T1(n) c1.f(n) n n1 ; T2(n) c2.g(n) n n2.

§Æt n0 = max(n1, n2)

NÕu n no th× T1(n) + T2(n) (c1 + c2).max(f(n),g(n)).

2. Qui t¾c tÝch:

T1(n). T2(n) lµ O(f(n).g(n)).

Chøng minh : t­¬ng tù nh­ tæng.

VÝ dô : Cã 3 ch­¬ng tr×nh cã thêi gian ch¹y t­¬ng øng lµ O(n2), O(n3), O(n.logn). ThÕ th× thêi gian ch¹y 3 ch­¬ng tr×nh ®ång thêi lµ O(max(n2, n3, nlogn)) sÏ lµ O(n3).

Nãi chung thêi gian ch¹y mét d·y cè ®Þnh c¸c b­íc lµ thêi gian ch¹y lín nhÊt cña mét b­íc nµo ®ã trong d·y. Còng cã tr­êng hîp cã 2 hay nhiÒu b­íc cã thêi gian ch¹y kh«ng t­¬ng xøng (kh«ng lín h¬n mµ còng kh«ng nhá h¬n). Khi ®ã qui t¾c tÝnh tæng ph¶i ®­îc tÝnh trong tõng tr­êng hîp.

n4 nÕu n ch½n VÝ dô : f(n) = n2 nÕu n lÎ g(n) =

n2 nÕu n ch½n n3 nÕu n lÏ

Thêi gian ch¹y lµ O(max(f(n),g(n))) lµ n4 nÕu n ch½n vµ n3 nÕu n lÎ.

NÕu g(n) f(n), n no, no lµ const nµo ®ã th× O(f(n)+g(n)) sÏ lµ O(f(n)).

VÝ dô : O(n2 + n) = O(n2)

Tr­íc khi ®­a ra qui t¾c chung ®Ó ph©n tÝch thêi gian ch¹y cña ch­¬ng tr×nh th× ta xÐt vÝ dô ®¬n gi¶n sau.

Page 5: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

5

VÝ dô : XÐt ch­¬ng tr×nh Bubble dïng s¾p d·y sè nguyªn theo chiÒu t¨ng.

Procedure Bubble (var A: array [1..n] of integer);

Var i, j, temp : integer ;

Begin

1 For i := 2 to n do

2 For j := n downto i do

3 If A[j-1] > A[j] then

Begin

4 temp := A[j-1] ;

5 A[j-1] := A[j] ;

6 A[j] := temp ;

End ;

End ;

Ph©n tÝch :

- N lµ sè phÇn tö - kÝch th­íc cña bµi to¸n. Mçi lÖnh g¸n tõ dßng 4 - > dßng 6 mÊt 3 ®¬n vÞ thêi gian, theo qui t¾c tÝnh tæng sÏ lµ O(max(1,1,1) = O(1).

- Vßng If vµ For lång nhau, ta ph¶i xÐt tõ trong ra ngoµi. §èi víi ®iÒu kiÖn sau If ph¶i kiÓm tra O(1) thêi gian. Ta kh«ng ch¾c th©n lÖnh If tõ 4 - 6 cã thùc hiÖn hay kh«ng. V× xÐt trong tr­êng hîp xÊu nhÊt nªn ta gi¶ thuyÕt lµ c¸c lÖnh tõ 4 - 6 ®Òu cã thùc hiÖn. VËy nhãm If tõ c¸c lÖnh 3 -6 lµm mÊt O(1) thêi gian.

- Ta xÐt vßng lÆp ngoµi tõ 2 - 6. Nguyªn t¾c chung cña vßng lÆp: thêi gian

vßng lÆp lµ tæng thêi gian mçi lÇn lÆp trong th©n vßng lËp. Ýt nhÊt lµ O(1) cho mçi lÇn lÆp khi chØ sè t¨ng. Sè lÇn lÆp tõ 2 - 6 lµ n - i +1

VËy theo qui t¾c tÝch : O((n - i +1), 1) lµ O(n -i +1).

- Ta xÐt vßng ngoµi cïng chøa c¸c lÖnh cña ch­¬ng tr×nh. LÖnh 1 lµm n-1 lÇn, tèn n-1 ®¬n vÞ thêi gian. VËy tæng thêi gian ch¹y cña ch­¬ng tr×nh bÞ chÆn d­íi bëi 1 thêi gian cè ®Þnh lµ :

n

2i

2/)1n(*n)1in( tøc lµ O(n2)

Tuy nhiªn kh«ng cã qui t¾c ®Çy ®ñ ®Ó ph©n tÝch ch­¬ng tr×nh.

Nãi chung thêi gian ch¹y cña 1 lÖnh hoÆc 1 nhãm lÖnh cã thÓ lµ 1 hµm cña kÝch th­íc c¸c input hoÆc 1 hay nhiÒu biÕn. Nh­ng chØ cã n - kÝch th­íc cña bµi to¸n lµ th«ng sè cho phÐp ®èi víi thêi gian ch¹y cña ch­¬ng tr×nh.

Page 6: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

6

3. Qui t¾c tÝnh thêi gian ch¹y

a) Thêi gian ch¹y cña mçi lÖnh g¸n, read, write cã gi¶ thiÕt lµ O(1).

b) Thêi gian ch¹y cña 1 d·y lÖnh x¸c ®Þnh theo qui t¾c tæng; nghÜa lµ thêi gian ch¹y cña d·y lµ thêi gian lín nhÊt cña 1 lÖnh nµo ®ã trong d·y lÖnh.

c) Thêi gian ch¹y lÖnh If lµ thêi gian thùc hiÖn lÖnh ®iÒu kiÖn céng víi thêi gian kiÓm tra ®iÒu kiÖn.

Thêi gian thùc hiÖn lÖnh If cã cÊu tróc If then eles lµ thêi gian kiÓm tra ®iÒu kiÖn céng víi thêi gian lín nhÊt cña 1 trong 2 lÖnh rÏ nh¸nh true vµ false.

d) Thêi gian thùc hiÖn vßng lÆp lµ tæng thêi gian thùc hiÖn th©n vßng lÆp vµ thêi gian kiÓm tra kÕt thóc vßng lÆp.

e) Gäi thñ tôc:NÕu ch­¬ng tr×nh cã c¸c thñ tôc vµ kh«ng cã thñ tôc nµo lµ ®Ö qui th× ta cã thÓ tÝnh thêi gian ch¹y cïng mét lóc, b¾t ®Çu tõ c¸c thñ tôc kh«ng gäi ®Õn c¸c thñ tôc kh¸c. TÊt nhiªn ph¶i cã Ýt nhÊt 1 thñ tôc nh­ vËy trong tr­êng hîp nµy, nÕu kh«ng th× ph¶i cã thñ tôc ®Ö qui. Sau ®ã ta cã thÓ ®¸nh gi¸ thêi gian ch¹y cña c¸c thñ tôc cã gäi, ®Õn c¸c thñ tôc kh«ng chøa lêi gäi ®· ®­îc ®¸nh gi¸. Cø nh­ thÕ ta l¹i ®¸nh gi¸ thêi gian ch¹y cña c¸c thñ tôc cã lêi gäi ®Õn c¸c thñ tôc ®· ®¸nh gi¸, nghÜa lµ mçi thñ tôc ®­îc ®¸nh gi¸ sau khi ®¸nh gi¸ hÕt c¸c thñ tôc mµ ®­îc nã gäi.

NÕu cã thñ tôc ®Ö qui th× kh«ng thÓ t×m ®­îc thø tù cña tÊt c¶ c¸c thñ tôc sao cho mçi thñ tôc chØ gäi ®Õn c¸c thñ tôc ®· ®¸nh gi¸. Khi ®ã ta ph¶i lËp 1 liªn hÖ gi÷a mçi thñ tôc ®Ö qui víi 1 hµm thêi gian ch­a biÕt T(n) trong ®ã n lµ kÝch th­íc cña ®èi sè cña thñ tôc. Lóc ®ã ta cã thÓ nhËn ®­îc sù truy håi ®èi víi T(n), nghÜa lµ 1 ph­¬ng tr×nh diÔn t¶ T(n) qua c¸c T(k) víi c¸c gi¸ trÞ k kh¸c nhau.

VÝ dô : XÐt ch­¬ng tr×nh ®Ö qui tÝnh n giai thõa (n!), trong ®ã n lµ kÝch th­íc cña hµm nªu trªn.

Function Fact (n:integer) : LongInt ;

Begin

1 If n <= 1 then

2 Fact := 1

Else

3 Fact := n*fact (n-1)

End ;

Ph©n tÝch:

Ta ký hiÖu T(n) lµ thêi gian ch¹y ®Ó tÝnh hµm Fact(n).

Thêi gian ch¹y ®èi víi c¸c dßng 1, 2 lµ O(1) vµ ®èi víi dßng 3 lµ O(1) + T(n-1). VËy víi c¸c h»ng c, d nµo ®ã ta cã ph­¬ng tr×nh:

Page 7: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

7

c + T(n-1) nÕu n > 1 T(n) =

d nÕu n 1

Gi¶i ph­¬ng tr×nh :

Gi¶ sö n > 2, ta cã thÓ khai triÓn T(n-1) trong c«ng thøc :

T(n) = 2.c + T(n-2) nÕu n > 2

Sau ®ã ta l¹i thay T(n-2) = c + T(n-3) ta ®­îc.

T(n) = 3.c + T(n-3) nÕu n > 3 .....

T(n) = i.c + T(n-i) nÕu n > i

Cuèi cïng ta thay i = n - 1, ta ®­îc

T(n) = c(n-1) + T(1) = c(n-1) + d

KÕt luËn T(n) lµ O(n).

V. sù ph©n líp c¸c thuËt to¸n :

Nh­ ®· ®­îc chó ý ë 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µ ¶nh h­ëng rÊt nhiÒu tíi thêi gian ch¹y. Tham sè N cã thÓ lµ bËc cña 1 ®a thøc, kÝch th­íc cña 1 tËp tin ®­îc s¾p xÕp hay t×m kiÕm, sè nót trong 1 ®å thÞ...HÇu hÕt tÊt c¶ thuËt to¸n trong bµi gi¶ng nµy cã thêi gian ch¹y tiÖm cËn tíi 1 trong c¸c hµm sau :

1. HÇu hÕt tÊt c¶ c¸c chØ thÞ cña c¸c 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 cïng 1 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è. §iÒu nµy hiÓn nhiªn lµ môc tiªu phÊn ®Êu ®Ó ®¹t ®­îc trong viÖc thiÕt kÕ thuËt to¸n.

2. logN

Khi thêi gian ch¹y cña ch­¬ng tr×nh lµ logarit, tøc lµ thêi gian ch¹y ch­¬ng tr×nh tiÕn chËm khi N lín dÇn. Thêi gian ch¹y lo¹i nµy xuÊt hiÖn trong c¸c ch­¬ng tr×nh mµ gi¶i 1 bµi to¸n lín b»ng c¸ch chuyÓn nã thµnh bµi to¸n nhá h¬n, b»ng c¸ch c¾t bá kÝch th­íc bít 1 h»ng sè nµo ®ã. Víi môc ®Ých cña chóng ta, thêi gian ch¹y cã ®­îc xem nh­ nhá h¬n 1 h»ng sè "lín". C¬ sè cña logarit lµm thay ®æi h»ng sè ®ã nh­ng kh«ng nhiÒu: Khi n lµ 1000 th× logN lµ 3 nÕu c¬ sè lµ 10; lµ 10 nÕu c¬ sè lµ 2 ; khi N lµ 1000000, logN ®­îc nh©n gÊp ®«i. BÊt cø khi nµo N ®­îc nh©n gÊp ®«i, logN ®­îc t¨ng lªn thªm mét h»ng sè, nh­ng logN kh«ng ®­îc nh©n gÊp ®«i tíi khi N t¨ng tíi N2.

3. N

Khi thêi gian ch¹y cña ch­¬ng tr×nh lµ tuyÕn tÝnh, nãi chung ®©y lµ tr­êng hîp mµ mét sè l­îng nhá c¸c xö lý ®­îc lµm cho mçi phÇn tö d÷ liÖu nhËp.

Page 8: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

8

Khi N lµ 1.000.000 th× thêi gian ch¹y còng cì nh­ vËy.

Khi N ®­îc nh©n gÊp ®«i th× thêi gian ch¹y còng ®­îc nh©n gÊp ®«i. §©y lµ t×nh huèng tèi ­u cho 1 thuËt to¸n mµ ph¶i xö lý N d÷ liÖu nhËp (hay s¶n sinh ra N d÷ liÖu xuÊt).

4. NlogN

§©y lµ thêi gian ch¹y t¨ng dÇn lªn cho c¸c thuËt to¸n mµ gi¶i 1 bµi to¸n b»ng c¸ch t¸ch nã thµnh c¸c bµi to¸n con nhá h¬n, kÕ ®Õn gi¶i quyÕt chóng 1 c¸ch ®éc lËp vµ sau ®ã tæ hîp c¸c lêi gi¶i. Bëi v× thiÕu 1 tÝnh tõ tèt h¬n (cã lÏ lµ "tuyÕn tÝnh logarit" ?), chóng ta nãi r»ng thêi gian ch¹y cña thuËt to¸n nh­ thÕ lµ "NlogN".

Khi N lµ 1000000, NlogN cã lÏ kho¶ng 6 triÖu.

Khi N ®­îc nh©n gÊp ®«i, thêi gian ch¹y bÞ nh©n lªn nhiÒu h¬n gÊp ®«i (nh­ng kh«ng nhiÒu l¾m).

5. N2

Khi thêi gian ch¹y cña 1 thuËt to¸n lµ bËc hai, tr­êng hîp nµy chØ cã ý nghÜa thùc tÕ cho c¸c bµi to¸n t­¬ng ®èi nhá. Thêi gian b×nh ph­¬ng th­êng t¨ng lªn trong c¸c thuËt to¸n mµ xö lý tÊt c¶ c¸c cÆp phÇn tö d÷ liÖu (cã thÓ lµ 2 vßng lÆp lång nhau).

Khi N lµ 1000 th× thêi gian ch¹y lµ 1000000.

Khi N ®­îc nh©n ®«i th× thêi gian ch¹y t¨ng lªn gÊp 4 lÇn.

6. N3

T­¬ng tù, mét thuËt to¸n mµ xö lý mét bé 3 cña c¸c phÇn tö d÷ liÖu (cã lÏ 3 vßng lÆp lång nhau) cã thêi gian ch¹y bËc 3 vµ còng chØ cã ý nghÜa thùc tÕ trong c¸c bµi to¸n nhá.

Khi N lµ 100 th× thêi gian ch¹y lµ 1.000.000.

Khi N ®­îc nh©n ®«i th× thêi gian ch¹y t¨ng lªn gÊp 8 lÇn.

7. 2n

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 1 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 bµi to¸n.

Khi N lµ 20 th× thêi gian ch¹y xÊp xØ lµ 1.000.000

Khi N lµ gÊp 2 th× thêi gian ch¹y ®­îc n©ng lªn lòy thõa 2.

Thêi gian ch¹y cña 1 ch­¬ng tr×nh cô thÓ ®«i khi lµ mét h»ng sè nh©n víi c¸c sè h¹ng nãi trªn céng thªm mét sè h¹ng nhá h¬n. C¸c gi¸ trÞ cña h»ng sè vµ c¸c sè h¹ng phô thuéc vµo c¸c kÕt qu¶ cña sù ph©n tÝch vµ c¸c chi tiÕt cµi ®Æt. HÖ sè cña h»ng sè liªn quan tíi sè chØ thÞ bªn trong vßng lÆp : ë 1 tÇng tïy ý cña

Page 9: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

9

thiÕt kÕ thuËt to¸n th× ph¶i cÈn thËn giíi h¹n sè chØ thÞ nh­ thÕ. Víi N lín th× c¸c h»ng sè ®ãng vai trß chñ chèt, víi N nhá th× c¸c sè h¹ng cïng ®ãng gãp vµo vµ sù so s¸nh thuËt to¸n sÏ khã kh¨n h¬n. Ngoµi nh÷ng hµm võa nãi trªn còng cßn cã 1 sè hµm kh¸c, vÝ dô nh­ 1 thuËt to¸n víi N2 phÇn tö d÷ liÖu nhËp mµ cã thêi gian ch¹y lµ bËc 3 theo N th× sÏ ®­îc ph©n líp nh­ 1 thuËt to¸n N3/2. Mét sè thuËt to¸n cã 2 giai ®o¹n ph©n t¸ch thµnh c¸c bµi to¸n con vµ cã thêi gian ch¹y xÊp xØ víi Nlog2N.

VI. c¸c c«ng thøc truy håi c¬ së :

PhÇn lín c¸c thuËt to¸n ®Òu dùa trªn viÖc ph©n r· ®Ö qui mét bµi to¸n lín thµnh c¸c bµi to¸n nhá h¬n, råi dïng c¸c lêi gi¶i cña c¸c bµi to¸n nhá ®Ó gi¶i bµi to¸n ban ®Çu. Thêi gian ch¹y cña c¸c thuËt to¸n nh­ thÕ ®­îc x¸c ®Þnh bëi kÝch th­íc vµ sè l­îng c¸c bµi to¸n con vµ gi¸ ph¶i tr¶ cña sù ph©n r·. Trong phÇn nµy ta quan s¸t c¸c ph­¬ng ph¸p c¬ së ®Ó ph©n tÝch c¸c thuËt to¸n nh­ thÕ vµ tr×nh bµy mét vµi c«ng thøc chuÈn th­êng ®­îc ¸p dông trong viÖc ph©n tÝch nhiÒu thuËt to¸n.

TÝnh chÊt rÊt tù nhiªn cña 1 ch­¬ng tr×nh ®Ö qui lµ thêi gian ch¹y cho d÷ liÖu nhËp cã kÝch th­íc N sÏ phô thuéc vµo thêi gian ch¹y cho c¸c d÷ liÖu nhËp cã kÝch th­íc nhá h¬n : ®iÒu nµy ®­îc diÔn dÞch thµnh 1 c«ng thøc to¸n häc gäi lµ quan hÖ truy håi. C¸c c«ng thøc nh­ thÕ m« t¶ chÝnh x¸c tÝnh n¨ng cña c¸c thuËt to¸n t­¬ng øng, do ®ã ®Ó cã ®­îc thêi gian ch¹y chóng ta ph¶i gi¶i c¸c bµi to¸n truy håi. B©y giê chóng ta chó ý vµo c¸c c«ng thøc chø kh«ng ph¶i c¸c thuËt to¸n.

C«ng thøc 1 :

C«ng thøc nµy th­êng dïng cho c¸c ch­¬ng tr×nh ®Ö qui mµ cã vßng lÆp duyÖt qua d÷ liÖu nhËp ®Ó bá bít 1 phÇn tö.

Cn = Cn-1 + n, víi n >= 2 vµ C1 = 1

Chøng minh :

Cn kho¶ng n2/2. §Ó gi¶i 1 c«ng thøc truy håi nh­ trªn, chóng ta lÇn l­ît ¸p dông chÝnh c«ng thøc ®ã nh­ sau :

Cn = Cn-1 + n

= Cn-2 + (n-1) + n

= ...

= C1 + 2 + ... + (n-2) + (n-1) + n

= 1 + 2 + ... + n

= n(n+1)/2

Page 10: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

10

C«ng thøc 2 :

C«ng thøc nµy dïng cho ch­¬ng tr×nh ®Ö qui mµ chia d÷ liÖu nhËp thµnh 2 phÇn trong mçi b­íc.

Cn = Cn/2 + 1, víi n >= 2 vµ C1 = 0

Chøng minh :

Cn kho¶ng logn. Ph­¬ng tr×nh nµy v« nghÜa trõ phi n ch½n hay chóng ta gi¶ sö r»ng n/2 lµ phÐp chia nguyªn : b©y giê chóng ta gi¶ sö r»ng n = 2m ®Ó cho c«ng thøc lu«n lu«n cã nghÜa. Chóng ta viÕt nh­ sau :

122

1 CC mm

22

2 C m

32

3 C m

= ...... mC mm

2

nm log

C«ng thøc chÝnh x¸c cho n tæng qu¸t th× phô thuéc vµo biÓu diÔn nhÞ ph©n cña n, nãi chung Cn kho¶ng logn víi mäi n.

C«ng thøc 3 :

C«ng thøc nµy dïng cho ch­¬ng tr×nh ®Ö qui mµ chia ®«i d÷ liÖu nhËp nh­ng cã thÓ kiÓm tra mçi phÇn tö cña d÷ liÖu nhËp.

Cn = Cn/2 + n, víi n >= 2 vµ C1 = 0

Chøng minh :

Cn kho¶ng 2n. T­¬ng tù trªn, c«ng thøc nµy chÝnh lµ tæng n + n/2 + n/4 + ... (dÜ nhiªn ®iÒu nµy chØ chÝnh x¸c khi n lµ lòy thõa cña 2).

NÕu d·y lµ v« h¹n, th× ®©y lµ 1 chuçi h×nh häc ®¬n gi¶n mµ ®­îc ­íc l­îng chÝnh x¸c lµ 2n. Trong tr­êng hîp tæng qu¸t lêi gi¶i chÝnh x¸c phô thuéc vµo biÓu diÔn nhÞ ph©n cña n.

C«ng thøc 4 :

C«ng thøc nµy dïng cho ch­¬ng tr×nh ®Ö qui mµ duyÖt tuyÕn tÝnh xuyªn qua d÷ liÖu nhËp, tr­íc, trong, hay sau khi d÷ liÖu nhËp ®­îc chia ®«i.

Cn = 2Cn/2 + n, víi n >= 2 vµ C1 = 0

Chøng minh :

Cn kho¶ng nlogn. C«ng thøc nµy ¸p dông cho nhiÒu thuËt to¸n theo ph­¬ng ph¸p "chia ®Ó trÞ".

Page 11: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

11

2221 mmm CC

122

1

122

m

m

m

m CC

112

2

22

m

mC

mC

mm

mm

2

2

mmC 2

0

nnmCm

n log2

Lêi gi¶i cho c«ng thøc nµy rÊt gièng nh­ trong c«ng thøc 2, nh­ng ph¶i chia 2 vÕ cña c«ng thøc cho 2n trong b­íc thø hai.

C«ng thøc 5 :

C«ng thøc nµy dïng cho ch­¬ng tr×nh ®Ö qui mµ t¸ch d÷ liÖu thµnh 2 phÇn.

Cn = 2Cn/2 + 1, víi n >= 2 vµ C1 = 0

Chøng minh :

Cn kho¶ng 2n. Chøng minh gièng nh­ c«ng thøc 4.

C¸c biÕn d¹ng cña nh÷ng c«ng thøc nµy ch¼ng h¹n nh­ ®iÒu kiÖn kh¸c nhau hay c¸c sè h¹ng thªm vµo kh¸c nhau mét Ýt, cã thÓ ­íc l­îng b»ng c¸ch dïng còng mét kü thuËt nh­ trªn. MÆc dï vËy, chóng ta còng nªn chó ý 1 quan hÖ truy håi d­êng nh­ t­¬ng tù víi mét quan hÖ ®· biÕt th× ®«i khi l¹i khã gi¶i h¬n rÊt nhiÒu.

VII. gi¶i ph­¬ng tr×nh truy håi :

§Ó gi¶i ph­¬ng tr×nh truy håi cã nhiÒu c¸ch gi¶i kh¸c nhau, ë ®©y chóng t«i tr×nh bµy c¸ch gi¶i ph­¬ng tr×nh truy håi b»ng c¸ch truy vÒ ph­¬ng tr×nh ®Æc tr­ng. Chóng t«i dïng c¸ch gi¶i nµy ®Ó viÕt ch­¬ng tr×nh gi¶i tù ®éng ph­¬ng tr×nh truy håi.

a) Ta xÐt ph­¬ng tr×nh truy håi thuÇn nhÊt tuyÕn tÝnh víi c¸c hÖ sè kh«ng ®æi sau ®©y :

a0tn + a1tn-1 + ... + aktn-k = 0 (VII.1)

trong ®ã ti(i=n, n-1,..., n-k) lµ c¸c Èn sè cÇn t×m.

TuyÕn tÝnh v× c¸c ti chØ cã bËc nhÊt, thuÇn nhÊt v× vÕ ph¶i b»ng kh«ng vµ c¸c hÖ sè a0, a1,..., ak lµ kh«ng ®æi v× kh«ng phô thuéc vµo n.

Page 12: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

12

Sau khi gi¶ thiÕt tn = xn ta ®­a (VII.1) vÒ d¹ng:

a0xn + a1xn-1 +...+ akxn-k = 0

hay xn-k(a0xk + a1xk-1 +...+ ak) = 0

Râ rµng x = 0 lµ nghiÖm hiÓn nhiªn, nh­ng ta quan t©m nghiÖm ph­¬ng tr×nh a0xk + a1xk-1 +...+ ak = 0 (VII.2) vµ ®©y chÝnh lµ ph­¬ng tr×nh ®Æc tr­ng bËc k cña ph­¬ng tr×nh truy håi (VII.1)

Gi¶ sö r1, r2,..., rk lµ k nghiÖm cña ph­¬ng tr×nh (VII.2) vµ chóng kh¸c nhau (cã thÓ phøc). DÔ dµng kiÓm tra:

rctn

i

k

iin

1

Víi c1, c2,..., ck lµ c¸c h»ng x¸c ®Þnh tõ k ®iÒu kiÖn ban ®Çu.

VÝ dô 1 :

XÐt ph­¬ng tr×nh truy håi:

043 21 ttt nnn

§iÒu kiÖn ban ®Çu : t0 = 1 ; t1 =1

Ph­¬ng tr×nh ®Æc tr­ng t­¬ng øng cña nã lµ:

x2 - 3x - 4 = 0

cã nghiÖm b»ng -1 vµ 4. VËy nghiÖm tæng qu¸t lµ :

)4()1( 21

nn

n cct

Theo ®iÒu kiÖn ban ®Çu (khi n =0 vµ n = 1) ta cã :

c1 + c2 = 1 = t0

- c1 + 4c2 =1

VËy c1 = 3/5, c2 = 2/5. Ta ®­îc tn = - [4n - (-1)n ] /5

VÝ dô 2 : (ph­¬ng tr×nh Fibonacci)

tn = tn-1 + tn-2 n 2

§iÒu kiÖn : t0 = 0, t1 = 1

ViÕt l¹i ph­¬ng tr×nh trªn :

tn - tn-1 - tn -2 = 0

Ph­¬ng tr×nh ®Æc tr­ng t­¬ng øng :

x2 - x -1 = 0

Page 13: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

13

NghiÖm : 2/)51(r1 , 2/)51(r2

NghiÖm tæng qu¸t : tn = c1r1n + c2r2

n

Tõ ®iÒu kiÖn ban ®Çu :

c1 + c2 = 0 (n = 0) r1c1 + r2c2 = 1 (n =1)

Ta cã 5/1c1 ,

5/1c2

VËy: tn = 5/)nn( rr 21

Gi¶ sö c¸c nghiÖm ph­¬ng tr×nh ®Æc tr­ng lµ kh«ng ph©n biÖt, P(x) lµ 1 ®a thøc.

P(x) = a0xk + a1xk-1 + ... + ak

vµ r lµ nghiÖm kÐp.

Víi mçi r > k, ta xÐt ®a thøc bËc n ®­îc x¸c ®Þnh nh­ sau :

h(x) = x [xn-k P(x)] = a0nxn + a1(n-1)xn-1 + ... + ak(n-k)xn-k

§Æt q(x) lµ ®a thøc tháa ®iÒu kiÖn

P(x) = (x-r)2 q(x)

Ta cã :

h(x) = x[(x-r)2 xn-k q(x)] = x[2(x-r)xn-k q(x) + (x-r)2[xn-k q(x)]]

Râ rµng h(r) = 0, do ®ã

a0nrn + a1(n-1)xn-1 + ... + ak(n-k) rn-k = 0

NghÜa lµ tn = nrn còng lµ nghiÖm cña (5.13). Tæng qu¸t h¬n, nÕu nghiÖm r trïng nhau m lÇn (r béi m) th×

tn = rn, tn = nrn, tn = n2rn,...., tn = nm-1rn

còng lµ c¸c nghiÖm cña (5.13). NghiÖm tæng qu¸t (nghiÖm chung) lµ tæ hîp tuyÕn tÝnh cña c¸c nghiÖm riªng nµy vµ nghiÖm riªng kh¸c cña ph­¬ng tr×nh ®Æc tr­ng. K h»ng ®­îc x¸c ®Þnh tõ c¸c ®iÒu kiÖn ban ®Çu.

VÝ dô 3 : XÐt ph­¬ng tr×nh

tn = 5tn-1 - 8tn-2 + 4tn-3 n 3

víi c¸c ®iÒu kiÖn t0 = 0, t1 = 1, t2 = 2

Ta viÕt l¹i ph­¬ng tr×nh:

tn - 5tn-1 + 8tn-2 - 4tn-3 = 0

vµ ph­¬ng tr×nh ®Æc tr­ng t­¬ng øng lµ:

x3 - 5x2 + 8x - 4 = 0

hay (x-1) (x-2)2 = 0

Page 14: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

14

Ta cã c¸c nghiÖm 1 (cã béi 1), 2 (cã béi 2). VËy nghiÖm tæng qu¸t lµ :

tn = c11n + c22n + c3n2n

C¸c ®iÒu kiÖn ban ®Çu cho tr­íc lµ:

c1 + c2 = 0 khi n = 0

c1 + 2c2 + 2c3 = 1 khi n = 1

c1 + 4c2 + 8c3 = 2 khi n = 2

Tõ ®©y ta t×m ra c1 = -2, c2 = 2, c3 = -1/2. VËy tn = 2n+1- n2n-1- 2

b) Ph­¬ng tr×nh truy håi kh«ng thuÇn nhÊt:

Ta xÐt ph­¬ng tr×nh cã d¹ng sau :

a0tn + a1tn-1 + ... + aktn-k = bnP(n) (VII.3)

Trong ®ã vÕ tr¸i nh­ trong (VII.1), vÕ ph¶i lµ bnP(n) víi b lµ h»ng vµ P(n) lµ ®a thøc.

VÝ dô 4 :

tn - 2tn-1 = 3n

th× b = 3 vµ P(n) = 1 lµ ®a thøc bËc 0.

B»ng phÐp biÕn ®æi ®¬n gi¶n ta cã thÓ chuyÓn vÝ dô nµy vÒ d¹ng (VII.1) lµ ph­¬ng tr×nh truy håi thuÇn nhÊt. Tr­íc hÕt ta nh©n 2 vÕ cho 3 ta ®­îc :

3tn - 6tn-1 = 3n+1 (1)

Sau ®ã ta thay n ra n + 1 trong ph­¬ng tr×nh ban ®Çu:

tn+1 - 2tn = 3n+1 (2)

Cuèi cïng, lÊy (2) - (1) , ta thu ®­îc (cã cïng vÕ ph¶i 3n+1), ta ®­îc:

tn+1 - 5tn + 6tn-1 = 0

§Õn ®©y ta cã thÓ gi¶i ph­¬ng tr×nh ®· tr×nh bµy ë môc a.

Ph­¬ng tr×nh ®Æc tr­ng cña nã lµ :

x2 - 5x + 6 = 0

hay (x-2) (x-3) = 0

Trùc gi¸c cho ta thÊy r»ng thµnh phÇn (x-2) t­¬ng øng víi vÕ tr¸i ph­¬ng tr×nh ban ®Çu; cßn (x-3) lµ biÓu hiÖn kÕt qu¶ cña viÖc biÕn ®æi vµ trõ vÕ ph¶i.

VÝ dô 5 :

tn - 2tn-1 = (n+5)3n

Page 15: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

15

Sù biÕn ®æi cã phøc t¹p nh­ sau :

- Nh©n 2 vÕ cho 9

- Thay n bëi n+2

- Thay n bëi n+1,sau ®ã nh©n cho -6

- Ta ®­îc kÕt qu¶ :

9tn - 18tn-1 = (n + 5) 3n+2

tn+2 - 2tn+1 = (n + 7) 3n+2

-6tn+1 + 12tn = -6(n + 6) 3n+1

Céng 3 ph­¬ng tr×nh l¹i ta ®­îc :

tn+2 - 8tn+1 + 21tn - 18tn-1 = 0

Ph­¬ng tr×nh ®Æc tr­ng.

x2 - 8x2 + 21x - 18 = 0 hay (x-2) (x-3)2 = 0

Ta l¹i thÊy (x-2) t­¬ng øng vÕ tr¸i ph­¬ng tr×nh ban ®Çu vµ (x-3)2 lµ kÕt qu¶ cña sù biÕn ®æi.

Nh­ vËy chóng ta cã thÓ nãi r»ng ®Ó gi¶i ph­¬ng tr×nh truy håi kh«ng thuÇn nhÊt cã d¹ng (VII.3) ta chØ cÇn gi¶i ph­¬ng tr×nh ®Æc tr­ng sau.

(a0xk + a1xk-1 + ... + ak) (x-b)d+1 = 0 (VII.4)

VÝ dô 6 : (bµi to¸n th¸p Hµ Néi)

Ph­¬ng tr×nh truy håi cho bµi to¸n chuyÓn n ®Üa nµy cã d¹ng:

1 nÕu n = 1 tn = 2tn-1 + 1 nÕu n > 1

hay tn = 2tn-1 + 1, n > 1 víi t0 = 0

Ta viÕt l¹i ph­¬ng tr×nh :

tn - 2tn-1 = 1

Vµ thÊy nã cã d¹ng (VII.3) víi b = 1, P(n) = 1 bËc 0

Ph­¬ng tr×nh ®Æc tr­ng lµ (x-2) (x-1) = 0

VËy : tn =c11n + c22n. Tõ t0 = 0 ®Ó t×m t1 ta viÕt :

t1 = 2to + 1 = 1

VËy c1 + c2 = 0, n = 0

c1 + 2c2 = 1, n = 1

Suy ra c1 = -1, c2 = 1. VËy tn = 2n-1

Ta nhËn thÊy tõ tn = c11n + c22n còng cã thÓ kÕt luËn tn cã O(2n).

Page 16: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

16

VÝ dô 7 :

tn = 2tn-1 + n

hay tn - 2tn-1 = n

ë ®©y b = 1, P(n) = n bËc 1

Ta cã ph­¬ng tr×nh ®Æc tr­ng:

(x-2) (x-1)2 = 0

VËy nghiÖm tæng qu¸t lµ :

tn = c12n + c21n + c3n1n

NÕu tn > 0 víi mçi n th× ta cã thÓ kÕt luËn T(n)= O(2n),

B©y giê ta xÐt ph­¬ng tr×nh truy håi kh«ng thuÇn nhÊt tæng qu¸t h¬n.

aotn +a1tn-1 + ... + aktn-k = b1np1(n) + b2

np2(n) + ... (VII.5)

Trong ®ã bi lµ c¸c h»ng kh¸c nhau vµ pi(n) lµ c¸c ®a thøc bËc di cña n.

B»ng c¸ch biÕn ®æi gÇn nh­ t­¬ng tù víi d¹ng ph­¬ng tr×nh (VII.1), ta cã thÓ viÕt ®­îc ph­¬ng tr×nh ®Æc tr­ng cho d¹ng (VII.1)5) nh­ sau :

(aoxk + a1xk-1 + ... + ak) (x-b1)d1+1(x-b2)d2+1= 0 (VII.6)

VÝ dô 8 : Gi¶i ph­¬ng tr×nh

tn = 2tn-1 + n + 2n n 1

víi to = 0, ta cã

tn - 2tn-1 = n + 2n

cã d¹ng (VII.1)5) víi b1 = 1, p1(n) = n, b2 = 2, p2(n) = 1. BËc cña p1(n) lµ 1, bËc cña p2(n) lµ 0. VËy ph­¬ng tr×nh ®Æc tr­ng lµ :

(x-2) (x-1)2 (x-2) = 0

C¶ hai nghiÖm 1 vµ 2 ®Òu cã béi lµ 2. VËy nghiÖm tæng qu¸t cña ph­¬ng tr×nh truy håi lµ :

tn = c11n + c2n1n + c32n + c4n2n

Sö dông d¹ng truy håi tn = 2tn-1 + n+ 2n víi to = 0 ta cã thÓ tÝnh ®­îc t1, t2 vµ t3 vµ tõ ®ã x¸c ®Þnh ®­îc c¸c hÖ sè c1, c2, c3 vµ c4 qua hÖ sau:

c1 + c3 = 0 khi n = 0

c1 + c2 + 2c3 + 2c4 = 3 n = 1

c1 + 2c2 + 4c3 + 8c4 = 12 n = 2

c1 + 3c2 + 8c3 + 24c4 = 35 n = 3

Page 17: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

17

KÕt qu¶ cuèi cïng lµ :

tn = -2 -n + 2n+1 + n2n

DÔ dµng nhËn thÊy tn cã O(n2n)

VÝ dô 9 :

Gi¶ sö n lµ lòy thõa cña 2. T×m T(n) tõ ph­¬ng tr×nh:

T(n) = 4T(n/2) + n, n > 1

Thay n b»ng 2k (víi k = logn), ta cã T(2k) = 4T(2k-1) + 2k. Khi ®ã ta cã thÓ viÕt:

tk = 4tk-1 + 2k

NÕu tk = T(2k) = T(n). Ta ®· biÕt c¸ch gi¶i ph­¬ng tr×nh truy håi míi nµy.

Ph­¬ng tr×nh ®Æc tr­ng cña nã lµ :

(x-4) (x-2) = 0

vµ tõ ®ã ta cã tk = c14k + c22k

§Æt n ng­îc l¹i thay cho k, ta t×m ®­îc :

T(n) = c1n2 + c2n

Do ®ã T(n) cã 0(n2) khi n lµ lòy thõa cña 2.

VÝ dô 10 :

T(n) = 4t(n/2) + n2, n > 1, lòy thõa cña 2. §Æt n = 2k, ta cã.

T(2k) = 4T(2k-1) + 4k

Ph­¬ng tr×nh ®Æc tr­ng (x-4)2 = 0 vµ ta cã tk = c14k + c2k4k

VËy T(n) = c1n2 + c2n2logn vµ T(n) lµ 0(n2logn) víi n lòy thõa 2.

VÝ dô 11 :

T(n) = 2T(n/2) + nlogn, n > 1

Sau khi thay n = 2k, ta cã T(2k )= 2T(2k-1) + k2k vµ

tk = 2tk-1 + k2k

Ph­¬ng tr×nh ®Æc tr­ng (x-2)3 = 0 vµ tk = c12k + c2k2k + c3k22k.

VËy T(n) = c1n + c2nlogn + c3nlog2n cã 0(nlog2n), n lòy thõa 2.

Page 18: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

18

VÝ dô 12 :

T(n) = 3T(n/2) + cn (c lµ const, n = 2k> 1)

Ta sÏ nhËn ®­îc :

T(2k) = 3T(2k-1) + c2k ; tk = 3tk-1 + c2k

Ph­¬ng tr×nh ®Æc tr­ng lµ (x-3) (x-2) = 0, vµ do ®ã.

Tk = c13k + c22k ; T(n) = c13logn + c2n

Do alogb = bloga nªn T(n) = c1nlog3 + c2n cã 0(nlog3),n lòy thõa 2.

c) Ph­¬ng tr×nh truy håi cã hÖ sè biÕn ®æi

Ta xÐt vÝ dô cô thÓ :

T(1) = 6

T(n) = nT2(n/2), n > 1,n lòy thõa cña 2

(hÖ sè ë vÕ ph¶i lµ biÕn n)

Tr­íc hÕt ta ®Æt tk = T(2k) vµ tõ ®Êy ta cã :

tk = 2kt2K-1 k > 0

to = 6

§Ó lËp ph­¬ng tr×nh truy håi míi kh«ng cã hÖ sè biÕn ®æi ta ®Æt Vk = lgtk, ta ®­îc :

Vk = K + 2Vk-1 k >0

Vo = lg6

NghÜa lµ ta cã hÖ ph­¬ng tr×nh d¹ng (VI.3)

Ph­¬ng tr×nh ®Æc tr­ng sÏ lµ

(x-2) (x-1)2 = 0

vµ do ®ã :

Vk = c12k + c21k + c3k1k

Tõ Vo = 1 + lg3, V1 = 3+2lg3 vµ V2 = 8 + 4lg3 ta t×m ra

c1 = 3 + lg3, c2 = -2 vµ c3 = -1.

VËy V3 = (3 + lg3) 2k - K -2

Cuèi cïng, sö dông tk = 2vk vµ T(n) = tlgn, ta ®­îc :

n

nTnn 32

)(23

Page 19: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

19

ch­¬ng Ii

®Ö qui

I. Kh¸i niÖm :

§Ö qui lµ 1 c«ng cô rÊt th­êng dïng trong khoa häc m¸y tÝnh vµ trong to¸n häc ®Ó gi¶i quyÕt c¸c vÊn ®Ò. Tr­íc hÕt, chóng ta h·y kh¶o s¸t thÕ nµo lµ mét vÊn ®Ò cã ®Ö qui qua vÝ dô sau:

TÝnh S(n) = 1 +2 +3 +4+ ... +n-1+n =S(n-1) + n

Ta nhËn thÊy r»ng, c«ng thøc trªn cã thÓ diÔn ®¹t l¹i nh­ sau:

S(n) = S(n-1) + n, vµ

S(n-1) = S(n-2) + (n-1) ..... S(2) = S(1) + 2

S(1) = 1

Nh­ vËy, mét vÊn ®Ò cã ®Ö qui lµ vÊn ®Ò ®­îc ®Þnh nghÜa l¹i b»ng chÝnh nã.

Mét c¸ch tæng qu¸t, mét ch­¬ng tr×nh ®Ö qui cã thÓ ®­îc biÓu diÔn nh­ bé P gåm c¸c mÖnh ®Ò c¬ së S (kh«ng chøa P) vµ b¶n th©n P:

P P (Si, P)

§Ó tÝnh S(n): ta cã kÕt qu¶ cña S(1), thay nã vµo S(2), cã S(2) ta thay nã vµo S(3)...., cø nh­ vËy cã S(n-1) ta sÏ tÝnh ®­îc S(n)

Còng nh­ c¸c lÖnh lÆp, c¸c thñ tôc ®Ö qui còng cã thÓ thùc hiÖn c¸c tÝnh to¸n kh«ng kÕt thóc, v× vËy ta ph¶i xÐt ®Õn vÊn ®Ò kÕt thóc c¸c tÝnh to¸n trong gi¶i thuËt ®Ö qui. Râ rµng 1 thñ tôc P ®­îc gäi ®Ö qui chØ khi nµo tháa 1 ®iÒu kiÖn B, vµ dÜ nhiªn ®iÒu kiÖn B nµy ph¶i kh«ng ®­îc tháa m·n t¹i 1 thêi ®iÓm nµo ®ã. Nh­ vËy m« h×nh vÒ c¸c gi¶i thuËt ®Ö qui lµ:

P if (B) P(Si, P)

hay P P(Si, if (B) P).

Th«ng th­êng trong c¸c vßng lÆp while, ®Ó ®¶m b¶o cho vßng lÆp kÕt thóc ta ph¶i ®Þnh nghÜa mét hµm f(x) (x lµ 1 biÕn trong ch­¬ng tr×nh) sao cho nã ph¶i tr¶ vÒ trÞ b»ng 0 t¹i mét thêi ®iÓm nµo ®ã. T­¬ng tù nh­ vËy, ch­¬ng tr×nh ®Ö qui còng cã thÓ ®­îc chøng minh lµ sÏ dõng b»ng c¸ch chøng minh r»ng hµm f(x) sÏ gi¶m sau mçi lÇn thùc hiÖn. Mét c¸ch th­êng lµm lµ kÕt hîp mét gi¸ trÞ n víi P vµ gäi P mét c¸ch ®Ö qui víi gi¸ trÞ tham sè lµ n-1. §iÒu kiÖn B b©y giê lµ n > 0 th× sÏ ®¶m b¶o ®­îc sù kÕt thóc cña gi¶i thuËt ®Ö qui. Nh­ vËy, ta cã m« h×nh ®Ö qui míi:

P(n) if (n >0) P(Si, P(n-1))

Hay P P (Si, if (n>0) P(n-1) )

Page 20: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

20

II. Hµm ®Ö qui vµ Stack:

Mét ch­¬ng tr×nh C th­êng gåm cã hµm main() vµ c¸c hµm kh¸c. Khi ch¹y ch­¬ng tr×nh C th× hµm main() sÏ ®­îc gäi ch¹y tr­íc, sau ®ã hµm main() gäi c¸c hµm kh¸c, c¸c hµm nµy trong khi ch¹y cã thÓ gäi c¸c hµm kh¸c n÷a. Khi mét hµm ®­îc gäi, th× mét khung kÝch ho¹t cña nã ®­îc t¹o ra trong bé nhí stack. Khung kÝch ho¹t nµy chøa c¸c biÕn côc bé cña hµm vµ mÈu tin ho¹t ®éng cña hµm. MÈu tin ho¹t ®éng chøa ®Þa chØ trë vÒ cña hµm gäi nã vµ c¸c tham sè kh¸c.

BiÕn côc bé

MÈu tin

ho¹t ®éng §Þa chØ trë vÒ

Th«ng sè kh¸c

Khung kÝch ho¹t

Sau khi hµm ®­îc gäi ®· thi hµnh xong th× ch­¬ng tr×nh sÏ thùc hiÖn tiÕp dßng lÖnh ë ®Þa chØ trë vÒ cña hµm gäi nã, ®ång thêi xãa khung kÝch ho¹t cña hµm ®ã khái bé nhí.

Gi¶ sö ta cã c¬ chÕ gäi hµm trong mét ch­¬ng tr×nh C nh­ sau:

main()

{ ......

A();

.....;

B();

....;

}

A()

{.....;

C();

....;

D();

}

B()

{.....;

D();

}

C()

{......;

D();

.....;

}

D()

{........;

........;

}

H×nh sau ®©y cho ta thÊy sù chiÕm dông bé nhí stack khi ch¹y ch­¬ng tr×nh C nh­ m« t¶ ë trªn.

M M M M M M M M M M M M M

A A A A A A A B B B

C C C D D

D

Boä nhôùStack

Thôøi gian

T­¬ng tù víi tr­êng hîp hµm ®Ö qui, khi gäi ®Ö qui lÉn nhau th× mét lo¹t c¸c khung kÝch ho¹t sÏ ®­îc t¹o ra vµ n¹p vµo bé nhí Stack. CÊp ®Ö qui cµng cao

Page 21: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

21

th× sè khung kÝch ho¹t trong Stack cµng nhiÒu, do ®ã, cã kh¶ n¨ng dÉn ®Õn trµn Stack (Stack overflow). Trong nhiÒu tr­êng hîp khi lËp tr×nh, nÕu cã thÓ ®­îc, ta nªn gì ®Ö qui cho c¸c bµi to¸n.

III. vÝ dô

VÝ dô 1: Hµm giai thõa:

n! = 1*2*3*......*(n-1)*n , n>0

1 , n=0

n! = n*(n-1)! , n>0

1 , n= 0

NhËn xÐt:

- Theo c«ng thøc trªn, ta nhËn thÊy trong ®Þnh nghÜa cña n giai thõa (n!) cã ®Þnh nghÜa l¹i chÝnh nã nªn hµm giai thõa cã ®Ö qui.

- §iÒu kiÖn dõng tÝnh hµm giai thõa lµ n=0, khi ®ã n! = 1

- Hµm ®Ö qui:

long giaithua(int n)

{

if (n == 0)

return(1);

else

return(n * giaithua(n-1));

}

hay:

long giaithua(int n)

{ return ((n==0) ? 1 : n*giaithua(n-1));

}

- Hµm kh«ng ®Ö qui:

long giaithua (int n)

{ long gt=1;

for (int i=1; i<=n; i++)

gt= gt * i ;

return (gt);

}

Page 22: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

22

VÝ dô 2: Hµm FIBONACCI:

Fn = 1 ; n =0,1

Fn-1 + Fn-2 ; n>1

NhËn xÐt:

- Theo ®Þnh nghÜa trªn, hµm Fibonacci cã lêi gäi ®Ö qui.

- Qu¸ tr×nh tÝnh dõng l¹i khi n= 1

- Hµm ®Ö qui:

long fib(int n)

{ if (n==0 || n==1)

return 1 ;

else return(fib(n-1) + fib(n-2));

}

- Hµm kh«ng ®Ö qui:

long fib(int n)

{ long kq, Fn_1, Fn_2;

kq = 1;

if (n > 1)

{

Fn_1 = 1;

Fn_2 = 1;

for (int i=2; i<=n; i++)

{

kq = Fn_1 + Fn_2 ;

Fn_2 = Fn_1;

Fn_1 = kq;

}

}

return (kq);

}

VÝ dô 3: Bµi to¸n Th¸p Hµ néi

Cã 3 cét A, B, C. Cét A hiÖn ®ang cã n dÜa kÝch th­íc kh¸c nhau, dÜa nhá ë trªn dÜa lín ë d­íi. H·y dêi n dÜa tõ cét A sang cét C (xem cét B lµ cét trung gian) víi ®iÒu kiÖn mçi lÇn chØ ®­îc dêi 1 dÜa vµ dÜa ®Æt trªn bao giê còng nhá h¬n dÜa ®Æt d­íi.

Page 23: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

23

- Gi¶i thuËt ®Ö qui: §Ó dêi n dÜa tõ cét A sang cét C (víi cét B lµ cét trung gian), ta cã thÓ xem nh­ :

+ Dêi (n-1) dÜa tõ cét A sang cét B ( víi cét C lµ cét trung gian)

+ Dêi dÜa thø n tõ cét A sang cét C

+ Dêi (n-1) dÜa tõ cét B sang cét C ( víi cét A lµ cét trung gian)

- Ch­¬ng tr×nh:

void hanoi (int n, char cotA, char cotC, char cotB)

{

if(n == 1)

printf("\n%s%c%s%c", " chuyen dia 1 tu cot ", cotA, " den cot ", cotC);

else

{

hanoi(n-1, cotA, cotB, cotC);

printf("\n%s%d%s%c%s%c", " chuyen dia ", n, " tu cot ", cotA,

" den cot ", cotC);

hanoi(n-1, cotB, cotC, cotA);

}

}

IV. C¸C THUËT TO¸N LÇN NG¦îC:

Trong lËp tr×nh, ®«i khi ta ph¶i x¸c ®Þnh c¸c thuËt gi¶i ®Ó t×m lêi gi¶i cho c¸c bµi to¸n nhÊt ®Þnh nh­ng kh«ng ph¶i theo mét luËt tÝnh to¸n cè ®Þnh, mµ b»ng c¸ch thö-vµ-sai. C¸ch chung lµ ph©n tÝch thö-vµ-sai thµnh nh÷ng c«ng viÖc côc bé. Th«ng th­êng c«ng viÖc nµy ®­îc thùc hiÖn trong d¹ng ®Ö qui vµ bao gåm viÖc th¨m dß mét sè h÷u h¹n c¸c nhiÖm vô nhá. Trong bµi gi¶ng nµy ta kh«ng t×m hiÓu c¸c qui t¾c t×m kiÕm tæng qu¸t, mµ chØ t×m nh÷ng nguyªn lý chung ®Ó chia viÖc gi¶i bµi to¸n thµnh nh÷ng viÖc nhá vµ øng dông cña sù ®Ö qui lµ chñ ®Ò chÝnh. Tr­íc hÕt, ta minh häa kü thuËt c¨n b¶n b»ng c¸ch xÐt bµi to¸n m· ®i tuÇn.

VÝ dô 1. Bµi to¸n m· ®i tuÇn.

Cho bµn cê cã n x n «. Mét con m· ®­îc phÐp ®i theo luËt cê vua, ®Çu tiªn nã ®­îc ®Æt ë « cã to¹ ®é x0, y0. C©u hái lµ, nÕu cã th× h·y t×m c¸ch sao cho con m· ®i qua ®­îc tÊt c¶ c¸c « cña bµn cê, mçi « ®i qua ®óng 1 lÇn.

* LuËt ®i cña con m· trªn bµn cê: T¹i mét « cã täa ®é cét x0, hµng y0 (x0,y0) trªn bµn cê, con m· cã 1 trong 8 n­íc ®i nh­ sau:

Page 24: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

24

3 2

4 1

Con M·

5 8

6 7

H×nh 2.1 8 n­íc ®i cã thÓ cña con m· xuÊt ph¸t tõ cét x0, hµng y0.

Víi täa ®é b¾t ®Çu (x0,y0), cã tÊt c¶ 8 « (u,v) mµ con m· cã thÓ ®i ®Õn ®­îc. Chóng ®­îc ®¸nh sè tõ 1 ®Õn 8 trong h×nh 2.1

Ph­¬ng ph¸p ®¬n gi¶n ®Ó cã ®­îc u,v tõ x,y lµ céng c¸c chªnh lÖch cét, dßng vÒ täa ®é ®­îc l­u trong 2 m¶ng a vµ b. C¸c gi¸ trÞ trong 2 m¶ng a, b ®· ®­îc khëi ®éng thÝch øng nh­ sau:

Ta xem nh­ cã 1 hÖ trôc täa ®é (Oxy) ngay t¹i vÞ trÝ (x0,y0) cña con m·, th× :

+ VÞ trÝ 1 mµ con m· cã thÓ ®i ®­îc lµ :

u= x0 + 2, v = y0 + 1

+ VÞ trÝ 2 mµ con m· cã thÓ ®i ®­îc lµ :

u= x0 + 1, v = y0 + 2

+ VÞ trÝ 3 mµ con m· cã thÓ ®i ®­îc lµ :

u= x0 + (-1), v = y0 + 2 ....

Nh­ vËy, m¶ng a vµ b cã gi¸ trÞ sau:

int a[8] = {2, 1, -1,-2, -2, -1, 1, 2};

int b[8] = {1, 2, 2, 1, -1, -2,-2, -1};

* C¸ch biÓu diÔn d÷ liÖu: §Ó m« t¶ ®­îc bµn cê, ta dïng ma trËn BanCo theo khai b¸o sau:

#define KICHTHUOC 5 // KÝch th­íc cña bµn cê

int BanCo[KICHTHUOC][KICHTHUOC]; // Tæ chøc bµn cê lµ m·ng hai chiÒu

Ta thÓ hiÖn mçi « cê b»ng 1 sè nguyªn ®Ó ®¸nh ®Êu « ®ã ®· ®­îc ®i qua ch­a, v× ta muèn lÇn dß theo qu¸ tr×nh di chuyÓn cña con m·. Vµ ta qui ­íc nh­ sau:

BanCo [x][y]=0 ; « (x,y) ch­a ®i qua

BanCo [x][y]=i ; « (x,y) ®· ®­îc ®i qua ë n­íc thø i ( 1 i n2 )

Page 25: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

25

* ThuËt gi¶i:

C¸ch gi¶i quyÕt lµ ta ph¶i xÐt xem cã thÓ thùc hiÖn mét n­íc ®i kÕ n÷a hay kh«ng tõ vÞ trÝ x0, y0. ThuËt gi¶i ®Ó thö thùc hiÖn n­íc ®i kÕ.

void thö n­íc ®i kÕ

{ khëi ®éng c¸c chän lùa cã thÓ ®i

do

{ chän mét n­íc ®i;

if chÊp nhËn ®­îc

{ ghi nhËn n­íc ®i;

if bµn cê ch­a ®Çy

{ thö n­íc ®i kÕ t¹i vÞ trÝ võa ghi nhËn ®­îc;

if kh«ng ®­îc

xãa n­íc ®i tr­íc

}

}

} while (kh«ng ®i ®­îc && cßn n­íc ®i)

}

* NhËn xÐt:

- §Ó x¸c ®Þnh täa ®é (u,v) cña n­íc ®i kÕ ( 0 i 7 ), ta thùc hiÖn nh­ sau:

u = x + a[i] ; v = y + b[i]

- §iÒu kiÖn ®Ó n­íc ®i kÕ chÊp nhËn ®­îc lµ (u,v) ph¶i thuéc bµn cê vµ con m· ch­a ®i qua « ®ã, nghÜa lµ ta ph¶i tháa c¸c ®iÒu kiÖn sau:

(0 u <KICHTHUOC && 0 v< KICHTHUOC && BanCo[u][v]==0 )

- Ghi nhËn n­íc ®i thø n, nghÜa lµ BanCo [u][v] = n; cßn bá viÖc ghi nhËn n­íc ®i lµ BanCo [u][v] = 0

- Bµn cê ®Çy khi ta ®· ®i qua tÊt c¶ c¸c « trong BanCo, lóc ®ã :

n = KICHTHUOC 2.

Qua nhËn xÐt trªn, ta cã thuËt gi¶i chi tiÕt h¬n nh­ sau:

void thu_nuoc_di(int n, int x, int y, int &q) // thö 8 c¸ch ®i cña con m· t¹i

// n­íc thø n xuÊt ph¸t tõ « (x,y)

{ int u,v, q1;

khëi ®éng c¸c chän lùa cã thÓ ®i

Page 26: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

26

do

{ u = x + a[i] ;

v = y + b[i];

if (0 u < KICHTHUOC && 0 v < KICHTHUOC

&& BanCo [u][v] == 0 )

{ BanCo [u][v] = n;

if n < KICHTHUOC*KICHTHUOC

{ thu_nuoc_di (n+1, u, v, q1)

if !q1

BanCo [u][v] = n;

}

else q1=TRUE;

}

} while (q1==FALSE && cßn n­íc ®i)

}

* Ch­¬ng tr×nh m· ®i tuÇn:

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#define KICHTHUOC 5 // KÝch th­íc cña bµn cê

#define TRUE 1

#define FALSE 0 // Tæ chøc bµn cê lµ m·ng hai chiÒu

int BanCo[KICHTHUOC][KICHTHUOC];

// 8 c¸ch ®i cña con m·

int a[8] = {2, 1, -1,-2, -2, -1, 1, 2};

int b[8] = {1, 2, 2, 1, -1, -2,-2, -1};

void innuocdi(int BanCo[][KICHTHUOC])

{

int i, j;

char c;

randomize();

textmode(C80);

textbackground(BLACK);

Page 27: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

27

textcolor(1);

for(i = 0; i < KICHTHUOC; i++)

for(j = 0; j < KICHTHUOC; j++)

{

gotoxy(23+5*j, 8+2*i);

textcolor(1 + random(15));

if(BanCo[i][j] == 0 ? printf(" ") : cprintf("%2d", BanCo[i][j]));

}

}

// Hµm thu_nuoc_di gióp ®i n­íc thø n xuÊt ph¸t tõ «(x, y)

void thu_nuoc_di (int n, int x, int y, int &q)

{

int k=-1,u,v, q1;

do

{ k++; q1=FALSE;

u = x+a[k];

v = y+b[k];

if (u >= 0 && u < KICHTHUOC && v >= 0 && v < KICHTHUOC)

if (BanCo[u][v] ==0)

{

// §i n­íc thø n

BanCo[u][v] = n;

if (n < KICHTHUOC*KICHTHUOC) // D/kien dung, di duoc nuoc cuoi

{ try(n+1, u, v, q1); // Buoc de qui, goi di nuoc n+1

if (q1 == FALSE)

BanCo[u][v]=0;

}

else q1=TRUE;

}

} while (q1==FALSE && k <7);

q=q1;

}

void vebanco()

{

Page 28: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

28

printf("\n\t\t\t CHUONG TRINH MA DI TUAN\n");

printf("\n\t\tKich thuoc ban co %dx%d", KICHTHUOC, KICHTHUOC);

printf("\n\n\t\t 0 1 2 3 4 5 6 7"); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 0 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 1 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 2 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 3 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 4 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 5 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 6 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 7 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");

}

void main()

{

int i, j,q;

clrscr();

vebanco();

for(i = 0; i < KICHTHUOC; i++)

for(j = 0; j < KICHTHUOC; j++)

BanCo[i][j] = 0;

// Chon nuoc di dau tien va goi ham de qui de di nuoc thu hai

BanCo[0][0] = 1;

thu_nuoc_di(2, 0, 0,q);

if (q==FALSE)

printf ("\n Khong co loi giai");

else innuocdi(BanCo);

}

Page 29: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

29

* B¶ng sau ®©y cho ta mét sè lêi gi¶i t­¬ng øng víi c¸c vÞ trÝ ®Çu vµ kÝch th­íc cña bµn cê:

- KÝch th­íc bµn cê = 5

+ VÞ trÝ b¾t ®Çu (1,1) + VÞ trÝ b¾t ®Çu (3,3)

1 6 15 10 21 23 10 15 4 25

14 9 20 5 16 16 5 24 9 14

19 2 7 22 11 11 22 1 18 3

8 13 24 17 4 6 17 20 13 8

25 18 3 12 23 21 12 7 2 19

- KÝch th­íc bµn cê = 8

+ VÞ trÝ b¾t ®Çu (1,1)

1 60 39 34 31 18 9 64

38 35 32 61 10 63 30 17

59 2 37 40 33 28 19 8

36 49 42 27 62 11 16 29

43 58 3 50 41 24 7 20

48 51 46 55 26 21 12 15

57 44 53 4 23 14 25 6

52 47 56 45 54 5 22 13

VÝ dô 2: Bµi to¸n t¸m hoµng hËu.

Bµi to¸n t¸m hµng hËu ®­îc m« t¶ nh­ sau: t¸m hoµng hËu ®­îc ®Æt lªn bµn cê vua sao cho kh«ng bµ nµo cã thÓ chiÕm lÊy c¸c bµ kh¸c.

* Theo luËt cña cê vua, mét hoµng hËu cã thÓ chiÕm lÊy c¸c qu©n kh¸c n»m ë cïng dßng, hay cïng cét, hay cïng c¸c ®­êng chÐo. Do ®ã, ta suy ra r»ng mçi cét chØ cã thÓ chøa mét hoµng hËu vµ chØ 1 mµ th«i. Ta qui ­íc hoµng hËu thø 0 sÏ ®Æt ë cét 0, hoµng hËu thø 1 sÏ ®Æt ë cét 1,.., hoµng hËu thø 7 sÏ ®Æt ë cét 7. Nh­ vËy, viÖc chän chç cho hoµng hËu thø i lµ t×m vÞ trÝ dßng j cã thÓ cã trªn cét i.

Sau ®©y lµ h×nh minh häa cho mét lêi gi¶i cña bµi to¸n: (0 6 4 7 1 3 5 2)

Page 30: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

30

0 Q

1 Q

2 Q

3 Q

4 Q

5 Q

6 Q

7 Q

* C¸ch biÓu diÔn d÷ liÖu:

Bµn cê 8x8 cã 8 hµng, 8 cét, 15 ®­êng chÐo xu«i, 15 ®­êng chÐo ng­îc, ta qui ­íc 1 con hËu chØ cã thÓ ®Æt trªn 1 cét i vµ hµng j nµo ®ã cña bµn cê. Khi ®ã, c¸c vÞ trÝ trªn ®­êng chÐo xu«i vµ ®­êng chÐo ng­îc cña bµn cê kh«ng thÓ dïng ®Ó ®Æt c¸c con hËu kh¸c. Ta l­u ý r»ng c¸c phÇn tö cïng n»m trªn 1 ®­êng chÐo xu«i cña bµn cê tháa m·n biÓu thøc sau (cét i - hµng j + 7 = h»ng sè), vµ c¸c phÇn tö cïng n»m trªn 1 ®­êng chÐo ng­îc cña bµn cê tháa m·n biÓu thøc sau (cét i + hµng j = h»ng sè) nh­ h×nh sau:

®­êng chÐo xu«i ®­êng chÐo ng­îc

14

13

12

11

10

9

8

76543210

Haøng j:0

1

2

3

4

5

6

7

§­êngchÐo xu«i

0

1

2

3

4

5

6

7 8 9 10 11 12 13 14

§­êngchÐo ng­îc

Nh­ vËy, ta sÏ x©y dùng cÊu tróc d÷ liÖu sau ®Ó l­u tr÷ d÷ liÖu:

int hang_trong[8] ; // hµng trèng cßn cã thÓ ®Æt hoµng hËu

int cheo_xuoi[15];

// duong cheo xuoi co the dat hoang hau. Cac phan tu tren duong cheo xuoi //thoa (cot i -hang j +7 = hangso)

int cheo_nguoc[15];

Page 31: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

31

// duong cheo nguoc co the dat hoang hau. Cac phan tu tren duong cheo // nguoc thoa (cot i +hang j = hangso)

int loi_giai[8] ; // loi giai chua ket qua.

víi:

- hang_trong[j] = TRUE nghÜa lµ ch­a cã con hËu nµo trªn hµng thø j

- cheo_xuoi[k] = TRUE nghÜa lµ ch­a cã con hËu nµo trªn ®­êng chÐo xu«i thø k

- cheo_nguoc[k] = TRUE nghÜa lµ ch­a cã con hËu nµo trªn ®­êng chÐo ng­îc thø k

VÝ dô:

C¸c vÞ trÝ trªn ®­êng chÐo xu«i thø 12 : 5 - 0 +7 = 6 -1 +7 = 7 -2 + 7 = 12

C¸c vÞ trÝ trªn ®­êng chÐo ng­îc thø 12: 7 + 5 = 6 + 6 = 5 + 7 = 12

-loi_giai[i] chØ vÞ trÝ cña hoµng hËu ë cét thø i

* ThuËt gi¶i:

void chon_vi_tri (int i) // t×m vÞ trÝ thÝch hîp cho hoµng hËu thø i

{ khëi ®éng c¸c vÞ trÝ cã thÓ chän cho hoµng hËu thø i

do

{ chän vÞ trÝ kÕ;

if an toµn

{ ®Æt hoµng hËu

if ch­a ®Æt hÕt 8 hoµng hËu

{ chon_vi_tri (i+1);

if kh«ng thµnh c«ng

dêi hoµng hËu ®i

}

}

} while (kh«ng thµnh c«ng && ch­a ®Æt hÕt c¸c vÞ trÝ)

}

* NhËn xÐt: Víi c¸c d÷ liÖu ®· cho, th×:

- §iÒu kiÖn an toµn lµ ®iÒu kiÖn sao cho hoµng hËu thø i (cét i) n»m trªn hµng j sao cho hµng j vµ c¸c ®­êng chÐo ®i qua « (j,i) ch­a bÞ chiÕm gi÷ bëi c¸c hoµng hËu kh¸c; nghÜa lµ nã ph¶i tháa biÓu thøc logic:

hang_trong[j] && cheo_xuoi [i-j+7] && cheo_nguoc[i+j]

- §Æt hoµng hËu sÏ ®­îc thÓ hiÖn bëi:

Page 32: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

32

loi_giai[i] = j ;

hang_trong[j] = FALSE ; cheo_xuoi [i-j+7] =FALSE; cheo_nguoc[i+j] = FALSE;

- Dêi hoµng hËu ®i sÏ ®­îc thÓ hiÖn bëi:

hang_trong[j]=TRUE ; cheo_xuoi [i-j+7] =TRUE;

cheo_nguoc[i+j] = TRUE;

- §iÒu kiÖn ch­a ®Æt hÕt c¸c hoµng hËu : i < 7

- §Ó biÕt ®­îc ®Æt hoµng hËu thø i cã thµnh c«ng hay kh«ng, ta dïng thªm 1 tham sè h×nh thøc biÕn q. NÕu ®Æt thµnh c«ng th× q = TRUE, ng­îc l¹i q=FALSE.

* Ch­¬ng tr×nh: Qua nhËn xÐt trªn, ta cã ch­¬ng tr×nh cña bµi to¸n 8 hoµng hËu nh­ sau:

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#define TRUE 1

#define FALSE 0

// tim 1 loi giai cho bai toan 8 hoang hau

int hang_trong[8] ; // hµng trong con co the dat hoang hau

int cheo_xuoi[15]; // duong cheo xuoi co the dat hoang hau. Cac phan tu

// tren duong cheo xuoi thoa (cot i -hang j +7 = hangso)

int cheo_nguoc[15]; // duong cheo nguoc co the dat hoang hau. Cac phan tu

// tren duong cheo nguoc thoa (cot i +hang j = hangso)

int loi_giai[8] ; // loi giai chua ket qua.

int i, q;

void in_loigiai(int *loigiai)

{

int i, j;

char c;

randomize();

textmode(C80);

textbackground(BLACK);

clrscr();

textcolor(1 + random(15));

Page 33: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

33

printf("\n\t\t\t CHUONG TRINH 8 HOANG HAU\n");

printf("\n\n\t\t 0 1 2 3 4 5 6 7 ");

printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 0 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 1 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 2 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 3 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 4 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 5 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 6 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 7 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");

for(i = 0; i < 8; i++)

{

gotoxy(24+5*i,8+2*loigiai[i] );

textcolor(1 + random(15));

cprintf("Q");

}

gotoxy(13, 25);

printf("Nhan phim bat ky de thoat ...");

getche();

}

void chon_vi_tri ( int i, int &q)

{ int j= -1;

do

{

j++;

q=FALSE;

if (hang_trong[j] && cheo_xuoi[i-j+7] && cheo_nguoc[i+j])

{ loi_giai[i]= j;

hang_trong[j]=FALSE; cheo_xuoi[i-j+7] = FALSE;

Page 34: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

34

cheo_nguoc[i+j]=FALSE;

if (i < 7)

{

chon_vi_tri (i+1,q);

if (q==FALSE)

{

hang_trong[j]=TRUE; cheo_xuoi[i-j+7] = TRUE;

cheo_nguoc[i+j]=TRUE;

}

}

else q=TRUE;

}

} while ((q==FALSE) && (j<7)); //Ch­a thµnh c«ng vµ ch­a hÕt vÞ trÝ // th× tiÕp tôc

}

void main (void)

{

/*Khoi dong tat ca cac hang, duong cheo xuoi, duong cheo nguoc deu co the dat hoang hau */

for(i = 0; i < 8; i++)

hang_trong[i] = TRUE;

for(i = 0; i < 15; i++)

{

cheo_xuoi [i] = TRUE;

cheo_nguoc[i] = TRUE;

}

// Goi ham de qui de bat dau dat HoangHau0 (hoang hau o cot 0)

chon_vi_tri (0,q);

in_loigiai(loi_giai);

}

L­u ý:

- Trªn ®©y lµ thuËt gi¶i t×m mét lêi gi¶i cho bµi to¸n 8 hoµng hËu. Tuy nhiªn, ta cã thÓ më réng ®Ó cã thÓ t×m mäi lêi gi¶i cho bµi to¸n. S¬ ®å tæng qu¸t cho gi¶i thuËt back-tracking ®Ó t×m mäi lêi gi¶i cho bµi to¸n:

Page 35: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

35

void chon_vi_tri (int i)

{ int j;

for (j=0; j < m; j++)

{ chän b­íc thø j;

if ®­îc

{ ghi nhËn

if i < n

chon_vi_tri (i+1) ;

else in lêi gi¶i;

bá viÖc ghi nhËn;

}

}

}

- Ch­¬ng tr×nh t×m mäi lêi gi¶i cho bµi to¸n t¸m hoµng hËu:

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#define TRUE 1

#define FALSE 0 // tim tat ca loi giai cho bai toan 8 hoang hau int hang_trong[8] ; // cot trong con co the dat hoang hau int cheo_xuoi[15]; // duong cheo xuoi co the dat hoang hau

int cheo_nguoc[15]; // duong cheo nguoc co the dat hoang hau

int loi_giai[8] ; // loi giai chua ket qua

int i, q;

int SoLoiGiai =0;

void in_loigiai(int *loigiai)

{

int i, j;

char c;

randomize();

textmode(C80);

textbackground(BLACK);

clrscr();

textcolor(1 + random(15));

Page 36: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

36

cprintf("\n CHUONG TRINH 8 HOANG HAU\n ");

printf("\n Loi giai thu %d", ++SoLoiGiai);

printf("\n\n\t\t 0 1 2 3 4 5 6 7 ");

printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 0 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 1 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 2 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 3 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 4 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 5 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 6 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ "); printf("\n\t\t 7 ---------------------------------------- "); printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");

for(i = 0; i < 8; i++)

{

gotoxy(24+5*i,8+2*loigiai[i] );

textcolor(1 + random(15));

cprintf("Q");

}

gotoxy(13, 25);

printf("Nhan phim <ESC> de thoat, nhan phim bat ky de tiep tuc ...");

c = getche();

if(c == 27)

exit(1);

}

void chon_vi_tri( int i)

{ int j;

for (j=0; j<8; j++)

{

if (hang_trong[j] && cheo_xuoi[i-j+7] && cheo_nguoc[i+j])

{ loi_giai[i]= j;

Page 37: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

37

hang_trong[j]=FALSE; cheo_xuoi[i-j+7] = FALSE;

cheo_nguoc[i+j]=FALSE;

if (i < 7)

chon_vi_tri (i+1);

else in_loigiai(loi_giai);

hang_trong[j]=TRUE; cheo_xuoi[i-j+7] = TRUE; cheo_nguoc[i+j]=TRUE;

}

} // for

} // chon_vi_tri

void main(void)

{

/* Khoi dong tat ca cac cot, duong cheo xuoi, duong cheo nguoc deu co the dat hoang hau */

for(i = 0; i < 8; i++)

hang_trong[i] = TRUE;

for(i = 0; i < 15; i++)

{

cheo_xuoi [i] = TRUE;

cheo_nguoc[i] = TRUE;

}

// Goi ham de qui de bat dau dat HoangHau0 (hoang hau o hang 0)

chon_vi_tri (0);

}

Page 38: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

38

Bµi tËp

1. ViÕt mét hµm ®Ö quy vµ kh«ng ®Ö quy ®Ó tÝnh gi¸ trÞ cña hµm

{ 1 , n=0

Pn(x)= x , n =1

Pn-1(x) - Pn-2 (x) , n >= 2

2. ViÕt ch­¬ng tr×nh Th¸p Hµ Néi.

M« t¶ ch­¬ng tr×nh Th¸p Hµ Néi : Ta cã 3 cäc A, B, C vµ n dÜa ®­îc xÕp trªn cäc A sao cho dÜa nhá trªn dÜa lín.

H·y viÕt ch­¬ng tr×nh di chuyÓn n dÜa tõ cäc A sang cäc C víi cäc B lµm trung gian, theo ®iÒu kiÖn :

- Mçi lÇn chØ di chuyÓn mét dÜa - Bao giê dÜa nhá còng n»m trªn dÜa lín

3. ViÕt ch­¬ng tr×nh t×m mäi lêi gi¶i cho bµi to¸n m· ®i tuÇn.

Page 39: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

39

ch­¬ng Iii

Danh s¸ch tuyÕn tÝnh

KH¸I NIÖM :

Danh s¸ch lµ mét tËp hîp n phÇn tö a0, a1, a2,....., an-1, mçi phÇn tö cã kiÓu ®¬n gi¶n hoÆc kiÓu d÷ liÖu cã cÊu tróc.

TÝnh tuyÕn tÝnh cña danh s¸ch thÓ hiÖn ë sù rµng buéc gi÷a c¸c phÇn tö trong danh s¸ch víi nhau, vÝ dô nh­ tõ vÞ trÝ cña phÇn tö ai ta sÏ t×m ®­îc gi¸ trÞ cña phÇn tö ai+1.

I. §Þnh nghÜa:

Danh s¸ch tuyÕn tÝnh lµ 1 d·y c¸c phÇn tö cã cïng kiÓu d÷ liÖu ®­îc s¾p xÕp liªn tiÕp nhau trong bé nhí.

0100

0102 0 int

0104 1 danh s¸ch n phÇn tö

n-1

Bé nhí

®Æc ®iÓm cña danh s¸ch tuyÕn tÝnh:

- KÝch th­íc cña danh s¸ch sÏ ®­îc cÊp ph¸t theo khai b¸o.

- C¸c phÇn tö cña danh s¸ch n»m liªn tôc nhau trong bé nhí, gi÷a c¸c phÇn tö nµy kh«ng cã kho¶ng trèng.

- Tiªu biÓu cho danh s¸ch ®Æc lµ d·y (array). §Ó cµi ®Æt danh s¸ch tuyÕn tÝnh, ta dïng m¶ng 1 chiÒu.

Khai b¸o: Ta khai b¸o cÊu tróc list lµ mét mÈu tin (struct) cã 2 field:

- n : cho biÕt sè phÇn tö hiÖn cã trong danh s¸ch. NÕu n ==0 th× cã nghÜa lµ danh s¸ch rçng.

- danhsach : lµ m¶ng 1 chiÒu, mçi phÇn tö cña m¶ng lµ 1 phÇn tö trong danh s¸ch.

#define MAXLIST 100

typedef struct list

{ int n; // sè nót cña danh s¸ch

int danhsach[MAXLIST]; // danh s¸ch lµ m·ng 1 chiÒu

Page 40: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

40

};

list ds; // biÕn ds thuéc kiÓu struct list

VÝ dô: Khai b¸o 1 danh s¸ch hä tªn häc viªn cña 1 líp häc, cã tèi ®a 50 häc viªn.

#define MAXLIST 50

typedef struct list

{ int n;

char dshv[MAXLIST][30]; // hä tªn häc viªn cã tèi ®a 30 ký tù

};

list ds;

II. C¸c phÐp to¸n trªn danh s¸ch tuyÕn tÝnh:

§Ó ®¬n gi¶n, c¸c phÐp to¸n sau ®©y sÏ ®­îc thao t¸c trªn danh s¸ch c¸c sè nguyªn víi khai b¸o nh­ sau:

#define MAXLIST 100

typedef struct list

{ int n; // sè nót cña danh s¸ch

int nodes[MAXLIST]; // danh s¸ch lµ m·ng 1 chiÒu

};

struct list ds; // biÕn ds thuéc kiÓu struct list

1. PhÐp to¸n Empty: kiÓm tra xem danh s¸ch cã rçng hay kh«ng?

int Empty(struct list plist)

{ return (plist.n==0 ? TRUE : FALSE);

}

2. PhÐp to¸n Full: kiÓm tra xem danh s¸ch ®· ®Çy ch­a?

int Full(struct list plist)

{

return (plist.n==MAXLIST ? TRUE : FALSE);

}

3. PhÐp thªm vµo : Thªm mét phÇn tö cã néi dung lµ info vµo vÞ trÝ thø i cña danh s¸ch.

NÕu i ==0 : thªm phÇn tö vµo ®Çu danh s¸ch

NÕu i ==ds.n+1 : thªm phÇn tö vµo cuèi danh s¸ch.

Page 41: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

41

L­u ý:

Khi thªm mét phÇn tö vµo danh s¸ch, ta ph¶i kiÓm tra xem danh s¸ch ®· ®Çy hay ch­a?

void Insert_item(struct list &plist, int i, int info)

{

int j;

if(i < 0 || i > plist.n+1)

printf("Vi tri chen khong phu hop.");

else

if(Full(plist))

printf("Danh sach bi day.");

else

{ if (i==0) i=1;

for(j = plist.n -1; j >= i-1; j--)

plist.nodes[j+1] = plist.nodes[j];

plist.nodes[i-1] = info;

plist.n ++;

}

}

4. PhÐp lo¹i bá : Lo¹i bá phÇn tö thø i khái danh s¸ch tuyÕn tÝnh. Khi lo¹i bá 1 phÇn tö th× danh s¸ch ph¶i cã Ýt nhÊt mét phÇn tö.

void Delete_item (struct list &plist, int i)

{

int j;

int temp;

if(i <= 0 || i > plist.n)

printf("Vi tri xoa khong phu hop.");

else

if(Empty(plist))

printf("Danh sach khong co phan tu.");

else

{

for(j = i; j< plist.n ; j++)

plist.nodes[j-1] = plist.nodes[j];

plist.n--;

}

}

* Muèn lo¹i bá tÊt c¶ c¸c phÇn tö trong danh s¸ch, ta chØ cÇn cho ds.n=0

Page 42: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

42

5. DuyÖt danh s¸ch: duyÖt tõ ®Çu cho ®Õn cuèi danh s¸ch, mçi phÇn tö ®­îc duyÖt qua 1 lÇn. Gi¶ sö ta duyÖt danh s¸ch ®Ó in gi¸ trÞ c¸c phÇn tö.

void Traverse(struct list plist)

{

int i;

if(plist.n == 0)

{

printf("\n Danh sach khong co phan tu");

return;

}

for(i = 0; i < plist.n; i++)

printf("%7d", plist.nodes[i]);

}

6. T×m kiÕm: t×m vÞ trÝ ®Çu tiªn cña phÇn tö cã gi¸ trÞ x trong danh s¸ch plist. NÕu kh«ng cã x trong plist th× hµm Search_info sÏ tr¶ vÒ gi¸ trÞ -1.

int Search_info(struct list plist, int info)

{

int vitri = 0;

while( vitri < plist.n && plist.nodes[vitri] != info )

vitri++;

return(vitri==plist.n ? -1 : vitri+1);

}

L­u ý: §Ó nhËp danh s¸ch, ta cã thÓ dïng gi¶i thuËt sau:

void Create_list(struct list &plist)

{ int i;

printf("\nSo phan tu cua danh sach :");

scanf("%d", &plist.n);

for (i=0; i< plist.n; i++)

{ printf("List[%d] =", i+1);

scanf("%d",&plist.nodes[i]);

}

}

NhËn xÐt : Danh s¸ch ®Æc dïng ph­¬ng ph¸p truy xuÊt trùc tiÕp nªn thêi gian truy xuÊt nhanh, nh­ng hiÖu qu¶ sö dông bé nhí thÊp. Danh s¸ch ®Æc kh«ng phï hîp víi phÐp thªm vµo vµ lo¹i bá v× mçi lÇn thªm vµo vµ lo¹i bá th× chóng ta ph¶i ®æi chç nhiÒu lÇn. §Æc biÖt tr­êng hîp xÊu nhÊt lµ khi thªm vµo vµ lo¹i bá ë ®Çu danh s¸ch

Page 43: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

43

KÕt luËn : Danh s¸ch ®Æc kh«ng nªn sö dông cho c¸c danh s¸ch hay bÞ biÕn ®éng. Cßn ®èi víi nh÷ng danh s¸ch th­êng bÞ biÕn ®éng th× ng­êi ta chän cÊu tróc lµ danh s¸ch liªn kÕt.

VÝ dô: T¹o mét menu cho phÐp ta thùc hiÖn c¸c phÐp to¸n sau trªn danh s¸ch c¸c sè nguyªn:

1. T¹o danh s¸ch

2. LiÖt kª danh s¸ch trªn mµn h×nh

3. Thªm mét phÇn tö cã gi¸ trÞ info t¹i vÞ trÝ thø i

- NÕu i ==0 : thªm phÇn tö vµo ®Çu danh s¸ch

- NÕu i ==ds.n+1 : thªm phÇn tö vµo cuèi danh s¸ch.

4. Xãa phÇn tö ®Çu tiªn cã gi¸ trÞ info trong danh s¸ch

5. Xãa toµn bé danh s¸ch. Tr­íc khi xãa hái l¹i ng­êi sö dông cã muèn xãa hay kh«ng? NÕu ng­êi sö dông ®ång ý "C" th× míi xãa.

* Ch­¬ng tr×nh :

#include <stdio.h>

#include <conio.h>

#include <ctype.h>

#define MAXLIST 100 // so phan tu toi da trong danh sach

#define TRUE 1

#define FALSE 0

typedef struct list

{

int n;

int nodes[MAXLIST];

};

// Phep toan empty: kiem tra danh sach co bi rong khong

int empty(struct list plist)

{

return(plist.n == 0 ? TRUE : FALSE);

}

// Phep toan full: kiem tra danh sach bi day khong

int full(struct list plist)

{

return(plist.n == MAXLIST ? TRUE : FALSE);

}

// Tao danh sach

Page 44: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

44

void create_list(struct list &plist)

{ int i;

printf("\nSo phan tu cua danh sach :");

scanf("%d", &plist.n);

for (i=0; i< plist.n; i++)

{ printf("List[%d] =", i+1);

scanf("%d",&plist.nodes[i]);

}

}

// Tac vu insert_item: chen nut co noi dung info vao vi tri i

// i==0 : them vao dau danh sach

// i==plist->n +1 : them vao cuoi danh sach

void insert_item(struct list &plist, int i, int info)

{

int j;

if(i < 0 || i > plist.n+1)

printf("Vi tri chen khong phu hop.");

else

if(full(plist))

printf("Danh sach bi day.");

else

{ if (i==0) i=1;

for(j = plist.n -1; j >= i-1; j--)

plist.nodes[j+1] = plist.nodes[j];

plist.nodes[i-1] = info;

plist.n ++;

}

}

// Tac vu delete_item: xoa nut tai vi tri i trong danh sach

void delete_item (struct list &plist, int i)

{

int j;

int temp;

if(i <= 0 || i > plist.n)

printf("Vi tri xoa khong phu hop.");

else

if(empty(plist))

Page 45: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

45

printf("Danh sach khong co phan tu.");

else

{

for(j = i; j< plist.n ; j++)

plist.nodes[j-1] = plist.nodes[j];

plist.n--;

}

}

// Tac vu clearlist: xoa tat ca cac nut trong danh sach

void clearlist(struct list &plist)

{

plist.n = 0;

}

// Tac vu traverse: duyet danh sach cac so nguyen

void traverse(struct list plist)

{

int i;

if(plist.n == 0)

{

printf("\n Danh sach khong co phan tu");

return;

}

for(i = 0; i < plist.n; i++)

printf("%7d", plist.nodes[i]);

}

/* Phep toan search: tim kiem tuyen tinh, neu khong tim thay ham nay tra

ve -1, neu tim thay ham nay tra ve vi tri tim thay */

int search_info(struct list plist, int info)

{

int vitri = 0;

while( vitri < plist.n && plist.nodes[vitri] != info )

vitri++;

return(vitri==plist.n ? -1 : vitri+1);

}

int menu()

{ int chucnang;

clrscr();

Page 46: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

46

// menu chinh cua chuong trinh

printf("\n\n CHUONG TRINH QUAN LY DANH SACH CAC SO \n");

printf(" Cac chuc nang cua chuong trinh:\n");

printf(" 1: Nhap danh sach\n");

printf(" 2: Xem danh sach \n");

printf(" 3: Them mot so vao vi tri thu i\n");

printf(" 4: Xoa phan tu dau tien co tri info\n");

printf(" 5: Xoa toan bo danh sach\n");

printf(" 0: Ket thuc chuong trinh\n");

printf(" Chuc nang ban chon: ");

do

scanf("%d", &chucnang);

while (chucnang<0 || chucnang >5);

return chucnang;

}

void main()

{

struct list ds;

int chucnang, vitri, info;

char c;

ds.n=0;

do

{

clrscr();

chucnang=menu();

switch(chucnang)

{

case 1:

{

printf("\nNhap danh sach: ");

create_list(ds);

break;

}

case 2:

{

printf("\nDanh sach so: ");

traverse(ds);

Page 47: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

47

getche();

break;

}

case 3:

{

printf("\nVi tri them (1, 2, ...): ");

scanf("%d", &vitri);

printf("Gia tri: ");

scanf("%d", &info);

insert_item(ds, vitri, info);

getche();

break;

}

case 4:

{

printf("\nGia tri so can xoa: ");

scanf("%d", &info);

vitri = search_info(ds, info);

if(vitri == -1)

printf("Khong co so %d trong danh sach", info);

else

delete_item(ds, vitri);

getche();

break;

}

case 5:

{

printf("\nBan co chac muon xoa hay khong (c/k):");

c = toupper(getche());

if( c == 'C')

clearlist(ds);

break;

}

}

} while(chucnang != 0);

}

Page 48: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

48

III. stack (chång):

III.1. Kh¸i niÖm:

Stack lµ mét danh s¸ch mµ viÖc thªm vµo vµ lo¹i bá chØ diÔn ra cïng mét ®Çu cña danh s¸ch, tøc lµ theo c¬ chÕ LIFO (Last In First Out). Stack gåm nhiÒu phÇn tö cã cïng kiÓu d÷ liÖu, phÇn tö trªn cïng Stack lu«n lu«n cã mét con trá chØ tíi ta gäi lµ Stack Pointer (ký hiÖu: sp).

§Ó t¹o Stack ta cã hai c¸ch : danh s¸ch tuyÕn tÝnh (m¶ng) hoÆc danh s¸ch liªn kÕt (con trá). Trong ch­¬ng nµy, ta chØ quan t©m ®Õn viÖc t¹o Stack b»ng danh s¸ch tuyÕn tÝnh.

- Stack cã 2 phÐp to¸n chÝnh :

* Push : thªm mét phÇn tö vµo ®Çu Stack

* Pop : xãa mét phÇn tö khái Stack, tr¶ cho ch­¬ng tr×nh gäi gi¸ trÞ cña phÇn tö võa xãa.

D­íi ®©y lµ h×nh minh häa cho c¸c phÐp to¸n push, pop trªn Stack.

20

15

10

5

0

1

2

3sp

push(20) 20

15

10

5

0

1

2

3

sp204

(a) (b)

20

15

10

5

0

1

2

3

sp204

(d)

20

15

10

5

0

1

2

3

204

(c)

1sp

5

push(1) pop()

20

15

10

5

0

1

2

3sp

push(20) 20

15

10

5

0

1

2

3

sp204

(a) (b)

20

15

10

5

0

1

2

3

sp204

(d)

20

15

10

5

0

1

2

3

204

(c)

1sp

5

push(1) pop()

* L­u ý: Ta khai b¸o biÕn st cã kiÓu cÊu tróc stack nh­ sau:

#define STACKSIZE 100

#define TRUE 1

#define FALSE 0

Page 49: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

49

struct stack

{

int sp;

int nodes[STACKSIZE];

} st;

III.2. C¸c phÐp to¸n trªn stack:

a. PhÐp to¸n push : thªm mét phÇn tö cã gi¸ trÞ x vµo ®Çu stack

void push (struct stack &st, int x)

{

if(st.sp == STACKSIZE-1)

{

printf("%s", "stack bi day");

exit(1);

}

else

st.nodes[++(st.sp)] = x;

}

b. PhÐp to¸n pop : lo¹i bá phÇn tö khái Stack vµ tr¶ vÒ gi¸ trÞ cña phÇn tö võa xãa; tr­íc khi xãa, ta ph¶i kiÓm tra Stack cã kh¸c rçng hay kh«ng.

int pop(struct stack &st)

{

if(empty(st))

{

printf("%s", "stack bi rong");

exit(1);

}

return(st.nodes[(st.sp)--]);

}

øng dông cña Stack:

- Stack th­êng ®­îc dïng trong c¸c bµi to¸n cã c¬ chÕ LIFO (vµo sau ra tr­íc)

- Stack còng ®­îc dïng trong c¸c bµi to¸n gì ®Ö qui (chuyÓn mét gi¶i thuËt ®Ö qui thµnh gi¶i thuËt kh«ng ®Ö qui)

III.3. VÝ dô:

a. ViÕt ch­¬ng tr×nh ®æi sè nguyªn kh«ng ©m ë hÖ thËp ph©n sang sè ë hÖ nhÞ ph©n.

Page 50: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

50

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#define STACKSIZE 100

#define TRUE 1

#define FALSE 0

struct stack

{

int sp;

int nodes[STACKSIZE];

};

int empty(struct stack st)

{

if(st.sp == -1)

return(TRUE);

else

return(FALSE);

}

void push(struct stack &st, int x)

{

if(st.sp == STACKSIZE-1)

{

printf("%s", "stack bi day");

exit(1);

}

else

st.nodes[++(st.sp)] = x;

}

int pop(struct stack &st)

{

if(empty(st))

{

printf("%s", "stack bi rong");

exit(1);

}

return(st.nodes[(st.sp)--]);

}

Page 51: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

51

void main()

{

struct stack st;

int sodu;

long int so;

char c;

clrscr();

do

{

st.sp =- 1; // khoi dong stack

printf("\n\nNhap vao mot so thap phan: ");

scanf("%lD", &so);

do

{

sodu = so % 2;

push(st, sodu); // push so du vao stack

so = so / 2;

} while (so != 0);

printf("So da doi la: ");

while(!empty(st))

printf("%d", pop(st)); // pop so du ra khoi stack

printf("\n\nBan co muon tiep tuc khong? (c/k): ");

c = getche();

} while(c == 'c' || c == 'C');

}

b. ViÕt ch­¬ng tr×nh tÝnh trÞ mét biÓu thøc d¹ng hËu tè (PostFix), biÕt r»ng mçi sè h¹ng lµ 1 ký sè vµ c¸c to¸n tö trong biÓu thøc gåm cã: céng(+), trõ (-), nh©n (*), chia (/), lòy thõa (^).

D¹ng hËu tè cña biÓu thøc cã d¹ng nh­ sau:

82- = 6

84-21+^ = 64

23+3^ = 125

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <math.h>

#define TOIDA 80

Page 52: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

52

#define TRUE 1

#define FALSE 0

// Khai bao stack chua cac toan hang

struct stack

{

int sp;

double nodes[TOIDA];

} st;

int empty(struct stack st)

{

if (st.sp == -1)

return(TRUE);

else

return(FALSE);

}

void push(struct stack &st, double x)

{

if(st.sp == TOIDA-1)

{

printf("%s", "stack bi day");

exit(1);

}

else

st.nodes[++(st.sp)] = x;

}

double pop(struct stack &st)

{

if(empty(st))

{

printf("%s", "Bieu thuc sai nen khong the tinh");

getch();

exit(1);

}

else

return(st.nodes[st.sp--]);

}

/* Ham tinh: tÝnh trÞ cña hai to¸n h¹ng toanhang1 va toanhang2 qua

phÐp to¸n toantu */

Page 53: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

53

double tinh(int toantu, double toanhang1, double toanhang2)

{

switch(toantu)

{

case '+':

return(toanhang1 + toanhang2); break;

case '-':

return(toanhang1 - toanhang2); break;

case '*':

return(toanhang1 * toanhang2); break;

case '/':

return(toanhang1 / toanhang2); break;

case '^':

return(pow(toanhang1, toanhang2)); break;

default:

printf("%s", "toan tu khong hop le");

exit(1);

}

}

// Hµm dinhtri: tÝnh mét biÓu thøc postfix

double dinhtri(char bieuthuc[])

{

int c, i;

double toanhang1, toanhang2, tri;

st.sp = -1; // khoi dong stack

for(i = 0; (c = bieuthuc[i]) != '\0'; i++)

if(c>='0' && c<='9') // c la toan hang

push(st, (double)(c-'0'));

else // c la toan tu

{

toanhang2 = pop(st);

toanhang1 = pop(st);

tri = tinh(c, toanhang1, toanhang2); // tinh ket qua trung gian

push(st, tri);

}

return(pop(st));

}

Page 54: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

54

void main()

{

char c, bieuthuc[TOIDA];

clrscr();

do

{

printf("\n\nNhap bieu thuc postfix can dinh tri: ");

gets(bieuthuc);

double ketqua = dinhtri(bieuthuc) ;

if (empty(st))

printf("Bieu thuc %s co tri la %5.2f", bieuthuc, ketqua);

else

printf("Bieu thuc sai nen khong the tinh");

printf("\n\nTiep tuc khong ? (c/k): ");

c = getche();

} while(c == 'c' || c == 'C');

}

IV. QUEUE (hµng ®îi):

IV.1. Kh¸i niÖm:

Queue lµ mét danh s¸ch h¹n chÕ mµ viÖc thªm vµo ®­îc thùc hiÖn ë ®Çu danh s¸ch, vµ viÖc lo¹i bá ®­îc thùc hiÖn ë ®Çu cßn l¹i (FIFO - First In First Out). Queue chøa c¸c phÇn tö cã cïng kiÓu d÷ liÖu. Queue còng cã thÓ ®­îc tæ

chøc theo danh s¸ch tuyÕn tÝnh hoÆc danh s¸ch liªn kÕt. ë ®©y, ta chØ tæ chøc queue theo danh s¸ch tuyÕn tÝnh.

- VÞ trÝ ®Ó lo¹i bá phÇn tö ®­îc gäi lµ Front

- VÞ trÝ ®Ó thªm vµo ®­îc gäi lµ Rear

Queue cã hai phÐp to¸n chÝnh:

- Insert_queue : thªm mét phÇn tö vµo hµng ®îi; khi thªm ta ph¶i l­u ý xem hµng ®îi bÞ trµn hay bÞ ®Çy ®Ó xö lý cho thÝch hîp.

+ Hµng ®îi bÞ trµn : lµ tr­êng hîp khi Rear = QUEUESIZE-1 (=n) vµ Front > 0, tøc lµ kh«ng thÓ thªm phÇn tö míi vµo cuèi hµng. §Ó kh¾c phôc tr­êng hîp nµy, ta cã thÓ dïng mét trong 2 c¸ch:

Di chuyÓn tÞnh tiÕn tõng phÇn tö lªn ®Ó cã Front = 0 vµ Rear < QUEUESIZE-1

(tr­êng hîp nµy Front lu«n nhá h¬n Rear)

Di chuyÓn vßng : cho Rear = 0, Front gi÷ nguyªn

(tr­êng hîp nµy Front cã lóc nhá h¬n, cã lóc lín h¬n Rear )

Page 55: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

55

C

B

A

Rear

Front

C

B

A

Rear

Front Di chuyÓntÞnh tiÕn

C

B

A

Rear

Front

Di chuyÓnvßng

0

1

2

3

n

C

B

A

Rear

Front

C

B

A

Rear

Front Di chuyÓntÞnh tiÕn

C

B

A

RearRear

FrontFront

Di chuyÓnvßng

0

1

2

3

n

Hµng ®îi bÞ trµn Rear Front Rear >< Front

+ Hµng ®îi bÞ ®Çy: hµng ®îi kh«ng cã phÇn tö nµo trèng: Front = 0 vµ Rear = n hoÆc Rear ®øng ngay tr­íc Front; do ®ã nÕu tiÕp tôc thªm vµo sÏ bÞ mÊt d÷ liÖu.

Rear = QUEUESIZE-1

Front = -1 Rear - Front + 1 = QUEUESIZE

hoÆc

Rear ®øng ngay tr­íc Front: Rear - Front + 1 = 0

Rear

Front

n

0

Rear - Front + 1 = QUEUESIZE

RearFront

Rear - Front + 1 = 0

Rear

Front

n

0

Rear - Front + 1 = QUEUESIZE

RearFront

Rear - Front + 1 = 0

- Delete_queue: lo¹i bá phÇn tö khái Queue vµ tr¶ vÒ gi¸ trÞ cña phÇn tö võa xãa; tr­íc khi xãa, ta ph¶i kiÓm tra Queue cã kh¸c rçng hay kh«ng.

- Khëi t¹o hµng ®îi:

Front := -1; Rear := -1;

L­u ý:

- PhÐp to¸n Insert_queue thùc hiÖn ë cuèi hµng ®îi, cßn phÐp to¸n Delete_queue thùc hiÖn ë ®Çu hµng ®îi.

Ta khai b¸o biÕn q cã kiÓu cÊu tróc Queue gåm 3 thµnh phÇn:

- front, rear : sè nguyªn chØ ®Çu vµ cuèi hµng ®îi

- nodes: m¶ng 1 chiÒu, mçi phÇn tö cña m¶ng lµ 1 phÇn tö trong queue.

#define QUEUESIZE 100

#define TRUE 1

#define FALSE 0

struct queue

Page 56: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

56

{

int front, rear;

int nodes[QUEUESIZE];

} q;

IV.2. C¸c phÐp to¸n trªn hµng: §èi víi hµng ®îi, ta cã hai phÐp to¸n chñ yÕu lµ thªm vµo (Insert_queue) vµ lo¹i bá (Delete_queue).

a. PhÐp thªm vµo : thªm mét phÇn tö x vµo hµng ®îi; khi thªm ta ph¶i l­u ý xem hµng ®îi bÞ trµn hay bÞ ®Çy ®Ó xö lý cho thÝch hîp.

int Insert_queue(struct queue &q, int x)

{

if (q.rear - q.front + 1== 0 || q.rear -q.front+1== QUEUESIZE)

return 0 ;

else

{

if(q.front==-1)

{ q.front=0;

q.rear =-1;

}

if (q.rear==QUEUESIZE-1) q.rear=-1;

++q.rear;

q.nodes[q.rear]=x;

return 1;

}

}

b. PhÐp lo¹i bá : lo¹i bá phÇn tö khái Queue vµ tr¶ vÒ gi¸ trÞ cña phÇn tö võa xãa; tr­íc khi xãa, ta ph¶i kiÓm tra Queue cã kh¸c rçng hay kh«ng.

int Delete_queue(struct queue &q, int &x)

{

if(empty(q))

return 0;

else

{

x= q.nodes[q.front];

if(q.front == q.rear) // Hang chi co 1 phan tu

{

q.front = -1;

q.rear = -1;

Page 57: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

57

}

else

{

(q.front)++;

if (q.front ==QUEUESIZE)

q.front=0;

}

return 1;

}

}

* øng dông cña Queue:

- Queue th­êng ®­îc dïng trong c¸c bµi to¸n cã c¬ chÕ FIFO (vµo tr­íc ra tr­íc).

- Queue th­êng ®­îc dïng trong c¸c c«ng viÖc ®ang ®îi phôc vô trong c¸c hÖ ®iÒu hµnh ®a nhiÖm, ®Ó qu¶n lý c¸c hµng ®îi in trªn m¸y in m¹ng (print server)...

IV.3. VÝ dô:

ViÕt ch­¬ng tr×nh ®æi phÇn thËp ph©n cña sè kh«ng ©m ë hÖ thËp ph©n sang sè ë hÖ nhÞ ph©n, tèi ®a ta chØ lÊy 8 sè lÏ trong hÖ nhÞ ph©n

* Gi¶i thuËt:

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <math.h>

#define QUEUESIZE 8

#define TRUE 1

#define FALSE 0

struct queue

{

int front, rear;

int nodes[QUEUESIZE];

};

struct queue q;

void Initialize(struct queue &q)

{

q.front = q.rear = -1;

}

Page 58: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

58

int empty(struct queue q)

{

return((q.front == -1 || q.rear== -1) ? TRUE : FALSE);

}

void Insert_queue(struct queue &q, int x)

{

if (q.rear - q.front + 1== 0 || q.rear -q.front+1== QUEUESIZE)

{

printf("\nHang bi day");

}

else

{

if(q.front==-1)

{ q.front=0;

q.rear =-1;

}

if (q.rear==QUEUESIZE-1) q.rear=-1;

++q.rear;

q.nodes[q.rear]=x;

}

}

int Delete_queue(struct queue &q)

{

int x;

if(empty(q))

printf("Hang doi rong");

else

{

x= q.nodes[q.front];

if(q.front == q.rear) // Hang chi co 1 phan tu

{

q.front = -1;

q.rear = -1;

}

else

{

(q.front)++;

if (q.front ==QUEUESIZE)

q.front=0;

Page 59: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

59

}

return x;

}

}

void dec_bin2(double n)

{ double positive;

double r, le;

le = modf(n,&positive); // Hµm modf t¸ch sè double n ra thµnh 2 phÇn

// phÇn nguyªn chøa trong positive (double) vµ phÇn thËp ph©n chøa // trong le (double)

int i=0;

do

{ r =le*2;

le = modf(r,&positive);

Insert_queue(q, positive);

i++ ;

} while (i <8 && r!=1);

printf("\n So nhi phan cua phan le : 0.");

while (!empty(q))

{

printf("%d", Delete_queue(q));

}

getch();

}

// chuong trinh chinh

void main(void)

{

int chucnang, so;

float n;

clrscr();

// khoi tao queue

Initialize(q);

printf("\nNhap phan thap phan cua so thuc :");

scanf("%e", &n);

dec_bin2(n);

}

Bµi tËp

1. ViÕt ch­¬ng tr×nh cho phÐp :

Page 60: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

60

- NhËp mét v¨n b¶n cã tèi ®a 100 c©u, mçi c©u cã tèi ®a 80 ký tù, vµ mçi tõ trong c©u cã Ýt nhÊt mét kho¶ng tr¾ng. Ta kÕt thóc viÖc nhËp b»ng c©u rçng.

- Xö lý c©u :

+ In ra mµn h×nh c¸c c©u bÊt kú trong v¨n b¶n

+ Lo¹i bá mét ®o¹n gåm mét sè c©u nµo ®ã trong v¨n b¶n

+ Xen vµo mét ®o¹n míi t¹i mét vÞ trÝ bÊt kú trong v¨n b¶n

- Xö lý tõ :

+ Cho biÕt sè lÇn xuÊt hiÖn cña mét tõ trong v¨n b¶n

+ Thay thÕ mét tõ b»ng mét tõ kh¸c.

2. T¹o menu thùc hiÖn c¸c c«ng viÖc sau:

a. NhËp danh s¸ch häc viªn, mçi häc viªn gåm : maso (sè nguyªn), ho (chuçi), ten (chuçi). Danh s¸ch häc viªn ®­îc l­u tr÷ trong 1 danh s¸ch tuyÕn tÝnh cã tèi ®a 100 phÇn tö.

b. LiÖt kª danh s¸ch trªn mµn h×nh

c. S¾p xÕp l¹i danh s¸ch theo thø tù t¨ng dÇn cña tªn, trïng tªn th× s¾p qua hä.

d. Thªm mét häc viªn vµo danh s¸ch sao cho sau khi thªm th× vÉn ®¶m b¶o tÝnh thø tù cña danh s¸ch.

e. In ra mµn h×nh th«ng tin cña häc viªn cã m· sè do ta nhËp

f. Xãa häc viªn cã m· sè do ta nhËp

g. Save danh s¸ch häc viªn vµo file DSHV.TXT.

h. Load danh s¸ch häc viªn tõ file DSHV.TXT vµo danh s¸ch tuyÕn tÝnh.

3. T¹o menu thùc hiÖn c¸c c«ng viÖc sau:

a. §æi sè thùc d­¬ng ë hÖ thËp ph©n sang hÖ nhÞ ph©n

b. §æi sè thùc d­¬ng ë hÖ thËp ph©n sang hÖ thËp lôc

c. §æi sè nhÞ ph©n sang sè thËp ph©n

d. §æi sè thËp lôc sang sè thËp ph©n

4. H·y ®Õm cã bao nhiªu bit 1 trong 1000 tõ, mçi tõ 4 byte

Page 61: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

61

CH¦¥NG IV

DANH S¸CH LI£N KÕT

(LINKED LIST)

I. Kh¸i niÖm:

CÊu tróc danh s¸ch liªn kÕt lµ cÊu tróc ®éng, viÖc cÊp ph¸t nót vµ gi¶i phãng nót trªn danh s¸ch x¶y ra khi ch­¬ng tr×nh ®ang ch¹y. Ta th­êng cÊp ph¸t nót cho danh s¸ch liªn kÕt b»ng biÕn ®éng. Danh s¸ch liªn kÕt cã nhiÒu lo¹i nh­ danh s¸ch liªn kÕt ®¬n, danh s¸ch liªn kÕt kÐp, danh s¸ch liªn kÕt ®a vµ danh s¸ch liªn kÕt vßng. Trong ch­¬ng nµy ra sÏ kh¶o s¸t mét sè lo¹i danh s¸ch liªn kÕt nh­ ®¬n, kÐp vµ vßng.

C¸c phÇn tö trong danh s¸ch liªn kÕt sÏ ®­îc cÊp ph¸t vïng nhí trong qu¸ tr×nh thùc thi ch­¬ng tr×nh, do ®ã chóng cã thÓ n»m r¶i r¸c ë nhiÒu n¬i kh¸c nhau trong bé nhí (kh«ng liªn tôc).

3 .

First

Nul

1 .2

4 .

.

3 .

First

Nul

1 .2

4 .

.

Null

Firs

t• • • • 1 2 3 4

H×nh 4.1 Minh häa danh s¸ch liªn kÕt trong bé nhí

C¸c phÇn tö trong danh s¸ch ®­îc kÕt nèi víi nhau theo chïm liªn kÕt nh­ h×nh trªn:

- First lµ con trá chØ ®Õn phÇn tö ®Çu cña danh s¸ch liªn kÕt

- PhÇn tö cuèi cña danh s¸ch liªn kÕt víi vïng liªn kÕt cã gi¸ trÞ NULL

- Mçi nót cña danh s¸ch cã tr­êng info chøa néi dung cña nót vµ tr­êng next lµ con trá chØ ®Õn nót kÕ tiÕp trong danh s¸ch.

* L­u ý:

- CÊu tróc danh s¸ch liªn kÕt lµ cÊu tróc ®éng, c¸c nót ®­îc cÊp ph¸t hoÆc bÞ gi¶i phãng khi ch­¬ng tr×nh ®ang ch¹y.

Page 62: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

62

- Danh s¸ch liªn kÕt rÊt thÝch hîp khi thùc hiÖn c¸c phÐp to¸n trªn danh s¸ch th­êng bÞ biÕn ®éng. Trong tr­êng hîp xãa hay thªm phÇn tö trong danh s¸ch liªn kÕt th× ta kh«ng dêi c¸c phÇn tö ®i nh­ trong danh s¸ch tuyÕn tÝnh (m¶ng) mµ chØ viÖc hiÖu chØnh l¹i tr­êng next t¹i c¸c nót ®ang thao t¸c. Thêi gian thùc hiÖn c¸c phÐp to¸n thªm vµo vµ lo¹i bá kh«ng phô thuéc vµo sè phÇn tö cña danh s¸ch liªn kÕt.

- Tuy nhiªn, danh s¸ch liªn kÕt còng cã c¸c ®iÓm h¹n chÕ sau:

+ V× mçi nót cña danh s¸ch liªn kÕt ph¶i chøa thªm tr­êng next nªn danh s¸ch liªn kÕt ph¶i tèn thªm bé nhí.

+ T×m kiÕm trªn danh s¸ch liªn kÕt kh«ng nhanh v× ta chØ ®­îc truy xuÊt tuÇn tù tõ ®Çu danh s¸ch.

Khai b¸o : Mét phÇn tö cña danh s¸ch liªn kÕt Ýt nhÊt ph¶i cã hai thµnh phÇn : néi dung cña phÇn tö (info) vµ thµnh phÇn next ®Ó liªn kÕt phÇn tö nµy víi phÇn tö kh¸c.

Gi¶ sö ta khai b¸o kiÓu NODEPTR lµ kiÓu con trá chØ ®Õn nót trong 1 danh s¸ch liªn kÕt, mçi phÇn tö cã 2 thµnh phÇn : info (sè nguyªn) vµ next.

struct node

{ int info ;

struct node *next ;

};

typedef struct node *NODEPTR;

- §Ó khai b¸o biÕn First qu¶n lý danh s¸ch liªn kÕt ta viÕt nh­ sau: NODEPTR First;

- Khëi t¹o danh s¸ch liªn kÕt : First = NULL;

- Ghi chó :

Thµnh phÇn chøa néi dung cã thÓ gåm nhiÒu vïng víi c¸c kiÓu d÷ liÖu kh¸c nhau.

VÝ dô: Khai b¸o biÕn First ®Ó qu¶n lý mét danh s¸ch sinh viªn víi cÊu tróc d÷ liÖu lµ danh s¸ch liªn kÕt ®¬n, mçi sinh viªn gåm cã 2 thµnh phÇn lµ: mssv (sè nguyªn) vµ hä tªn.

struct sinhvien

int mssv;

char hoten[30];

};

struct node

{ sinhvien sv ;

Page 63: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

63

struct node *next ;

};

typedef struct node *NODEPTR;

NODEPTR First;

Thµnh phÇn liªn kÕt còng cã thÓ nhiÒu h¬n mét nÕu lµ danh s¸ch ®a liªn kÕt hoÆc danh s¸ch liªn kÕt kÐp.

First lµ con trá trá ®Õn phÇn tö ®Çu tiªn cña danh s¸ch liªn kÕt, nã cã thÓ lµ kiÓu con trá (nh­ khai b¸o trªn), vµ còng cã thÓ lµ mét struct cã hai thµnh phÇn: First trá ®Õn phÇn tö ®Çu tiªn cña danh s¸ch liªn kÕt, vµ Last trá ®Õn phÇn tö cuèi cña danh s¸ch liªn kÕt.

struct Linked_List;

{ First NODEPTR;

Last NODEPTR;

};

II. C¸c phÐp to¸n trªn danh s¸ch liªn kÕt:

§Ó ®¬n gi¶n, c¸c phÐp to¸n sau ®©y sÏ ®­îc thao t¸c trªn danh s¸ch c¸c sè nguyªn víi khai b¸o nh­ sau:

struct node

{ int info ;

struct node *next ;

};

typedef struct node *NODEPTR;

- §Ó khai b¸o biÕn First qu¶n lý danh s¸ch liªn kÕt ta viÕt nh­ sau:

NODEPTR First;

II.1. T¹o danh s¸ch:

a. Khëi t¹o danh s¸ch (Initialize): dïng ®Ó khëi ®éng mét danh s¸ch liªn kÕt, cho ch­¬ng tr×nh hiÓu lµ hiÖn t¹i danh s¸ch liªn kÕt ch­a cã phÇn tö.

void Initialize(NODEPTR &First)

{

First = NULL; }

b. CÊp ph¸t vïng nhí (New_Node): cÊp ph¸t mét nót cho danh s¸ch liªn kÕt. Hµm New_Node nµy tr¶ vÒ ®Þa chØ cña nót võa cÊp ph¸t.

Trong ch­¬ng tr×nh cã sö dông hµm malloc (trong <alloc.h>), hµm nµy cÊp ph¸t mét khèi nhí tÝnh theo byte tõ bé nhí heap. NÕu cÊp ph¸t thµnh c«ng, hµm malloc tr¶ vÒ ®Þa chØ cña vïng nhí võa cÊp ph¸t, ng­îc l¹i nã sÏ tr¶ vÒ NULL.

Page 64: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

64

NODEPTR New_node(void)

{

NODEPTR p;

p = (NODEPTR)malloc(sizeof(struct node));

return (p);

}

c. Thªm vµo ®Çu danh s¸ch (Insert_first): thªm mét nót cã néi dung x vµo ®Çu danh s¸ch liªn kÕt.

NULL

First • • • •

• x

H×nh 4.2 Thªm nót cã néi dung x vµo ®Çu danh s¸ch liªn kÕt

void Insert_first(NODEPTR &First, int x)

{

NODEPTR p;

p = New_node();

p->info = x;

p->next = First;

First = p;

}

d. Thªm nót míi vµo sau nót cã ®Þa chØ p (Insert_after): thªm mét nót cã néi dung x vµo sau nót cã ®Þa chØ p trong danh s¸ch liªn kÕt First.

NULL

First • • • •

• x

p

q

H×nh 4.3 Thªm nót cã néi dung x vµo sau nót cã ®Þa chØ p

void Insert_after(NODEPTR p, int x)

{

NODEPTR q;

Page 65: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

65

if(p == NULL)

printf("khong them phan tu vao danh sach duoc");

else

{

q = New_node();

q->info = x;

q->next = p->next;

p->next = q;

}

}

II.2. T×m kiÕm (Search_info):

T×m nót ®Çu tiªn trong danh s¸ch cã info b»ng víi x. Do ®©y lµ danh s¸ch liªn kÕt nªn ta ph¶i t×m tõ ®Çu danh s¸ch.

Hµm Search_info nÕu t×m thÊy x trong danh s¸ch th× tr¶ vÒ ®Þa chØ cña nót cã trÞ b»ng x trong danh s¸ch, nÕu kh«ng cã th× tr¶ vÒ trÞ NULL.

NODEPTR Search_info(NODEPTR First, int x)

{

NODEPTR p;

p = First;

while(p != NULL && p->info != x )

p = p->next;

return(p);

}

II.3. CËp nhËt danh s¸ch:

a. Gi¶i phãng vïng nhí (free): Hµm nµy dïng ®Ó hñy nót ®· cÊp ph¸t, vµ tr¶ vïng nhí vÒ l¹i cho memory heap.

free( p) ; víi p lµ biÕn con trá

b. KiÓm tra danh s¸ch liªn kÕt rçng hay kh«ng (Empty): hµm Empty tr¶ vÒ TRUE nÕu danh s¸ch liªn kÕt rçng, vµ ng­îc l¹i.

int Empty(NODEPTR First) { return(First == NULL ? TRUE : FALSE); }

c. Xãa phÇn tö ®Çu cña danh s¸ch (Delete_First): muèn xãa 1 phÇn tö khái danh s¸ch liªn kÕt th× ta ph¶i kiÓm tra xem danh s¸ch cã rçng hay kh«ng. NÕu danh s¸ch cã phÇn tö th× míi xãa ®­îc.

Page 66: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

66

NULL

First • • • •

p

H×nh 4.4 Xãa nót ®Çu tiªn trong danh s¸ch liªn kÕt

void Delete_First (NODEPTR &First)

{ NODEPTR p;

if (Empty(First))

printf("Danh sach rong nen khong the xoa");

else

{

p = First; // nut can xoa la nut dau

First = p->next;

free(p);

}

}

d. Xãa phÇn tö ®øng sau nót cã ®Þa chØ p (Delete_after):

NULL

First • • • •

p q

H×nh 4.5 Xãa nót sau nót cã ®Þa chØ p

void Delete_after(NODEPTR p)

{ NODEPTR q;

// nÕu p lµ NULL hoÆc sau p kh«ng cã nót

if((p == NULL) || (p->next == NULL))

printf("Khong xoa duoc");

else

{

q = p->next; // q chi nut can xoa

p->next = q->next;

free(q);

}

}

e. Xãa phÇn tö theo néi dung (Delete_info):

- T×m ®Þa chØ cña phÇn tö cã néi dung lµ x trong danh s¸ch liªn kÕt.

- Lo¹i bá phÇn tö nµy theo ®Þa chØ.

Page 67: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

67

void Delete_info(NODEPTR &First,int x)

{ NODEPTR q,p;

p= search_info(First,x);

if (p==NULL)

printf("Khong co gia tri %d trong danh sach", x);

else

{

if (p==First)

Delete_first(First);

else

{

q=First;

while (q->next != p)

q=q->next;

Delete_after(q);

}

printf("Da xoa phan tu co gia tri %d trong danh sach",x);

}

}

L­u ý : Gi¶i thuËt nµy chØ lo¹i bá phÇn tö ®Çu tiªn trong danh s¸ch cã gi¸ trÞ info = x.

f. Xãa toµn bé danh s¸ch (Clearlist): ta cã thÓ sö dông lÖnh First = NULL ®Ó xãa toµn bé danh s¸ch, nh­ng trong bé nhí, c¸c vïng nhí ®· cÊp ph¸t cho c¸c nót kh«ng gi¶i phãng vÒ l¹i cho memory heap, nªn sÏ l·ng phÝ vïng nhí. Do ®ã, ta sö dông gi¶i thuËt sau:

void Clearlist(NODEPTR &First)

{

NODEPTR p;

while(First != NULL)

{

p = First;

First = First->next;

free(p);

}

}

II.4. DuyÖt danh s¸ch:

Th«ng th­êng ta hay duyÖt danh s¸ch liªn kÕt ®Ó thùc hiÖn mét c«ng viÖc g× ®ã, nh­ liÖt kª d÷ liÖu trong danh s¸ch hay ®Õm sè nót trong danh s¸ch...

Page 68: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

68

void Traverse(NODEPTR First)

{ NODEPTR p;

int stt = 0;

p = First;

if(p == NULL)

printf("\n (Khong co phan tu trong danh sach)");

while(p != NULL)

{

printf("\n %5d%8d", stt++, p->info);

p = p->next;

}

}

II.5. S¾p xÕp (Selection_Sort): s¾p xÕp danh s¸ch liªn kÕt theo thø tù info t¨ng dÇn.

- Néi dung: Ta so s¸nh tÊt c¶ c¸c phÇn tö cña danh s¸ch ®Ó chän ra mét phÇn tö nhá nhÊt ®­a vÒ ®Çu danh s¸ch; sau ®ã, tiÕp tôc chän phÇn tö nhá nhÊt trong c¸c phÇn tö cßn l¹i ®Ó ®­a vÒ phÇn tö thø hai trong danh s¸ch. Qu¸ tr×nh nµy lÆp l¹i cho ®Õn khi chän ra ®­îc phÇn tö nhá thø (n-1).

- Gi¶i thuËt:

void Selection_Sort(NODEPTR &First)

{ NODEPTR p, q, pmin;

int min;

for(p = First; p->next != NULL; p = p->next)

{ min = p->info;

pmin = p;

for(q = p->next; q != NULL; q = q->next)

if(min > q->info)

{

min = q->info;

pmin = q;

}

// hoan doi truong info cua hai nut p va pmin

pmin->info = p->info;

p->info = min;

}

}

Page 69: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

69

III. C¸c phÐp to¸n trªn danh s¸ch liªn kÕt cã thø tù:

Danh s¸ch liªn kÕt cã thø tù lµ mét danh s¸ch liªn kÕt ®· ®­îc s¾p xÕp theo mét thø tù nhÊt ®Þnh (t¨ng hay gi¶m) trªn mét thµnh phÇn nµo ®ã cña néi dung.

ë ®©y, ta gi¶ sö danh s¸ch liªn kÕt First cã thø tù t¨ng theo thµnh phÇn info.

III.1. PhÐp thªm vµo :

Thªm vµo danh s¸ch liªn kÕt cã thø tù mét phÇn tö cã néi dung lµ x sao cho sau khi thªm vµo vÉn ®¶m b¶o tÝnh cã thø tù cña danh s¸ch.

NULL

First • • • •

t s

• x

p

H×nh 4.6 Thªm nót cã néi dung x vµo danh s¸ch liªn kÕt cã thø tù

* Gi¶i thuËt:

- T¹o phÇn tö míi, g¸n gi¸ trÞ x cho nã

New_node (p) ;

p->info = x ;

- T×m vÞ trÝ thÝch hîp ®Ó ®­a phÇn tö míi vµo, nghÜa lµ t×m hai vÞ trÝ t vµ s sao cho: t^.info <= x <= s^.info

for(s = First; s != NULL && s->info < x; t=s, s = s->next);

- G¸n liªn kÕt thÝch hîp sao cho p n»m gi÷a hai phÇn tö cã ®Þa chØ t vµ s:

if(s == First) // them nut vao dau danh sach lien ket

{

p->next = First;

First = p;

}

else // them nut p vao truoc nut s

{

p->next= s;

t->next= p;

}

Page 70: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

70

* Ch­¬ng tr×nh:

void Insert_Order(NODEPTR &First, int x)

{

NODEPTR p, t, s; // q la nut truoc, p la nut sau

p=New_node();

p->info=x;

for(s = First; s != NULL && s->info < x ; t=s, s = s->next);

if(s == First) // them nut vao dau danh sach lien ket

{

p->next = First;

First = p;

}

else // them nut p vao truoc nut s

{

p->next= s;

t->next= p;

}

}

III.2. PhÐp trén :

Cho hai danh s¸ch liªn kÕt First1, First2 ®· cã thø tù. H·y trén hai danh s¸ch nµy l¹i thµnh mét danh s¸ch liªn kÕt míi First3 sao cho nã còng cã thø tù.

NULL

First1 • • • ••

NULL

• ••First2

1 3

5

1097

2 8

H×nh 4.7 Trén hai danh s¸ch liªn kÕt cã thø tù

a. Gi¶i thuËt: Gäi p1, p2, p3 lµ 3 biÕn con trá ®Ó duyÖt 3 danh s¸ch First1, First2, First3

- T¹o gi¶ nót ®Çu tiªn trong danh s¸ch liªn kÕt First3 ®Ó h×nh thµnh mét phÇn tö cho p3 chØ ®Õn.

- DuyÖt First1 vµ First2:

NÕu p1->info < p2->info :

Page 71: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

71

§­a phÇn tö p1 vµo sau phÇn tö p3

Cho p1 chØ ®Õn phÇn tö kÕ trong danh s¸ch First1

NÕu p2->info < p1->info :

§­a phÇn tö p2 vµo sau phÇn tö p3

Cho p2 chØ ®Õn phÇn tö kÕ trong danh s¸ch First2

Qu¸ tr×nh duyÖt sÏ dõng l¹i khi 1 trong 2 danh s¸ch ®· duyÖt xong

- §­a nèt phÇn cßn l¹i cña danh s¸ch ch­a duyÖt xong vµo danh s¸ch liªn kÕt First3.

- Xãa phÇn tö gi¶ ®Çu danh s¸ch First3 ®· t¹o ë trªn.

NODEPTR Merge(NODEPTR First1, NODEPTR First2)

{ NODEPTR p1, p2, p3;

First3=New_node();

p1=First1; p2 = First2; p3=First3;

while (p1 !=NULL && p2 !=NULL)

if (p1->info < p2->info)

{ p3->next = p1;

p3=p1;

p1=p1->next ;

}

else

{ p3->next = p2;

p3=p2;

p2=p2->next ;

}

if (p1==NULL)

p3->next=p2;

else

p3->next=p1;

p3 = First3;

First3=p3->next;

free(p3);

return First3;

}

VÝ dô:

ViÕt ch­¬ng tr×nh t¹o mét menu ®Ó qu¶n lý danh s¸ch sinh viªn gåm c¸c c«ng viÖc sau:

Page 72: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

72

1. T¹o danh s¸ch sinh viªn: Qu¸ tr×nh nhËp danh s¸ch sÏ dõng l¹i khi ta nhËp m· sè lµ 0.

2. Thªm sinh viªn vµo danh s¸ch: Thªm 1 sinh viªn vµo danh s¸ch, vÞ trÝ sinh viªn thªm vµo do ta chän

3. Xem danh s¸ch sinh viªn: LiÖt kª danh s¸ch sinh viªn trªn mµn h×nh

4. HiÖu chØnh sinh viªn: nhËp vµo vÞ trÝ sinh viªn cÇn hiÖu chØnh, sau ®ã ch­¬ng tr×nh cho phÐp ta hiÖu chØnh l¹i m· sè, hä, tªn cña sinh viªn.

5. Xãa sinh viªn trong danh s¸ch: xãa sinh viªn theo vÞ trÝ.

6. T×m kiÕm sinh viªn theo m· sè: nhËp vµo m· sè sinh viªn, sau ®ã in ra vÞ trÝ cña sinh viªn trong danh s¸ch.

7. S¾p xÕp danh s¸ch sinh viªn theo m· sè t¨ng dÇn

8. Thªm sinh viªn vµo danh s¸ch ®· cã thø tù t¨ng dÇn theo m· sè sao cho sau khi thªm th× danh s¸ch vÉn cßn t¨ng dÇn theo m· sè.

9. Xãa toµn bé danh s¸ch sinh viªn.

BiÕt r»ng:

- Mçi sinh viªn gåm c¸c th«ng tin: m· sè (int), hä, tªn

- Danh s¸ch sinh viªn ®­îc tæ chøc theo danh s¸ch liªn kÕt ®¬n.

Ch­¬ng tr×nh:

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <alloc.h>

#include <ctype.h>

#define TRUE 1

#define FALSE 0

struct sinhvien

{

int mssv;

char ho[30];

char ten[10];

};

struct node

{

sinhvien sv;

struct node *next;

};

Page 73: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

73

typedef node *NODEPTR;

NODEPTR First;

sinhvien sv;

NODEPTR p;

// Phep toan New_node: cap phat mot nut cho danh sach lien ket

NODEPTR New_node(void)

{

NODEPTR p;

p = (NODEPTR)malloc(sizeof(struct node));

return(p);

}

/* Tac vu nodepointer: xac dinh con tro cua nut i trong danh sach lien ket

(i = 2, ...) */

NODEPTR nodepointer(NODEPTR First, int i)

{

NODEPTR p;

int vitri=1;

p = First;

while(p != NULL && vitri < i)

{

p = p->next;

vitri++;

}

return(p);

}

// Tac vu position: xac dinh vi tri cua nut p trong danh sach lien ket

int position(NODEPTR First, NODEPTR p)

{

int vitri;

NODEPTR q;

q = First;

vitri = 1;

while(q != NULL && q != p)

{

q = q->next;

vitri++;

}

Page 74: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

74

if(q == NULL)

return(-1);

return(vitri);

}

// Phep toan initialize: khoi dong danh sach lien ket

void initialize(NODEPTR &First)

{

First = NULL;

}

// Tac vu Empty: kiem tra danh sach lien ket co bi rong khong

int Empty(NODEPTR First)

{

return(First == NULL ? TRUE : FALSE);

}

// Phep toan Insert_first: them nut moi vao dau danh sach lien ket

void Insert_first(NODEPTR &First, sinhvien x)

{

NODEPTR p;

p = New_node();

p->sv = x;

p->next = First;

First = p;

}

// Phep toan Insert_after: them nut moi sau nut co dia chi p

void Insert_after(NODEPTR p, sinhvien x)

{

NODEPTR q;

if(p == NULL)

printf("khong them sinh vien vao danh sach duoc");

else

{

q = New_node();

q->sv = x;

q->next = p->next;

p->next = q;

}

}

Page 75: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

75

// Phep toan Delete_first: xoa nut o dau danh sach lien ket

void Delete_first(NODEPTR &First)

{

NODEPTR p;

if(Empty(First))

printf("Khong co sinh vien trong danh sach");

else

{

p = First; // nut can xoa la nut dau

First = p->next;

free(p);

}

}

// Tac vu Delete_after: xoa nut sau nut p

void Delete_after(NODEPTR p)

{

NODEPTR q;

// neu p la NULL hoac p chi nut cuoi

if((p == NULL) || (p->next == NULL))

printf("khong xoa sinh vien nay duoc");

else

{

q = p->next; // q chi nut can xoa

p->next = q->next;

free(q);

}

}

/* Phep toan Insert_Order: Phep toan nay chi su dung khi them nut vao danh sach lien ket da co thu tu */

void Insert_Order(NODEPTR &First, sinhvien x)

{

NODEPTR p, q; // q la nut truoc, p la nut sau

q = NULL;

for(p = First; p != NULL && p->sv.mssv< x.mssv; p = p->next)

q = p;

if(q == NULL) // them nut vao dau danh sach lien ket

Insert_first(First, x);

Page 76: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

76

else // them nut vao sau nut q

Insert_after(q, x);

}

// Phep toan clearlist: xoa tat ca cac nut trong danh sach lien ket

void clearlist(NODEPTR &First)

{

NODEPTR p, q; // q la nut truoc, p la nut sau

p = First;

while(First != NULL)

{

p = First;

First = First->next;

free(p);

}

}

// Phep toan traverse: duyet danh sach lien ket

void traverse(NODEPTR First)

{

NODEPTR p;

int stt = 0;

p = First;

if(p == NULL)

printf("\n (Khong co sinh vien trong danh sach)");

while(p != NULL)

{

printf("\n %5d %8d %-30s %-10s", ++stt, p->sv.mssv, p->sv.ho,p->sv.ten);

p = p->next;

}

}

/* Tac vu search_info: tim kiem theo phuong phap tim kiem tuyen tinh, neu khong tim thay ham nay tra ve NULL, neu tim thay ham nay tra ve con tro chi nut tim thay */

NODEPTR search_info(NODEPTR First, int x)

{

NODEPTR p;

p = First;

Page 77: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

77

while(p != NULL && p->sv.mssv != x )

p = p->next;

return(p);

}

// Tac vu selectionsort: sap xep danh sach lien ket theo MSSV tang dan

void selectionsort(NODEPTR &First)

{

NODEPTR p, q, pmin;

sinhvien min;

for(p = First; p->next != NULL; p = p->next)

{

min = p->sv;

pmin = p;

for(q = p->next; q != NULL; q = q->next)

if(min.mssv > q->sv.mssv)

{

min = q->sv;

pmin = q;

}

// hoan doi truong info cua hai nut p va pmin

pmin->sv = p->sv;

p->sv = min;

}

}

char menu ()

{ char chucnang;

do

{ clrscr();

printf("\n\n\t\tCHUONG TRINH QUAN LY DANH SACH SINH VIEN");

printf("\n\nCac chuc nang cua chuong trinh:\n");

printf(" 1: Tao danh sach sinh vien\n");

printf(" 2: Them sinh vien vao danh sach\n");

printf(" 3: Xem danh sach sinh vien\n");

printf(" 4: Hieu chinh sinh vien\n");

printf(" 5: Xoa sinh vien trong danh sach\n");

printf(" 6: Tim kiem sinh vien theo MSSV\n");

Page 78: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

78

printf(" 7: Sap xep danh sach theo MSSV\n");

printf(" 8: Them sinh vien vao danh sach da co thu tu\n");

printf(" 9: Xoa toan bo danh sach\n");

printf(" 0: Ket thuc chuong trinh\n");

printf("Chuc nang ban chon: ");

chucnang = getche();

} while(chucnang < '0' || chucnang >'9') ;

return chucnang;

}

void Create_list(NODEPTR &First)

{ NODEPTR Last,p ;

sinhvien sv;

char maso [5],c;

clearlist(First);

printf("Ma so sinh vien: ");

gets(maso);

sv.mssv = atoi(maso);

while (sv.mssv !=0)

{

printf("Ho sinh vien: ");

gets(sv.ho);

printf("Ten sinh vien: ");

gets(sv.ten);

p=New_node();

p->sv=sv;

if (First==NULL)

First=p;

else

Last->next = p;

Last=p;

p->next=NULL;

printf("Ma so sinh vien moi: ");

gets(maso);

sv.mssv = atoi(maso);

}

}

Page 79: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

79

// chuong trinh chinh

void main()

{

int vitri;

char chucnang, c, maso [5], c_vitri[5];

// khoi dong danh sach lien ket

initialize(First);

do

{

chucnang = menu();

flushall();

switch(chucnang)

{

case '1':

{

Create_list(First);

break;

}

case '2':

{

printf("\nVi tri them (1, 2, ...): ");

gets(c_vitri);

vitri = atoi(c_vitri);

p = nodepointer(First, vitri-1);//p chi nut truoc nut can them

if (vitri <=0 || p==NULL)

{

printf("Vi tri khong hop le");

getche();

}

else

{

printf("Ma so sinh vien: ");

gets(maso);

sv.mssv = atoi(maso);

printf("Ho sinh vien: ");

gets(sv.ho);

printf("Ten sinh vien: ");

Page 80: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

80

gets(sv.ten);

if (vitri == 1)

Insert_first(First, sv);

else

Insert_after(p, sv);

}

break;

}

case '3':

{

printf("\nDanh sach sinh vien: ");

printf("\n STT MSSV HO TEN");

traverse(First);

getche();

break;

}

case '4':

{

printf("\nVi tri hieu chinh (1, 2, ...): ");

gets(c_vitri);

vitri = atoi(c_vitri);

p = nodepointer(First, vitri); // p chi nut can hieu chinh

if(p == NULL)

{

printf("Vi tri khong phu hop");

getche();

}

else

{

printf("\nSTT:%d MSSV:%d HO:%s TEN:%s",

vitri,p->sv.mssv, p->sv.ho, p->sv.ten);

printf("\nMa so sv moi: ");

gets(maso);

sv.mssv = atoi(maso);

printf("Ho sv moi: ");

gets(sv.ho);

printf("Ten sv moi: ");

Page 81: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

81

gets(sv.ten);

p->sv = sv;

}

break;

}

case '5':

{

printf("\nVi tri xoa ( 1, 2, ...): ");

gets(c_vitri);

vitri = atoi(c_vitri);

p = nodepointer(First, vitri-1);//p chi nut truoc nut can xoa

if (vitri <=0 || p==NULL)

{

printf("Vi tri khong hop le");

getche();

}

else

if(vitri == 1)

Delete_first(First);

else

Delete_after(p);

break;

}

case '6':

{

printf("\nMa so sinh vien can tim: ");

gets(maso);

sv.mssv = atoi(maso);

p = search_info(First, sv.mssv);

if(p == NULL)

printf("Khong co sinh vien co MSSV %d trong danh sach", sv.mssv);

else

printf("Tim thay o vi tri %d trong danh sach", position(First, p));

getche();

break;

}

Page 82: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

82

case '7':

{

printf("\n Ban co chac khong? (c/k): ");

c = toupper(getche());

if( c == 'C')

selectionsort(First);

break;

}

case '8':

{

printf("\n Ban nho sap xep danh sach truoc. Nhan phim bat ky ...");

getche();

printf("\nMa so sinh vien: ");

gets(maso);

sv.mssv = atoi(maso);

printf("Ho sinh vien: ");

gets(sv.ho);

printf("Ten sinh vien: ");

gets(sv.ten);

Insert_Order(First, sv);

break;

}

case '9':

{

printf("\n Ban co chac khong (c/k): ");

c = getche();

if(c == 'c' || c == 'C')

clearlist(First);

break;

}

}

} while(chucnang != '0');

// xoa tat ca cac nut tren danh sach lien ket

clearlist(First);

}

Page 83: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

83

Iv. Danh s¸ch liªn kÕt vßng:

IV.1. Kh¸i niÖm :

Danh s¸ch liªn kÕt vßng lµ danh s¸ch liªn kÕt mµ tr­êng next cña phÇn tö cuèi sÏ chØ tíi phÇn tö ®Çu cña danh s¸ch.

info

• • • •

next Last

H×nh 4.8 Danh s¸ch liªn kÕt vßng

Qui ­íc: §Ó ®¬n gi¶n gi¶i thuËt, ta qui ­íc dïng con trá Last ®Ó qu¶n lý danh s¸ch liªn kÕt vßng, con trá nµy sÏ chØ tíi phÇn tö cuèi trong danh s¸ch liªn kÕt vßng.

Nh­ vËy:

+ NÕu danh s¸ch liªn kÕt vßng rçng Last = NULL

+ NÕu danh s¸ch liªn kÕt vßng chØ cã mét phÇn tö (Last ==Last->next)

- Khai b¸o: Ta khai b¸o biÕn Last qu¶n lý danh s¸ch liªn kÕt vßng víi thµnh phÇn néi dung lµ sè nguyªn nh­ sau:

struct node

{ int info ;

struct node *next ;

};

typedef struct node *NODEPTR;

NODEPTR Last;

IV.2. C¸c phÐp to¸n trªn danh s¸ch liªn kÕt vßng:

IV.2.1.T¹o danh s¸ch:

a. Khëi t¹o danh s¸ch (Initialize): dïng ®Ó khëi ®éng mét danh s¸ch liªn kÕt, cho ch­¬ng tr×nh hiÓu lµ hiÖn t¹i danh s¸ch liªn kÕt ch­a cã phÇn tö.

void Initialize(NODEPTR &Last)

{

Last = NULL;

}

b. CÊp ph¸t vïng nhí (New_Node): cÊp ph¸t mét nót cho danh s¸ch liªn kÕt vßng. Hµm New_Node nµy tr¶ vÒ ®Þa chØ cña nót võa cÊp ph¸t.

Page 84: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

84

NODEPTR New_node(void)

{

NODEPTR p;

p = (NODEPTR)malloc(sizeof(struct node));

return (p);

}

c. Thªm vµo ®Çu danh s¸ch (Ins_first): thªm mét nót cã néi dung x vµo ®Çu danh s¸ch liªn kÕt vßng.

void Ins_first(NODEPTR &Last, int x)

{

NODEPTR p;

p = New_node();

p->info = x;

if (Empty(Last))

Last=p;

else

p->next = Last->next;

Last->next = p;

}

d. Thªm vµo cuèi danh s¸ch (Ins_last): thªm mét nót cã néi dung x vµo cuèi danh s¸ch liªn kÕt vßng.

void Ins_last(NODEPTR &Last, int x)

{

NODEPTR p;

p = New_node();

p->info = x;

if (Empty(Last))

p->next=p;

else

{

p->next = Last->next;

Last->next = p;

}

Last = p;

}

Page 85: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

85

e. Thªm nót míi vµo sau nót cã ®Þa chØ p (Ins_after): thªm mét nót cã néi dung x vµo sau nót cã ®Þa chØ p trong danh s¸ch liªn kÕt vßng.

void Ins_after(NODEPTR Last, NODEPTR p, int x)

{

NODEPTR q;

if(p == NULL)

printf("Nut hien tai khong co, nen khong the them");

else

{

if (p==Last)

Ins_last(Last,x);

else

{ q = New_node();

q->info = x;

q->next = p->next;

p->next = q;

}

}

}

IV.2.2. DuyÖt danh s¸ch:

Th«ng th­êng ta hay duyÖt danh s¸ch liªn kÕt ®Ó thùc hiÖn mét c«ng viÖc g× ®ã, nh­ liÖt kª d÷ liÖu trong danh s¸ch hay ®Õm sè nót trong danh s¸ch...

void Traverse(NODEPTR Last)

{

NODEPTR p;

p = Last->next; // p chi toi phan tu dau trong dslk vong

if(Last == NULL)

printf("\n Danh sach rong ");

else

{ printf("\n");

while(p != Last)

{

printf("%8d", p->info);

p = p->next;

}

printf("%8d", p->info);

}

}

Page 86: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

86

IV.2.3. PhÐp lo¹i bá:

a. Gi¶i phãng vïng nhí (free): Hµm nµy dïng ®Ó hñy nót ®· cÊp ph¸t, vµ tr¶ vïng nhí vÒ l¹i cho memory heap.

free( p) ; víi p lµ biÕn con trá

b. KiÓm tra danh s¸ch liªn kÕt rçng hay kh«ng (Empty): hµm Empty tr¶ vÒ TRUE nÕu danh s¸ch liªn kÕt vßng rçng, vµ ng­îc l¹i.

int Empty(NODEPTR Last) { return(Last == NULL ? TRUE : FALSE);

}

c. Xãa phÇn tö ®Çu cña danh s¸ch (Del_first): muèn xãa 1 phÇn tö khái danh s¸ch liªn kÕt th× ta ph¶i kiÓm tra xem danh s¸ch cã rçng hay kh«ng. NÕu danh s¸ch cã phÇn tö th× míi xãa ®­îc.

void Del_first(NODEPTR &Last)

{

NODEPTR p;

if(Empty(Last))

printf("Khong co nut trong danh sach lien ket vong, nen khong the xoa");

else

{

p = Last->next; // nut can xoa la nut dau

if (p==Last) // danh sach chi co 1 nut

Last=NULL;

else

Last->next = p->next;

free(p);

}

}

d. Xãa phÇn tö cuèi cña danh s¸ch (Del_last): muèn xãa 1 phÇn tö khái danh s¸ch liªn kÕt th× ta ph¶i kiÓm tra xem danh s¸ch cã rçng hay kh«ng. NÕu danh s¸ch cã phÇn tö th× míi xãa ®­îc.

void Del_last(NODEPTR &Last)

{

NODEPTR p;

if(Empty(Last))

Page 87: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

87

printf("Khong co nut trong danh sach lien ket vong, nen khong the xoa");

else

{

p = Last; // nut can xoa la nut cuoi

if (Last->next==Last) // danh sach chi co 1 nut

Last=NULL;

else

{

for (NODEPTR q=Last->next;q->next !=Last; q=q->next); // q dung ngay truoc Last

q->next = Last->next;

Last=q;

}

free(p);

}

}

e. Xãa phÇn tö ®øng sau nót cã ®Þa chØ p (Del_after): xãa nót sau nót p. PhÐp to¸n nµy kh«ng xãa ®­îc khi danh s¸ch ®· rçng hoÆc danh s¸ch chØ cã 1 nót

void Del_after(NODEPTR &Last, NODEPTR p)

{

NODEPTR q;

if(Empty(Last))

printf("Khong co nut trong danh sach lien ket vong, nen khong the xoa");

else

{ // neu p la NULL hoac danh sach chi co 1 nut

if((p == NULL) || (Last->next == Last))

printf("khong the xoa trong danh sach lien ket vong duoc");

else

{

q=p->next;

if (p->next == Last)

{

p->next=Last->next;

Last=p;

}

Page 88: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

88

else

p->next=q->next;

free(q);

}

}

}

f. Xãa toµn bé danh s¸ch (Clearlist): ta cã thÓ sö dông lÖnh Last=NULL ®Ó xãa toµn bé danh s¸ch, nh­ng trong bé nhí, c¸c vïng nhí ®· cÊp ph¸t cho c¸c nót kh«ng gi¶i phãng vÒ l¹i cho memory heap, nªn sÏ l·ng phÝ vïng nhí. Do ®ã, ta sö dông gi¶i thuËt sau:

void clearlist(NODEPTR &Last)

{

while(Last != NULL)

Del_first(Last);

}

IV.2.4. T×m kiÕm (Srch_info) :

T×m nót ®Çu tiªn trong danh s¸ch liªn kÕt vßng cã info b»ng víi x.

Hµm Srch_info nÕu t×m thÊy x trong danh s¸ch th× tr¶ vÒ ®Þa chØ cña nót ®ã trong danh s¸ch, nÕu kh«ng cã th× tr¶ vÒ trÞ NULL.

NODEPTR Srch_info(NODEPTR Last, int x)

{

NODEPTR p;

if (Empty(Last))

return (NULL);

else

{

p = Last->next; // p chi toi phan tu dau cua dslk vong

if (p->info==x)

return (p);

else

{ p=p->next;

while(p != Last->next && p->info != x )

p = p->next;

return (p->info==x ? p : NULL);

}

}

}

Page 89: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

89

IV.2.5. S¾p xÕp (Selection_Sort):

S¾p xÕp danh s¸ch liªn kÕt vßng theo thø tù info t¨ng dÇn theo ph­¬ng ph¸p Selection sort.

- Néi dung: Ta so s¸nh tÊt c¶ c¸c phÇn tö cña danh s¸ch ®Ó chän ra mét phÇn tö nhá nhÊt ®­a vÒ ®Çu danh s¸ch; sau ®ã, tiÕp tôc chän phÇn tö nhá nhÊt trong c¸c phÇn tö cßn l¹i ®Ó ®­a vÒ phÇn tö thø hai trong danh s¸ch. Qu¸ tr×nh nµy lÆp l¹i cho ®Õn khi chän ra ®­îc phÇn tö nhá thø (n-1).

- Gi¶i thuËt:

void selectionsort(NODEPTR &Last)

{

NODEPTR p, q, pmin;

int min;

for(p = Last->next; p->next != Last->next; p = p->next)

{

min = p->info;

pmin = p;

for(q = p->next; q != Last->next; q = q->next)

if(min > q->info)

{

min = q->info;

pmin = q;

}

// hoan doi truong info cua hai nut p va pmin

pmin->info = p->info;

p->info = min;

}

}

VÝ dô: ViÕt ch­¬ng tr×nh thùc hiÖn c¸c c«ng viÖc sau trªn mét danh s¸ch c¸c sè nguyªn víi cÊu tróc d÷ liÖu lµ danh s¸ch liªn kÕt vßng :

1. T¹o danh s¸ch sè

2. Thªm phÇn tö vµo ®Çu danh s¸ch

3. Thªm phÇn tö vµo cuèi danh s¸ch

4. Thªm phÇn tö vµo sau phÇn tö cã gi¸ trÞ x

5. Xãa phÇn tö ®Çu trong danh s¸ch

6. Xãa phÇn tö cuèi trong danh s¸ch

7. LiÖt kª danh s¸ch

Page 90: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

90

8. S¾p xÕp danh s¸ch theo thø tù t¨ng

9. Xãa toµn bé danh s¸ch

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <alloc.h>

#include <ctype.h>

#define TRUE 1

#define FALSE 0

struct node

{

int info;

struct node *next;

};

typedef struct node *NODEPTR;

NODEPTR Last;

// Phep toan New_node: cap phat mot nut cho danh sach lien ket

NODEPTR New_node(void)

{

NODEPTR p;

p = (NODEPTR)malloc(sizeof(struct node));

return(p);

}

// Phep toan initialize: khoi dong danh sach lien ket

void Initialize(NODEPTR &Last)

{

Last = NULL;

}

// Tac vu Empty: kiem tra danh sach lien ket co bi rong khong

int Empty(NODEPTR Last)

{

return(Last == NULL ? TRUE : FALSE);

}

// Phep toan Ins_first: them nut moi vao dau danh sach lien ket vong

void Ins_first(NODEPTR &Last, int x)

{

NODEPTR p;

Page 91: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

91

p = New_node();

p->info = x;

if (Empty(Last))

Last=p;

else

p->next = Last->next;

Last->next = p;

}

// Phep toan Ins_last: them nut moi vao cuoi danh sach lien ket vong

void Ins_last(NODEPTR &Last, int x)

{

NODEPTR p;

p = New_node();

p->info = x;

if (Empty(Last))

p->next=p;

else

{

p->next = Last->next;

Last->next = p;

}

Last = p;

}

// Phep toan Ins_after: them nut moi sau nut co dia chi p

void Ins_after(NODEPTR Last, NODEPTR p, int x)

{

NODEPTR q;

if(p == NULL)

printf("Nut hien tai khong co, nen khong the them");

else

{

if (p==Last)

Ins_last(Last,x);

else

{ q = New_node();

q->info = x;

q->next = p->next;

Page 92: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

92

p->next = q;

}

}

}

// Phep toan Del_first: xoa nut o dau danh sach lien ket

void Del_first(NODEPTR &Last)

{

NODEPTR p;

if(Empty(Last))

printf("Khong co nut trong danh sach lien ket vong, nen khong the xoa");

else

{

p = Last->next; // nut can xoa la nut dau

if (p==Last) // danh sach chi co 1 nut

Last=NULL;

else

Last->next = p->next;

free(p);

}

}

// Phep toan Del_last: xoa nut o cuoi danh sach lien ket

void Del_last(NODEPTR &Last)

{

NODEPTR p;

if(Empty(Last))

printf("Khong co nut trong danh sach lien ket vong, nen khong the xoa");

else

{

p = Last; // nut can xoa la nut cuoi

if (Last->next==Last) // danh sach chi co 1 nut

Last=NULL;

else

{

for (NODEPTR q=Last->next;q->next !=Last; q=q->next);

// q dung ngay truoc Last

q->next = Last->next;

Last=q;

Page 93: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

93

}

free(p);

}

}

// Tac vu Del_after: xoa nut sau nut p. Phep toan nay khong xoa duoc

// khi da rong hoac ds chi co 1 nut

void Del_after(NODEPTR &Last, NODEPTR p)

{

NODEPTR q;

if(Empty(Last))

printf("Khong co nut trong danh sach lien ket vong, nen khong the xoa");

else

{ // neu p la NULL hoac danh sach chi co 1 nut

if((p == NULL) || (Last->next == Last))

printf("khong the xoa trong danh sach lien ket vong duoc");

else

{

q=p->next;

if (p->next == Last)

{

p->next=Last->next;

Last=p;

}

else

p->next=q->next;

free(q);

}

}

}

// Phep toan clearlist: xoa tat ca cac nut trong danh sach lien ket vong

void clearlist(NODEPTR &Last)

{

while(Last != NULL)

Del_first(Last);

}

// Phep toan traverse: duyet danh sach lien ket vong

Page 94: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

94

void traverse (NODEPTR Last)

{

NODEPTR p;

p = Last->next; // p chi toi phan tu dau trong dslk vong

if(Last == NULL)

printf("\n Danh sach rong ");

else

{ printf("\n");

while(p != Last)

{

printf("%8d", p->info);

p = p->next;

}

printf("%8d", p->info);

}

}

/* PhÐp to¸n Srch_info: tim kiem theo phuong phap tim kiem tuyen tinh, neu khong tim thay ham nay tra ve NULL, neu tim thay ham nay tra ve con tro chi nut tim thay */

NODEPTR Srch_info(NODEPTR Last, int x)

{

NODEPTR p;

if (Empty(Last))

return (NULL);

else

{

p = Last->next; // p chi toi phan tu dau cua dslk vong

if (p->info==x)

return (p);

else

{ p=p->next;

while(p != Last->next && p->info != x )

p = p->next;

return (p->info==x ? p : NULL);

}

}

}

// Tac vu selectionsort: sap xep danh sach lien ket vong theo info tang dan

Page 95: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

95

void selectionsort(NODEPTR &Last)

{

NODEPTR p, q, pmin;

int min;

for(p = Last->next; p->next != Last->next; p = p->next)

{

min = p->info;

pmin = p;

for(q = p->next; q != Last->next; q = q->next)

if(min > q->info)

{

min = q->info;

pmin = q;

}

// hoan doi truong info cua hai nut p va pmin

pmin->info = p->info;

p->info = min;

}

}

void Create_list(NODEPTR &Last)

{

int nd;

clearlist(Last);

printf("Nhap so (ket thuc bang 0: ");

scanf("%d", &nd);

while (nd !=0)

{

Ins_last(Last, nd);

printf("Nhap so ke : ");

scanf("%d", &nd);

}

}

char menu ()

{ char chucnang;

do

{ clrscr();

Page 96: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

96

printf("\n\n\t\tCHUONG TRINH QUAN LY DANH SACH LIEN KET VONG");

printf("\n\nCac chuc nang cua chuong trinh:\n");

printf(" 1: Tao danh sach \n");

printf(" 2: Them phan tu vao dau danh sach\n");

printf(" 3: Them phan tu vao cuoi danh sach\n");

printf(" 4: Them phan tu vao sau phan tu co gia tri x\n");

printf(" 5: Xoa phan tu dau trong danh sach \n");

printf(" 6: Xoa phan tu cuoi trong danh sach \n");

printf(" 7: Liet ke danh sach \n");

printf(" 8: Sap xep danh sach theo thu tu tang\n");

printf(" 9: Xoa toan bo danh sach\n");

printf(" 0: Ket thuc chuong trinh\n");

printf("Chuc nang ban chon: ");

chucnang = getche();

} while(chucnang < '0' || chucnang >'9') ;

printf("\n");

return chucnang;

}

// chuong trinh chinh

void main()

{

int x, info;

char chucnang, c;

NODEPTR p;

// khoi dong danh sach lien ket

Initialize(Last);

do

{

chucnang = menu();

switch(chucnang)

{

case '1':

{

Create_list(Last);

break;

}

case '2':

{

Page 97: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

97

printf("\nNoi dung muon them: ");

scanf("%d",&x);

Ins_first(Last,x);

break;

}

case '3':

{

printf("\nNoi dung muon them: ");

scanf("%d",&x);

Ins_last(Last,x);

break;

}

case '4':

{

printf("\nNoi dung phan tu muon them: ");

scanf("%d",&x);

printf("\nBan muon them no vao sau phan tu co info = ");

scanf("%d",&info);

p=Srch_info(Last,info);

if (p==NULL)

{

printf("Khong co phan tu voi x=%d", info);

getch();

}

else

if (p==Last)

Ins_last(Last,x);

else

Ins_after(Last,p,x);

break;

}

case '5':

Del_first(Last);

break;

case '6':

Del_last(Last);

break;

case '7':

Page 98: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

98

{

Traverse(Last);

getche();

break;

}

case '8':

{

printf("\n Ban co chac khong? (c/k): ");

c = toupper(getche());

if( c == 'C')

selectionsort(Last);

break;

}

case '9':

{

printf("\n Ban co chac khong (c/k): ");

c = getche();

if(c == 'c' || c == 'C')

clearlist(Last);

break;

}

}

} while(chucnang != '0');

// xoa tat ca cac nut tren danh sach lien ket

clearlist(Last);

}

V. Danh s¸ch liªn kÕt kÐp (Doubly Linked List) :

V.1. Kh¸i niÖm :

Danh s¸ch liªn kÕt kÐp lµ mét danh s¸ch liªn kÕt mµ mçi phÇn tö cña nã cã 2 vïng liªn kÕt, liªn kÕt thuËn dïng ®Ó chØ ®Õn phÇn tö ®øng ngay sau nã (right), liªn kÕt nghÞch dïng ®Ó chØ ®Õn phÇn tö ®øng ngay tr­íc nã (left).

NULL

First•• •• •• •• ••

NULL

H×nh 4.9 Danh s¸ch liªn kÕt kÐp

Page 99: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

99

L­u ý:

- Nót cuèi cña danh s¸ch liªn kÕt kÐp cã tr­êng right lµ NULL, vµ nót ®Çu cña danh s¸ch liªn kÕt kÐp cã tr­êng left lµ NULL.

- Chóng ta cã thÓ duyÖt danh s¸ch liªn kÕt kÐp theo hai chiÒu duyÖt xu«i vµ duyÖt ng­îc.

* Khai b¸o: Ta khai b¸o biÕn First qu¶n lý danh s¸ch liªn kÕt kÐp víi thµnh phÇn néi dung lµ sè nguyªn nh­ sau:

struct node

{ int info ;

struct node *left, *right ;

};

typedef struct node *NODEPTR;

NODEPTR First. Last;

* Khëi t¹o :

First = NULL ;

- BiÕn First : con trá chØ ®Õn phÇn tö ®Çu danh s¸ch liªn kÕt kÐp

V.2. C¸c phÐp to¸n trªn danh s¸ch liªn kÕt kÐp:

V.2.1.T¹o danh s¸ch:

a. Khëi t¹o danh s¸ch (Initialize): dïng ®Ó khëi ®éng mét danh s¸ch liªn kÕt, cho ch­¬ng tr×nh hiÓu lµ hiÖn t¹i danh s¸ch liªn kÕt ch­a cã phÇn tö.

void Initialize(NODEPTR &First)

{

First = NULL;

}

b. CÊp ph¸t vïng nhí (New_Node): cÊp ph¸t mét nót cho danh s¸ch liªn kÕt kÐp. Hµm New_Node nµy tr¶ vÒ ®Þa chØ cña nót võa cÊp ph¸t.

NODEPTR New_node(void)

{

NODEPTR p;

p = (NODEPTR)malloc(sizeof(struct node));

return (p);

}

c. Thªm vµo ®Çu danh s¸ch (Insert_first): thªm mét nót cã néi dung x vµo ®Çu danh s¸ch liªn kÕt kÐp.

Page 100: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

100

void Insert_first(NODEPTR &First, int x)

{

NODEPTR p;

p = New_node();

p->info = x;

if(First == NULL) // truong hop danh sach rong

p->right = NULL;

else

{

// tao lien ket giua p va First

p->right = First;

First->left = p;

}

First = p;

p->left = NULL;

}

d. Thªm nót míi vµo sau nót cã ®Þa chØ p (Insert_right): thªm mét nót cã néi dung x vµo sau nót cã ®Þa chØ p trong danh s¸ch liªn kÕt kÐp. PhÐp to¸n nµy còng ®­îc dïng ®Ó thªm mét nót vµo cuèi danh s¸ch.

void Insert_right(NODEPTR p, int x)

{

NODEPTR q, r; // q la nut can them vao, p la nut truoc, r la nut sau

if(p == NULL)

printf("Nut p khong hien huu, khong them nut duoc\n");

else

{

q = New_node();

q->info = x;

r = p->right;

// tao hai lien ket giua r va q

r->left = q;

q->right = r;

// tao hai lien ket giua p va q

q->left = p;

p->right = q;

}

}

Page 101: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

101

e. Thªm nót míi vµo tr­íc nót cã ®Þa chØ p (Insert_left): thªm mét nót cã néi dung x vµo tr­íc nót cã ®Þa chØ p trong danh s¸ch liªn kÕt kÐp.

void Insert_left(NODEPTR &First, NODEPTR p, int x) {

NODEPTR q, r; // q la nut can them vao, p la nut sau, r la nut truoc

if(p == NULL)

printf("Nut p khong hien huu, khong them nut duoc\n");

else

{

if(p == First) // them nut vao dau danh sach

Insert_first(First, x);

else

{

q = New_node();

q->info = x;

r = p->left;

// tao hai lien ket giua r va q

r->right = q;

q->left = r;

// tao hai lien ket giua p va q

q->right = p;

p->left = q;

}

}

}

V.2.2. DuyÖt danh s¸ch:

Th«ng th­êng ta hay duyÖt danh s¸ch liªn kÕt ®Ó thùc hiÖn mét c«ng viÖc g× ®ã, nh­ liÖt kª d÷ liÖu trong danh s¸ch hay ®Õm sè nót trong danh s¸ch...

a. DuyÖt xu«i: DuyÖt danh s¸ch liªn kÕt kÐp tõ nót ®Çu cho tíi nót cuèi danh s¸ch.

void Right_traverse(NODEPTR First)

{

NODEPTR p;

if(empty(First))

printf("\n (khong co doan nao)");

else

{

p = First; // p chi nut dau

Page 102: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

102

while(p != NULL)

{

printf("\n%8d, p->info);

p = p->right;

}

}

}

b. DuyÖt ng­îc: DuyÖt danh s¸ch liªn kÕt kÐp tõ nót cuèi cho tíi nót ®Çu danh s¸ch.

void Left_traverse(NODEPTR First)

{

NODEPTR p;

if(empty(First))

printf("\n (khong co doan nao)");

else

{

for (p=First; p->right!=NULL; p=p->right); // p chi toi nut cuoi

while(p != NULL)

{

printf("\n%8d, p->info

p = p->left;

}

}

}

V.2.3. PhÐp lo¹i bá:

a. Gi¶i phãng vïng nhí(free): Hµm nµy dïng ®Ó hñy nót ®· cÊp ph¸t, vµ tr¶ vïng nhí vÒ l¹i cho memory heap.

free( p) ; víi p lµ biÕn con trá

b. KiÓm tra danh s¸ch liªn kÕt rçng hay kh«ng (Empty): hµm Empty tr¶ vÒ TRUE nÕu danh s¸ch liªn kÕt vßng rçng, vµ ng­îc l¹i.

int Empty(NODEPTR First) { return(First == NULL ? TRUE : FALSE); }

c. Xãa phÇn tö ®Çu cña danh s¸ch (Delete_first): muèn xãa 1 phÇn tö khái danh s¸ch liªn kÕt th× ta ph¶i kiÓm tra xem danh s¸ch cã rçng hay kh«ng; nÕu danh s¸ch cã phÇn tö th× míi xãa ®­îc.

Page 103: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

103

void Delete_first(NODEPTR &First)

{

NODEPTR p;

if(empty(First)) // truong hop danh sach rong

printf("Danh sach rong, khong xoa nut duoc");

else

{

p = First; // p la nut can xoa

if(First->right == NULL) // truong hop danh sach co mot nut

First = NULL;

else

{

First = p->right;

First->left = NULL;

}

free(p);

}

}

d. Xãa phÇn tö cã ®Þa chØ p (Delete_node):

void Delete_node(NODEPTR &First, NODEPTR p)

{

NODEPTR q, r;

if(p == NULL)

printf("Nut p khong hien huu, khong xoa nut duoc\n");

else

{

if(First == NULL) // truong hop danh sach rong

printf("Danh sach rong, khong xoa nut duoc");

else

{

if(p == First) // truong hop xoa nut dau

Delete_first(First);

else

{

q = p->left; // q la nut truoc

r = p->right; // r la nut sau

// tao hai lien ket giua q va r

r->left = q;

Page 104: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

104

q->right = r;

free(p);

}

}

}

}

e. Xãa toµn bé danh s¸ch (Clearlist):

void clearlist(NODEPTR &First)

{

while(First != NULL)

Delete_first(Last);

}

V.2.4. T×m kiÕm (Search_info):

T×m nót ®Çu tiªn trong danh s¸ch liªn kÕt kÐp cã info b»ng víi x.

Hµm Search_info nÕu t×m thÊy x trong danh s¸ch th× tr¶ vÒ ®Þa chØ cña nót ®ã trong danh s¸ch, nÕu kh«ng cã th× tr¶ vÒ trÞ NULL.

NODEPTR Search_info(NODEPTR First, int x)

{

NODEPTR p;

p = First;

while(p->info != x && p != NULL)

p = p->right;

return(p);

}

VÝ dô:

ViÕt ch­¬ng tr×nh qu¶n lý vµ ®iÒu hµnh tuyÕn xe löa TP HCM - HA NOI b»ng danh s¸ch liªn kÕt kÐp; mçi nót cña danh s¸ch lµ mét ®o¹n ®­êng cã ga tr­íc, ga sau, chiÒu dµi vµ thêi gian xe löa ch¹y trªn ®o¹n ®­êng ®ã.

Ch­¬ng tr×nh cã c¸c chøc n¨ng sau:

1. Thªm mét ®o¹n ®­êng

2. Xãa mét ®o¹n ®­êng

3. Xem toµn tuyÕn ®­êng theo liªn kÕt xu«i

4. Xem toµn tuyÕn ®­êng theo liªn kÕt ng­îc

5. Xem th«ng tin cña ®o¹n ®­êng thø i

6. HiÖu chØnh th«ng tin cña ®o¹n ®­êng thø i

Page 105: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

105

7. B¸o lé tr×nh: nhËp n¬i ®i vµ n¬i ®Õn, ch­¬ng tr×nh sÏ cho biÕt c¸c ga trung gian ph¶i ®i qua, tæng chiÒu dµi vµ tæng thêi gian cña lé tr×nh.

- Ch­¬ng tr×nh:

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <alloc.h>

#include <dos.h>

#include <ctype.h>

#define TRUE 1

#define FALSE 0

// Khai bao cau truc cua mot doan duong tren tuyen duong

typedef struct doan

{

char gatruoc[12];

char gasau[12];

int chieudai; // km

int thoigian; // thoi gian xe lua chay tren doan, tinh theo phut

};

// Khai bao cau truc cua mot nut

struct node

{

doan info;

struct node *left, *right;

};

typedef struct node *NODEPTR;

// Tac vu New_node: cap phat mot nut cho danh sach lien ket kep

NODEPTR New_node(void)

{

NODEPTR p;

p = (NODEPTR)malloc(sizeof(struct node));

return(p);

}

// Tac vu initialize: khoi dong danh sach lien ket kep

void Initialize(NODEPTR &First)

{

Page 106: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

106

First = NULL;

}

// Tac vu empty: kiem tra danh sach lien ket kep co bi rong khong

int empty(NODEPTR First)

{

return((First == NULL) ? TRUE : FALSE);

}

// Tac vu Insert_first: them nut vao dau danh sach lien ket

void Insert_first(NODEPTR &First, doan x)

{

NODEPTR p;

p = New_node();

p->info = x;

if(First == NULL) // truong hop danh sach rong

p->right = NULL;

else

{

// tao lien ket giua p va First

p->right = First;

First->left = p;

}

First = p;

p->left = NULL;

}

/ Tac vu Insert_right: them nut moi sau nut p

void Insert_right(NODEPTR p, doan x)

{

NODEPTR q, r; // q la nut can them vao, p la nut truoc, r la nut sau

if(p == NULL)

printf("Nut p khong hien huu, khong them nut duoc\n");

else

{

q = New_node();

q->info = x;

r = p->right;

// tao hai lien ket giua r va q

r->left = q;

Page 107: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

107

q->right = r;

// tao hai lien ket giua p va q

q->left = p;

p->right = q;

}

}

// Tac vu Insert_left: them nut moi truoc nut p

void Insert_left(NODEPTR &First, NODEPTR p, doan x)

{

NODEPTR q, r; // q la nut can them vao, p la nut sau, r la nut truoc

if(p == NULL)

printf("Nut p khong hien huu, khong them nut duoc\n");

else

{

if(p == First) // them nut vao dau danh sach

Insert_first(First, x);

else

{

q = New_node();

q->info = x;

r = p->left;

// tao hai lien ket giua r va q

r->right = q;

q->left = r;

// tao hai lien ket giua p va q

q->right = p;

p->left = q;

}

}

}

// Tac vu Delete_first: xoa nut o dau danh sach lien ket

void Delete_first(NODEPTR &First)

{

NODEPTR p;

if(empty(First)) // truong hop danh sach rong

printf("Danh sach rong, khong xoa nut duoc");

else

Page 108: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

108

{

p = First; // p la nut can xoa

if(First->right == NULL) // truong hop danh sach co mot nut

First = NULL;

else

{

First = p->right;

First->left = NULL;

}

free(p);

}

}

// Tac vu Delete_node: xoa nut co con tro la p

void Delete_node(NODEPTR &First, NODEPTR p)

{

NODEPTR q, r;

if(p == NULL)

printf("Nut p khong hien huu, khong xoa nut duoc\n");

else

{

if(First == NULL) // truong hop danh sach rong

printf("Danh sach rong, khong xoa nut duoc");

else

{

if(p == First) // truong hop xoa nut dau

Delete_first(First);

else

{

q = p->left; // q la nut truoc

r = p->right; // r la nut sau

// tao hai lien ket giua q va r

r->left = q;

q->right = r;

free(p);

}

}

}

Page 109: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

109

}

// Tac vu Right_traverse: duyet danh sach tu trai sang phai (duyet xuoi)

void Right_traverse(NODEPTR First)

{

NODEPTR p;

int stt;

if(empty(First))

printf("\n (khong co doan nao)");

else

{

p = First; // p chi nut dau

stt = 1;

while(p != NULL)

{

printf("\n%5d%12s%12s%7d%7d", stt++, p->info.gatruoc,

p->info.gasau, p->info.chieudai, p->info.thoigian);

p = p->right;

}

}

}

// Tac vu Left_traverse: duyet danh sach tu phai sang trai (duyet nguoc)

void Left_traverse(NODEPTR First)

{

NODEPTR p;

int stt;

if(empty(First))

printf("\n (khong co doan nao)");

else

{

for (p=First; p->right!=NULL; p=p->right); // p chi toi nut cuoi

stt = 1;

while(p != NULL)

{

printf("\n%5d%12s%12s%7d%7d", stt++, p->info.gasau,

p->info.gatruoc, p->info.chieudai, p->info.thoigian);

p = p->left;

}

Page 110: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

110

}

}

// Tac vu Search_info1: tim ga truoc cua mot doan

NODEPTR Search_info1(NODEPTR First, char x[])

{

NODEPTR p;

p = First;

while(strcmp(p->info.gatruoc, x) != 0 && p != NULL)

p = p->right;

return(p);

}

// Tac vu Search_info2: tim ga sau cua mot doan

NODEPTR Search_info2(NODEPTR First, char x[])

{

NODEPTR p;

p = First;

while(strcmp(p->info.gasau, x) != 0 && p != NULL)

p = p->right;

return(p);

}

// Tac vu clearlist: xoa toan bo danh sach lien ket kep

void clearlist(NODEPTR &First)

{

while(First != NULL)

Delete_first(First);

}

int position(NODEPTR First, NODEPTR p)

{

int vitri;

NODEPTR q;

q = First;

vitri = 0;

while(q != NULL && q != p)

{

q = q->right;

vitri++;

}

Page 111: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

111

if(q == NULL)

return(-1);

return(vitri);

}

void baolotrinh(NODEPTR &First, char noidi[], char noiden[], char c)

{

NODEPTR p1, p2;

int kc, tg;

if(c == 'X')

{

p1 = Search_info1(First, noidi);

if(p1 == NULL)

{

printf("Khong co noi di");

return;

}

if(strcmp(noidi, noiden) == 0)

{

printf("Noi di trung noi den");

return;

}

p2 = Search_info2(First, noiden);

if(p2 == NULL)

{

printf("Khong co noi den");

return;

}

if(position(First, p1) <= position(First, p2))

{

kc = tg = 0;

while(p1 != p2)

{

kc = kc + p1->info.chieudai;

tg = tg + p1->info.thoigian;

printf("\n%s -> %s : %d km %d phut", p1->info.gatruoc,

p1->info.gasau, p1->info.chieudai, p1->info.thoigian);

p1 = p1->right;

Page 112: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

112

}

kc = kc + p1->info.chieudai;

tg = tg + p1->info.thoigian;

printf("\n%s -> %s : %d km %d phut", p1->info.gatruoc,

p1->info.gasau, p1->info.chieudai, p1->info.thoigian);

printf("\nTong chieu dai lo trinh: %d km. Tong thoi gian van chuyen %d phut", kc, tg);

}

else

printf("Khong di xuoi duoc");

return;

}

if(c == 'N')

{

p1 = Search_info2(First, noidi);

if(p1 == NULL)

{

printf("Khong co noi di");

return;

}

if(strcmp(noidi, noiden) == 0)

{

printf("Noi di trung noi den");

return;

}

p2 = Search_info1(First, noiden);

if(p2 == NULL)

{

printf("Khong co noi den");

return;

}

if(position(First, p1) >= position(First, p2))

{

kc = tg = 0;

while(p1 != p2)

{

Page 113: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

113

kc = kc + p1->info.chieudai;

tg = tg + p1->info.thoigian;

printf("\n%s -> %s : %d km %d phut", p1->info.gasau,

p1->info.gatruoc, p1->info.chieudai, p1->info.thoigian);

p1 = p1->left;

}

kc = kc + p1->info.chieudai;

tg = tg + p1->info.thoigian;

printf("\n%s -> %s : %d km %d phut", p1->info.gasau,

p1->info.gatruoc, p1->info.chieudai, p1->info.thoigian);

printf("\nTong chieu dai lo trinh: %d km. Tong thoi gian van chuyen %d phut", kc, tg);

}

else

printf("Khong di nguoc duoc");

return;

}

}

/* Tac vu nodepointer: xac dinh con tro chi nut thu i (i=0,1,2,...) trong

danh sach lien ket kep */

NODEPTR nodepointer(NODEPTR First, int i)

{

NODEPTR p;

int vitri;

p = First; // p chi nut dau dslk vong

vitri = 1;

while(p != NULL && vitri < i)

{

p = p->right;

vitri++;

}

return(p);

}

char menu ()

{ char chucnang;

do

{ clrscr();

Page 114: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

114

// menu chinh cua chuong trinh

printf("\n\nCHUONG TRINH QUAN LY VA DIEU HANH

TUYEN XE LUA TPHCM - HANOI\n");

printf(" 1: Them mot doan\n");

printf(" 2: Xoa mot doan\n");

printf(" 3: Xem lo trinh 1 (duyet xuoi)\n");

printf(" 4: Xem lo trinh 2 (duyet nguoc)\n");

printf(" 5: Xem thong tin cua doan thu i\n");

printf(" 6: Hieu chinh thong tin ve doan thu i\n");

printf(" 7: Bao lo trinh\n");

printf(" 0: Ket thuc chuong trinh\n");

printf("Chuc nang ban chon: ");

chucnang = getche();

} while(chucnang < '0' || chucnang >'7') ;

return chucnang;

}

// chuong trinh chinh

void main()

{

NODEPTR First, p, p1;

doan ga;

int vitri;

char c, chucnang;

char noidi[12], noiden[12];

char c_vitri[3], c_chieudai[10], c_thoigian[10];

clrscr();

// khoi dong danh sach lien ket kep

Initialize(First);

do

{

chucnang=menu();

switch(chucnang)

{

case '1':

{

printf("\nVi tri them (1, 2, ...): ");

gets(c_vitri);

Page 115: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

115

vitri = atoi(c_vitri);

p = nodepointer(First, vitri-1);//p chi nut truoc nut can them

if (vitri <=0 || (p==NULL && First !=NULL))

{

printf("Vi tri khong hop le");

getche();

}

else

{

printf("Ten ga truoc: ");

gets(ga.gatruoc);

printf("Ten ga sau: ");

gets(ga.gasau);

printf("Chieu dai (km): ");

gets(c_chieudai);

ga.chieudai = atoi(c_chieudai);

printf("Thoi gian (phut): ");

gets(c_thoigian);

ga.thoigian = atoi(c_thoigian);

if(vitri == 1 || First ==NULL)

Insert_first(First, ga);

else

Insert_right(p, ga);

}

break;

}

case '2':

{

printf("\nVi tri muon xoa(1,2,...): ");

gets(c_vitri);

vitri = atoi(c_vitri);

p = nodepointer(First, vitri);

if(p == NULL)

printf("Vi tri khong hop le");

else

{

if(vitri == 1)

Page 116: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

116

Delete_first(First);

else

Delete_node(First, p);

printf("Da xoa xong ");

}

delay(2000);

break;

}

case '3':

{

printf("\nXem lo trinh 1 (duyet xuoi): ");

printf("\n STT TU DEN CD TG");

Right_traverse(First);

getche();

break;

}

case '4':

{

printf("\nXem lo trinh 2 (duyet nguoc): ");

printf("\n STT TU DEN CD TG");

Left_traverse(First);

getche();

break;

}

case '5':

{

printf("\nVi tri doan muon xem thong tin(1,2,...): ");

gets(c_vitri);

vitri = atoi(c_vitri);

p = nodepointer(First, vitri);

if(p == NULL)

printf("Vi tri khong hop le");

else

printf("\nDoan:%d Tu:%s Den:%s Chieu dai:%d km Thoi gian:%d phut", vitri, p->info.gatruoc, p->info.gasau, p->info.chieudai, p->info.thoigian);

getche();

Page 117: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

117

break;

}

case '6':

{

printf("\nVi tri doan muon hieu chinh(1,2,...): ");

gets(c_vitri);

vitri = atoi(c_vitri);

p = nodepointer(First, vitri);

if(p == NULL)

printf("Vi tri khong hop le");

else

{

printf("\nDoan:%d Tu:%s Den:%s Chieu dai:%d km

Thoi gian:%d phut\n", vitri, p->info.gatruoc,

p->info.gasau, p->info.chieudai, p->info.thoigian);

printf("Ten ga truoc: ");

gets(ga.gatruoc);

printf("Ten ga sau: ");

gets(ga.gasau);

printf("Chieu dai (km): ");

gets(c_chieudai);

ga.chieudai = atoi(c_chieudai);

printf("Thoi gian (phut): ");

gets(c_thoigian);

ga.thoigian = atoi(c_thoigian);

p->info = ga;

}

break;

}

case '7':

{

printf("\nBan di xuoi hay nguoc (x/n): ");

c = toupper(getch());

printf("\nCho biet noi di: ");

gets(noidi);

printf("\nCho biet noi den: "); gets(noiden);

Page 118: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

118

baolotrinh(First, noidi, noiden, c); getch(); break;

}

} } while(chucnang != '0'); // Xoa toan bo cac nut tren danh sach lien ket kep clearlist(First);

}

VI. stack & queue trªn danh s¸ch liªn kÕt:

VI.1 Stack:

VI.1.1. Kh¸i niÖm:

Nh­ ta ®· biÕt, Stack lµ mét danh s¸ch mµ viÖc thªm vµo vµ lo¹i bá mét phÇn tö chØ diÔn ra cïng mét ®Çu cña danh s¸ch, tøc lµ theo c¬ chÕ LIFO (Last In First Out). Trong ch­¬ng 3, ta ®· kh¶o s¸t Stack víi cÊu tróc d÷ liÖu lµ danh s¸ch tuyÕn tÝnh, viÖc thªm vµo vµ lo¹i bá diÔn ra ë cuèi danh s¸ch. Víi danh s¸ch tuyÕn tÝnh lµm Stack th× Stack cã ®iÓm h¹n chÕ vÒ sè l­îng phÇn tö ph¶i khai b¸o tr­íc. §Ó kh¾c phôc nh­îc ®iÓm nµy, ta sÏ x©y dùng Stack víi cÊu tróc d÷ liÖu lµ danh s¸ch liªn kÕt ®¬n. ViÖc thªm vµo vµ lo¹i bá sÏ diÔn ra ë ®Çu danh s¸ch.

- Khai b¸o: Ta khai b¸o biÕn sp (Stack Pointer) lµ con trá chØ ®Õn mét danh s¸ch lµ Stack, mçi phÇn tö trong Stack lµ 1 sè nguyªn nh­ sau:

struct node

{ int info ;

struct node *next ;

};

typedef struct node *Stack;

Stack sp;

- Khëi t¹o Stack : sp = NULL;

L­u ý:

- Víi Stack lµ danh s¸ch liªn kÕt, ta chØ thùc hiÖn c¸c phÐp to¸n ë ®Çu danh s¸ch liªn kÕt.

- Kh«ng cã tr­êng hîp Stack ®Çy ; Stack rçng khi Sp = NULL ;

VI.1.2. C¸c phÐp to¸n trªn Stack:

§èi víi Stack, cã hai phÐp to¸n chñ yÕu lµ thªm vµo (Push) vµ lo¹i bá (Pop)

a. PhÐp thªm vµo (push) : Thªm mét phÇn tö cã gi¸ trÞ x vµo ®Çu Stack.

Page 119: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

119

void push(Stack &sp, int x)

{

Stack p;

p = (Stack)malloc(sizeof(struct node));

p->info = x;

p->next = sp;

sp = p;

}

b. PhÐp lo¹i bá (pop): Xãa phÇn tö khái Stack vµ tr¶ cho ch­¬ng tr×nh gäi gi¸ trÞ cña phÇn tö võa xãa.

int pop(Stack &sp)

{

Stack p;

int x;

if(sp==NULL)

printf("\nStack rong");

else

{

p = sp; // nut can xoa la nut dau

x =sp->info;

sp = p->next;

free(p);

return x;

}

}

VI.2. Queue:

VI.2.1.Kh¸i niÖm:

Queue lµ mét danh s¸ch h¹n chÕ mµ viÖc thªm vµo ®­îc thùc hiÖn ë ®Çu danh s¸ch, vµ viÖc lo¹i bá ®­îc thùc hiÖn ë ®Çu cßn l¹i cña danh s¸ch (FIFO -

First In First Out). Queue chøa c¸c phÇn tö cã cïng kiÓu d÷ liÖu. ë ch­¬ng nµy, ta chØ tæ chøc queue theo danh s¸ch liªn kÕt.

- VÞ trÝ ®Ó lo¹i bá phÇn tö ®­îc gäi lµ Front

- VÞ trÝ ®Ó thªm vµo ®­îc gäi lµ Rear

Queue cã hai phÐp to¸n chÝnh:

- Insert_queue : thªm mét phÇn tö vµo hµng ®îi; Trong tr­êng hîp nµy ta kh«ng cÇn quan t©m hµng ®îi bÞ trµn hay bÞ ®Çy.

Page 120: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

120

- Delete_queue: lo¹i bá phÇn tö khái Queue vµ tr¶ vÒ gi¸ trÞ cña phÇn tö võa xãa; tr­íc khi xãa, ta ph¶i kiÓm tra Queue cã kh¸c rçng hay kh«ng.

L­u ý:

- PhÐp to¸n Insert_queue thùc hiÖn ë cuèi hµng ®îi, cßn phÐp to¸n Delete_queue thùc hiÖn ë ®Çu hµng ®îi.

- Khai b¸o: Ta khai b¸o biÕn q cã kiÓu cÊu tróc Queue gåm 2 thµnh phÇn front, rear lµ con trá chØ ®Çu vµ cuèi hµng ®îi. Mçi phÇn tö cña hµng ®îi lµ mét nót chøa mét sè nguyªn.

struct node

{

int info;

struct node *next;

};

typedef node *Hangdoi;

struct Queue

{

Hangdoi Front, Rear;

};

struct Queue q;

- Khëi t¹o hµng ®îi: q.Front = NULL;

VI.2.2. C¸c phÐp to¸n trªn Queue:

a. PhÐp thªm vµo : Thªm vµo cuèi danh s¸ch liªn kÕt nªn sÏ thay ®æi gi¸ trÞ cña Rear

void Insert_queue(Queue &q, int x)

{

Hangdoi p;

p = (Hangdoi)malloc(sizeof(struct node));

p->info = x;

if (q.Front==NULL)

q.Front=p;

else q.Rear->next=p;

q.Rear=p;

p->next=NULL;

}

b. PhÐp lo¹i bá : Lo¹i bá phÇn tö ®Çu danh s¸ch liªn kÕt, do ®ã thay ®æi gi¸ trÞ cña Front

Page 121: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

121

int Delete_queue(Queue &q)

{

Hangdoi p;

int x;

if(q.Front==NULL)

printf("\nHang doi rong");

else

{

p = q.Front; // nut can xoa la nut dau

x = p->info;

q.Front = p->next;

free(p);

return x;

}

}

VÝ dô: ViÕt ch­¬ng tr×nh ®æi sè kh«ng ©m hÖ decimal ra sè hÖ nhÞ ph©n, víi Stack vµ Queue lµ danh s¸ch liªn kÕt ®¬n.

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <math.h>

#define TRUE 1

#define FALSE 0

struct node

{

int info;

struct node *next;

};

typedef node *Stack;

Stack sp;

struct node_

{

int info;

struct node_ *next;

};

typedef node_ *Hangdoi;

Page 122: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

122

struct Queue

{

Hangdoi Front, Rear;

};

struct Queue q;

void push(Stack &sp, int x)

{

Stack p;

p = (Stack)malloc(sizeof(struct node));

p->info = x;

p->next = sp;

sp = p;

}

int pop(Stack &sp)

{

Stack p;

int x;

if(sp==NULL)

{

printf("\nStack rong");

getche();

exit(1);

}

else

{

p = sp; // nut can xoa la nut dau

x =sp->info;

sp = p->next;

free(p);

return x;

}

}

void Insert_queue(Queue &q, int x)

{

Hangdoi p;

p = (Hangdoi)malloc(sizeof(struct node));

p->info = x;

Page 123: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

123

if (q.Front==NULL)

q.Front=p;

else q.Rear->next=p;

q.Rear=p;

p->next=NULL;

}

int Delete_queue(Queue &q)

{

Hangdoi p;

int x;

if(q.Front==NULL)

{

printf("\nHang doi rong");

getche();

exit(1);

}

else

{

p = q.Front; // nut can xoa la nut dau

x = p->info;

q.Front = p->next;

free(p);

return x;

}

}

void main()

{

int sodu;

float so;

char c;

clrscr();

do

{

sp =NULL; // khoi dong stack

q.Front =NULL ; // khoi dong hang doi

printf("\n\nNhap vao mot so thuc khong am: ");

scanf("%e", &so);

Page 124: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

124

double positive;

double r, le, nguyen;

le = modf(so,&nguyen);

do

{

sodu = (int) nguyen % 2;

push(sp, sodu); // push so du vao stack

nguyen = int(nguyen / 2);

} while (nguyen != 0);

printf("So da doi la: ");

while(sp!=NULL)

printf("%d", pop(sp)); // pop so du ra khoi stack

// Doi phan le ra so nhi phan

if (le!=0)

{

printf(".");

int i=0;

do

{ r =le*2;

le = modf(r,&positive);

Insert_queue(q, positive);

i++ ;

} while (i <8 && r!=1);

while (q.Front!=NULL)

{

printf("%d", Delete_queue(q));

}

}

printf("\n\nBan co muon tiep tuc khong? (c/k): ");

c = getche();

} while(c == 'c' || c == 'C');

}

Page 125: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

125

Bµi tËp:

1. ViÕt ch­¬ng tr×nh t¹o mét menu thùc hiÖn c¸c c«ng viÖc sau:

a. NhËp danh s¸ch liªn kÕt theo gi¶i thuËt thªm vÒ cuèi danh s¸ch, mçi phÇn tö gåm cã c¸c th«ng tin sau: mssv (int), vµ hoten (char hoten[30]).

b. LiÖt kª danh s¸ch ra mµn h×nh

c. Cho biÕt tæng sè nót trong danh s¸ch liªn kÕt, ®Æt tªn hµm lµ Reccount

(int Reccount (NODEPTR First))

d. Thªm 1 phÇn tö cã néi dung info (mssv, hoten) vµo sau phÇn tö cã thø tù thø i trong danh s¸ch.

Ghi chó: - Thø tù theo qui ­íc b¾t ®Çu lµ 1

- NÕu (i = 0) thªm vµo ®Çu danh s¸ch

- NÕu i > Reccount(First) th× thªm vµo cuèi danh s¸ch.

e. In ra hä tªn cña sinh viªn cã m· do ta nhËp vµo.

f. Lo¹i bá nót cã m· do ta nhËp vµo, tr­íc khi xãa hái l¹i "B¹n thËt sù muèn xãa (Y/N) ? "

g. S¾p xÕp l¹i danh s¸ch theo thø tù m· sè gi¶m dÇn.

h. Ghi toµn bé danh s¸ch vµo file tªn 'DSSV.DAT'

i. N¹p danh s¸ch tõ file 'DSSV.DAT' vµo danh s¸ch liªn kÕt. NÕu trong danh s¸ch liªn kÕt ®· cã nót th× xãa tÊt c¶ d÷ liÖu hiÖn cã trong danh s¸ch liªn kÕt tr­íc khi ®­a d÷ liÖu tõ file vµo.

2. ViÕt ch­¬ng tr×nh t¹o mét danh s¸ch liªn kÕt theo gi¶i thuËt thªm vµo ®Çu danh s¸ch, mçi nót chøa mét sè nguyªn.

3. ViÕt hµm tªn Delete_Node ®Ó xãa nót cã ®Þa chØ p.

ViÕt mét hµm lo¹i bá tÊt c¶ c¸c nót cã néi dung x trong danh s¸ch liªn kÕt First.

4. ViÕt hµm Copy_List trªn danh s¸ch liªn kÕt ®Ó t¹o ra mét danh s¸ch liªn kÕt míi gièng danh s¸ch liªn kÕt cò.

5. GhÐp mét danh s¸ch liªn kÕt cã ®Þa chØ ®Çu lµ First2 vµo mét danh s¸ch liªn kÕt cã ®Þa chØ ®Çu lµ First1 ngay sau phÇn tö thø i trong danh s¸ch liªn kÕt First1.

6. ViÕt hµm läc danh s¸ch liªn kÕt ®Ó tr¸nh tr­êng hîp c¸c nót trong danh s¸ch liªn kÕt bÞ trïng info.

7. §¶o ng­îc vïng liªn kÕt cña mét danh s¸ch liªn kÕt sao cho: - First sÏ chØ ®Õn phÇn tö cuèi - PhÇn tö ®Çu cã liªn kÕt lµ NULL.

Page 126: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

126

8. ViÕt hµm Left_Traverse (NODEPTR First) ®Ó duyÖt ng­îc danh s¸ch liªn kÕt.

9. ViÕt gi¶i thuËt t¸ch mét danh s¸ch liªn kÕt thµnh hai danh s¸ch liªn kÕt, trong ®ã mét danh s¸ch liªn kÕt chøa c¸c phÇn tö cã sè thø tù lÏ vµ mét danh s¸ch liªn kÕt chøa c¸c phÇn tö cã sè thø tù ch½n trong danh s¸ch liªn kÕt cò.

10. T¹o mét danh s¸ch liªn kÕt chøa tªn häc viªn, ®iÓm trung b×nh, h¹ng cña häc viªn (víi ®iÒu kiÖn chØ nhËp tªn vµ ®iÓm trung b×nh). Qu¸ tr×nh nhËp sÏ dõng l¹i khi tªn nhËp vµo lµ rçng.

XÕp h¹ng cho c¸c häc viªn. In ra danh s¸ch häc viªn thø tù h¹ng t¨ng dÇn (Ghi chó : Cïng ®iÓm trung b×nh th× cïng h¹ng).

11. NhËp hai ®a thøc theo danh s¸ch liªn kÕt. In ra tÝch cña hai ®a thøc nµy.

VÝ dô: §a thøc First1 : 2x5+4x2-1

§a thøc First2 : 10x7-3x4+x2

KÕt qu¶ in ra : 20x12 + 34x9 - 8x7 - 12x6 + 7x4 - x2

(Ghi chó : Kh«ng nhËp vµ in ra c¸c sè h¹ng cã hÖ sè b»ng 0)

12. ViÕt gi¶i thuËt thªm phÇn tö cã néi dung x vµo danh s¸ch liªn kÕt cã thø tù t¨ng dÇn sao cho sau khi thªm danh s¸ch liªn kÕt vÉn cã thø tù t¨ng.

13. Lo¹i bá phÇn tö cã néi dung lµ x trong danh s¸ch liªn kÕt cã thø tù t¨ng dÇn.

14. Cho 2 danh s¸ch liªn kÕt First1, First2 cã thø tù t¨ng dÇn theo info. ViÕt gi¶i thuËt Merge ®Ó trén 2 danh s¸ch liªn kÕt nµy l¹i sao cho danh s¸ch liªn kÕt sau khi trén còng cã thø tù t¨ng dÇn.

Page 127: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

127

CH­¬NG V

c©Y (TREE)

C©y lµ mét cÊu tróc d÷ liÖu rÊt th«ng dông vµ quan träng trong nhiÒu ph¹m vi kh¸c nhau cña kü thuËt m¸y tÝnh.

VÝ dô : Tæ chøc c¸c quan hÖ hä hµng trong mét gia ph¶, môc lôc cña mét cuèn s¸ch, x©y dùng cÊu tróc vÒ có ph¸p trong c¸c tr×nh biªn dÞch.

Trong ch­¬ng tr×nh nµy, chóng ta kh¶o s¸t c¸c kh¸i niÖm c¬ b¶n vÒ c©y, c¸c phÐp to¸n trªn c©y nhÞ ph©n, còng nh­ c¸c phÐp to¸n trªn c©y nhÞ ph©n c©n b»ng ( AVL tree) vµ øng dông cña hai lo¹i c©y nhÞ ph©n t×m kiÕm (BST), c©y nhÞ ph©n c©n b»ng ( AVL tree).

I. ®Þnh nghÜa vµ kh¸i niÖm:

I.1. Mét sè kh¸i niÖm c¬ b¶n:

1. C©y: C©y lµ tËp hîp c¸c phÇn tö gäi lµ nót, mét nót (t­¬ng tù nh­ mét phÇn tö cña danh s¸ch) cã thÓ cã kiÓu bÊt kú. C¸c nót ®­îc biÓu diÔn bëi 1 ký tù ch÷, mét chuçi, mét sè ghi trong mét vßng trßn.

Mét sè ®Þnh nghÜa theo ®Ö quy

Mét nót ®¬n còng chÝnh lµ mét c©y.

C¸c nót ®­îc gäi lµ ë cïng mét c©y khi cã ®­êng ®i gi÷a c¸c nót nµy.

Mét c©y sÏ bao gåm mét nót gèc (Root) vµ m c©y con, trong mçi c©y con l¹i cã mét nót gèc vµ m1 c©y con nhá h¬n v.v.

Mét c©y kh«ng cã mét nót nµo c¶ gäi lµ c©y rçng.

VÝ dô 1 :

A

B C

G H E

J

D

F

KI

1

2

3

4

Nuùt goác

H×nh 5.1. C©y víi nót gèc lµ A

- A lµ nót gèc víi 3 c©y con lÇn l­ît cã 3 nót gèc riªng lµ B, C, D

- Nót cha (ancestor)

Nót con (descendent)

A lµ nót cha cña B, C, D

G, H lµ nót con cña C

G, H kh«ng quan hÖ cha con víi A

Page 128: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

128

VÝ dô 2 : Víi ®Ò c­¬ng mét m«n häc T, ta cã thÓ biÓu diÔn d¹ng c©y nh­ sau :

T

CHÖÔNG I CHÖÔNG II CHÖÔNG III

I.1 I.2 II.1 II.3II.2

II.1.1 II.1.2

H×nh 5.2 C©y biÓu diÔn ®Ò c­¬ng m«n häc

CH­¬NG I

I.1

I.2

CH­¬NG II

II.1

II.1.1

II.1.2

II.2

II.3

CH­¬NG III

2. Nót cha (Ancestor) : Nót ®øng trªn cña mét nót ®­îc gäi lµ nót cha

C lµ nót cha cña G, H

Nót con (descendent) : Nót ®øng sau mét nót kh¸c ®­îc gäi lµ nót con cña nót ®ã.

Nót I, J, K lµ nót con cña nót E

3. BËc (degree) :

- BËc cña nót lµ sè c©y con cña nót ®ã.

C cã bËc lµ 2, E cã bËc lµ 3 (H×nh 5.1)

- BËc cña c©y lµ bËc lín nhÊt cña c¸c nót trong c©y.

C©y trong h×nh 5.1 cã bËc lµ 3.

C©y bËc n ®­îc gäi lµ c©y n ph©n nh­ c©y nhÞ ph©n, c©y tam ph©n....

4. Nót l¸ vµ nót trung gian :

- Nót l¸ lµ nót cã bËc b»ng 0 (tøc lµ kh«ng cã c©y con nµo) :

- Nót trung gian: lµ mét nót cã bËc kh¸c 0 vµ kh«ng ph¶i lµ nót gèc.

VÝ dô: Trong h×nh 5.1, B, G, H, I, J, K, F lµ nót l¸

C, D, E lµ nót trung gian.

Page 129: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

129

5. Møc cña nót (level) : Nót gèc cã møc lµ 1

Møc cña nót con = møc cña nót cha + 1

VÝ dô: trong h×nh 5.1,

A cã møc lµ 1

B, C, D cã møc lµ 2

G, H, E, F cã møc lµ 3

I, J, K cã møc lµ 4

6. ChiÒu cao cña c©y (height) : lµ møc lín nhÊt cña c¸c nót l¸ trong c©y.

VÝ dô: C©y trong h×nh 5.1 cã chiÒu cao lµ 4

7. Thø tù cña c¸c nót (order of nodes) : NÕu c©y ®­îc gäi lµ cã thø tù th× ph¶i ®¶m b¶o vÞ trÝ cña c¸c nót con tõ tr¸i qua ph¶i, tøc lµ nÕu thay ®æi vÞ trÝ cña mét nót con bÊt kú th× ta ®· cã mét c©y míi.

VÝ dô :

B

A

C C

A

B

Kâaùc vôùi

H×nh 5.3: Sau khi ®æi vÞ trÝ cña 2 nót B, C ta ®· cã c©y míi.

8. ChiÒu dµi ®­êng ®i (Path length) :

- ChiÒu dµi ®­êng ®i cña nót x: lµ sè c¸c c¹nh ®i tõ nót gèc ®Õn nót x.

VÝ dô: Trong h×nh 5.1:

Nót gèc A cã chiÒu dµi ®­êng ®i lµ 1

Nót B, C, D cã chiÒu dµi ®­êng ®i lµ 2

Tæng qu¸t: mét nót t¹i møc i cã chiÒu dµi ®­êng ®i lµ i

- ChiÒu dµi ®­êng ®i cña c©y: lµ tæng cña c¸c chiÒu dµi ®­êng ®i cña tÊt c¶ c¸c nót trong c©y.

VÝ dô: ChiÒu dµi ®­êng ®i cña c©y trong h×nh 5.1 lµ 31.

ChiÒu dµi ®­êng ®i trung b×nh cña c©y:

Page 130: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

130

n/)i.n(Pi

ii

trong ®ã ni lµ sè c¸c nót ë møc i vµ n lµ tæng sè c¸c nót trong c©y.

I.2. C¸ch biÓu diÔn c©y:

§Ó biÓu diÔn 1 c©y, ta cã nhiÒu c¸ch nh­ biÓu diÔn b»ng ®å thÞ, b»ng gi¶n ®å, b»ng chØ sè.. Nh­ng th«ng th­êng, ta hay dïng d¹ng ®å thÞ ®Ó biÓu diÔn 1 c©y nh­ h×nh 5.1

I.3. BiÓu diÔn thø tù c¸c nót trong c©y :

Mét c©y th­êng tæ chøc c¸c nót theo mét thø tù nhÊt ®Þnh c¨n cø vµo mét néi dung gäi lµ khãa cña c¸c nót. Cã thÓ tæ chøc c©y cã khãa t¨ng dÇn theo møc tõ tr¸i qua ph¶i nh­ vÝ dô sau :

2

1

3

54

76 98

Root

ROOT 123456789

Nh­ vËy khi duyÖt l¹i c©y theo møc t¨ng dÇn vµ tõ tr¸i qua ph¶i ta sÏ l¹i cã ®­îc thø tù c¸c nót nh­ trªn.

H×nh 5.4. C©y cã thø tù t¨ng dÇn theo møc tõ tr¸i qua ph¶i

II. C©y nhÞ ph©n (Binary tree)

II.1. §Þnh nghÜa :

1. C©y nhÞ ph©n : Lµ c©y cã bËc b»ng 2, tøc lµ sè nót con tèi ®a cña mét nót bÊt kú trong c©y lµ 2.

C©y nhÞ ph©n cã thÓ lµ mét c©y rçng (kh«ng cã nót nµo) hoÆc c©y chØ cã mét nót, hoÆc c©y chØ cã c¸c nót con bªn tr¸i (Left Child) hoÆc nót con bªn ph¶i (Right Child) hoÆc c¶ hai.

VÝ dô: H×nh 5.4 lµ c©y nhÞ ph©n.

2. C¸c c©y nhÞ ph©n ®Æc biÖt:

- C©y nhÞ ph©n ®óng: Mét c©y nhÞ ph©n ®­îc gäi lµ c©y nhÞ ph©n ®óng nÕu nót gèc vµ tÊt c¶ c¸c nót trung gian ®Òu cã 2 nót con.

Page 131: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

131

B

A

C

X F

H I

D E

G Y

B

A

C

X F

H I

D E

G Y

H×nh 5.5. C©y nhÞ ph©n ®óng

Ghi chó: nÕu c©y nhÞ ph©n ®óng cã n nót l¸ th× c©y nµy sÏ cã tÊt c¶ 2n-1 nót.

- C©y nhÞ ph©n ®Çy: Mét c©y nhÞ ph©n gäi lµ c©y nhÞ ph©n ®Çy víi chiÒu cao d th×:

Nã ph¶i lµ c©y nhÞ ph©n ®óng vµ

TÊt c¶ c¸c nót l¸ ®Òu cã møc lµ d.

H×nh 5.5 kh«ng ph¶i lµ c©y nhÞ ph©n ®Çy.

B

A

C

F G

N O

D E

J K L MH I

B

A

C

F G

N O

D E

J K L MH I

H×nh 5.6. C©y nhÞ ph©n ®Çy.

Ghi chó: C©y nhÞ ph©n ®Çy lµ c©y nhÞ ph©n cã sè nót tèi ®a ë mçi møc.

- C©y nhÞ ph©n t×m kiÕm (Binary Search Tree - BST): Mét c©y nhÞ ph©n gäi lµ c©y nhÞ ph©n t×m kiÕm nÕu vµ chØ nÕu ®èi víi mäi nót cña c©y th× khãa cña mét nót bÊt kú ph¶i lín h¬n khãa cña tÊt c¶ c¸c nót trong c©y con bªn tr¸i cña nã vµ ph¶i nhá h¬n khãa cña tÊt c¶ c¸c nót trong c©y con bªn ph¶i cña nã.

VÝ dô:

Page 132: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

132

7

8

9

3

2

1

11

12105

64

H×nh 5.7 C©y nhÞ ph©n t×m kiÕm (BST)

- C©y nhÞ ph©n c©n b»ng (AVL): Mét c©y nhÞ ph©n ®­îc gäi lµ c©y nhÞ ph©n c©n b»ng nÕu vµ chØ nÕu ®èi víi mäi nót cña c©y th× chiÒu cao cña c©y con bªn tr¸i vµ chiÒu cao cña c©y con bªn ph¶i h¬n kÐm nhau nhiÒu nhÊt lµ 1. (Theo Adelson - Velski vµ Landis).

B

A

C

E F

I J

D

G H

B

A

C

E F

I J

D

G H

H×nh 5.8. C©y nhÞ ph©n c©n b»ng

- C©y nhÞ ph©n c©n b»ng hoµn toµn: Mét c©y nhÞ ph©n ®­îc gäi lµ c©y nhÞ ph©n c©n b»ng hoµn toµn nÕu vµ chØ nÕu ®èi víi mäi nót cña c©y th× sè nót cña c©y con bªn tr¸i vµ sè nót cña c©y con bªn ph¶i h¬n kÐm nhau nhiÒu nhÊt lµ 1.

B

A

C

E F

I

E D

HH

B

A

C

E F

I

E D

HH

H×nh 5.9. C©y nhÞ ph©n c©n b»ng hoµn toµn

3. C¸c phÐp duyÖt c©y (Traverse) : Lµ qu¸ tr×nh ®i qua c¸c nót ®óng mét lÇn. Khi duyÖt c©y, ta th­êng dïng c¸c c¸ch duyÖt c¬ b¶n sau :

Page 133: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

133

- Preorder - TiÒn tù (NLR) duyÖt qua nót gèc tr­íc, sau ®ã ®i qua c©y con bªn tr¸i l¹i ¸p dông Preorder cho c©y con bªn tr¸i. Cuèi cïng qua c©y con bªn ph¶i, ¸p dông Preorder cho c©y con bªn ph¶i.

VÝ dô: Theo c©y nhÞ ph©n 5.4, ta cã:

ROOT 1 2 3 4 6 7 5 8 9

- Inorder - Trung tù (LNR) : qua c©y con bªn tr¸i duyÖt tr­íc (theo thø tù LNR), sau ®ã th¨m nót gèc, cuèi cïng qua c©y con bªn ph¶i (theo thø tù LNR)

VÝ dô: Theo c©y nhÞ ph©n 5.4, ta cã:

ROOT 2 1 6 4 7 3 8 5 9

- Postorder - HËu tù (LRN) : qua c©y con bªn tr¸i duyÖt tr­íc (theo thø tù LRN), sau ®ã qua c©y con bªn ph¶i (theo thø tù LRN), cuèi cïng th¨m nót gèc.

VÝ dô: Theo c©y nhÞ ph©n 5.4, ta cã:

ROOT 2 6 7 4 8 9 5 3 1

Ghi chó : §èi víi c©y ta cã thÓ tæ chøc thø tù theo khãa lµ mét néi dung cña nót hoÆc ta ®Æt thªm 1 field gäi lµ khãa cña nót.

II.2. C¸c phÐp to¸n trªn c©y nhÞ ph©n:

- Khai b¸o: §Ó tæ chøc d÷ liÖu theo c©y nhÞ ph©n, ta cã thÓ dïng mét néi dung cña d÷ liÖu ®Ó lµm khãa s¾p xÕp vµ tæ chøc c©y theo nhiÒu c¸ch kh¸c nhau. Nh­ng th«ng th­êng ®Ó thuËn tiÖn cho viÖc t×m kiÕm vµ thùc hiÖn c¸c phÐp to¸n kh¸c trªn c©y, ng­êi ta t¹o thªm mét khãa riªng trong c¸c phÇn tö vµ t¹o ra c©y nhÞ ph©n t×m kiÕm.

§Ó khai b¸o biÕn tree qu¶n lý mét c©y nhÞ ph©n, víi néi dung info chøa sè nguyªn, ta khai b¸o nh­ sau:

struct nodetype

{

int key;

int info;

struct nodetype *left;

struct nodetype *right;

};

typedef struct nodetype *NODEPTR;

NODEPTR tree;

II.2.1. T¹o c©y :

a. Khëi t¹o c©y (Initialize): dïng ®Ó khëi t¹o c©y nhÞ ph©n, cho ch­¬ng tr×nh hiÓu lµ hiÖn t¹i c©y nhÞ ph©n rçng.

Page 134: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

134

void Initialize(NODEPTR &root)

{

root = NULL;

}

Lêi gäi hµm: Initialize(tree);

b. CÊp ph¸t vïng nhí (New_Node): cÊp ph¸t mét nót cho c©y nhÞ ph©n. Hµm New_Node nµy tr¶ vÒ ®Þa chØ cña nót võa cÊp ph¸t.

NODEPTR New_Node(void)

{

NODEPTR p;

p = (NODEPTR)malloc(sizeof(struct nodetype));

return(p);

}

Lêi gäi hµm: p= New_Node();

c. T¹o c©y BST (Create_Tree): Trong gi¶i thuËt t¹o c©y BST, ta cã dïng hµm Insert_node.

Hµm Insert_node: Dïng ph­¬ng ph¸p ®Ö qui thªm nót cã khãa x, néi dung a vµo c©y cã nót gèc root. C©y nhÞ ph©n t¹o ®­îc qua gi¶i thuËt Create_Tree lµ c©y nhÞ ph©n t×m kiÕm (BST).

void Insert_node(NODEPTR &p, int x, int a)

{

if(p == NULL) // nót p hiÖn t¹i sÏ lµ nót l¸

{

p = New_node();

p->key = x;

p->info = a;

p->left = NULL;

p->right = NULL;

}

else

if(x < p->key )

Insert_node(p->left, x, a);

else if(x > p->key )

Insert_node(p->right, x, a);

}

void Create_Tree(NODEPTR &root)

{

int khoa, noidung;

Page 135: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

135

do

{ printf("Nhap khoa :");

cin >> khoa;

if (khoa !=0)

{

printf("Nhap noi dung :");

cin >> noidung;

Insert_node(root,khoa,noidung);

}

} while (khoa!=0); // khãa b»ng 0 th× dõng nhËp

}

Ghi chó : §Ó t¹o c©y nhÞ ph©n do biÕn tree qu¶n lý, ta gäi:

Create_Tree(&tree);

II.2.2. CËp nhËt c©y :

a. Gi¶i phãng vïng nhí (Free_Node): gi¶i phãng vïng nhí mµ p ®ang trá ®Õn.

free(p);

b. KiÓm tra c©y nhÞ ph©n rçng hay kh«ng (Empty): hµm Empty tr¶ vÒ TRUE nÕu c©y nhÞ ph©n rçng, vµ ng­îc l¹i.

int Empty(NODEPTR root)

return(root == NULL ? TRUE : FALSE);

}

Lêi gäi hµm : Empty(tree)

c. Hñy bá mét nót trong c©y nhÞ ph©n BST (Remove):

Xãa nót cã khãa lµ x trong c©y nhÞ ph©n t×m kiÕm sao cho sau khi xãa th× c©y nhÞ ph©n vÉn lµ c©y nhÞ ph©n t×m kiÕm. Ta cã 3 tr­êng hîp :

- Tr­êng hîp 1: nót p cÇn xãa lµ nót l¸. ViÖc xãa nót p chØ ®¬n gi¶n lµ hñy nót p

p1

p

p1

p1

p

p1

Page 136: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

136

- Tr­êng hîp 2: Nót p cÇn xãa cã 1 c©y con, th× ta cho rp chØ tíi nót p. Sau ®ã, ta t¹o liªn kÕt tõ nót cha cña p tíi nót con cña rp, cuèi cïng hñy nót p.

10

5

3

15

12 20

2 4

p xoùa nuùt p10

3 15

12 202 4

rp

H×nh 5.10. Xãa nót p trong tr­êng hîp nót nµy cã 1 c©y con bªn tr¸i.

2

10

5

3

15

4

20

18 25

rp

pxoùa nuùt p

10

5

3

20

18 25

2 4

H×nh 5.11. Xãa nót p trong tr­êng hîp nót nµy cã 1 c©y con bªn ph¶i.

- Tr­êng hîp 3: Nót p cÇn xãa cã 2 c©y con. Ta cho rp chØ tíi nót p. Do tÝnh chÊt nót cùc tr¸i cña c©y con bªn ph¶i cña p cã khãa võa lín h¬n khãa cña p, nªn ®Ó lo¹i p th× ta sÏ cho r chØ tíi nót cùc tr¸i ®ã. Sau ®ã, ta sao chÐp néi dung vµ khãa cña nót r vµo nót mµ rp ®ang chØ tíi. Ta t¹o liªn kÕt thÝch hîp ®Ó bøt nót rp ra khái c©y nhÞ ph©n vµ cuèi cïng xãa nót rp.

10

5 20

15 30

12 18

28

25 35

p

nuùt traùi nâaát cuûa caây con beân pâaûi

10

5 25

15 30

12 18 28 35

r

H×nh 5.12. Xãa nót p trong tr­êng hîp nót nµy cã 2 c©y con.

Hµm Remove xãa nót cã khãa lµ x:

NODEPTR rp;

void remove_case_3 ( NODEPTR &r )

{

Page 137: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

137

if (r->left != NULL)

remove_case_3 (r->left);

//den day r la nut cuc trai cua cay con ben phai co nut goc la rp}

else

{

rp->key = r->key; //Chep noi dung cua r sang rp ";

rp->info =r->info; // de lat nua free(rp)

rp = r;

r = r->right;

}

}

void remove (int x , NODEPTR &p )

{

if (p == NULL) printf ("Khong tm thay");

else

if (x < p->key) remove (x, p->left);

else if (x > p->key)

remove (x, p->right);

else // p^.key = x

{

rp = p;

if (rp->right == NULL) p = rp->left; // p lµ nót l¸ hoac la nut chi co cay con ben trai

else if (rp->left == NULL)

p = rp->right; // p lµ nut co cay con ben phai

else remove_case_3 (rp->right);

free (rp);

}

}

Lêi gäi hµm: Remove(x, tree); // x lµ khãa cña nót muèn xãa

d. T×m kiÕm (Search): T×m nót cã khãa b»ng x trªn c©y nhÞ ph©n BST cã gèc lµ root. NÕu t×m thÊy x trong c©y th× tr¶ vÒ ®Þa chØ cña nót cã trÞ b»ng x trong c©y, nÕu kh«ng cã th× tr¶ vÒ trÞ NULL.

Do c©y nhÞ ph©n lµ BST nªn ta cã thÓ t×m kiÕm nhanh b»ng ph­¬ng ph¸p t×m kiÕm nhÞ ph©n.

Page 138: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

138

NODEPTR Search(NODEPTR root, int x)

{

NODEPTR p;

p = root;

while(p != NULL && x!=p->key)

if(x < p->key)

p = p->left;

else

p = p->right;

return(p);

}

Lêi gäi hµm: p=Search(tree, x);

II.2.3. C¸c phÐp duyÖt c©y: Cã 3 c¸ch duyÖt c¬ b¶n lµ NLR, LNR, LRN vµ mét c¸ch ®Æc biÖt lµ duyÖt c©y theo møc. XÐt c©y sau :

7

8

9

3

2

1

11

12105

64

H×nh 5.13 C©y nhÞ ph©n minh häa cho phÇn duyÖt c©y.

a. DuyÖt c©y theo thø tù NLR (Preorder):

Gi¶i thuËt ®Ö qui:

void Preorder (NODEPTR root)

{ if(root != NULL)

{ printf("%d ", root->info);

Preorder(root->left);

Preorder (root->right);

}

}

Gi¶i thuËt kh«ng ®Ö qui: §i tõ gèc qua hÕt nh¸nh bªn tr¸i, mçi lÇn qua mét nót gi÷ l¹i ®Þa chØ nót con bªn ph¶i cña nã trong Stack.

Page 139: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

139

Sau khi duyÖt ®Õn nót l¸ tËn cïng bªn tr¸i, ta lÇn l­ît quay vÒ duyÖt c¸c nót bªn ph¶i b»ng c¸ch lÊy ®Þa chØ cña nót nµy tõ Stack. T¹i mçi nót lÊy ra, ta l¹i duyÖt sang nh¸nh tr¸i cña nã vµ cÊt ®Þa chØ nót con bªn ph¶i vµo Stack. Qu¸ tr×nh nµy sÏ dõng l¹i khi ta ®· duyÖt hÕt c¸c nót cña c©y nhÞ ph©n.

void Pretrav (NODEPTR root)

{

const STACKSIZE = 50;

NODEPTR Stack[STACKSIZE];

int cont,sp;

NODEPTR p=root;

sp=-1; // Khoi tao Stack rong

cont=1;

while (p!=NULL && cont)

{

cout << p->info << " ";

if (p->right != NULL)

Stack[++sp]= p->right;

if (p->left != NULL)

p=p->left;

else if (sp==-1)

cont =0;

else

p=Stack[sp--];

}

}

b. DuyÖt c©y theo thø tù LNR (Inorder):

Gi¶i thuËt ®Ö qui:

void Inorder(NODEPTR root)

{ if(root != NULL)

{ Inorder(root->left);

printf("%d ", root->info);

Inorder(root->right);

}

}

Gi¶i thuËt kh«ng ®Ö qui:

(i) §i tõ nót gèc qua hÕt nh¸nh bªn tr¸i, mçi lÇn qua mét nót ta gi÷ l¹i ®Þa chØ cña nót ®ã trong Stack.

Page 140: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

140

(ii) LÊy ®Þa chØ mét nót trong Stack ra, sau ®ã duyÖt sang nh¸nh ph¶i cña nót võa lÊy trong Stack.

(iii) Quay vÒ (i) cho tíi khi Stack rçng th× dõng.

void Intrav(NODEPTR root)

{

const STACKSIZE = 50;

NODEPTR Stack[STACKSIZE];

int cont,sp;

NODEPTR p=root;

sp=-1; // Khoi tao Stack rong

cont=1;

do

{

while (p != NULL)

{

Stack[++sp]= p;

p= p->left;

}

if (sp != -1)

{

p=Stack[sp--];

cout << p->info << " ";

p=p->right;

cont =1;

}

else cont =0;

} while (cont);

}

c. DuyÖt c©y theo thø tù LRN (Posorder):

Gi¶i thuËt ®Ö qui:

void Posorder(NODEPTR root)

{ if(root != NULL)

{ Posorder(root->left);

Posorder(root->right);

printf("%d ", root->info);

}

}

Page 141: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

141

Gi¶i thuËt kh«ng ®Ö qui: So víi hai c¸ch duyÖt tr­íc, c¸ch duyÖt LRN kh«ng ®Ö quy sÏ khã h¬n v× ta ph¶i gi÷ c¶ nót cha vµ nót con bªn ph¶i vµo Stack. Nót cha ®­îc ®­a vµo Stack tr­íc, nót con bªn ph¶i ®­a vµo sau ®Ó lÊy ra tr­íc.

C¸ch thùc hiÖn :

(1) NÕu nót cã nót con bªn tr¸i vµ nót con bªn ph¶i, ta cÊt nót nµy vµ nót con bªn ph¶i cña nã vµo Stack vµ ®i qua nót con bªn tr¸i.

(2) TiÕp tôc b­íc trªn cho ®Õn khi tíi nót l¸ tËn cïng bªn tr¸i, duyÖt nót nµy

(3) LÊy nót trong Stack ra, nÕu nót nµy cã nót con ta lÆp l¹i b­íc 1; nÕu kh«ng cã vµ lµ nót ph¶i th× duyÖt nót nµy vµ nót cha cña nã (trong Stack)

(4) LÆp l¹i c¸c b­íc (1), (2) vµ (3) cho ®Õn khi Stack rçng.

Stack sÏ gåm hai thµnh phÇn vµ ®­îc khëi t¹o b»ng mét phÇn tö cã ®Þa chØ = NULL.

void Postrav(NODEPTR root)

{

const STACKSIZE = 50;

struct phantu

{

NODEPTR diachi;

int kieu; //de danh dau la nut cha hay nut con ben phai

}; // kieu = TRUE -> nut con ben phai

// kieu= FALSE -> nut cha

phantu Stack[STACKSIZE];

int typ, sp;

NODEPTR p=root;

sp=0;

typ=TRUE;

Stack[0].diachi=NULL; // Khoi tao Stack

do

{

while (p != NULL && typ)

{

Stack[++sp].diachi= p;

Stack[sp].kieu= FALSE;

if (p->right != NULL)

{

Stack[++sp].diachi= p->right;

Page 142: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

142

Stack[sp].kieu= TRUE;

}

p= p->left;

}

if (p != NULL)

cout << p->info << " ";

p=Stack[sp].diachi;

typ=Stack[sp--].kieu;

} while (p!=NULL);

}

d. DuyÖt c©y theo møc: Ngoµi 3 c¸ch duyÖt c¬ b¶n trªn, ta cã thÓ duyÖt c©y theo møc tõ møc thÊp ®Õn møc cao, trong tõng møc th× duyÖt tõ tr¸i qua ph¶i.

DuyÖt c©y theo møc :

Root 8 7 9 3 11 2 5 10 12 1 4 6

§Ó thùc hiÖn phÐp duyÖt, ta dïng mét hµng ®Ó gi÷ ®Þa chØ c¸c nót, víi tæ chøc hµng lµ mét danh s¸ch liªn kÕt.

struct node

{

NODEPTR diachi ;

struct node *next;

};

typedef node *Node_queue;

struct Queue

{

Node_queue Front, Rear;

} q;

void Insert_queue(Queue &q, NODEPTR x)

{

Node_queue p;

p = (Node_queue)malloc(sizeof(struct node));

p->diachi = x;

if (q.Front==NULL)

q.Front=p;

else q.Rear->next=p;

q.Rear=p;

p->next=NULL;

}

Page 143: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

143

NODEPTR Delete_queue(Queue &q)

{

Node_queue p;

NODEPTR x;

if(q.Front==NULL)

{

printf("\nHang doi rong");

getche();

exit(1);

}

else

{

p = q.Front; // nut can xoa la nut dau

x = p->diachi;

q.Front = p->next;

free(p);

return x;

}

}

Gi¶i thuËt duyÖt nh­ sau:

- §­a nót gèc vµo hµng

- while (hµng != rçng)

+ LÊy 1 nót ra khái hµng

+ Xö lý nót nµy

+ §­a c¸c nót con cña nót nµy vµo hµng nÕu cã

Do hµng ®­îc tæ chøc theo kiÓu FIFO, nªn ta sÏ lu«n lu«n xö lý nót gèc ë møc thÊp tr­íc, vµ do ®­a c¶ 2 nót con vµo hµng theo thø tù nót con bªn tr¸i tr­íc nªn khi lÊy ra khái hµng ta sÏ xö lý ®­îc tÊt c¶ c¸c nót trong cïng mét møc theo thø tù tõ tr¸i qua ph¶i.

* Cµi ®Æt:

void leveltrav (NODEPTR root)

{

NODEPTR p;

q.Front=NULL;

q.Rear = NULL;

if (root!=NULL)

Insert_queue(q, root);

Page 144: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

144

while (q.Front !=NULL)

{

p=Delete_queue(q);

cout << p->info << " ";

if (p->left !=NULL)

Insert_queue(q,p->left);

if (p->right !=NULL)

Insert_queue(q,p->right);

}

}

III. c©y nhÞ ph©n T×M KIÕM c©n b»ng (AVL):

Chóng ta t¹o c©y nhÞ ph©n t×m kiÕm môc ®Ých lµ ®Ó t×m khãa cho nhanh, tuy nhiªn ®Ó t¨ng tèc ®é t×m kiÕm th× c©y cÇn ph¶i c©n ®èi vÒ 2 nh¸nh theo tõng nót trong c©y. Do vËy, ta sÏ t×m c¸ch tæ chøc l¹i c©y BST sao cho nã c©n b»ng.

III.1. §Þnh nghÜa:

- C©y nhÞ ph©n t×m kiÕm c©n b»ng (AVL) lµ c©y nhÞ ph©n t×m kiÕm mµ t¹i tÊt c¶ c¸c nót cña nã chiÒu cao cña c©y con bªn tr¸i cña nã vµ chiÒu cao cña c©y con bªn ph¶i chªnh lÖch nhau kh«ng qu¸ mét.

10

20

15 30

6

8

12 25 4018

H×nh 5.14. C©y nhÞ ph©n t×m kiÕm c©n b»ng

L­u ý: Víi c©y AVL, viÖc thªm vµo hay lo¹i bá 1 nót trªn c©y cã thÓ lµm c©y mÊt c©n b»ng, khi ®ã ta ph¶i c©n b»ng l¹i c©y. Tuy nhiªn viÖc c©n b»ng l¹i trªn c©y AVL chØ x¶y ra ë ph¹m vi côc bé b»ng c¸ch xoay tr¸i hoÆc xoay ph¶i ë mét vµi nh¸nh c©y con nªn gi¶m thiÓu chi phÝ c©n b»ng.

- ChØ sè c©n b»ng (balance factor) cña mét nót p trªn c©y AVL= lh(p) - rh(p)

Trong ®ã: lh (p) lµ chiÒu cao cña c©y con bªn tr¸i cña p

rh(p) lµ chiÒu cao cña c©y con bªn ph¶i cña p

Ta cã c¸c tr­êng hîp sau:

bf(p) = 0 nÕu lh(p) = rh(p) nót p c©n b»ng

bf(p) = 1 nÕu lh(p) = rh(p) +1 nót p bÞ lÖch vÒ tr¸i

bf(p) = -1 nÕu lh(p) = rh(p) -1 nót p bÞ lÖch vÒ ph¶i

Page 145: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

145

-1

1

0

B

0

B

0

1 -1

00

U4

0

U3U2

0

U1 B

0

B B

0

B

U8

0

U7U6

0

U5 U10

0

U9 U12

0

U11

A

B C

H×nh 5.15. Minh häa c¸c vÞ trÝ cã thÓ thªm nót l¸ vµo c©y AVL, khi thªm nót l¸ vµo 1 trong c¸c vÞ trÝ B th× c©y vÉn c©n b»ng, khi thªm nót l¸ vµo 1 trong c¸c vÞ trÝ U th× c©y sÏ mÊt c©n b»ng. C¸c sè trªn c©y lµ chØ sè c©n b»ng cña c¸c nót tr­íc khi thªm nót

III.2. C¸c phÐp to¸n trªn c©y AVL:

* Khai b¸o: Ta khai b¸o c©y AVL víi mçi nót cã thªm tr­êng bf cho biÕt chØ sè c©n b»ng cña nót ®ã.

struct nodetype { int key; int info; int bf; struct nodetype *left, *right; }; typedef struct nodetype *NODEPTR;

III.2.1. Thªm nót:

- Néi dung: Thªm 1 nót cã khãa x, néi dung a vµo c©y nhÞ ph©n t×m kiÕm c©n b»ng sao cho sau khi thªm th× c©y nhÞ ph©n vÉn lµ c©y nhÞ ph©n t×m kiÕm c©n b»ng.

- Gi¶i thuËt:

Thªm nót vµo c©y nh­ b×nh th­êng, nghÜa lµ nót võa thªm sÏ lµ nót l¸.

TÝnh l¹i chØ sè c©n b»ng cña c¸c nót cã bÞ ¶nh h­ëng

KiÓm tra xem c©y cã bÞ mÊt c©n b»ng hay kh«ng? NÕu c©y bÞ mÊt c©n b»ng th× ta c©n b»ng l¹i c©y.

* Tr­íc hÕt, ta h·y xÐt xem c¸c tr­êng hîp nµo khi thªm nót lµm c©y bÞ mÊt c©n b»ng.

Xem c©y h×nh 5.15, ta nhËn thÊy:

- NÕu thªm nót vµo 1 trong 6 vÞ trÝ B trªn c©y th× c©y vÉn c©n b»ng.

Page 146: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

146

- NÕu thªm nót vµo 1 trong c¸c vÞ trÝ U1U12 trªn c©y th× c©y sÏ mÊt c©n b»ng.

+ Thªm c¸c nót vµo sau bªn tr¸i cña nót A (bfA = 1) th× c©y sÏ bÞ mÊt c©n b»ng v× nót A ®ang bÞ lÖch tr¸i. §ã lµ c¸c vÞ trÝ U1, U2, U3, U4.

+ Thªm c¸c nót vµo sau bªn ph¶i cña nót C (bfC = -1) th× c©y sÏ bÞ mÊt c©n b»ng v× nót C ®ang bÞ lÖch ph¶i. §ã lµ c¸c vÞ trÝ U9, U10, U11, U12.

Tãm l¹i: Ta cã 2 tr­êng hîp khi thªm nót x vµo c©y AVL lµm c©y mÊt c©n b»ng, ®ã lµ thªm c¸c nót vµo sau bªn tr¸i cña nót cã bf = 1, vµ thªm c¸c nót vµo sau bªn ph¶i cña nót cã bf = -1.

* C©n b»ng l¹i c©y: Gäi ya lµ nót tr­íc gÇn nhÊt bÞ mÊt c©n b»ng khi thªm nót x vµo c©y AVL. Do c¶ 2 tr­êng hîp bÞ mÊt c©n b»ng khi thªm nót x lµ t­¬ng tù nhau nªn ta chØ xÐt tr­êng hîp bfya=1 vµ nót l¸ thªm vµo lµ nót sau bªn tr¸i cña nót ya.

1

0 T3câieàucao

nT1

câieàucao

n

T2câieàucao

n

S

ya

H×nh 5.16. Nh¸nh c©y con nót gèc ya tr­íc khi thªm nót.

NhËn xÐt:

- V× nót ya cã bfya = 1 nªn nót ya ch¾c ch¾n cã nót con bªn tr¸i s víi bfs = 0

- V× ya lµ nót gÇn nhÊt cã bf lµ 1 nªn nót s vµ c¸c nót tr­íc kh¸c cña nót x (sÏ thªm vµo) cã bf lµ 0.

- §é cao (T1) = §é cao(T2) = §é cao(T3)

Tr­êng hîp 1a: NÕu thªm nót míi x vµo vÞ trÝ nót sau bªn tr¸i cña s (thuéc nh¸nh T1) ta xoay ph¶i quanh nót ya

- Nót s sÏ lµ nót gèc míi cña nh¸nh c©y nµy víi bfs = 0

- Nót ya lµ nót con bªn ph¶i cña s víi bfya = 0.

0

T1câieàusaâu

n

0

T2câieàusaâun

T3câieàusaâu

n

S

ya

x

2

1 T3câieàusaâu

nT1

câieàusaâun

T2câieàusaâu

n

S

ya

x

xoay phaûiquanh nuùt ya

(a) (b)

0

T1câieàusaâu

n

0

T2câieàusaâun

T3câieàusaâu

n

S

ya

x

0

T1câieàusaâu

n

0

T2câieàusaâun

T3câieàusaâu

n

S

ya

x

2

1 T3câieàusaâu

nT1

câieàusaâun

T2câieàusaâu

n

S

ya

x

xoay phaûiquanh nuùt yaxoay phaûiquanh nuùt ya

(a) (b)

H×nh 5.17. Xoay ph¶i quanh nót ya ®Ó c©n b»ng l¹i c©y.

Page 147: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

147

Tr­êng hîp 1b: NÕu thªm nót míi x vµo vÞ trÝ nót sau bªn ph¶i cña s (thuéc nh¸nh T2) ta xoay 2 lÇn (xoay kÐp): xoay tr¸i quanh nót s vµ xoay ph¶i quanh nót ya

- Nót p sÏ lµ nót gèc míi cña nh¸nh c©y nµy víi bfp = 0 - Nót ya lµ nót con bªn ph¶i cña p víi bfya = -1 - Nót s lµ nót con bªn tr¸i cña p víi bfs = 0

2

-1 T3câieàusaâu

nT1câieàusaâun

S

ya

1

T2-1câieàusaâun-1

T2-2câieàusaâun-1

x

p

C©y AVL sau khi thªm nót x

x

T2-1câieàusaâu n-1

2

0

T1câieàusaâun

S

p

T2-2câieàusaâun-1

T3câieàusaâun

ya2

xoay traùi

quanh nuùt S

xoay phaûi

quanh nuùt ya

x

T2-1câieàusaâu n-1

0

0

T1câieàusaâun

S

p

-1

T2-2câieàusaâun-1

T3câieàusaâun

ya

H×nh 5.18. Xoay kÐp (xoay tr¸i quanh nót s, xoay ph¶i quanh nót ya) ®Ó c©n b»ng l¹i c©y.

Page 148: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

148

B¶ng sau ®©y ph©n biÖt c¸c tr­êng hîp c©y bÞ mÊt c©n 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 Tr­íc khi thªm nót x

Sau khi thªm nót x

C¸c phÐp xoay c©y vµ chØ sè c©n b»ng míi

1.a bfya = 1 bfs = 0

bfya = 2 bfs = 1

Xoay ph¶i quanh nót ya

bfs=0, bf ya = 0

1.b bfya = 1 bfs = 0

bfya = 2 bfs = -1

Xoay kÐp

1. Xoay tr¸i quanh nót s 2. Xoay ph¶i quanh nót ya bfs=0, bf ya = -1

2.a bfya = -1 bfs = 0

bfya = -2 bfs = -1

Xoay tr¸i quanh nót ya

bfs=0, bf ya = 0

2.b bfya = -1 bfs = 0

bfya = -2 bfs = 1

Xoay kÐp

1. Xoay ph¶i quanh nót s 2. Xoay tr¸i quanh nót ya bfs=0, bf ya = 1

- Gi¶i thuËt:

PhÐp xoay tr¸i (Rotate_Left): xoay tr¸i c©y nhÞ ph©n t×m kiÕm cã nót gèc lµ root, yªu cÇu root ph¶i cã nót con bªn ph¶i (gäi lµ nót p). Sau khi xoay tr¸i th× nót p trë thµnh nót gèc, nót gèc cò trë thµnh nót con bªn tr¸i cña nót gèc míi.

PhÐp xoay tr¸i tr¶ vÒ con trá chØ nót gèc míi.

NODEPTR Rotate_Left(NODEPTR root)

{

NODEPTR p;

if(root == NULL)

printf("Khong the xoay trai vi cay bi rong.");

else

if(root->right == NULL)

printf("Khong the xoay trai vi khong co nut con ben phai.");

else

{

p = root->right;

root->right = p->left;

p->left = root;

}

return p;

}

Page 149: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

149

PhÐp xoay ph¶i (Rotate_Right): xoay ph¶i c©y nhÞ ph©n t×m kiÕm cã nót gèc lµ root, yªu cÇu root ph¶i cã nót con bªn tr¸i (gäi lµ nót p). Sau khi xoay ph¶i th× nót p trë thµnh nót gèc, nót gèc cò trë thµnh nót con bªn ph¶i cña nót gèc míi.

PhÐp xoay ph¶i tr¶ vÒ con trá chØ nót gèc míi.

NODEPTR Rotate_Right(NODEPTR root)

{

NODEPTR p;

if(root == NULL)

printf("Khong the xoay phai vi cay bi rong.");

else

if(root->left == NULL)

printf("Khong the xoay phai vi khong co nut con ben trai.");

else

{

p = root->left;

root->left = p->right;

p->right = root;

}

return p;

}

Thªm nót (Insert): thªm nót cã khãa x, néi dung a vµo c©y AVL:

- Thªm nót theo gi¶i thuËt thªm nót vµo c©y nhÞ ph©n t×m kiÕm .

- C©n b»ng l¹i c©y b»ng c¸ch xoay ®¬n hay xoay kÐp

void Insert(NODEPTR &pavltree, int x, int a)

{

NODEPTR fp, p, q, // fp lµ nót cha cña p, q lµ con cña p

fya, ya, /* ya lµ nót tr­íc gÇn nhÊt cã thÓ mÊt c©n b»ng

fya lµ nót cha cña ya */

s; // s lµ nót con cña ya theo h­íng mÊt c©n b»ng

int imbal; /* imbal = 1 nÕu bÞ lÖch vÒ nh¸nh tr¸i

= -1 nÕu bÞ lÖch vÒ nh¸nh ph¶i */

// Khëi ®éng c¸c gi¸ trÞ

fp = NULL; p = pavltree;

fya = NULL; ya = p;

// tim nut fp, ya va fya, nut moi them vao la nut la con cua nut fp

while(p != NULL)

{

Page 150: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

150

if (x == p->info) // bi trung noi dung

return;

if (x < p->info)

q = p->left;

else

q = p->right;

if(q != NULL)

if(q->bf != 0) // truong hop chi so can bang cua q la 1 hay -1

{ fya = p;

ya = q;

}

fp = p;

p = q;

}

// Thªm nót míi (nut la) la con cua nut fp

q = New_Node(); // cÊp ph¸t vïng nhí

q->key =x; q->info = a; q->bf = 0;

q->left = NULL; q->right = NULL;

if(x < fp->info)

fp->left = q;

else

fp->right = q;

/* Hieu chinh chi so can bang cua tat ca cac nut giua ya va q, neu bi lech

ve phia trai thi chi so can bang cua tat ca cac nut giua ya va q deu la

1, neu bi lech ve phia phai thi chi so can bang cua tat ca cac nut giua

ya va q deu la -1 */

if(x < ya->info)

p = ya->left;

else

p = ya->right;

s = p; // s la con nut ya

while(p != q)

{ if(x < p->info)

{ p->bf = 1;

p = p->left;

}

else

{ p->bf = -1;

p = p->right;

}

Page 151: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

151

}

// xac dinh huong lech

if(x < ya->info)

imbal = 1;

else

imbal = -1;

if(ya->bf == 0)

{ ya->bf = imbal;

return;

}

if(ya->bf != imbal)

{ ya->bf = 0;

return;

}

if(s->bf == imbal) // Truong hop xoay don

{ if(imbal == 1) // xoay phai

p = Rotate_Right(ya);

else // xoay trai

p = Rotate_Left(ya);

ya->bf = 0;

s->bf = 0;

}

else // Truong hop xoay kep

{ if(imbal == 1) // xoay kep trai-phai

{ ya->left = Rotate_Left(s);

p = Rotate_Right(ya);

}

else // xoay kep phai-trai -

{ ya->right = Rotate_Right(s);

p = Rotate_Left(ya);

}

if(p->bf == 0) // truong hop p la nut moi them vao

{ ya->bf = 0;

s->bf = 0;

}

else

if(p->bf == imbal)

{ ya->bf = -imbal;

s->bf = 0;

}

Page 152: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

152

else

{ ya->bf = 0;

s->bf = imbal;

}

p->bf = 0;

}

if(fya == NULL)

pavltree = p;

else

if(ya == fya->right)

fya->right = p;

else

fya->left = p;

}

* §Ó t¹o c©y nhÞ ph©n t×m kiÕm c©n b»ng, ta sö dông gi¶i thuËt sau:

void Create_AVLTree(NODEPTR &root)

{ int khoa, noidung;

char so[10];

NODEPTR p;

do

{ printf("Nhap khoa :"); gets(so) ;

khoa = atoi(so);

if (khoa !=0)

{ printf("Nhap noi dung :");

gets(so) ;

noidung = atoi(so);

if (root==NULL)

{ p = New_Node();

p->key = khoa; p->info = noidung; p->bf = 0 ;

p->left = NULL; p->right = NULL;

root =p;

}

else Insert(root,khoa,noidung);

}

} while (khoa!=0); // khãa =0 th× dõng nhËp

}

Ghi chó: §Ó t¹o c©y nhÞ ph©n do biÕn tree qu¶n lý, ta gäi:

Create_AVLTree(tree);

Page 153: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

153

III.2.2. CËp nhËt c©y:

1. T×m kiÕm (Search): T×m nót cã khãa b»ng x trªn c©y nhÞ ph©n AVL cã gèc lµ root. NÕu t×m thÊy x trong c©y th× tr¶ vÒ ®Þa chØ cña nót cã trÞ b»ng x trongc©y, nÕu kh«ng cã th× tr¶ vÒ trÞ NULL.

Do AVL lµ c©y nhÞ ph©n BST nªn ta cã thÓ t×m kiÕm nhanh b»ng ph­¬ng ph¸p t×m kiÕm nhÞ ph©n, vµ do tÝnh chÊt lóc nµy c©y c©n b»ng nªn thêi gian t×m kiÕm sÏ nhanh h¬n rÊt nhiÒu.

NODEPTR search(NODEPTR root, int x)

{

NODEPTR p;

p = root;

while(p != NULL && x!=p->key)

if(x < p->key)

p = p->left;

else

p = p->right;

return(p);

}

2. Xãa nót : Remove (root, x):

- Néi dung: xãa nót cã khãa x trªn c©y AVL víi ®Þa chØ sao ®Çu root sao cho sau khi xãa th× c©y vÉn lµ AVL.

- Gi¶i thuËt:

NÕu root == NULL th× Th«ngb¸o ("Kh«ng thÓ xãa ®­îc nót x trªn c©y")

NÕu root != NULL th×

NÕu x< root->info th×:

+ Gäi ®Ö qui ®Ó xãa nót x ë nh¸nh bªn tr¸i cña root :

Remove(root->left, x)

+ Gäi balance_left ®Ó c©n b»ng l¹i c©y nót gèc root nÕu nh¸nh c©y con bªn tr¸i bÞ gi¶m ®é cao.

NÕu x > root->info th×:

+ Gäi ®Ö qui ®Ó xãa nót x ë nh¸nh bªn ph¶i cña root :

Remove(root->right, x)

+ Gäi balance_right ®Ó c©n b»ng l¹i c©y nót gèc root nÕu nh¸nh c©y con bªn ph¶i bÞ gi¶m ®é cao.

NÕu x==root->info th×:

Xãa nót root nh­ phÐp to¸n xãa trªn c©y nhÞ ph©n BST.

- Ch­¬ng tr×nh : tù cµi ®Æt.

Page 154: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

154

III.2.3. C¸c phÐp duyÖt c©y:

Do c©y AVL còng lµ c©y nhÞ ph©n nªn ta sÏ ¸p dông l¹i c¸c ph­¬ng ph¸p duyÖt Preorder, Inorder vµ Postorder vµo c©y AVL.

a. DuyÖt c©y theo thø tù NLR (Preorder):

void Preorder (NODEPTR root)

{

if (root != NULL)

{

printf("%d ", root->info);

Preorder(root->left);

Preorder (root->right);

}

}

b. DuyÖt c©y theo thø tù LNR (Inorder):

void Inorder(NODEPTR root)

{

if(root != NULL)

{

Inorder(root->left);

printf("%d ", root->info);

Inorder(root->right);

}

}

c. DuyÖt c©y theo thø tù LRN (Posorder):

void Posorder(NODEPTR root)

{

if(root != NULL)

{

Posorder(root->left);

Posorder(root->right);

printf("%d ", root->info);

}

}

Page 155: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

155

Bµi tËp:

1. ViÕt ch­¬ng tr×nh t¹o mét menu thùc hiÖn c¸c môc sau:

a. T¹o c©y nhÞ ph©n t×m kiÕm víi néi dung lµ sè nguyªn (kh«ng trïng nhau).

b. LiÖt kª c©y nhÞ ph©n ra mµn h×nh theo thø tù NLR

c. §Õm tæng sè nót, sè nót l¸, vµ sè nót trung gian cña c©y.

d. TÝnh ®é cao cña c©y.

e. Lo¹i bá nót cã néi dung lµ x trong c©y nhÞ ph©n BST.

f. Thªm nót cã néi dung x vµo c©y nhÞ ph©n BST sao cho sau khi thªm th× c©y vÉn lµ BST.

g. VÏ c©y nhÞ ph©n ra mµn h×nh.

2. Cho mét c©y nhÞ ph©n tree, h·y viÕt ch­¬ng tr×nh ®Ó sao chÐp nã thµnh mét c©y míi tree2, víi khãa, néi dung, vµ liªn kÕt gièng nh­ c©y tree.

3. ViÕt c¸c hµm kiÓm tra xem c©y nhÞ ph©n:

a. Cã ph¶i lµ c©y nhÞ ph©n ®óng kh«ng.

b. Cã ph¶i lµ c©y nhÞ ph©n ®Çy kh«ng.

4. ViÕt hµm kiÓm tra nót x vµ y cã trªn c©y hay kh«ng, nÕu cã c¶ x lÉn y trªn c©y th× x¸c ®Þnh nót gèc cña c©y con nhá nhÊt cã chøa x vµ y.

5. H·y tr×nh bµy c¸ch chuyÓn mét biÓu thøc sè häc sang c©y biÓu thøc. VÏ c©y biÓu thøc cña biÓu thøc sè häc sau:

(10 + 5 ) ^ 2 / (52 * 4 - 3 )

6. Cho mét c©y biÓu thøc, h·y viÕt hµm Calculate (NODEPTR root) ®Ó tÝnh gi¸ trÞ cña c©y biÓu thøc ®ã, biÕt r»ng c¸c to¸n tö ®­îc dïng trong biÓu thøc lµ:

+ - * / ^ % !

Page 156: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

156

CH¦¥NG VI

s¾p xÕp vµ t×m kiÕm

Trong thùc tiÔn cuéc sèng còng nh­ trong lÜnh vùc lËp tr×nh viÖc qu¶n lý d÷ liÖu th­êng ®ßi hái sù t×m kiÕm c¸c d÷ liÖu cÇn thiÕt; ®Ó thuËn tiÖn cho viÖc t×m kiÕm, d÷ liÖu th­êng ®­îc s¾p xÕp theo mét thø tù nµo ®ã.

Cã rÊt nhiÒu ph­¬ng ph¸p s¾p thø tù, trong gi¸o tr×nh nµy chØ kh¶o s¸t mét sè ph­¬ng ph¸p cã ®Æc ®iÓm lµ :

- Ph­¬ng ph¸p tèt nhÊt trong mét sè tr­êng hîp cô thÓ.

- Mang ®­îc nÐt tiªu biÓu cho tÊt c¶ c¸c ph­¬ng ph¸p kh¸c.

- Gi¶i thuËt dÔ hiÓu vµ dÔ viÕt.

Cã thÓ ph©n c¸c ph­¬ng ph¸p s¾p thø tù chÝnh nh­ sau :

- S¾p thø tù néi (Internal Sorting) : Toµn bé d÷ liÖu sÏ ®­îc ®­a vµo bé nhí trong ®Ó thùc hiÖn viÖc s¾p xÕp. Do toµn bé d÷ liÖu ®­îc ®­a vµo bé nhí trong nªn kÝch th­íc d÷ liÖu cÇn s¾p kh«ng lín, tuy nhiªn ­u ®iÓm cña ph­¬ng ph¸p nµy lµ gi¶i thuËt dÔ hiÓu vµ thêi gian s¾p xÕp nhanh.

- S¾p thø tù ngo¹i (External Sorting) : D÷ liÖu nhiÒu ph¶i chøa trong tËp tin hoÆc dÜa, mçi lÇn s¾p thø tù ta chØ ®­a mét phÇn cña d÷ liÖu vµo bé nhí ®Ó thùc hiÖn. Do ®ã, thêi gian s¾p xÕp chËm.

Trong ch­¬ng nµy ta chØ ph©n tÝch c¸c ph­¬ng ph¸p s¾p thø tù néi trªn danh s¸ch kÒ. Khi s¾p xÕp ta ph¶i chó ý ®Õn mét sè kh¸i niÖm sau:

- Khãa (Key) : Lµ d÷ liÖu cña mçi phÇn tö mµ ta c¨n cø vµo nã ®Ó s¾p thø tù; khãa nµy cã thÓ lµ ch÷ hoÆc sè.

- Thêi gian thùc hiÖn : C¸c gi¶i thuËt s¾p xÕp néi th­êng ®­îc thùc hiÖn b»ng c¸ch so s¸nh vµ ®æi chç hai phÇn tö víi nhau. Do ®ã thêi gian thùc hiÖn cña 1 gi¶i thuËt s¾p xÕp phô thuéc vµo hai yÕu tè :

+ Sè lÇn ®æi chç c¸c phÇn tö (®èi víi danh s¸ch ®Æc), hoÆc sè lÇn thay ®æi con trá (®èi víi danh s¸ch liªn kÕt). §©y lµ yÕu tè chiÕm nhiÒu thêi gian nhÊt. Ký hiÖu : M(n)

+ Sè lÇn so s¸nh khãa. Ký hiÖu : C(n), víi n lµ sè phÇn tö trong danh s¸ch.

I. Mét sè ph­¬ng ph¸p s¾p xÕp ®¬n gi¶n :

I.1. S¾p xÕp theo ph­¬ng ph¸p Bubble_Sort (ph­¬ng ph¸p næi bät)

- Néi dung : Cho d·y A cã n phÇn tö. Ta cho i duyÖt d·y a[0],...,a[n-1]; nÕu a[i-1] lín h¬n a[i] th× ta ho¸n ®æi (a[i-1],a[i]). LÆp l¹i qu¸ tr×nh duyÖt d·y nµy cho ®Õn khi kh«ng cã x¶y ra viÖc ®æi chç cña hai phÇn tö.

Page 157: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

157

VÝ dô: Ta s¾p thø tù d·y sè sau : 26 33 35 29 19 12 32

B­íc 0 1 2 3 4 5 6

26 12 12 12 12 12 12

33 26 19 19 19 19 19

35 33 26 26 26 26 26

29 35 33 29 29 29 29

19 29 35 33 32 32 32

12 19 29 35 33 33 33

32 32 32 32 35 35 35

H×nh 8.1: Minh häa qu¸ tr×nh s¾p xÕp qua ph­¬ng ph¸p Buble Sort

- Ch­¬ng tr×nh:

void Bubble_Sort(int A[100], int n)

{ int i,j,temp;

for (i=1; i<n; i++)

for (j=n-1;j>=i; j--)

if (A[j-1] > A[j])

{ temp = A[j-1];

A[j-1] = A[j];

A[j] = temp;

}

}

Ta nhËn thÊy ph­¬ng ph¸p nµy cã thÓ ®­îc c¶i tiÕn dÔ dµng. NÕu ë lÇn duyÖt d·y nµo ®ã mµ kh«ng cã cã sù ®æi chç gi÷a hai phÇn tö th× d·y ®· cã thø tù vµ gi¶i thuËt kÕt thóc. Trong tr­êng hîp nµy, ta dïng mét cê hiÖu flag ®Ó ghi nhËn ®iÒu nµy, vµ gi¶i thuËt Bubble Sort ®­îc c¶i tiÕn nh­ sau:

#define FALSE 0

#define TRUE 1

void Bubble_Sort_Ad(int A[], int n)

{ int i,temp;

unsigned char flag=TRUE;

while (flag)

{ flag = FALSE ;

for (i=0; i<n-1; i++)

if (A[i] > A[i+1])

{ temp = A[i];

Page 158: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

158

A[i] = A[i+1];

A[i+1] = temp;

flag=TRUE;

} } }

* Ph©n tÝch: Gi¶ sö d·y cã n phÇn tö.

- Ph©n tÝch thêi gian thùc hiÖn cña gi¶i thuËt Bubble Sort ch­a c¶i tiÕn :

+ Sè lÇn so s¸nh C(n):

Vßng lÆp ®Çu cã n-1 lÇn duyÖt

Víi mçi i, ta l¹i cã lÇn duyÖt phô thuéc vµo i, cô thÓ nh­ sau:

i Sè lÇn duyÖt

1 n-1

2 n-2

3 n-3

... ....

n-1 1

C(n) = 1 + 2 + 3 + n-2 + n-1 = (n-1)*n/2

BËc cña C(n) lµ O(n2)

+ Sè lÇn ®æi chç M(n): ta kh«ng thÓ x¸c ®Þnh chÝnh x¸c sè lÇn ®æi chæ 2 phÇn tö trong d·y v× nã phô thuéc vµo trËt tù hiÖn cã trong d·y. Tuy nhiªn, ta biÕt ch¾c r»ng sè lÇn ®æi chç tèi ®a sÏ b»ng C(n).

Do ®ã, M(n) C(n)

BËc cña M(n) lµ O(n2)

VËy thêi gian thùc hiÖn cña gi¶i thuËt Bubble Sort ch­a c¶i tiÕn cã bËc O(n2).

- Ph©n tÝch thêi gian thùc hiÖn cña gi¶i thuËt Bubble Sort c¶i tiÕn :

+ Sè lÇn so s¸nh C(n):

Vßng lÆp while cã k lÇn duyÖt ( k<= n-1)

Cã n-i lÇn so s¸nh trong lÇn duyÖt thø i

C(n) = (n-1) + (n-2) + .... + (n-k) = (n-k)*(n-k+1)/2

BËc cña C(n) lµ O(n2)

+ Sè lÇn ®æi chç M(n): T­¬ng tù nh­ trªn, chóng ta cã M(n) C(n)

Page 159: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

159

BËc cña M(n) lµ O(n2)

VËy thêi gian thùc hiÖn cña gi¶i thuËt Bubble Sort c¶i tiÕn còng cã bËc O(n2).

* NhËn xÐt: Gi¶i thuËt Bubble Sort dÔ hiÓu nh­ng kh«ng tèi ­u v× thêi gian thùc hiÖn gi¶i thuËt chËm (cã bËc O(n2))

Gi¶i thuËt Bubble Sort cã c¶i tiÕn kh«ng lµm thay ®æi bËc nh­ng cã lµm gi¶m hÖ sè nªn chØ nhanh h¬n kh«ng ®¸ng kÓ.

I.2. Insertion Sort (Ph­¬ng ph¸p xen vµo )

a. Néi dung :

XÐt mét danh s¸ch cã n phÇn tö a0, a1, a2,..........,an-1, néi dung tæng qu¸t cña ph­¬ng ph¸p xen vµo lµ : nÕu trong danh s¸ch ®· cã i-1 phÇn tö tr­íc ®· cã thø tù, tiÕp tôc so s¸nh phÇn tö ai víi i-1 phÇn tö nµy ®Ó t×m vÞ trÝ thÝch hîp cho ai xen vµo. V× danh s¸ch cã mét phÇn tö th× tù nã ®· cã thø tù, do ®ã ta chØ cÇn so s¸nh tõ phÇn tö thø 2 cho ®Õn phÇn tö thø n.

VÝ dô : Cho m·ng A cã 5 phÇn tö :

a0 a1 a2 a3 a4

44 55 12 42 94

i= a0 a1 a2 a3 a4

1 44 55 12 42 94

2 44 55 12 42 94

3 12 44 55 42 94

4 12 42 44 55 94

H×nh 8.2: Minh häa qu¸ tr×nh s¾p xÕp qua ph­¬ng ph¸p Insertion Sort

b. Gi¶i thuËt :

void Insertion_sort(int A[], int n)

{

int x;

int i,j;

for (i=1; i< n; i++)

{

x = A[i];

for (j=i-1; j>=0 && x<A[j]; j--)

A[j+1] = A[j];

A[j+1]=x;

}

}

Page 160: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

160

c. Ph©n tÝch

- Sè lÇn so s¸nh C(n):

+ Tr­êng hîp tèt nhÊt : Khi danh s¸ch ®· cã thø tù ban ®Çu, mçi phÇn tö chØ cÇn so s¸nh mét lÇn víi phÇn tö ®øng tr­íc nã

Cmin = n-1

+ Tr­êng hîp xÊu nhÊt: Khi danh s¸ch cã thø tù ng­îc, mét phÇn tö A[i] sÏ ph¶i so s¸nh i-1 lÇn

Cmax =

1

1 2

)1(n

i

nni

2

2

n

+ Tr­êng hîp trung b×nh : Mçi phÇn tö A[i] sÏ cã sè lÇn so s¸nh trung b×nh

lµ i

2 lÇn

Caverage = 44

)1(

2

)1(...3212

nnnn

BËc cña C(n) lµ O(n2)

- Sè lÇn ®æi chç M(n)

G¸n x = A[i] ;

+ Tr­êng hîp tèt nhÊt : Sau lÇn so s¸nh duy nhÊt ta l¹i g¸n x trë l¹i cho A[i]; do ®ã víi n phÇn tö sÏ cã n-1 lÇn g¸n nµy, nªn :

Mmin = 2* (n-1)

+ Tr­êng hîp xÊu nhÊt : Mçi b­íc sÏ cã i-1 lÇn so s¸nh t­¬ng øng víi i-1 lÇn ®æi chç, céng thªm 2 lÇn ®Ó g¸n trÞ nh­ trªn; do ®ã ta cã :

Mmax = Cmax + 2* (n-1)

)1(*22

)1(*22

)1(2

nnnnn

+ Tr­êng hîp trung b×nh : Ta còng cã sè lÇn ®æi chç trung b×nh lµ :

Maverage= Caverage )1(*24

)1(*2

2

nnn

BËc cña M(n) còng lµ O(n2)

I.3. Selection Sort (Ph­¬ng ph¸p lùa chän) :

a. Néi dung : XÐt mét danh s¸ch cã n phÇn tö a0, a1, a2,..........,an-1; ®Ó s¾p thø tù mét danh s¸ch, ta so s¸nh tÊt c¶ c¸c phÇn tö cña danh s¸ch ®Ó chän ra mét phÇn tö nhá nhÊt ®­a vÒ ®Çu danh s¸ch; sau ®ã tiÕp tôc chän phÇn tö nhá nhÊt

Page 161: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

161

trong c¸c phÇn tö cßn l¹i ®Ó t¹o thµnh phÇn tö thø 2 trong danh s¸ch. Qu¸ tr×nh nµy ®­îc lÆp ®i lÆp l¹i cho ®Õn khi chän ra ®­îc phÇn tö nhá thø (n-1)

b. Gi¶i thuËt (®èi víi danh s¸ch ®Æc)

void Selection_Sort(int A[], int n)

{

int min, vitrimin;

int i,j;

for (i=0; i< n-1; i++)

{

min = A[i];

vitrimin=i;

for (j=i+1; j<n; j++)

if (A[j] < min)

{ min = A[j];

vitrimin=j;

}

// Doi cho 2 phan tu A[i] va A[vitrimin]

A[vitrimin] = A[i];

A[i] = min;

}

}

c. Ph©n tÝch :

- Sè lÇn so s¸nh C(n) : kh«ng phô thuéc vµo thø tù ban ®Çu cña danh s¸ch, mµ phô thuéc vµo sè lÇn thùc hiÖn cña hai vßng For lång nhau.

Vßng For ngoµi sÏ lÆp n-1 lÇn, víi mçi lÇn lÆp th× nã sÏ thùc hiÖn vßng For trong. Sè lÇn so s¸nh cña vßng For trong tïy thuéc vµo chØ sè i, tøc lµ vÞ trÝ ®ang xÐt :

i= 0 so s¸nh (n-1) lÇn (j= 1 n-1)

i= 1 so s¸nh (n-2) lÇn (j= 2 n-1)

....

i= n-2 so s¸nh 1 lÇn (j:= n-1 n-1)

Suy ra sè lÇn so s¸nh lµ:

C = (n-1) + (n-2) + (n-3) + ... + 1

= in n

i

n

1

1 1

2

( )

C(n) 2

2

n sè lÇn ®æi chç

Page 162: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

162

BËc cña C(n) còng lµ O(n2)

Nh­ vËy sè lÇn so s¸nh ë ph­¬ng ph¸p chän lùa lu«n lu«n t­¬ng ®­¬ng víi sè lÇn so s¸nh trong tr­êng hîp xÊu nhÊt cña ph­¬ng ph¸p xen vµo

- Sè lÇn ®æi chç M(n) : Tïy thuéc thø tù ban ®Çu cña danh s¸ch, nã sÏ nhá nhÊt khi c¸c khãa ban ®Çu ®· cã thø tù vµ lín nhÊt khi khãa cã thø tù ng­îc.

II. Quick_Sort : (S¾p xÕp theo ph­¬ng ph¸p ph©n ®o¹n)

1. Néi dung: Chän mét phÇn tö bÊt kú trong danh s¸ch lµm ®iÓm chèt x, so s¸nh vµ ®æi chç nh÷ng phÇn tö trong danh s¸ch nµy ®Ó t¹o ra 3 phÇn: phÇn cã gi¸ trÞ nhá h¬n x, phÇn cã gi¸ trÞ b»ng x, vµ phÇn cã gi¸ trÞ lín h¬n x. L¹i tiÕp tôc chia 2 phÇn cã gi¸ trÞ nhá h¬n vµ lín h¬n x theo nguyªn t½c nh­ trªn; qu¸ tr×nh chia phÇn sÏ kÕt thóc khi mçi phÇn chØ cßn l¹i mét phÇn tö, lóc nµy ta ®· cã mét danh s¸ch cã thø tù.

VÝ dô: XÐt d·y 26 33 35 29 19 12 32

LÇn chia phÇn thø nhÊt : Chän phÇn tö chèt cã khãa lµ 29, ®Æt lµ x

26 33 35 29 19 12 32

i j

Dïng hai biÕn chØ sè i vµ j ®Ó duyÖt tõ hai ®Çu danh s¸ch ®Õn x. NÕu i gÆp phÇn tö lín h¬n hay b»ng x sÏ dõng l¹i, j gÆp phÇn tö nhá h¬n hay b»ng x sÏ dõng l¹i, råi ®æi chç hai phÇn tö nµy; sau ®ã tiÕp tôc duyÖt cho ®Õn khi i>j th× ngõng l¹i.

Lóc nµy d·y sÏ cã 3 phÇn kh¸c nhau nh­ h×nh vÏ sau :

26 33 35 29 19 12 32

i j

26 12 35 29 19 33 32

i j

26 12 19 29 35 33 32

ij

26 12 19 29 35 33 32

j i

LÇn chia phÇn thø hai cho d·y con 26 12 19, chän chèt x=12

26 12 19 12 26 19

i j j i

KÕt thóc ta sÏ cã hai phÇn : 12 ; 26 19

LÇn chia phÇn thø 3 cho d·y con 26 19, chän chèt x=26

26 19 19 26 KÕt thóc qu¸ tr×nh chia nhá d·y con 26 12 19

i j j i

Page 163: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

163

- LÇn chia phÇn thø 4 cho d·y con 35 33 32, chän chèt x= 33

35 33 32 32 33 35 32 33 35

i j ij j i

KÕt thóc ta sÏ cã ba phÇn : 32 ; 33 ; 35

§Õn ®©y qu¸ tr×nh chia phÇn kÕt thóc v× tÊt c¶ c¸c phÇn chØ cã mét phÇn tö, lóc nµy ta sÏ cã mét danh s¸ch cã thø tù lµ :

12 19 26 29 32 33 35

2. Gi¶i thuËt:

a. Gi¶i thuËt kh«ng ®Ö quy:

- Ta t¹o mét Stack, mçi phÇn tö cña Stack cã 2 thµnh phÇn lµ q, r chøa chØ sè ®Çu vµ chØ sè cuèi cña d·y cÇn s¾p. Ban ®Çu, Stack[0].q = 0 vµ Stack[0].r =n-1

- TiÕn hµnh ph©n ho¹ch d·y sè gåm c¸c sè b¾t ®Çu tõ chØ sè q ®Õn chØ sè r

- Sau mçi lÇn chia phÇn, ta kiÓm tra xem phÇn cã gi¸ trÞ nhá h¬n chèt vµ phÇn cã gi¸ trÞ lín h¬n chèt nÕu cã tõ 2 phÇn tö trë lªn th× ®­a vµo Stack. Sau mçi lÇn ph©n ho¹ch, ta l¹i lÊy d·y sè míi tõ Stack ra ph©n ho¹ch tiÕp.

- Qu¸ tr×nh cø nh­ thÕ cho tíi khi Stack rçng th× kÕt thóc.

* Ch­¬ng tr×nh:

void Quick_Sort(int A[100], int n)

{ struct Element_Stack // kiÓu phÇn tö trong Stack

{

int q, r;

} ;

Element_Stack Stack[50]; // Stack cã tèi ®a 50 phÇn tö

int sp=0; // con trá Stack, khëi t¹o sp=0

int i,j,x,q,r,temp;

Stack[0].q =0 ; // chØ sè ®Çu cña m¶ng cÇn s¾p

Stack[0].r =n-1; // chØ sè cuèi cña m¶ng cÇn s¾p

do

{ // LÊy mét ph©n ho¹ch ra tõ Stack

q = Stack[sp].q ; r =Stack[sp].r ;

sp--; // Xãa 1 phÇn tö khái Stack

do

{ // Ph©n ®o¹n d·y con a[q],..., a[r]

x = A[(q+r) / 2] ; // LÊy phÇn tö gi÷a cña d·y cÇn s¾p thø tù lµm chèt

Page 164: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

164

i = q; j =r;

do

{ while (A[i] < x) i++; //T×m phÇn tö ®Çu tiªn cã trÞ lín h¬n hay b»ng x

while (A[j] > x) j--; //T×m phÇn tö ®Çu tiªn cã trÞ nhá h¬n hay b»ng x

if (i<=j) // §æi chç A[i] víi A[j]

{ temp = A[i];

A[i] =A[j];

A[j] = temp;

i++ ; j--;

}

} while (i<=j);

if (i<r) // phÇn thø ba cã tõ 2 phÇn tö trë lªn

{ // §­a vµo Stack chØ sè ®Çu vµ chØ sè cuèi cña phÇn thø ba

sp++;

Stack[sp].q=i;

Stack[sp].r=r;

}

r = j ; // ChuÈn bÞ vÞ trÝ ®Ó ph©n ho¹ch phÇn cã gi¸ trÞ nhá h¬n chèt

} while (q< r);

} while (sp!=-1); // Ket thuc khi Stack rong

}

b. Gi¶i thuËt Quick Sort ®Ö qui: vÒ c¬ chÕ thùc hiÖn th× còng gièng nh­ gi¶i thuËt kh«ng ®Ö qui, nh­ng ta kh«ng kiÓm so¸t Stack mµ ®Ó cho qu¸ tr×nh gäi ®Ö qui tù t¹o ra Stack.

* Ch­¬ng tr×nh:

void Sort(int A[], int q,int r)

{ int temp;

int i=q;

int j=r;

int x = A[(q+r) / 2] ; //LÊy phÇn tö gi÷a cña d·y cÇn s¾p thø tù lµm chèt

do

{ // Ph©n ®o¹n d·y con a[q],..., a[r]

while (A[i] < x) i++; //T×m phÇn tö ®Çu tiªn cã trÞ lín h¬n hay b»ng x

while (A[j] > x) j--; //T×m phÇn tö ®Çu tiªn cã trÞ nhá h¬n hay b»ng x

if (i<=j) // Doi cho A[i] voi A[j]

{ temp = A[i];

A[i] =A[j];

Page 165: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

165

A[j] = temp;

i++ ; j--;

}

} while (i<=j);

if (q<j) // phÇn thø nhÊt cã tõ 2 phÇn tö trë lªn

Sort(A,q,j);

if (i<r) // phÇn thø ba cã tõ 2 phÇn tö trë lªn

Sort (A,i,r);

}

void Quick_Sort(int A[], int n)

{ Sort( A,0,n-1); // Gäi hµm Sort víi phÇn tö ®Çu cã chØ sè 0 ®Õn // phÇn tö cuèi cïng cã chØ sè n-1

}

3. Ph©n tÝch :

Ta nhËn thÊy nhê chia thµnh nh÷ng d·y con trong mçi lÇn chia phÇn sÏ cã kh¶ n¨ng gi¶m ®­îc sè lÇn so s¸nh. Tuy nhiªn cßn tïy thuéc vµo viÖc chän phÇn tö chèt vµ thø tù ban ®Çu cña d·y.

Khi chän vÞ trÝ phÇn tö chèt lµ ë gi÷a th× nÕu chia ta sÏ ®­îc c¸c d·y con cã sè phÇn tö gÇn b»ng nhau vµ do ®ã sÏ gi¶m ®­îc sè lÇn so s¸nh.

- Tr­êng hîp tèt nhÊt:

§Ó dÔ tÝnh C(n) vµ M(n), ta gi¶ sö sè nót cña danh s¸ch cÇn s¾p xÕp lµ n = 2m

Víi 1 danh s¸ch ban ®Çu : n lÇn so s¸nh (trong c¶ 2 h­íng quÐt)

Víi 2 danh s¸ch con tiÕp theo : nhá h¬n hoÆc b»ng n/2 lÇn so s¸nh trong mçi danh s¸ch con

Víi 4 danh s¸ch con tiÕp theo : nhá h¬n hoÆc b»ng n/4 lÇn so s¸nh trong mçi danh s¸ch con

.....

Víi n danh s¸ch con cuèi cïng: nhá h¬n hoÆc b»ng n/n lÇn so s¸nh trong mçi danh s¸ch.

+ Tæng sè lÇn so s¸nh C(n):

C(n) (1*n) + (2* n/2 ) + (4* n/4 ) + ... + (n* n/n )

n + n + n + ... + n

V× ta sÏ cã nhiÒu nhÊt lµ m lÇn chia nªn:

C(n) m * n = n lgn

Page 166: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

166

VËy bËc cña C(n) lµ O(nlgn)

+ Tæng sè lÇn ®æi chæ M(n):

Sè lÇn ®æi chæ ph¶i Ýt h¬n hoÆc b»ng sè lÇn so s¸nh:

M(n) C(n)

BËc cña M(n) còng lµ O(nlgn)

- Tr­êng hîp xÊu nhÊt: Víi gi¶i thuËt Quick Sort, tr­êng hîp xÊu nhÊt khi nót lµm chèt lóc nµo còng ë ®Çu hay cuèi danh s¸ch sau mçi lÇn chia phÇn. Hai danh s¸ch con suy biÕn thµnh mét danh s¸ch con cã sè nót bít ®i 1. Trong tr­êng hîp nµy:

Víi danh s¸ch ban ®Çu : n lÇn so s¸nh

Víi danh s¸ch con tiÕp theo : n-1 lÇn so s¸nh

Víi danh s¸ch con tiÕp theo : n-2 lÇn so s¸nh

....

Víi danh s¸ch con cuèi cïng : 1 lÇn so s¸nh

+ Tæng sè lÇn so s¸nh C(n):

C(n) = n + (n-1) + (n-2) + ... + 1 = n(n+1) /2

BËc cña C(n) lµ O(n2)

+ Tæng sè lÇn ®æi chæ M(n):

Sè lÇn ®æi chæ ph¶i Ýt h¬n hoÆc b»ng sè lÇn so s¸nh:

M(n) C(n)

BËc cña M(n) còng lµ O(n2)

- Tr­êng hîp trung b×nh : Tr­êng hîp trung b×nh th× C(n) vµ M(n) cã bËc ë kho¶ng gi÷a O(nlgn) vµ O(n2)

III. Heap Sort (S¾p xÕp kiÓu vun ®èng)

III.1. §Þnh nghÜa Heap: Heap lµ c©y nhÞ ph©n gÇn ®Çy ®­îc cµi ®Æt b»ng m¶ng mét chiÒu víi c¸c nót trªn Heap cã néi dung lín h¬n hay b»ng néi dung cña c¸c nót con cña nã.

VÝ dô: Ta cã d·y sè sau:

55 24 78 15 37 62 94 41 09 82

(0) (1) (2) (3) (4) (5) (6) (7) (8) (9)

th× c©y nhÞ ph©n ban ®Çu cña d·y lµ:

Page 167: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

167

55

24

15 37

78

62 94

41 09 82

(0)

(1) (2)

(3) (4) (5) (6)

(7) (8) (9)

vµ heap cña d·y sau khi vun ®èng sÏ lµ:

94

82

41 37

78

62 55

15 09 24

III.2. ThuËt to¸n Heap Sort:

a. Néi dung:

- Tr­íc tiªn ta cµi ®Æt hµm Adjust (A, r,n) ®Ó ®iÒu chØnh c©y cã gèc ë vÞ trÝ r víi n nót thµnh ®èng víi gi¶ thiÕt hai c©y con ®· lµ ®èng.

L­u ý: Do gi¶ thiÕt lµ ta ®· cã hai c©y con lµ ®èng nªn ta ph¶i vun ®èng tõ d­íi lªn. Trong c©y chØ cã c¸c nót víi vÞ trÝ 0,1,..., n/2-1 míi lµ c¸c nót gèc cã c©y con. Do ®ã, ta chØ cÇn vun ®èng c¸c c©y ë vÞ trÝ 0,1,..., n/2-1.

- Do sau khi vun ®èng th× nót ë vÞ trÝ 0 sÏ cã néi dung lín nhÊt nªn ta sÏ ho¸n ®æi néi dung cña A0 víi An-1.

- Ta tiÕp tôc Adjust(0, n-1) ®Ó vun ®èng c©y víi gèc ë nót cã vÞ trÝ 0 vµ sè nót lµ n-1 nót cßn l¹i (A0, A1,..., An-2). Sau ®ã, sÏ ho¸n ®æi néi dung cña A0 víi An-2.

- Qu¸ tr×nh trªn tiÕp tôc cho ®Õn khi c©y ®­îc vun ®èng chØ cßn 1 nót th× dõng l¹i. Cuèi cïng, ta ®· cã d·y ®· ®­îc s¾p theo thø tù t¨ng dÇn.

* ThuËt to¸n Adjust (A,r,n)

- Ta so s¸nh néi dung cña 2 nót con t×m ra néi dung cña nót con lín h¬n

- So s¸nh tiÕp néi dung cña nót con lín h¬n víi néi dung cña nót gèc :

+ NÕu néi dung cña nót con ®ã mµ nhá h¬n néi dung cña nót gèc th× c©y con ®ã lµ ®èng.

Page 168: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

168

+ NÕu néi dung cña nót con ®ã mµ lín h¬n néi dung cña nót gèc th× di chuyÓn néi dung cña nót con lªn vÞ trÝ cña nót gèc r. Sau ®ã, ®iÒu chØnh tiÕp c©y cã gèc ë vÞ trÝ nót lµ nót con lín h¬n ®ã.

b. Cµi ®Æt:

void Adjust(int A[], int r, int n)

{

int j=2*r+1; // vi tri nut con ben trai

int x=A[r];

int cont=TRUE;

while (j<=n-1 && cont)

{

if (j<n-1) // luc nay r moi co nut con ben phai. Neu j=n-1 thi r khong

// co nut con ben phai thi khong can so sanh

if (A[j] < A[j+1]) // tim vi tri nut con lon hon

j++;

if (A[j] <=x)

cont=FALSE;

else

{ // di chuyen nut con j len r

A[r]= A[j];

r=j ; // xem lai nut con co phai la dong khong

j=2*r+1;

}

}

A[r]=x;

}

void Heap_sort(int A[], int n)

{

int i, temp;

for (i=n/2-1; i>=0; i--) // Tao heap ban dau

Adjust(A, i,n);

for (i=n-2; i>=0; i--)

{

temp= A[0]; // Cho A[0] ve cuoi heap

A[0] = A[i+1];

A[i+1] = temp;

Adjust(A,0,i+1); // Dieu chinh lai heap tai vi tri 0

// Luc nay, 2 cay con o vi tri 1 va 2 da la heap

}

}

Page 169: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

169

c. VÝ dô: Dïng thuËt to¸n heap sort ®Ó s¾p xÕp d·y sè sau theo chiÒu t¨ng dÇn:

55 24 78 15 37 62 94 41 09 82 (0) (1) (2) (3) (4) (5) (6) (7) (8) (9)

n = 10;

C©y nhÞ ph©n ban ®Çu cña d·y lµ:

55

24

15 37

78

62 94

41 09 82

(0)

(1) (2)

(3) (4) (5) (6)

(7) (8) (9)

Vun c©y ban ®Çu thµnh ®èng b»ng gi¶i thuËt Adjust

Vun ®èng : Vun tõ d­íi lªn, Trong c©y chØ cã c¸c nót 0, 1,2,... n/2-1=4 míi lµ c¸c nót gèc

for (i=n/2-1; i>=0; i--) // Tao heap ban dau

Adjust(A, i,n);

+ Vun c©y cã gèc lµ n/2 -1 =

55

24

15 82

78

62 94

41 09 37

+ Vun c©y cã gèc lµ n/2 -2 =

55

24

41 82

78

62 94

15 09 37

+ Vun c©y cã gèc lµ n/2 -2 =

Page 170: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

170

55

24

41 82

94

62 78

15 09 37

+ Vun c©y cã gèc lµ n/2 -2 =

55

82

41 24

94

62 78

15 09 37

Do sau khi ho¸n ®æi th× c©y con kh«ng ph¶i lµ ®èng nªn ta Adjust l¹i:

55

82

41 37

94

62 78

15 09 24

+ Vun c©y cã gèc lµ n/2 -2 =

94

82

41 37

55

62 78

15 09 24

Do sau khi ho¸n ®æi th× c©y con kh«ng ph¶i lµ ®èng nªn ta Adjust l¹i:

94

82

41 37

78

62 55

15 09 24

Page 171: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

171

Ta ®æi chç A[0] víi A[n-1] vµ sau ®ã Adjust l¹i c©y ë vÞ trÝ 0 víi sè nót gi¶m ®i 1, vµ qu¸ tr×nh trªn sÏ dõng l¹i khi sè nót b»ng 0.

for (i=n-2; i>=0; i--)

{

temp= A[0]; // Cho A[0] ve cuoi heap

A[0] = A[i+1];

A[i+1] = temp;

Adjust(A,0,i+1); // Dieu chinh lai heap tai vi tri 0

// Luc nay, 2 cay con o vi tri 1 va 2 da la heap

}

+ i = n-2 = 8: §æi chæ A[0] víi A[n-1] th× d·y {A[n-1]} ®· s¾p xÕp.

24

82

41 37

78

62 55

15 09 94

Sau ®ã, ta l¹i vun c©y cã gèc lµ 0 vµ sè nót lµ n-1 =9 thµnh ®èng.

82

24

41 37

78

62 55

15 09

82

41

24 37

78

62 55

15 09

+ i = 7: §æi chæ A[0] víi A[n-2] th× d·y {A[n-2], A[n-1]} ®· s¾p xÕp.

09

41

24 37

78

62 55

15 82

Sau ®ã, ta l¹i vun c©y cã gèc lµ 0 vµ sè nót lµ n-2=8 thµnh ®èng.

Page 172: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

172

78

41

24 37

09

62 55

15

78

41

24 37

62

09 55

15

+ i = 6: §æi chæ A[0] víi A[n-3] th× d·y {A[n-3], A[n-2], A[n-1]} ®· s¾p xÕp.

15

41

24 37

62

09 55

78

Sau ®ã, ta l¹i vun c©y cã gèc lµ 0 vµ sè nót lµ n-3=7 thµnh ®èng.

62

41

24 37

15

09 55

62

41

24 37

55

09 15

+ i = 5: §æi chæ A[0] víi A[n-4] th× d·y {A[n-4], A[n-3], A[n-2], A[n-1]} ®· s¾p xÕp.

15

41

24 37

55

09 62

Sau ®ã, ta l¹i vun c©y cã gèc lµ 0 vµ sè nót lµ n-4=6 thµnh ®èng.

55

41

24 37

15

09

Page 173: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

173

+ i = 4: §æi chæ A[0] víi A[n-5] th× d·y {A[n-5],A[n-4], A[n-3], A[n-2], A[n-1]} ®· s¾p xÕp.

09

41

24 37

15

55

Sau ®ã, ta l¹i vun c©y cã gèc lµ 0 vµ sè nót lµ n-5=5 thµnh ®èng.

41

09

24 37

15

41

37

24 09

15

+ i = 3: §æi chæ A[0] víi A[n-6] th× d·y {A[n-6], A[n-5],A[n-4], A[n-3], A[n-2], A[n-1]} ®· s¾p xÕp.

09

37

24 37

15

Sau ®ã, ta l¹i vun c©y cã gèc lµ 0 vµ sè nót lµ n-6=4 thµnh ®èng.

37

09

24

15

37

24

09

15

+ i = 2: §æi chæ A[0] víi A[n-7] th× d·y {A[n-7], A[n-6], A[n-5],A[n-4], A[n-3], A[n-2], A[n-1]} ®· s¾p xÕp.

09

24

37

15

Sau ®ã, ta l¹i vun c©y cã gèc lµ 0 vµ sè nót lµ n-7=3 thµnh ®èng.

Page 174: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

174

24

09 15

+ i = 1: §æi chæ A[0] víi A[n-8] th× d·y {A[n-8], A[n-7], A[n-6], A[n-5],A[n-4], A[n-3], A[n-2], A[n-1]} ®· s¾p xÕp.

15

09 24

Sau ®ã, ta l¹i vun c©y cã gèc lµ 0 vµ sè nót lµ n-7=3 thµnh ®èng.

15

09

+ i = 0: §æi chæ A[0] víi A[n-9] th× d·y {A[n-9], A[n-8], A[n-7], A[n-6], A[n-5],A[n-4], A[n-3], A[n-2], A[n-1]} ®· s¾p xÕp.

09

15

Cuèi cïng, d·y ®· ®­îc s¾p theo thø tù t¨ng dÇn.

IV. Merge Sort (S¾p xÕp kiÓu trén)

a. Néi dung: Merge Sort lµ ph­¬ng ph¸p s¾p xÕp b»ng c¸ch trén hai danh s¸ch ®· cã thø tù thµnh mét danh s¸ch cã thø tù. Ph­¬ng ph¸p nµy gåm nhiÒu b­íc nh­ sau:

a.1. Xem danh s¸ch cÇn s¾p xÕp nh­ n danh s¸ch con ®· cã thø tù, mçi danh s¸ch con cã 1 phÇn tö.

Trén tõng cÆp hai danh s¸ch con kÕ cËn, ta sÏ ®­îc n/2 danh s¸ch con ®· cã thø tù, mçi danh s¸ch con cã 2 nót.

a.2. Ta tiÕp tôc xem danh s¸ch cÇn s¾p xÕp nh­ n/2 danh s¸ch con ®· cã thø tù, mçi danh s¸ch con cã 2 phÇn tö.

Trén tõng cÆp hai danh s¸ch con kÕ cËn, ta sÏ ®­îc n/4 danh s¸ch con ®· cã thø tù, mçi danh s¸ch con cã 4 nót.

a.3. Qu¸ tr×nh trªn cø tiÕp tôc cho ®Õn khi ®­îc 1 danh s¸ch con cã n phÇn tö.

VÝ dô: Ta dïng ph­¬ng ph¸p Merge Sort ®Ó s¾p xÕp d·y sè sau:

25 55 45 40 10 90 85 35

Page 175: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

175

25 55

25 55

45 40

40 45

10 90

10 90

85 35

35 85

Böôùc 1

Böôùc 2

4025 5545 3510 9085Böôùc 3

Böôùc 4 10 25 35 40 45 55 85 90

H×nh 8.3: C¸c b­íc trén cña gi¶i thuËt Merge Sort.

b. Gi¶i thuËt:

C¸c biÕn sö dông:

- A lµ d·y sè cÇn s¾p cã n phÇn tö

- low1, up1, low2, up2 lµ cËn d­íi vµ cËn trªn cña 2 danh s¸ch con ®ang trén

- size lµ kÝch th­íc cña danh s¸ch con, ë b­íc trén 1 th× size=1, ë b­íc trén 2 th× size=2, ë b­íc trén 3 th× size=4, ë b­íc trén 4 th× size=8,...

#define MAXLIST 100

int A[MAXLIST];

void mergesort(int A[], int n)

{

int i, j, k, low1, up1, low2, up2, size;

int dstam[MAXLIST];

size = 1;

while(size < n)

{

low1 = 0;

k = 0;

while(low1+size < n)

{

up1 = low1+ size-1;

low2 = up1 + 1;

up2 = (low2+size-1 < n) ? low2+size-1 : n-1;

for(i = low1, j = low2; i <= up1 && j <= up2; k++)

if(A[i] <= A[j])

dstam[k] = A[i++];

Page 176: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

176

else

dstam[k] = A[j++];

for(; i <= up1; k++)

dstam[k] = A[i++];

for(; j <= up2; k++)

dstam[k] = A[j++];

low1 = up2+1;

}

for(i = low1; k < n; i++)

dstam[k++] = A[i];

for(i = 0; i < n; i++) // gan nguoc tra lai cho A

A[i] = dstam[i];

size *= 2;

}

}

c. Ph©n tÝch

Gi¶i thuËt Merge Sort kh«ng hiÖu qu¶ vÒ mÆt bé nhí v× cã dïng thªm danh s¸ch t¹m trong qu¸ tr×nh s¾p xÕp.

- Sè lÇn so s¸nh C(n) :

Gi¶i thuËt Merge Sort cã log2n b­íc trén, cã Ýt h¬n n lÇn so s¸nh trong tõng b­íc

Suy ra C(n) < nlog2n

BËc cña C(n) lµ O(nlgn)

- Sè lÇn ®æi chæ M(n) :

Gi¶i thuËt Merge Sort cã log2n b­íc trén, trong tõng b­íc trén cã chÐp n nót tõ danh s¸ch A[] sanh dstam[] vµ chÐp n nót tõ danh s¸ch dstam[] vÒ danh s¸ch A[]

VËy M(n) cã bËc lµ O(nlgn)

V. t×m kiÕm:

V.1. Kh¸i niÖm: Cho danh s¸ch A cã n phÇn tö. T×m x trong danh s¸ch A, nÕu cã th× tr¶ vÒ vÞ trÝ cña phÇn tö ®ã trong danh s¸ch, ng­îc l¹i nÕu t×m kh«ng thÊy th× tr¶ vÒ -1. Th«ng th­êng danh s¸ch A ch­a cã thø tù hoÆc ®· ®­îc s¾p theo 1 trËt tù nµo ®ã.

V.2. T×m kiÕm tuÇn tù:

- Néi dung: Ta t×m tõ ®Çu danh s¸ch cho ®Õn khi nµo gÆp phÇn tö ®Çu tiªn

Page 177: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

177

cã trÞ b»ng víi x hoÆc ®· t×m hÕt danh s¸ch th× dõng l¹i. Gi¶i thuËt nµy ®­îc dïng trong danh s¸ch ch­a cã thø tù.

- Gi¶i thuËt:

int Search(int A[], int n, int x)

{ int i=0;

while (i<n && A[i] <> x)

i++;

return (i<n ? i : -1) ;

}

V.3. T×m kiÕm nhÞ ph©n: chØ dïng ®­îc ®èi víi danh s¸ch ®· cã thø tù. Ta gi¶ sö danh s¸ch cã thø tù t¨ng dÇn.

- Néi dung:

B­íc 1: Ph¹m vi t×m kiÕm ban ®Çu lµ toµn bé danh s¸ch.

B­íc 2: LÊy phÇn tö chÝnh gi÷a cña ph¹m vi t×m kiÕm (gäi lµ y) so s¸nh víi x.

- NÕu x=y th× ta ®· t×m thÊy, tr¶ vÒ chØ sè. Gi¶i thuËt kÕt thóc

- NÕu x < y th× ph¹m vi t×m kiÕm míi lµ c¸c phÇn tö n»m phÝa tr­íc cña y.

- NÕu x > y th× ph¹m vi t×m kiÕm míi lµ c¸c phÇn tö n»m phÝa sau cña y.

B­íc 3: NÕu cßn tån t¹i ph¹m vi t×m kiÕm th× lÆp l¹i b­íc 2, ng­îc l¹i gi¶i thuËt kÕt thóc víi kÕt qu¶ lµ kh«ng cã x trong d·y sè.

- Gi¶i thuËt:

int Binary_Search(int A[], int n, int x)

{ int found=FALSE; // Gi¶ sö ban ®Çu ta ch­a t×m thÊy x trong d·y

// Ph¹m vi ban ®Çu t×m kiÕm lµ tõ k=0 m=n-1

int k=0;

int m=n-1;

int j;

while (k<=m && !found)

{ j=(k+m) /2; //chØ sè phÇn tö gi÷a

if (A[j]==x)

found=TRUE;

else if (x>A[j]) k=j+1; // Ph¹m vi t×m míi lµ (j+1, m)

else m=j-1; // Ph¹m vi t×m míi lµ (k, j-1)

}

Page 178: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

178

return (found ? j : -1) ;

}

V.4. PhÐp t×m kiÕm nhÞ ph©n ®Ö qui:

- Néi dung: t­¬ng tù nh­ trªn

B­íc 1: Ph¹m vi t×m kiÕm ban ®Çu lµ toµn bé danh s¸ch (k=0m=n-1).

B­íc 2: LÊy phÇn tö chÝnh gi÷a cña ph¹m vi t×m kiÕm (gäi lµ y) so s¸nh víi x.

- NÕu x=y th× ta ®· t×m thÊy, tr¶ vÒ chØ sè. Gi¶i thuËt kÕt thóc

- NÕu x < y th× ph¹m vi t×m kiÕm míi lµ c¸c phÇn tö n»m phÝa tr­íc cña y, nªn ta gäi ®Ö qui víi ph¹m vi míi lµ (k, j-1)

- NÕu x > y th× ph¹m vi t×m kiÕm míi lµ c¸c phÇn tö n»m phÝa sau cña y, nªn ta gäi ®Ö qui víi ph¹m vi míi lµ (j+1,m )

§iÒu kiÖn dõng: x=y hoÆc k > m.

- Gi¶i thuËt:

int Binary_Search2(int A[], int k,int m, int x)

{ int j=(k+m) /2;

if (k>m) return -1 ;

else if (A[j]==x) return j ;

else Binary_Search2(A, (A[j]<x ? j+1:k), (A[j] > x ?j-1:m),x);

}

Page 179: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

179

Bµi tËp :

1. ViÕt l¹i hµm QuickSort trong tr­êng hîp chän nót chèt lµ nót gi÷a cña danh s¸ch cÇn s¾p.

2. ViÕt gi¶i thuËt t×m k nót lín nhÊt trong danh s¸ch cã n nót, yªu cÇu gi¶i thuËt cã dïng cÊu tróc heap.

3. Cµi ®Æt gi¶i thuËt Seletion Sort trªn danh s¸ch liªn kÕt.

4. ViÕt ch­¬ng tr×nh minh häa c¸c ph­¬ng ph¸p s¾p xÕp. Ch­¬ng tr×nh cã c¸c chøc n¨ng sau:

a. NhËp ngÉu nhiªn n sè vµo danh s¸ch víi n kh¸ lín

b. Chän ph­¬ng ph¸p s¾p xÕp, cã b¸o thêi gian thùc hiÖn qu¸ tr×nh s¾p xÕp: Bubble Sort, Insertion Sort, Selection Sort, Quick Sort, Heap Sort, Merge Sort.

c. Xem danh s¸ch

d. KÕt thóc ch­¬ng tr×nh

Page 180: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

180

CH¦¥NG VII

§å thÞ (Graph)

Mét cÊu tróc d÷ liÖu ®­îc ¸p dông rÊt nhiÒu trong kü thuËt lËp tr×nh lµ ®å thÞ. CÊu tróc d÷ liÖu ®å thÞ ®­îc sö dông trong c¸c bµi to¸n cña rÊt nhiÒu lÜnh vùc nh­ ®­êng ®i, s¬ ®å m¹ng m¸y tÝnh, s¬ ®å ®­êng xe löa - ®­êng xe ®iÖn ngÇm trong thµnh phè....

Ch­¬ng nµy sÏ m« t¶ c¸c c¸ch tæ chøc vµ cÊu tróc d÷ liÖu kh¸c nhau cho 2 lo¹i ®å thÞ: ®å thÞ v« h­íng vµ ®å thÞ cã h­íng. Chóng ta sÏ nghiªn cøu 2 c¸ch cµi ®Æt ®å thÞ nh­ ma trËn kÒ vµ danh s¸ch kÒ, hai ph­¬ng ph¸p duyÖt ®å thÞ (theo chiÒu s©u vµ theo chiÒu réng). Ngoµi ra ta sÏ tham kh¶o mét gi¶i thuËt t×m ®­êng ®i ng¾n nhÊt (Shortest paths algorithm) trªn mét ®å thÞ cã träng sè.

I. CÊU TRóC D÷ LIÖU CHO §å THÞ:

I.1. §Þnh nghÜa ®å thÞ :

- Mét ®å thÞ G (Graph) bao gåm mét tËp V (vertices) chøa c¸c nót cña ®å thÞ vµ mét tËp E chøa c¸c cÆp nót (v,w) sao cho gi÷a v vµ w cã mét c¹nh.

v w

t z

H×nh 6.1 §å thÞ v« h­íng

V = {v, w, z, t}

E = { (v,w); (v,t); (t,z); (v,z) }

- §å thÞ v« h­íng (Undirected graph): lµ ®å thÞ mµ c¸c cung kh«ng cã chiÒu nhÊt ®Þnh.

- §å thÞ h÷u h­íng (Directed graph): lµ ®å thÞ trong ®ã mçi cung cã mét chiÒu nhÊt ®Þnh.

v w

t z H×nh 6.2 §å thÞ h÷u h­íng

Page 181: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

181

V = {v, w, z, t}

E = {<v,w>); <w,t>; <w,z>; <t,v>; <t,z>}

I.2. C¸c kh¸i niÖm trªn ®å thÞ:

Trong bµi häc, chóng ta sÏ dïng ®å thÞ h×nh 6.3 ®Ó minh häa c¸c kh¸i niÖm trªn ®å thÞ.

A

B

E D

C

H×nh 6.3 §å thÞ h÷u h­íng minh häa cho c¸c kh¸i niÖm cña ®å thÞ.

- C¹nh nèi hai ®Ønh a vµ b trªn ®å thÞ v« h­íng ®­îc ký hiÖu (a,b)

- C¹nh nèi hai ®Ønh a vµ b trªn ®å thÞ h÷u h­íng ®­îc ký hiÖu <a,b>.

- Nót: §å thÞ h×nh 6.3 cã 5 nót lµ A, B, C, D, E

- Cung : Mçi cung trªn ®å thÞ ®­îc x¸c ®Þnh bëi 2 nót: nót ®Ønh (nót tr­íc cña cung) vµ nót ngän (nót sau cña cung)

+ Khuyªn: C¹nh (hay cung) nèi tõ 1 ®Ønh ®Õn chÝnh ®Ønh ®ã gäi lµ khuyªn. Khuyªn lµ chu tr×nh cã chiÒu dµi lµ 1.

- BËc cña nót: sè cung liªn kÕt víi nót

+ BËc vµo: sè nót ngän liªn kÕt víi nót

+ BËc ra: sè nót ®Ønh liªn kÕt víi nót.

BËc cña nót = bËc vµo + bËc ra

- Nót kÒ: Nót y ®­îc gäi lµ nót kÒ víi nót x nÕu cã 1 cung ®i tõ nót x ®Õn nót y.

- §­êng ®i: ta nãi tõ nót x ®Õn nót y cã 1 ®­êng ®i víi chiÒu dµi lµ k khi ®i tõ nót x ®Õn nót y ta qua 1 chuçi k-1 nót x n1 n2 ... nk-1 y víi nót ni

lµ nót kÒ víi nót ni-1.

VÝ dô: §­êng ®i tõ nót A ®Õn nót D qua c¸c nót A, C, D cã chiÒu dµi lµ 2.

- Chu tr×nh : Ta nãi qua nót x cã 1 chu tr×nh chiÒu dµi k nÕu xuÊt ph¸t tõ nót x chóng ta qua k-1 nót trung gian vµ vÒ l¹i nót x (x n1 n2 ... nk-1 x)

G =

Page 182: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

182

VÝ dô:

Khuyªn A -> A (chiÒu dµi chu tr×nh nµy b»ng 1)

Chu tr×nh A -> C -> D -> E -> A cã chiÒu dµi b»ng 4

- §å thÞ cã träng sè: lµ ®å thÞ mµ mçi cung cã liªn kÕt víi 1 träng sè; th«ng th­êng träng sè nµy sÏ cã mét ý nghÜa nµo ®ã ch¼ng h¹n nh­ chiÒu dµi cña ®o¹n ®­êng, chi phÝ vËn chuyÓn trªn mét qu·ng ®­êng, thêi gian vËn chuyÓn...

- §å thÞ liªn th«ng: ®å thÞ ®­îc gäi lµ liªn th«ng nÕu víi mäi cÆp nót ph©n biÖt bao giê còng cã 1 ®­êng ®i tõ nót nµy ®Õn nót kia.

VÝ dô: §å thÞ h×nh 6.3 lµ ®å thÞ liªn th«ng.

I.3 Tæ chøc d÷ liÖu cho ®å thÞ :

Mét ®å thÞ G bao gåm mét tËp c¸c nót v, mçi nót v V sÏ cã mét tËp Av chøa c¸c nót w V sao cho cã mét cung tõ v w E

w ®­îc gäi lµ nót kÒ cña v.

Chóng ta cã c¸c ph­¬ng ph¸p ®Ó cµi ®Æt cÊu tróc d÷ liÖu cho tËp c¸c nót cña mét ®å thÞ : ma trËn kÒ vµ danh s¸ch kÒ.

a. Ma trËn kÒ (m¶ng 2 chiÒu):

- Trong tr­êng hîp G lµ ®å thÞ v« h­íng th× ta quy ­íc :

G[v][w] = G[w][v] = 1 nÕu (v,w) E

- Trong tr­êng hîp G lµ ®å thÞ h÷u h­íng th× ta quy ­íc :

G[v][w] = 1 nÕu <v,w> E

VÝ dô : Ma trËn kÒ cña ®å thÞ h×nh 6.4 cã d¹ng:

0 0 1 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0

1 2

0 3

4

H×nh 6.4

Page 183: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

183

- Khai b¸o :

const MAX = 50; // Sè ®Ønh tèi ®a cña ®å thÞ

typedef int Dothi[MAX][MAX] ;

Dothi G ; // G lµ ma trËn kÒ biÓu diÔn ®å thÞ

b. Danh s¸ch kÒ (m¶ng 1 chiÒu kÕt hîp víi danh s¸ch liªn kÕt):

Mét ®å thÞ ®­îc xem lµ bao gåm danh s¸ch c¸c nót, mçi nót cã mét danh s¸ch c¸c nót kÒ t­¬ng øng.

VÝ dô : Danh s¸ch kÒ cña ®å thÞ h×nh 6.4 cã d¹ng:

• •

• •

2 3

43

4

0

1

2

3

4

6

7

• 2

• 3•

max

H×nh 6.5 Danh s¸ch kÒ cña ®å thÞ 6.4

- Khai b¸o :

typedef int BYTE;

const MAX = 6;

struct node

{

int dinh_ke;

struct node *next;

};

typedef struct node *NODEPTR;

struct phantu

{

NODEPTR pF;

NODEPTR pL ;

};

typedef struct phantu Dothi[MAX];

Dothi G;

Page 184: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

184

II. duyÖt ®å thÞ:

Trong ®a sè c¸c bµi to¸n trªn ®å thÞ, viÖc lÇn l­ît ®i qua tÊt c¶ c¸c nót cña mét ®å thÞ lµ rÊt cÇn thiÕt; viÖc nµy gäi lµ duyÖt mét ®å thÞ. Ta cã nhiÒu ph­¬ng ph¸p ®Ó duyÖt mét ®å thÞ: duyÖt theo chiÒu s©u vµ duyÖt theo ®é réng.

§Ó minh häa cho c¸c gi¶i thuËt duyÖt ®å thÞ, ta sö dông ®å thÞ h×nh 6.6 sau:

0

1

4 3

2

H×nh 6.6 §å thÞ minh häa cho c¸c gi¶i thuËt duyÖt

II.1. DuyÖt theo chiÒu s©u (Depth-First Travelsal)

Nguyªn t¾c :

Gi¶ sö ta ®Õn mét nót v cã c¸c nót kÒ lÇn l­ît lµ w1, w2,...wk. Sau khi duyÖt nót v, ta sÏ ®i qua w1 vµ gi÷ l¹i c¸c nót w2,...,wk vµo Stack. TiÕp tôc duyÖt nót w1 vµ tÊt c¶ c¸c nót kÒ cña w1, råi míi trë l¹i duyÖt w2. LÆp l¹i cho ®Õn khi duyÖt hÕt nót wk vµ c¸c nót kÒ cña nã.

L­u ý :

- Kh«ng duyÖt mét nót hai lÇn.

- §Ó tr¸nh tr­êng hîp duyÖt sãt mét nót k’ trong ®å thÞ, ta ph¶i t¹o mét vßng lÆp ®Ó cã thÓ ®¶m b¶o duyÖt hÕt c¸c nót cña ®å thÞ.

Gi¶i thuËt:

void Depth_traverse(int i0) // nót b¾t ®Çu ®Ó tõ ®ã duyÖt

{

int C [MAX] ; // de danh dau cac dinh da di qua

int Stack[MAX] ; // Stack de chua cac dinh trong khi duyet

int sp ; // sp : con tro dau stack

int i,x ;

for (i=0; i<MAX; C[i++] =0 );

sp=0; // khoi tao Stack

Stack[sp]=i0;

C[i0]=1 ; // da duyet qua dinh i0

Page 185: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

185

while (sp >-1) // Khi Stack khac rong

{

x=Stack[sp];

sp-- ; // xoa dinh vua tham ra khoi Stack

cout << x << " "; // Tham dinh vua lay ra

for (i=0; i<MAX; i++) // dua tat ca cac nót ngon chua duyet tu x vao C

if (G[x][i] && C[i]==0)

{

Stack[++sp]=i;

C[i]=1;

}

}

}

VÝ dô: ¸p dông gi¶i thuËt trªn cho ®å thÞ h×nh 6.6 ta sÏ nhËn ®­îc kÕt qu¶ t­¬ng øng víi c¸c ®Ønh b¾t ®Çu :

§Ønh b¾t ®Çu Tr×nh tù duyÖt

0 0 4 3 1 2

1 1 2 3 0 4

2 2 3 0 4 1

3 3 0 4 1 2

4 4 3 0 1 2

II.2. DuyÖt theo ®é réng (Breadth First Travelsal)

Nguyªn t¾c :

Gi¶ sö ta ®Õn mét nót v cã c¸c nót kÒ lÇn l­ît lµ w1, w2,...wk. Sau khi duyÖt nót v, ta duyÖt hÕt c¸c nót wi cña v, råi míi tiÕp tôc xem c¸c nót kÒ cña tõng wi. DuyÖt c¸c nót kÒ ch­a ®­îc duyÖt cña c¸c nót wi. Cø tiÕp tôc nh­ vËy cho ®Õn khi hÕt c¸c nót cña ®å thÞ.

* Gi¶i thuËt:

// Hang doi phuc vu cho cong viec duyet Width_traverse

struct node

{

int diachi ;

struct node *next;

};

typedef node *Node_queue;

Page 186: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

186

struct Queue

{

Node_queue Front, Rear;

} Q;

void Insert_queue(Queue &Q, int x)

{

Node_queue p;

p = (Node_queue)malloc(sizeof(struct node));

p->diachi = x;

if (Q.Front==NULL)

Q.Front=p;

else Q.Rear->next=p;

Q.Rear=p;

p->next=NULL;

}

int Delete_queue(Queue &Q)

{

Node_queue p;

int x;

if(Q.Front==NULL)

{

cout <<"\nHang doi rong";

getche();

exit(1);

}

else

{

p = Q.Front; // nut can xoa la nut dau

x = p->diachi;

Q.Front = p->next;

free(p);

return x;

}

}

void Width_traverse(int i0) // dinh bat dau de tu do duyet

{

BYTE C [MAX] ; // de danh dau cac dinh da di qua

int i,x ;

Page 187: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

187

cout << "Cac dinh cua do thi theo giai thuat duyet rong \n";

for (i=0 ; i< MAX; C[i++]=0);

Q.Front= NULL; // khoi tao hang doi

Insert_queue(Q,i0);

C[i0]=1 ; // da duyet qua dinh i0

while (Q.Front !=NULL)

{

x=Delete_queue(Q); // xoa dinh vua tham ra khoi hang doi

cout << x << " "; // Tham dinh Q[l]

for (i=0; i<MAX; i++) // dua tat ca cac dinh ngon chua duyet tu x vao Q

if (G[x][i] && C[i]==0)

{

Insert_queue(Q,i);

C[i]=1;

}

}

}

VÝ dô: ¸p dông gi¶i thuËt trªn cho ®å thÞ h×nh 6.6 ta sÏ nhËn ®­îc kÕt qu¶ t­¬ng øng víi c¸c ®Ønh b¾t ®Çu :

§Ønh b¾t ®Çu Tr×nh tù duyÖt

0 0 1 4 2 3

1 1 2 0 3 4

2 2 0 3 1 4

3 3 0 1 4 2

4 4 3 0 1 2

III. bµi to¸n bao ®ãng truyÒn øng:

III.1. Kh¸i niÖm:

Bao ®ãng truyÒn øng cña mét ®å thÞ G cã n nót lµ mét ma trËn cho chóng ta biÕt gi÷a 2 nót x vµ y bÊt kú trªn ®å thÞ cã tån t¹i mét ®­êng ®i víi chiÒu dµi nhá h¬n hay b»ng n hay kh«ng.

Ma trËn h×nh 6.7 lµ bao ®ãng truyÒn øng cña ®å thÞ h×nh 6.4. C¸c sè 1 trong ma trËn cho ta biÕt tõ nót x ®Õn nót y tån t¹i ®­êng ®i víi chiÒu dµi nhá h¬n hay b»ng 5.

Page 188: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

188

0 1 2 3 4

0 0 0 1 1 1

1 0 0 1 1 1

2 0 0 0 1 1

3 0 0 0 1 1

4 0 0 0 1 1

H×nh 6.7: Bao ®ãng truyÒn øng cña ®å thÞ h×nh 6.4

III.2. ThuËt to¸n WarShall :

1- Cho P1 lµ ma trËn kÒ cña ®å thÞ G cho chóng ta biÕt gi÷a 2 nót x vµ y bÊt kú trªn ®å thÞ cã tån t¹i mét ®­êng ®i víi chiÒu dµi nhá h¬n hay b»ng 1.

2. TÝnh P2 = P1 x P1 : cho chóng ta biÕt gi÷a 2 nót x vµ y bÊt kú trªn ®å thÞ cã tån t¹i mét ®­êng ®i víi chiÒu dµi nhá h¬n hay b»ng 2.

P1 x P1 chÝnh lµ phÐp nh©n 2 ma trËn víi phÐp nh©n lµ and vµ phÐp céng lµ or.

P*PP1kj

1ik

n

1k

)2(ij

3. T­¬ng tù, ta tÝnh P3, P4, ..., P n.

4. Bao ®ãng truyÒn øng = P1 P2 P3... P n.

VÝ dô: Víi ®å thÞ G h×nh 6.4, th× lÇn l­ît c¸c Pi lµ:

P1 =

0 0 1 1 0

0 0 1 0 0

0 0 0 1 1

0 0 0 0 1

0 0 0 1 0

P2 =

0 0 0 1 1

0 0 0 1 1

0 0 0 1 1

0 0 0 1 0

0 0 0 0 1

P3 =

0 0 0 1 1

0 0 0 1 1

0 0 0 1 1

0 0 0 0 1

0 0 0 1 0

Page 189: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

189

P4 =

0 0 0 1 1

0 0 0 1 1

0 0 0 1 1

0 0 0 1 0

0 0 0 0 1

P5 =

0 0 0 1 1

0 0 0 1 1

0 0 0 1 1

0 0 0 0 1

0 0 0 1 0

Bao ®ãng truyÒn øng cña ®å thÞ G :

0 1 2 3 4

0 0 0 1 1 1

1 0 0 1 1 1

2 0 0 0 1 1

3 0 0 0 1 1

4 0 0 0 1 1

* Ch­¬ng tr×nh:

#include <stdio.h>

#include <conio.h>

const MAX = 4;

int G[MAX][MAX]= { {0,0,1,0},

{0,0,1,0},

{0,0,1,1},

{0,1,0,0}

} ;

void Xuat(int P[][MAX])

{

int i,j;

for( i=0; i<MAX;i++)

{

for( j=0; j< MAX; j++)

printf ("%4d", P[i][j] ) ;

printf ( "\n");

}

Page 190: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

190

getch();

printf("\n");

}

void WarShall( int G[][MAX])

{

int i,j,k, dem;

int C[MAX][MAX], P[MAX][MAX];

int BD[MAX][MAX]; // bao ®ãng truyÒn øng cña ma trËn G

for( i=0; i<MAX;i++) // P1

for (j=0;j<MAX; j++)

BD[i][j]= P[i][j]=G[i][j];

for ( dem=1; dem<MAX; dem++)

{

for ( i=0; i<MAX; i++)

for (j=0; j< MAX;j++)

{

C[i][j]=0;

for (k=0; k<MAX; k++)

C[i][j]= C[i][j] || (P[i][k] && G[k][j]);

}

for (i=0;i<MAX;i++)

for (j=0 ; j<MAX; j++)

{

P[i][j]=C[i][j];

BD[i][j]=BD[i][j] || P[i][j]; // OR don ma tran P vua tinh vao bao dong

}

Xuat(P); // Kiem tra tung Pi

}

Xuat(BD);

}

void main()

{

int P[MAX][MAX] ;

int i,j ;

clrscr();

WarShall(G);

getch();

}

Page 191: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

191

IV. GI¶I THUËT T×M §­êNG §I NG¾N NHÊT:

§èi víi mét ®å thÞ cã träng sè, mçi c¹nh sÏ cã mét gi¸ trÞ träng sè t­¬ng øng, t×m ®­êng ®i ng¾n nhÊt trªn ®å thÞ G tõ mét nót v ®Õn mét nót w lµ bµi to¸n t×m ®­êng ®i cã träng l­îng nhá nhÊt tõ v ®Õn w.

Träng sè cña mét c¹nh cã thÓ lµ thêi gian ®Ó ®i qua mét c¹nh, phÝ tæn, kho¶ng c¸ch hoÆc l­u l­îng.

0

4 1

3 2

2 5

2

4 1

63

106

2

0

4 1

3 2

2 5

2

4 1

63

106

2

H×nh 6.8 §å thÞ h÷u h­íng cã träng sè

* ThuËt to¸n Dijkstra: T×m c¸c ®­êng ®i ng¾n nhÊt tõ nót v ®Õn c¸c nót cßn l¹i cña ®å thÞ.

Input : - §å thÞ G lµ ma trËn kÒ h÷u h­íng cã träng sè víi qui ­íc sau:

+ NÕu u kÒ víi v th× ®é dµi cung > 0

+ NÕu u kh«ng kÒ víi v th× ®é dµi cung = -1

- Nót v lµ nót ta b¾t ®Çu t×m c¸c ®­êng ®i ng¾n nhÊt tõ v ®Õn tÊt c¶ c¸c nót cßn l¹i trong ®å thÞ.

Output: §é dµi ng¾n nhÊt tõ v ®Õn tÊt c¶ c¸c nót cßn l¹i trong ®å thÞ.

* Gi¶i thuËt:

Dïng mét tËp S ®Ó chøa c¸c nót ®· x¸c ®Þnh ®­îc kho¶ng c¸ch ng¾n nhÊt tõ nót v ®Õn c¸c nót ®ã.

Dïng mét m¶ng Dist ®Ó chøa gi¸ trÞ c¸c kho¶ng c¸ch ng¾n nhÊt nµy. NÕu nót u ë trong S th× Dist [u] lµ gi¸ trÞ kho¶ng c¸ch ng¾n nhÊt tõ v cho ®Õn u. NÕu u ch­a cã trong S th× Dist [u] chøa ®é dµi tõ v ®Õn mét nót w nµo ®ã trong S céng víi kho¶ng c¸ch tõ w ®Õn u. M¶ng Dist sÏ ®­îc khëi t¹o b»ng gi¸ trÞ träng l­îng tõ nót v ®Õn c¸c nót cßn l¹i nÕu cã c¹nh trùc tiÕp, vµ b»ng v« cïng (MAXINT) nÕu kh«ng cã c¹nh trùc tiÕp.

Page 192: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

192

a

0

4 1

3 2

2 5

3 d=5

d=3

d=2

d=

S={0}

b

0

4 1

3 2

2 5

4

3

d=5

d=3

d=2

d=6

10

6

S={0,4}

c

0

4 1

3 2

2

2

1

3

d=4

d=3

d=2

d=5

6

S={0,4,2,1}

e

0

4 1

3 2

2

2

1

3 d=4

d=3

d=2

d=5

S={0,4,2,1,3}

f

0

4 1

3 2

2 5

2

4 1

3 d=4

d=3

d=2

d=5

d

S={0,4,2}

0

4 1

3 2

2 5

2

4 1

63

106

2

a

0

4 1

3 2

2 5

3 d=5

d=3

d=2

d=

S={0}

b

0

4 1

3 2

2 5

3 d=5

d=3

d=2

d=

S={0}

b

0

4 1

3 2

2 5

4

3

d=5

d=3

d=2

d=6

10

6

S={0,4}

c

0

4 1

3 2

2

2

1

3

d=4

d=3

d=2

d=5

6

S={0,4,2,1}

e

0

4 1

3 2

2

2

1

3 d=4

d=3

d=2

d=5

S={0,4,2,1,3}

f

0

4 1

3 2

2 5

2

4 1

3 d=4

d=3

d=2

d=5

d

S={0,4,2}

0

4 1

3 2

2 5

2

4 1

63

106

2

H×nh 6.9 Minh häa c¸c b­íc ¸p dông gi¶i thuËt Dijkstra t×m ®­êng ®i ng¾n nhÊt tõ nót 0 cho ®Õn tÊt c¶ c¸c nót cßn l¹i trong ®å thÞ h×nh 6.8

* Gi¶i thuËt

void Shortest_path(BYTE v, const long G[][MAX])

{

/* Cost chua do dai cac cung cua do thi G, voi qui uoc

neu G[i][j]=-1 thi Cost[i][j] = MAXINT */

long Cost[MAX][MAX] ;

/* Dist[j] : the hien do dai cua duong di ngan nhat tu nut v den nut j

trong do thi dinh huong G co MAX nut; G duoc bieu dien boi

ma tran ke huu huong co trong so kich thuoc MAX x MAX */

Page 193: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

193

long int Dist [MAX] ;

int duongdi[MAX] ; // chua lo trinh duong di ngan nhat tu v den cac dinh

duongdi= {v};

/* S : Tap cac dinh (ke ca v) theo do cac duong di ngan nhat da xac lap */

int S[MAX] ;

int w,i,j,u,k ;

for (i=0; i<MAX; i++)

for (j=0;j<MAX;j++)

Cost[i][j]= (G[i][j]==-1? MAXINT : G[i][j]);

// Khoi tao S va Dist

for (i=0; i< MAX; S[i]=0, Dist[i]=Cost[v][i],i++ );

S[v]=1; Dist[v]=0 ; k=1; //dua v vao S

while (k < MAX) // xac dinh n-1 duong di tu dinh v

{

// chon u sao cho: Dist[u] = min (Dist[j]), S[j]=0

j=0;

while (j<MAX && S[j]!=0) j++; // Tim S[j] = 0 dau tien

u=j;

for (j=u; j<MAX; j++)

if (S[j] == 0 && Dist[u] > Dist[j]) u=j;

//Dua u vao tap S *)

S[u]=1 ; k++;

for (w=0; w< MAX; w++)

if (S[w] == 0)

if (Dist[u]+Cost[u][w] < Dist [w])

{ Dist[w]= Dist[u]+Cost[u][w];

duongdi[w] = u; // ie : u w

}

}

for (w=0; w<MAX; w++)

if (Dist[w] < MAXINT)

cout << "\n" << v << "->" <<w <<": " << Dist[w];

else

cout << "\n" << v << "->" <<w << ": Khong co duong di";

}

Muèn in lé tr×nh ng¸n nhÊt tõ ®Ønh s ®Õn ®Ønh t :

printf("\nLo trinh tu %d->%d la: ", s, t);

Page 194: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

194

i = t;

while(i != s)

{ printf("%d <- ", i); i = duongdi[i]; }

printf("%d", s);

V. S¾p thø tù Topo:

V.1. Kh¸i niÖm:

S¾p thø tù Topo lµ mét qu¸ tr×nh s¾p thø tù c¸c phÇn tö mµ trong ®ã cã ®Þnh nghÜa mét thø tù bé phËn, nghÜa lµ mét thø tù cho tr­íc trªn mét vµi cÆp c¸c phÇn tö mµ kh«ng ph¶i trªn tÊt c¶ c¸c phÇn tö.

Mét thø tù bé phËn cña mét tËp hîp S lµ mét quan hÖ gi÷a c¸c phÇn tö cña S. Nã ®­îc ký hiÖu bëi <, ®äc lµ "®øng tr­íc", vµ tháa m·n ba tÝnh chÊt sau ®©y ®èi víi mäi phÇn tö ph©n biÖt x, y, z cña S:

(1) NÕu x < y vµ y < z th× x < z (tÝnh b¾c cÇu)

(2) NÕu x < y th× kh«ng cã thÓ cã y < x (tÝnh ph¶n xøng)

(3) Kh«ng thÓ cã x < x (tÝnh kh«ng ph¶n x¹)

Th«ng th­êng, bµi to¸n Topo nh»m ®Ó s¾p xÕp c¸c phÇn viÖc trong mét c«ng viÖc nµo ®ã cho logic, nghÜa lµ khi ta thùc hiÖn ®Õn phÇn viÖc thø i th× ph¶i ®¶m b¶o ®· thùc hiÖn c¸c phÇn viÖc chuÈn bÞ cho nã tr­íc råi. Ch¼ng h¹n nh­ s¾p xÕp c¸c tÝn chØ m«n häc sao cho khi ®¨ng ký ®Õn m«n häc i th× ta ph¶i häc qua c¸c m«n chuÈn bÞ tr­íc cho nã.

V.2. ThuËt to¸n: §Ó ®¬n gi¶n, ta lÊy vÝ dô sau ®Ó minh häa:

Gi¶ sö khoa c«ng nghÖ th«ng tin cã gi¶ng d¹y c¸c m«n häc sau: ®¹i sè tuyÕn tÝnh (§STT), Tin häc c¬ b¶n (THCB), LËp tr×nh c¨n b¶n (LTCB), Kü thuËt lËp tr×nh (KTLT), CÊu tróc d÷ liÖu (CTDL), CÊu tróc m¸y tÝnh (CTMT), C¬ së d÷ liÖu (CSDL), Qu¶n trÞ giao t¸c (QTGT), Ph©n tÝch & thiÕt kÕ hÖ thèng th«ng tin (PTTK), HÖ qu¶n trÞ c¬ së d÷ liÖu (HQT).

Yªu cÇu: H·y s¾p xÕp c¸c m«n häc trªn sao cho khi sinh viªn ®¨ng ký tÝn chØ m«n häc th× ph¶i ®¶m b¶o c¸c ®iÒu kiÖn sau:

M«n häc C¸c m«n ph¶i häc tr­íc

§¹i sè tuyÕn tÝnh

Tin häc c¬ b¶n

LËp tr×nh c¨n b¶n Tin häc c¬ b¶n

Kü thuËt lËp tr×nh LËp tr×nh c¨n b¶n, §¹i sè tuyÕn tÝnh

CÊu tróc d÷ liÖu Kü thuËt lËp tr×nh

CÊu tróc m¸y tÝnh

Page 195: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

195

C¬ së d÷ liÖu Tin häc c¬ b¶n

Qu¶n trÞ giao t¸c C¬ së d÷ liÖu

Ph©n tÝch & thiÕt kÕ hÖ thèng th«ng tin

HÖ qu¶n trÞ c¬ së d÷ liÖu C¬ së d÷ liÖu, Ph©n tÝch & thiÕt kÕ hÖ thèng th«ng tin

Ta cã ®å thÞ minh häa bµi to¸n trªn víi qui ­íc:

Cung <u,v> víi u lµ m«n ph¶i häc tr­íc m«n v

§STT

THCB

CTMT CSDL QTGT

HQTPTTK

LTCB CTDL

KTLT§STT

THCB

CTMT CSDL QTGT

HQTPTTK

LTCB CTDL

KTLT

H×nh 6.10 §å thÞ minh häa bµi to¸n s¾p thø tù c¸c m«n häc tháa rµng buéc ®· cho

Gi¶i thuËt:

(i) Ta t×m nót nµo kh«ng cã cung ®Õn nã th× chän, sau ®ã hñy tÊt c¶ c¸c cung tõ nót ®ã ®i ra.

(ii) LÆp l¹i b­íc i cho ®Õn khi kh«ng cßn nót nµo trªn ®å thÞ

L­u ý: NÕu trong qu¸ tr×nh chän mµ kh«ng t×m ®­îc 1 nót kh«ng cã cung tíi nã th× cã nghÜa lµ ®å thÞ cã chu tr×nh. Do ®ã, kh«ng thÓ thùc hiÖn s¾p Topo ®­îc.

¸p dông gi¶i thuËt trªn víi ®å thÞ h×nh 6.10

Page 196: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

196

Nót chän §å thÞ cßn l¹i

§STT

THCB

CTMT CSDL QTGT

HQTPTTK

LTCB CTDL

KTLT

THCB

CTMT CSDL QTGT

HQTPTTK

LTCB CTDL

KTLT

CTMT

CSDL QTGT

HQTPTTK

LTCB

CTDL

KTLT

LTCB CSDL QTGT

HQTPTTK

CTDLKTLT

KTLT CSDL QTGT

HQTPTTK

CTDL

Page 197: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

197

CTDL CSDL QTGT

HQTPTTK

CSDL QTGT

HQTPTTK

PTTK QTGT

HQT

QTGT HQT

HQT

V.3. Cµi ®Æt: Do sè nót trªn ®å thÞ th­êng nhiÒu vµ sè cung trªn ®å thÞ t­¬ng ®èi Ýt nªn ®Ó tiÕt kiÖm bé nhí, ta chän cÊu tróc d÷ liÖu ®Ó l­u tr÷ lµ danh s¸ch kÒ; trong ®ã m¶ng 1 chiÒu chøa danh s¸ch c¸c nót cña ®å thÞ, cßn danh s¸ch liªn kÕt sÏ chøa c¸c cung trªn ®å thÞ. Ch¼ng h¹n nh­ danh s¸ch kÒ cña ®å thÞ h×nh 6.10 nh­ sau:

ÑSTT

THCB

CTMT

LTCB

KTLT

CTDL

CSDL

PTTK

QTGT

HQT

0

0

0

1

2

1

0

2

KTLT

1

1

LTCB CSDL

KTLT

CTDL

QTGT HQT

HQT

H×nh 6.11 Danh s¸ch kÒ cña ®å thÞ h×nh 6.10

§Ó biÕt ®­îc cã bao nhiªu cung ®i tíi nót i, ta thªm tr­êng count vµo m¶ng chøa danh s¸ch c¸c nót.

D­íi ®©y lµ ch­¬ng tr×nh s¾p Topo víi gi¶ thiÕt cña bµi to¸n ®­îc chøa trong 1 file v¨n b¶n. File v¨n b¶n cã d¹ng sau:

Sè n : sè nót cña ®å thÞ

Page 198: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

198

Ma trËn sè biÓu diÔn ®å thÞ

VÝ dô: File v¨n b¶n biÓu diÔn ®å thÞ h×nh 6.10 cã d¹ng:

10 0 0 0 0 1 0 0 0 0 0

0 0 0 1 0 0 1 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 1 0 0 0 0 0

0 0 0 0 0 1 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 1 1

0 0 0 0 0 0 0 0 0 1

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

#include <stdio.h>

#include <conio.h>

#include <ctype.h>

#include <alloc.h>

#include <stdlib.h>

struct node

{

int dinh_ke;

struct node *next;

};

typedef struct node *NODEPTR;

struct phantu_ke

{

int count;

NODEPTR pF;

NODEPTR pL ;

};

typedef struct phantu_ke Dothi[100];

Dothi G;

int MAX;

void Init_graph(Dothi G)

{

for(int i=0; i< MAX; G[i++].pF=NULL);

Page 199: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

199

}

void Create_graph()

{

int i,j ;

NODEPTR p;

unsigned B[100][100];

FILE *fptr;

if ( (fptr = fopen ("dt.txt", "rt")) == NULL )

{ printf("\nKhong the mo file dt.txt");

getch();

exit(0);

}

fscanf(fptr,"%d", &MAX);

for (i=0; i< MAX ; i++)

for (j=0; j<MAX; j++)

fscanf(fptr,"%d", &B[i][j]);

/// Khoi tao rong do thi

Init_graph(G);

//Tao count : so cung toi dinh j

for (j=0; j<MAX; j++)

{

G[j].count=0;

for (i=0; i< MAX; i++)

if (B[i][j] ==1) G[j].count++;

}

for (i=0; i< MAX; i++)

for (j=0;j<MAX; j++)

if (B[i][j] == 1)

{

p = (NODEPTR)malloc(sizeof(struct node));

p->next=NULL;

p->dinh_ke=j;

if( G[i].pF == NULL) G[i].pF=p;

else G[i].pL->next=p;

G[i].pL=p;

}

}

Page 200: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

200

void Topo_Sort(Dothi G)

{

int Stack[100];

int i,j,k, Sp=-1 ;

NODEPTR p;

for(i=0;i<MAX; i++) // Dua vao Stack tat cac cac nut khong co cung di // toi no

if (G[i].count==0) { // day la cac task co the lam doc lap

Stack[++ Sp]=i;

}

for( i=0; i<MAX; i++)

{

if (Sp ==-1)

{

printf("\nCo chu trinh trong do thi!!!");

exit(0);

}

j=Stack[Sp--]; printf("%5d",j); // Lay 1 nut trong Stack ra

p=G[j].pF;

while (p !=NULL)

{

k=p->dinh_ke; // k la ngon cua cung j --> k

G[k].count --;

if (G[k].count == 0) // khong co dinh nao toi nut k

{

Stack[++Sp]=k;

}

p=p->next;

}

}

}

void main()

{ clrscr();

Create_graph();

Topo_Sort(G);

getch();

}

Page 201: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

201

Page 202: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

202

Bµi tËp :

1. ViÕt thñ tôc ReadGraph ®Ó nhËp vµo c¸c ®Ønh vµ c¸c c¹nh cña ®å thÞ G tõ 1 file v¨n b¶n, biÕt r»ng:

- Néi dung cña file v¨n b¶n lµ nh­ sau:

n

u v trängsè

.....

víi : n : sè nót cña ®å thÞ G

u v trängsè : chiÒu dµi ®­êng ®i tõ nót u ®Õn nót v

- CÊu tróc d÷ liÖu cña ®å thÞ G ®­îc sö dông lµ :

a. B¶ng kÒ

b. Danh s¸ch kÒ

2. Cho mét ®å thÞ G, viÕt thñ tôc WriteGraph ®Ó in c¸c ®Ønh cña ®å thÞ, vµ c¸c c¹nh cña ®å thÞ ra mµn h×nh.

3. Cho mét ®å thÞ G. H·y x¸c ®Þnh xem gi÷a 2 nót u vµ v cã ®­êng ®i hay kh«ng? NÕu cã, h·y x¸c ®Þnh lé tr×nh tõ nót u ®Õn nót v.

4. Cho mét ®å thÞ G. H·y x¸c ®Þnh xem ®å thÞ G cã liªn th«ng hay kh«ng ?

5. Cµi ®Æt vµ kiÓm tra thñ tôc t×m ®­êng ®i ng¾n nhÊt tõ nót u cho ®Õn nót v trong mét ®å thÞ cã h­íng. H·y x¸c ®Þnh râ lé tr×nh ®ã vµ cho biÕt chiÒu dµi ®­êng ®i ng¾n nhÊt lµ bao nhiªu?

Minh häa c¸c b­íc cña gi¶i thuËt Dijkstra t×m ®­êng ®i ng¾n nhÊt tõ nót 0 ®Õn nót 5 trªn ®å thÞ sau:

01

25

43

12

25

30

20

30

24

8080

50

30

40

Page 203: Ch¬ng Idulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/... · ch¹y cµng nhanh cµng tèt. Do ®ã khi viÕt ch¬ng tr×nh ®Ó ch¹y mét lÇn hoÆc Ýt ch¹y th× môc tiªu

203

TµI LIÖU THAM KH¶O

[1] CÊu tróc d÷ liÖu - øng dông NguyÔn Hång Ch­¬ng 1999 vµ cµi ®Æt b»ng C

[2] CÊu tróc d÷ liÖu + Gi¶i thuËt Niklaus Wirth - = Ch­¬ng tr×nh Ng­êi dÞch NguyÔn Quèc C­êng

[3] CÊu tróc d÷ liÖu §ç Xu©n L«i

[4] CÊu tróc d÷ liÖu NguyÔn Trung Trùc 1992

[5] Ph©n tÝch vµ thiÕt kÕ gi¶i thuËt §inh NghiÖp 1992 §H BK Tp. Hå ChÝ Minh

[6] Course 12.2AB2 Data Structures Alison Cousey 1999 and Algorithms II - http://www.cee.hw.ac.uk/~alison/alg/lectures.html