sdcc.vnsdcc.vn/template/263_Sach_06-06.doc · Web viewGi¸o tr×nh nµy ®îc viÕt cho sinh viªn...

525
Lêi nãi ®Çu Gi¸o tr×nh nµy ®îc viÕt cho sinh viªn c¸c trêng Cao ®¼ng Đại học §Ó häc tèt gi¸o tr×nh nµy sinh viªn cÇn cã kiÕn thøc vÒ tin häc c¬ së vµ ®· biÕt mét ng«n ng÷ lËp tr×nh bËc cao nh Pascal, Delphi, C hay C ++ ... Gi¸o tr×nh ®îc viÕt nh»m nh÷ng môc tiªu sau ®©y: Giíi thiÖu cho häc sinh vÒ kh¸i niÖm vÒ kiÓu d÷ liÖu trõu tîng. Cung cÊp cho häc sinh kiÕn thøc c¬ b¶n vÒ nh÷ng kiÓu d÷ liÖu trõu tîng, cÊu tróc d÷ liÖu th«ng dông, n©ng cao vµ nh÷ng thao t¸c trªn c¸c cÊu tróc ®ã. Cung cÊp mét sè thuËt to¸n c¬ b¶n vµ rÌn luyÖn mét sè kÜ n¨ng ph©n tÝch thuËt to¸n cho häc sinh. RÌn luyÖn cho häc sinh c¸ch ¸p dông c¸c cÊu tróc d÷ liÖu ®· häc vµ t duy thuËt to¸n ®Ó cã thÓ thiÕt kÕ vµ cµi ®Æt mét sè ch¬ng tr×nh b»ng mét ng«n ng÷ bËc cao. §Ó cã thÓ häc tèt c¸c ch¬ng sau, sinh viªn cÇn ®äc kÜ ch- ¬ng 1 vµ ch¬ng 2. Ch¬ng 1 giíi thiÖu nh÷ng kh¸i niÖm c¬ b¶n vÒ thuËt gi¶i. Ch¬ng 2 giíi thiÖu nh÷ng kh¸i niÖm c¬ b¶n vÒ kiÓu d÷ liÖu trõu tîng. §©y lµ kh¸i niÖm míi ®èi víi häc sinh. Mét kiÓu d÷ liÖu trõu tîng lµ mét tËp hîp c¸c ®èi tîng vµ ®îc x¸c ®Þnh hoµn toµn bëi c¸c phÐp to¸n cã thÓ biÓu diÔn trªn c¸c ®èi tîng ®ã. Ngêi sö dông ®îc phÐp t×m hiÓu c¸c ®èi tîng vµ thùc - 1 -

Transcript of sdcc.vnsdcc.vn/template/263_Sach_06-06.doc · Web viewGi¸o tr×nh nµy ®îc viÕt cho sinh viªn...

Lêi nãi ®Çu

Gi¸o tr×nh nµy ®îc viÕt cho sinh viªn c¸c trêng Cao ®¼ng Đại học

§Ó häc tèt gi¸o tr×nh nµy sinh viªn cÇn cã kiÕn thøc vÒ tin häc c¬ së vµ ®· biÕt mét ng«n ng÷ lËp tr×nh bËc cao nh Pascal, Delphi, C hay C++...

Gi¸o tr×nh ®îc viÕt nh»m nh÷ng môc tiªu sau ®©y:

Giíi thiÖu cho häc sinh vÒ kh¸i niÖm vÒ kiÓu d÷ liÖu trõu tîng.

Cung cÊp cho häc sinh kiÕn thøc c¬ b¶n vÒ nh÷ng kiÓu d÷ liÖu trõu tîng, cÊu tróc d÷ liÖu th«ng dông, n©ng cao vµ nh÷ng thao t¸c trªn c¸c cÊu tróc ®ã.

Cung cÊp mét sè thuËt to¸n c¬ b¶n vµ rÌn luyÖn mét sè kÜ n¨ng ph©n tÝch thuËt to¸n cho häc sinh.

RÌn luyÖn cho häc sinh c¸ch ¸p dông c¸c cÊu tróc d÷ liÖu ®· häc vµ t duy thuËt to¸n ®Ó cã thÓ thiÕt kÕ vµ cµi ®Æt mét sè ch¬ng tr×nh b»ng mét ng«n ng÷ bËc cao.

§Ó cã thÓ häc tèt c¸c ch¬ng sau, sinh viªn cÇn ®äc kÜ ch¬ng 1 vµ ch¬ng 2. Ch¬ng 1 giíi thiÖu nh÷ng kh¸i niÖm c¬ b¶n vÒ thuËt gi¶i. Ch¬ng 2 giíi thiÖu nh÷ng kh¸i niÖm c¬ b¶n vÒ kiÓu d÷ liÖu trõu t-îng. §©y lµ kh¸i niÖm míi ®èi víi häc sinh. Mét kiÓu d÷ liÖu trõu t-îng lµ mét tËp hîp c¸c ®èi tîng vµ ®îc x¸c ®Þnh hoµn toµn bëi c¸c phÐp to¸n cã thÓ biÓu diÔn trªn c¸c ®èi tîng ®ã. Ngêi sö dông ®îc phÐp t×m hiÓu c¸c ®èi tîng vµ thùc hiÖn c¸c thao t¸c trªn c¸c ®èi t-îng cña kiÓu d÷ liÖu th«ng qua c¸c phÐp to¸n ®ã mµ kh«ng cÇn quan t©m ®Õn viÖc ®èi tîng ®îc cµi nh thÕ nµo trong ng«n ng÷ lËp tr×nh. Chóng t«i cã ®a ra mét vµi vÝ dô ®¬n gi¶n vÒ kiÓu d÷ liÖu trõu tîng, c¸ch ®Æc t¶ vµ x©y dùng chóng ®Ó ®Þnh híng cho viÖc ®Æc t¶ vµ x©y dùng nh÷ng kiÓu d÷ liÖu trõu tîng trong nh÷ng ch¬ng sau.

- 1 -

Trong khi tr×nh bµy mçi kiÓu d÷ liÖu trõu tîng ë mçi ch¬ng sau, chóng t«i cè g¾ng khuyÕn khÝch sinh viªn tríc hÕt ph¶i hiÓu mét c¸ch kh¸i qu¸t vÒ kiÓu d÷ ®ã tríc khi quan t©m ®Õn viÖc cµi ®Æt chi tiÕt bªn trong. §iÒu ®ã kh«ng cã nghÜa lµ chóng t«i kh«ng coi träng viÖc cµi ®Æt. ViÖc t¸ch riªng ®Æc t¶ bªn ngoµi vµ bªn trong cho phÐp ta nh×n râ tríc hÕt vµo b¶n chÊt cña mét kiÓu d÷ liÖu trõu tîng lµ tËp c¸c thao t¸c trªn c¸c ®èi tîng cña kiÓu d÷ liÖu ®ã. Vµ chØ khi ®· hiÓu râ b¶n chÊt cña c¸c thao t¸c trªn mét kiÓu d÷ liÖu trõu tîng chóng ta míi chuyÓn tíi viÖc cµi ®Æt nh÷ng thao t¸c ®ã b»ng mét ng«n ng÷ bËc cao nµo ®ã. C«ng cô cho phÐp ta bãc t¸ch mét c¸ch kh¸i niÖm h×nh thøc bªn ngoµi vµ chi tiÕt bªn trong ®ã chÝnh lµ kiÓu d÷ liÖu trõu tîng.

Tõ ch¬ng 3 ®Õn ch¬ng 6 dµnh cho viÖc nghiªn cøu mét sè kiÓu d÷ liÖu trõu tîng c¬ b¶n tuyÕn tÝnh vµ phi tuyÕn. §ã lµ c¸c kiÓu d÷ liÖu trõu tîng ng¨n xÕp, hµng ®îi, c©y, b¶ng t×m kiÕm, tËp hîp vµ ®å thÞ... Víi mçi kiÓu d÷ liÖu trõu tîng ®a ra, chóng ®Òu ®îc ®Æc t¶ bëi c¸c thao t¸c c¬ b¶n vµ híng dÉn cµi ®Æt mét sè thao t¸c. Nh÷ng thao t¸c ®a ra lµ nh÷ng thao t¸c c¬ b¶n nhÊt. Tuy nhiªn, tuú theo ®iÒu kiÖn vµ hoµn c¶nh, häc sinh cã thÓ bæ sung thªm mét sè nh÷ng thao t¸c kh¸c. Trong viÖc x©y dùng c¸c kiÓu d÷ liÖu trõu tîng, chóng t«i rÊt nhÊn m¹nh viÖc quan t©m ®Çu tiªn lµ ®Æc t¶ ®îc c¸c thao t¸c cÇn thiÕt (x©y dùng m« ®un ngoµi), sau ®ã míi ®Õn viÖc cµi ®Æt c¸c thao t¸c (x©y dùng m« ®un trong). Ngoµi ra, chóng t«i còng quan t©m ®Õn viÖc híng dÉn sö dông c¸c kiÓu d÷ liÖu trõu tîng th«ng qua nh÷ng vÝ dô vÒ nh÷ng m« ®un øng dông.

Sinh viªn ¾t h¼n ®· ®îc giíi thiÖu mét vµi thuËt to¸n s¾p xÕp ®¬n gi¶n trªn m¶ng tõ phÇn Tin häc ®¹i c¬ng. Tuy nhiªn, bµi to¸n s¾p xÕp vµ t×m kiÕm lµ bµi to¸n hÕt søc c¬ b¶n ®èi víi mçi sinh viªn Cao ®¼ng vµ §¹i häc nªn chóng t«i dµnh riªng ch¬ng 7 ®Ó nãi vÒ mét sè gi¶i thuËt s¾p xÕp ®¬n gi¶n còng nh mét sè gi¶i thuËt s¾p

- 2 -

xÕp n©ng cao, cÇn ®Õn mét chót kiÕn thøc vÒ kiÓu d÷ liÖu trõu t-îng võa häc trong c¸c ch¬ng tríc. Mét sè phÐp so s¸nh c¸c gi¶i thuËt s¾p xÕp còng ®îc ®Ò cËp trong ch¬ng nµy.

§Ó gióp häc sinh cã thªm mét sè kiÕn thøc vÒ thuËt gi¶i, trong ch-¬ng 8, chóng t«i tr×nh bµy mét sè ph¬ng ph¸p thiÕt kÕ thuËt gi¶i nh ®Ö qui, quay lui, chia dÓ trÞ, tham lam, qui ho¹ch ®éng. §©y lµ nh÷ng ph¬ng ph¸p rÊt c¬ b¶n vµ th«ng dông trong khoa häc m¸y tÝnh. B¹n ®äc cã thÓ t×m thÊy nhiÒu vÝ dô minh ho¹ cho nh÷ng ph-¬ng ph¸p nµy. C¸c vÝ dô ®Òu ®îc cµi ®Æt cô thÓ b»ng ng«n ng÷ lËp tr×nh Pascal.

Cuèi mçi ch¬ng ®Òu cã hÖ thèng bµi tËp ®Ó häc sinh lµm vµ tù kiÓm tra kiÕn thøc cña m×nh.

Cuèi cïng lµ phÇn phô lôc, trong ®ã chóng t«i cã ®a ra mét sè bµi tËp lín, ®Ó häc sinh ¸p dông nh÷ng kiÕn thøc ®· häc tËp gi¶i quyÕt nh÷ng vÊn ®Ò phøc t¹p h¬n so víi bµi tËp sau mçi ch¬ng. Víi nh÷ng bµi tËp lín nµy, ®Ó n©ng cao hiÖu qu¶, yªu cÇu häc sinh cÇn ®Æc t¶ râ bµi to¸n, ph©n tÝch vµ thiÕt kÕ thuËt gi¶i, sau ®ã cµi ®Æt trªn mét ng«n ng÷ cô thÓ. TiÕp theo häc sinh cÇn ph¶i kiÓm thö phÇn mÒm m×nh võa cµi ®Æt vµ cã nh÷ng nhËn xÐt vÒ ®é phøc t¹p cña thuËt to¸n m×nh thiÕt kÕ, vÒ c¸c híng cÇn më réng cho c¸c bµi tËp nµy. ChØ khi nµo häc sinh lµm tèt c¸c bµi tËp lín ®ã míi cã thÓ nãi lµ hä ®· thµnh c«ng trong viÖc häc tËp m«n häc nµy.

Chñ biªn vµ hiÖu ®Ýnh toµn bé néi dung b¶n th¶o:

Ch¬ng 1: Më ®Çu

ch¬ng 2: .

Ch¬ng 3: .

Ch¬ng 4,

- 3 -

Ch¬ng 6:

Ch¬ng 7:

Ch¬ng 8:

- 4 -

Ch¬ng I: Më ®Çu

Ch¬ng nµy tr×nh bµy mét sè kh¸i niÖm c¬ b¶n ®Çu tiªn vÒ bµi to¸n theo quan ®iÓm Tin häc, thuËt gi¶i, cÊu tróc d÷ liÖu, mèi quan hÖ gi÷a cÊu tróc d÷ liÖu vµ thuËt gi¶i. Nh÷ng kh¸i niÖm vÒ ®é phøc t¹p cña thuËt gi¶i vµ ph©n tÝch thuËt gi¶i còng ®îc giíi thiÖu trong ch¬ng.

1.1. Kh¸i niÖm vÒ cÊu tróc d÷ liÖu vµ thuËt gi¶i

1.1.1. Kh¸i niÖm bµi to¸n

Trong ph¹m vi Tin häc, ta cã thÓ quan niÖm bµi to¸n lµ bÊt cø viÖc g× ta muèn m¸y tÝnh thùc hiÖn. Nh vËy nh÷ng viÖc nh viÕt mét dßng ch÷ ra mµn h×nh, gi¶i ph¬ng tr×nh bËc hai, gi¶i hÖ ph¬ng tr×nh bËc nhÊt hai Èn sè, qu¶n lý c¸c c¸n bé trong mét c¬ quan... ®Òu lµ c¸c vÝ dô vÒ bµi to¸n.

Khi dïng m¸y tÝnh gi¶i bµi to¸n, ta chØ cÇn quan t©m ®Õn hai yÕu tè: ®a vµo m¸y th«ng tin g× (th«ng tin vµo) vµ cÇn lÊy ra th«ng tin g× (th«ng tin ra), Th«ng tin vµo cßn ®îc gäi lµ Input, th«ng tin ra cßn ®îc gäi lµ Output. Nh vËy ®Ó ph¸t biÓu mét bµi to¸n, ta chØ cÇn ®Æc t¶ Input vµ Output cña bµi to¸n.

VÝ dô 1. Bµi to¸n t×m íc chung lín nhÊt

Input. Hai sè nguyªn d¬ng M vµ N

Output. ¦íc chung lín nhÊt cña M vµ N

VÝ dô 2. Bµi to¸n t×m nghiÖm cña ®a thøc mét biÕn:

Input: sè nguyªn d¬ng n; c¸c sè thùc a0, a1, . . ., an;

Output: Tr¶ lêi c©u hái cã bao nhiªu sè thùc x kh¸c nhau vµ gi¸ trÞ cña chóng (nÕu cã) sao cho

- 5 -

a0 + a1x +...+ anxn = 0

VÝ dô 3. Bµi to¸n ph©n tÝch sè:

Input: Sè nguyªn d¬ng N2;

Output: C¸c sè nguyªn tè p1,..., pk; c¸c sè nguyªn d¬ng a1,...,ak; sao cho

n = p1a1...pkak;

VÝ dô 4. Bµi to¸n kiÓm tra tÝnh nguyªn tè:

Input: Sè nguyªn d¬ng n;

Output: Tr¶ lêi c©u hái n lµ sè nguyªn tè hay kh«ng?.

VÝ dô 5. Bµi to¸n qu¶n lý hå s¬ c¸n bé:

Input: Hå s¬ gèc cña c¸c c¸n bé trong c¬ quan;

Output: Nh÷ng biÓu b¶ng thèng kª, ph©n lo¹i c¸n bé, c¸c quy tr×nh lu tr÷, qu¶n lý hå s¬ c¸n bé.

VÝ dô 6. Bµi to¸n thø 10 cña Hilbert:

Input: P lµ ®a thøc (nhiÒu Èn) víi hÖ sè nguyªn;

Output: Tr¶ lêi c©u hái P cã nghiÖm nguyªn hay kh«ng?

Qua c¸c vÝ dô trªn, ta thÊy c¸c bµi to¸n ®îc cÊu t¹o bëi hai thµnh phÇn c¬ b¶n:

- Th«ng tin vµo (input): Cho ta biÕt nh÷ng th«ng tin ®· cã (c¸c gi¶ thiÕt);

- Th«ng tin ra (output): C¸c th«ng tin cÇn t×m tõ input (kÕt luËn);

1.1.2. Kh¸i niÖm thuËt gi¶i

- 6 -

Nh vËy trong gi¸o tr×nh nµy, viÖc cho mét bµi to¸n cã nghÜa lµ cho input vµ m« t¶ output cÇn t×m. VÊn ®Ò ®Æt ra lµ thÕ nµo lµ gi¶i mét bµi to¸n?

Tríc hÕt cÇn lu ý r»ng trong to¸n häc cã mét xu híng nghiªn cøu ®Þnh tÝnh c¸c bµi to¸n. Theo xu híng nµy, khi xem xÐt c¸c bµi to¸n, ngêi ta chØ cÇn chøng tá sù tån t¹i cña output khi cho input vµ nÕu cã thÓ, xÐt xem cã bao nhiªu "lêi gi¶i" vµ nghiªn cøu d¸ng ®iÖu cña chóng. Trong c¸c nghiªn cøu nh vËy, nhiÒu khi ta kh«ng cÇn t×m ra lêi gi¶i mét c¸ch têng minh nhng b»ng c¸ch dïng c¸c c«ng cô to¸n häc kh¸c nhau mét c¸ch thÝch hîp ta vÉn cã thÓ chøng minh chÆt chÏ c¸c ®iÒu kh¼ng ®Þnh liªn quan ®Õn lêi gi¶i. Môc tiªu cña xu h-íng nghiªn cøu nµy lµ chØ ra ®iÒu kiÖn tån t¹i vµ nÕu cã thÓ, sù duy nhÊt cña lêi gi¶i. Sù tån t¹i lêi gi¶i theo nghÜa nµy kh«ng lu«n cho ta c¸ch thøc thùc tÕ ®Ó t×m ra lêi gi¶i.

Trong khu«n khæ cña Tin häc, viÖc gi¶i bµi to¸n cã nghÜa trao ®îc cho m¸y tÝnh c¸ch gi¶i. §Ó giao bµi to¸n cho m¸y tÝnh, ta cÇn híng dÉn cho m¸y c¸c thao t¸c mµ vÒ nguyªn t¾c m¸y cã thÓ thùc hiÖn ®îc. Mét c¸ch gi¶i bµi to¸n nh vËy ®îc gäi lµ mét thuËt gi¶i (cßn gäi lµ thuËt to¸n hay gi¶i thuËt).

Nãi mét c¸ch ®Çy ®ñ h¬n,

ThuËt gi¶i A ®Ó gi¶i bµi to¸n P lµ mét d·y h÷u h¹n c¸c thao t¸c ®¬n gi¶n ®îc s¾p xÕp theo mét tr×nh tù x¸c ®Þnh sao cho sau khi thùc hiÖn d·y thao t¸c ®ã, tõ Input cña bµi to¸n, ta nhËn ®îc Output cÇn t×m.

ChÝnh quan niÖm vÒ viÖc gi¶i bµi to¸n nh vËy lµ cèt lâi ®Ó ta cã thÓ chuyÓn giao c«ng viÖc ®ã cho m¸y tÝnh. Nh vËy, kh¸c víi quan niÖm vÒ viÖc gi¶i mét bµi to¸n theo to¸n häc truyÒn thèng, viÖc gi¶i bµi to¸n theo quan niÖm cña Tin häc lµ qu¸ tr×nh thùc hiÖn mét d·y

- 7 -

h÷u h¹n c¸c thao t¸c ®¬n gi¶n ®Ó cã thÓ tõ Input dÉn ra Output mét c¸ch têng minh.

Trong ®Þnh nghÜa nªu trªn, thao t¸c ®¬n gi¶n ®îc hiÓu lµ thao t¸c mµ m¸y tÝnh cã thÓ thùc hiÖn ®îc. VÝ dô c¸c phÐp to¸n sè häc, c¸c phÐp so s¸nh hai gi¸ trÞ sè lµ c¸c thao t¸c ®¬n gi¶n.

1.1.3. M« t¶ thuËt gi¶i

Ngay tõ khi häc m«n Tin häc c¬ së häc sinh ®· ®îc lµm quen víi kh¸i niÖm thuËt gi¶i vµ ®îc häc c¸ch m« t¶ hay diÔn ®¹t nh÷ng thuËt gi¶i ®¬n gi¶n. ThuËt gi¶i cho nh÷ng bµi to¸n nhá hay thuËt gi¶i cho nh÷ng bµi to¸n lín khi ®îc thiÕt kÕ ë møc th« hay ®îc m« t¶ b»ng s¬ ®å khèi. C¸ch dïng s¬ ®å khèi ®Ó minh häa thuËt gi¶i cã lîi thÕ lµ rÊt trùc quan, dÔ hiÓu. Tuy nhiªn, víi nh÷ng bµi to¸n lín, phøc t¹p, viÖc dïng s¬ ®å khèi ®Ó m« t¶ thuËt gi¶i cã nh÷ng h¹n chÕ nhÊt ®Þnh. H¹n chÕ nµy lµ cã thÓ lµ do khu«n khæ giÊy hay mµn h×nh ta dïng ®Ó vÏ s¬ ®å hay tÇm bao qu¸t, theo dâi cña m¾t ta trªn s¬ ®å. H¹n chÕ nµy còng n¶y sinh khi bµi to¸n cña ta phøc t¹p, cã nhiÒu vßng lÆp lång nhau, khi ®ã viÖc tr×nh bµy s¬ ®å cã rÊt nhiÒu h¹n chÕ.Ta còng hay dïng ph¬ng ph¸p liÖt kª c¸c bíc gi¶i ®Ó m« t¶ thuËt gi¶i. Ph¬ng ph¸p nµy còng rÊt dÔ hiÓu ®èi víi c¸c bµi to¸n nhá. Tuy nhiªn, ®èi víi c¸c bµi to¸n lín, viÖc liÖt kª sÏ trë nªn khã kh¨n vµ nÕu ®îc th× còng g©y khã khã theo dâi, nhÊt lµ ®èi víi vßng lÆp. H¬n thÕ n÷a viÖc liÖt kª c¸c bíc gi¶i ta hay ph¶i dïng ng«n ng÷ tù nhiªn ®Ó m« t¶ c¸c thao t¸c nªn viÖc diÔn ®¹t nhiÒu khi rÊt khã chÝnh x¸c.Ph¬ng ph¸p thø ba hay ®îc dïng ®Ó m« t¶ thuËt gi¶i lµ dïng gi¶ m· hay ng«n ng÷ pháng tr×nh. ViÖc dïng ng«n ng÷ pháng tr×nh kh¾c phôc ®îc nh÷ng nhiÒu nhîc ®iÓm cña hai ph¬ng ph¸p trªn, ®Æc

- 8 -

biÖt ®èi víi nh÷ng bµi to¸n lín, phøc t¹p. Còng cã ý kiÕn lµ ta nªn chän mét ng«n ng÷ lËp tr×nh th«ng dông lµm c«ng cô ®Ó diÔn ®¹t thuËt gi¶i. Tuy nhiªn, ai còng biÕt lµ thuËt gi¶i cÇn ph¶i ®éc lËp víi ng«n ng÷ lËp tr×nh. Khi thuËt gi¶i ®îc viÕt tèt nã cã thÓ ®îc cµi ®Æt b»ng bÊt cø ng«n ng÷ lËp tr×nh nµo, tïy theo tÝnh thÝch hîp cña bµi to¸n vµ ý muèn cña ngêi lËp tr×nh. H¬n thÕ n÷a, thiÕt kÕ thuËt gi¶i lµ mét trong nh÷ng c«ng viÖc quan träng nhÊt cña ngêi lËp tr×nh. NÕu ta chän mét ng«n ng÷ lËp tr×nh ®Ó m« t¶ thuËt gi¶i th× lóc nµo ta còng ph¶i chó ý tu©n thñ c¸c tiÓu tiÕt có ph¸p cña ng«n ng÷. §iÒu ®ã sÏ g©y mÊt th× giê vµ ¶nh hëng lín ®Õn sù tËp trung vµo c«ng viÖc chÝnh lµ thiÕt kÕ vµ m« t¶ thuËt gi¶i.

Sau ®©y lµ vÝ dô vÒ m« t¶ thuËt gi¶i t×m íc chung lín nhÊt cña hai sè nguyªn m vµ n.

C¸ch 1: Dïng s¬ ®å khèi

H×nh 1.1: S¬ ®å khèi diÔn t¶ thuËt gi¶i t×m íc chung lín nhÊt cña hai sè nguyªn kh«ng ©m--------------------------------------

- 9 -

t mm n mod m n t

False

True

Begin

End

m>0

Write n

C¸ch thø hai: Dïng ph¬ng ph¸p liÖt kª c¸c bíc gi¶i, ta cã thÓ viÕt nh sau:.

Bíc 1. Khi m > 0 thùc hiÖnt mm n mod mn t

Bíc 2. KiÓm tra xem nÕu m > 0, quay l¹i bíc 1

Bíc 3. In kÕt qu¶ lµ n vµ kÕt thóc

C¸ch thø ba: Dïng ng«n ng÷ pháng tr×nh.

Function Ucln(m,n)var t

BeginWhile m > 0 do

t mm n mod mn t

Return n-----------------------------Trong thùc tÕ, tïy theo tõng giai ®o¹n thiÕt kÕ thuËt gi¶i, tïy theo møc ®é, vµ ®èi tîng tr×nh bµy mµ ngêi lËp tr×nh thêng hay chän ph¬ng ph¸p thÝch hîp nhÊt trong ba ph¬ng tiÖn nªu trªn. Nh vËy, viÖc diÔn t¶ mét thuËt gi¶i gi¶i mét bµi to¸n nµo ®ã cã nghÜa lµ tr×nh bµy tr×nh tù c¸c thao t¸c cÇn thùc hiÖn. Tuy nhiªn, ®ã chØ lµ c¸ch diÔn t¶ thuËt gi¶i gi÷a ngêi víi ngêi.Ngay khi thuËt gi¶i ®· ®îc diÔn t¶ nh vËy, con ngêi cã thÓ dïng ®Ó gi¶i bµi to¸n víi mçi bé d÷ liÖu vµo. Tuy nhiªn, theo c¸ch diÔn t¶

- 10 -

nµy, m¸y tÝnh vÉn cha thÓ thùc hiÖn c¸c thao t¸c trong thuËt gi¶i dï c¸c thao t¸c ®ã rÊt ®¬n gi¶n. ThuËt gi¶i cÇn ®îc diÔn t¶ thµnh mét ch¬ng tr×nh gåm nh÷ng dßng lÖnh. Mçi lÖnh lµ mét viÖc nµo ®ã mµ ta ®ßi hái m¸y tÝnh thùc hiÖn.

Ng«n ng÷ dïng ®Ó viÕt ch¬ng tr×nh ®îc gäi lµ ng«n ng÷ lËp tr×nh.

PhÇn ®äc thªm

Kh¸i niÖm thuËt gi¶i tr×nh bµy ë trªn ®ñ ®Ó ta cã thÓ h×nh dung ®Ó cã thÓ chuyÓn giao cho m¸y tÝnh viÖc gi¶i mét bµi to¸n ta cÇn diÔn t¶ c¸ch gi¶i nh thÕ nµo vµ còng lµ c¸ch nhËn biÕt thÕ nµo lµ thuËt gi¶i ®èi víi mét bµi to¸n nµo ®ã.

Trong qu¸ tr×nh nghiªn cøu c¸ch gi¶i bµi to¸n theo nghÜa nªu trªn,trong to¸n häc ®· diÔn ra mét qu¸ tr×nh ph¸t triÓn ®Çy kÞch tÝnh. Cho tíi ®Çu thÕ kû 20, víi lßng tin tiªn nghiÖm vµo viÖc mäi bµi to¸n ®îc ph¸t biÓu ®óng ®¾n ®Òu cã thuËt gi¶i gi¶i, nhiÒu nhµ to¸n häc ®Çy tµi n¨ng vµ t©m huyÕt ®· tiÕn c«ng vµo c¸c bµi to¸n ®ang tån t¹i nh nh÷ng lêi th¸ch ®è trÝ tuÖ con ngêi.VÊn ®Ò then chèt nhÊt cña lý thuyÕt tÝnh to¸n ph¸t sinh ë ®©y. §Ó chøng minh mét bµi to¸n nµo ®ã cã thuËt gi¶i gi¶i nã, ta chØ cÇn ®Ò ra mét thuËt gi¶i theo quan niÖm trùc gi¸c cña kh¸i niÖm nµy vµ kiÓm ®Þnh tÝnh ®óng ®¾n cña nã ®èi víi bµi to¸n ®· cho. Tuy nhiªn, khi cÇn chøng minh viÖc kh«ng cã thuËt gi¶i gi¶i mét bµi to¸n nµo ®ã, quan niÖm trùc quan vÒ thuËt gi¶i kh«ng thÓ lµ c¬ së b¶o ®¶m cho mét chøng minh to¸n häc chÆt chÏ ®îc. Do ®ã, muèn chøng minh nh÷ng ®iÒu kh¼ng ®Þnh "kh«ng cã thuËt gi¶i gi¶i mét bµi to¸n nµo dã", ta cÇn cã mét ®Þnh nghÜa to¸n häc cho kh¸i niÖm thuËt gi¶i.Vµo kho¶ng nh÷ng n¨m 1930-1936, lÇn lît c¸c nhµ to¸n häc K.Gâdel, S. Kleene, A.Church, A.Turing ®· ®Ò ra mét sè ®Þnh nghÜa kh¸c nhau cho kh¸i niÖm thuËt gi¶i. Trong sè c¸c ®Þnh nghÜa to¸n häc kh¸c nhau (nhng t¬ng ®¬ng) vÒ thuËt gi¶i, c¸c kh¸i niÖm M¸y Turing (1936) vµ Hµm ®Ö quy (1931-1936) ®îc sö dông réng r·i h¬n v× cã nhiÒu thuËn tiÖn cho c¸c nghiªn cøu c¶ vÒ

- 11 -

lý thuyÕt lÉn thùc hµnh. Ta cã thÓ xem m¸y Turing lµ mét m« h×nh to¸n häc cña m¸y tÝnh. ChÝnh nhê cã ®îc ®Þnh nghÜa to¸n häc vÒ thuËt gi¶i, ngêi ta ®· chøng minh ®îc cã nh÷ng bµi to¸n kh«ng cã thuËt gi¶i gi¶i. Ch¼ng h¹n, bµi to¸n thø 10 cña Hilbert (VÝ dô 5 nªu trªn) kh«ng cã thuËt gi¶i ®Ógi¶i.

1.1.4. Mét sè vÝ dô vÒ thuËt gi¶i

VÝ dô 1. Mét thuËt gi¶i t×m íc chung lín nhÊt (viÕt t¾t lµ UC) cña hai sè nguyªn d¬ng M vµ N.(B¹n ®äc cã thÓ thÊy sù kh¸c nhau chót Ýt gi÷a thuËt to¸n nµy vµ thuËt to¸n tr×nh bµy ë phÇn trªn).

Bíc 1. NÕu M=N th× UC=M vµ kÕt thóc, nÕu kh«ng th× chuyÓn ®Õn bíc 2.

Bíc 2. NÕu M<N th× thay N b»ng N-M vµ chuyÓn ®Õn bíc 1, nÕu kh«ng th× thay M b»ng M-N vµ chuyÓn ®Õn bíc 1.

D·y thao t¸c trong thuËt gi¶i diÔn ra trong nhiÒu nhÊt Max(M,N) bíc.

Tuy nhiªn, víi c¸ch diÔn t¶ thuËt gi¶i trªn, m¸y cha cã kh¶ n¨ng trùc tiÕp thùc hiÖn. Ta cÇn diÔn t¶ thuËt gi¶i ®ã b»ng mét ng«n ng÷ mµ m¸y tÝnh cã thÓ “hiÓu” vµ thùc hiÖn ®îc. C¸ch diÔn t¶ mét thuËt gi¶i nh vËy ®îc gäi lµ mét ch¬ng tr×nh, ng«n ng÷ dïng ®Ó viÕt ch-¬ng tr×nh ®îc gäi lµ ng«n ng÷ lËp tr×nh.

VÝ dô 2. ThuËt gi¶i t×m gi¸ trÞ lín nhÊt vµ nhá nhÊt cña mét d·y sè

Ta xÐt bµi to¸n sau:

Input: Sè nguyªn d¬ng n vµ d·y n sè a1, . . ., an.

Output: Gi¸ trÞ lín nhÊt Max vµ gi¸ trÞ nhá nhÊt Min cña d·y sè

Sau ®©y lµ thuËt gi¶i ®èi víi bµi to¸n nµy:

Bíc 1. §Æt Max= a1, Min= a1, i=2.

- 12 -

Bíc 2. NÕu i<N th× thùc hiÖn bíc 3, nÕu kh«ng th× kÕt thóc.

Bíc 3

3.1. NÕu ai>Max th× Max= ai.

3.2. NÕu ai<Min th× Min= ai.

3.3. T¨ng i mét ®¬n vÞ vµ quay vÒ bíc 2.

Râ rµng sè thao t¸c cÇn tiÕn hµnh kh«ng qu¸ n.

VÝ dô 3. ThuËt gi¶i ®Ó s¾p xÕp mét d·y sè cho tríc thµnh mét d·y ®¬n ®iÖu kh«ng t¨ng.

Ta xÐt bµi to¸n sau:

Input: Sè nguyªn d¬ng n vµ d·y n sè a1, . . ., an.

Output: D·y sè trªn ®îc s¾p xÕp l¹i thµnh mét d·y sè kh«ng t¨ng tøc lµ sè h¹ng tríc lín h¬n hay b»ng sè h¹ng sau.

Mét thuËt gi¶i gi¶i bµi to¸n nµy cã thÓ nãi v¾n t¾t nh sau: víi mçi chØ sè i, 1£i£n-1, xÐt c¸c chØ sè j ®øng sau i, i+1£j£n, nÕu ai<aj th× ta tr¸o ®æi hai sè h¹ng nµy cho nhau.

Mét c¸ch cô thÓ h¬n:

Bíc 1. i=1;Bíc 2. NÕu i=n th× kÕt thóc, nÕu kh«ng ( tøc lµ i<n) th×

Bíc 2.1. j=i+1;

Bíc 2.2. NÕu (j£n) vµ (ai<aj) th× tr¸o ®æi gi¸ trÞ cña hai sè nµy

Bíc 2.3. NÕu j<n th× (t¨ng J mét ®¬n vÞ vµ quay l¹i Bíc 2.2), nÕu kh«ng ( tøc lµ j=n), chuyÓn sang bíc 3.

Bíc 3. T¨ng i mét ®¬n vÞ vµ quay l¹i Bíc 2.

Râ rµng sè bíc thao t¸c cÇn tiÕn hµnh kh«ng qu¸ n(n+1).

- 13 -

1.1.5 Kh¸i niÖm vÒ cÊu tróc d÷ liÖu vµ mèi quan hÖ víi thuËt gi¶i

ë trªn ta ®· nªu râ kh¸i niÖm thuËt gi¶i. §èi tîng cña thuËt gi¶i chÝnh lµ d÷ liÖu hay thuËt gi¶i bao giê còng ph¶i t¸c ®éng lªn d÷ liÖu ®Ó cã kÕt qu¶ cña bµi to¸n. Mét tËp d÷ liÖu cã thÓ gåm nh÷ng phÇn tö rêi r¹c, ch¼ng cã quan hÖ g× víi nhau, nhng còng cã thÓ gåm nh÷ng phÇn tö cã quan hÖ, rµng buéc nhÊt ®Þnh. Khi nh÷ng thµnh phÇn cña tËp d÷ liÖu cã mèi quan hÖ víi nhau, chóng cÇn ®îc tæ chøc theo nh÷ng ph¬ng thøc nhÊt ®Þnh thµnh nh÷ng cÊu tróc d÷ liÖu ®Ó thuËt gi¶i t¸c ®éng lªn ®ã ®îc hiÖu qu¶.

Trong gi¸o tr×nh Tin häc c¬ së, ta ®· lµm quen víi mét sè cÊu tróc d÷ liÖu ®¬n gi¶n nh b¶n ghi, m¶ng...Trong gi¸o tr×nh nµy ta sÏ lÇn lît nghiªn cøu nh÷ng cÊu tróc d÷ liÖu phøc t¹p h¬n c¶ tuyÕn tÝnh vµ phi tuyÕn tÝnh.

Khi lËp ch¬ng tr×nh cho m¸y tÝnh, c«ng viÖc tæ chøc d÷ liÖu vµ thiÕt kÕ nh÷ng thuËt gi¶i t¬ng thÝch, hiÖu qu¶ lµ rÊt quan träng. ChÝnh v× thÕ cÊu tróc d÷ liÖu vµ thuËt gi¶i lµ hai thµnh tè quan träng cña ch¬ng tr×nh m¸y tÝnh vµ ®Òu lµ nh÷ng ®èi tîng nghiªn cøu quan träng cña khoa häc m¸y tÝnh. H¬n n÷a, chóng cã quan hÖ mËt thiÕt víi nhau, ¶nh hëng vµ ®iÒu phèi lÉn nhau ®Ó t¹o ra lêi gi¶i cho bµi to¸n. Trong ph¹m vi cña gi¸o tr×nh nµy, ta nghiªn cøu nh÷ng cÊu tróc d÷ liÖu c¬ b¶n vµ nh÷ng thuËt gi¶i hay thao t¸c th-êng thùc hiÖn trªn c¸c cÊu tróc d÷ liÖu ®ã.

1.2. Kh¸i niÖm vÒ ®é phøc t¹p cña thuËt gi¶iMçi thuËt gi¶i chØ gi¶i mét bµi to¸n nµo ®ã nhng cã thÓ cã nhiÒu thuËt gi¶i kh¸c nhau gi¶i cïng mét bµi to¸n. VÝ dô, ®Ó s¾p xÕp mét

- 14 -

d·y sè bÊt kú thµnh mét d·y ®¬n ®iÖu, cã rÊt nhiÒu thuËt gi¶i kh¸c nhau.

Cïng mét bµi to¸n, cã thÓ cã nhiÒu thuËt gi¶i kh¸c nhau. ViÖc lùa chän mét thuËt gi¶i thÝch hîp nhÊt hay tèt nhÊt cho mét bµi to¸n lu«n lµ mèi quan t©m cña ngêi lËp tr×nh. VËy lµm thÕ nµo ®Ó chän ®îc thuËt gi¶i thÝch hîp nhÊt trong nh÷ng thuËt gi¶i cña mét bµi to¸n? Nãi cô thÓ h¬n, nh÷ng tiªu chÝ nµo lµ quan träng ®Ó ®¸nh gi¸ mét thuËt gi¶i? ThuËt gi¶i cµng trong s¸ng, cã cÊu tróc tèt th× m· hãa cµng nhanh, b¶o tr× ch¬ng tr×nh cµng dÔ dµng vµ do ®ã gi¶m ®îc gi¸ thµnh cña phÇn mÒm. Tuy nhiªn, cã nh÷ng thuËt gi¶i rÊt trong s¸ng, dÔ hiÓu nhng l¹i kh«ng kh¶ thi vÒ mÆt thêi gian thùc hiÖn hay kh«ng gian nhí cÇn thiÕt khi thùc hiÖn nã. VËy lµm thÕ nµo ®Ó ®¸nh gi¸ ®îc thêi gian thùc hiÖn vµ kh«ng gian nhí dµnh cho mét thuËt gi¶i? C¸ch ®¬n gi¶n nhÊt lµ ta cµi ®Æt thuËt gi¶i råi cho m¸y ch¹y chong tr×nh víi mét tËp d÷ liÖu vµo nµo ®ã vµ ®o thêi gian thùc hiÖn ch¬ng tr×nh còng nh tÝnh kh«ng gian nhí cÇn thiÕt cho nã vµ ta cã kÕt qu¶ vÒ thêi gian vµ kh«ng gian cÇn thiÕt cho thuËt gi¶i. Tuy nhiªn, c¸ch tÝnh nµy chØ míi ¸p dông trªn mét tËp d÷ liÖu ®Çu vµo cô thÓ. SÏ lµ kh«ng thÝch hîp nÕu ta dïng kÕt qu¶ nµy ®Ó ¸p dông chung cho c¸c tËp d÷ liÖu ®Çu vµo kh¸c. NÕu bµi to¸n ®¬n gi¶n vµ ®Çu vµo chØ gåm mét sè Ýt phÇn tö th× ta còng ch¼ng cÇn quan t©m nhiÒu ®Õn viÖc lùa chän thuËt gi¶i lµm g×. VÝ dô nh bµi to¸n sau: Ta cÇn chän ra sè lín nhÊt trong 3 sè nguyªn hay thËm chÝ trong vµi chôc sè nguyªn ®· cho. B¹n cã thÓ dïng bÊt cø thuËt gi¶i nµo b¹n nghÜ ra hay b¹n thÝch, miÔn lµ nã ®óng, cã lÏ thêi gian thùc hiÖn chóng còng kh«ng kh¸c nhau bao nhiªu. Mét thuËt to¸n t×m kiÕm tuÇn tù ®Ó t×m mét sè ®iÖn tho¹i trong mét danh s¸ch ®iÖn tho¹i gåm 50 sè th× cã thÓ chÊp nhËn ®-îc nhng nÕu ¸p dông thuËt to¸n ®ã cho mét danh s¸ch gåm hµng

- 15 -

chôc ngµn sè ®iÖn tho¹i trong mét thµnh phè, h¼n lµ kh«ng thÓ chÊp nhËn ®îc.

Nh vËy, vÊn ®Ò ®Æt ra rÊt tù nhiªn lµ khi gi¶i mét bµi to¸n, ta muèn chän mét thuËt gi¶i tèt. Chóng ta cÇn t×m ra mét ph¬ng ph¸p nµo ®ã ®Ó cã thÓ cho phÐp ta ®¸nh gi¸ ®îc thuËt gi¶i nµy tèt h¬n thuËt gi¶i kia víi mét tËp d÷ liÖu vµo bÊt k×. VÝ dô, khi mét danh b¹ ®iÖn tho¹i gåm tõ mét tr¨m sè ®iÖn tho¹i trë lªn, c¸ch tæ chøc thµnh th môc vµ viÖc t×m kiÕm theo th môc ch¾c ch¾n sÏ gióp ta t×m kiÕm tèt h¬n lµ viÖc t×m kiÕm tuÇn tù.

Nhng thÕ nµo lµ thuËt gi¶i tèt. §©y lµ néi dung nghiªn cøu cña lý thuyÕt ®é phøc t¹p tÝnh to¸n. Lý thuyÕt nµy cã thÓ ®îc x©y dùng trªn mét nÒn t¶ng to¸n häc chÆt chÏ tõ mét hÖ tiªn ®Ò. Tuy nhiªn, trong ph¹m vi gi¸o tr×nh nµy, chóng t«i chØ giíi thiÖu mét sè vÊn ®Ò ®¬n gi¶n .

Khi dïng m¸y tÝnh thùc hiÖn mét ch¬ng tr×nh thÓ hiÖn mét thuËt gi¶i nµo ®ã, hÖ ®iÒu hµnh cÇn cung cÊp cho ch¬ng tr×nh ®ã c¸c tµi nguyªn nh giê CPU, bé nhí, . . . §é phøc t¹p cña mét thuËt gi¶i ®îc ®o b»ng sè lîng c¸c tµi nguyªn cÇn dïng ®Ó thùc hiÖn ch¬ng tr×nh ®ã. Khi so s¸nh hai thuËt gi¶i cïng gi¶i mét bµi to¸n, mét thuËt gi¶i nµy ®îc xem lµ tèt h¬n thuËt gi¶i kia nÕu nã dïng Ýt tµi nguyªn h¬n.

Trong c¸c tµi nguyªn cÇn dïng ®Ó ch¹y ch¬ng tr×nh, hiÖn nay ngêi ta quan t©m nhiÒu nhÊt ®Õn thêi gian v× ®ã lµ d¹ng tµi nguyªn kh«ng t¸i t¹o ®îc. Mét thuËt gi¶i ®îc xem lµ tèt nÕu ch¬ng tr×nh t-¬ng øng ch¹y nhanh hay chÝnh x¸c h¬n, ch¹y trong thêi gian chÊp nhËn ®îc. Do ®ã, ®Ó ®¸nh gi¸ ®é phøc t¹p cña mét thuËt gi¶i, ta thêng íc tÝnh sè thao t¸c c¬ b¶n cÇn dïng ®Ó thùc hiÖn thuËt gi¶i. Thao t¸c c¬ b¶n cña mét thuËt gi¶i lµ thao t¸c mµ sè lÇn thùchiÖn nã kh«ng Ýt h¬n sè lÇn thùc hiÖn c¸c thao t¸c kh¸c.

- 16 -

VÝ dô vÒ thao t¸c c¬ b¶n:

Bµi to¸n Thao t¸c c¬ b¶n

T×m phÇn tö x trong mét danh s¸ch

So s¸nh x víi mét phÇn tö cña danh s¸ch

Nh©n hai ma trËn thùc PhÐp nh©n hai sè thùc, phÐp céng hai sè thùc

S¾p xÕp mét danh s¸ch So s¸nh hai phÇn tö cña danh s¸ch

Víi mçi bµi to¸n, ta xÐt kÝch thíc ®Çu vµo hay gäi ®¬n gi¶n lµ kÝch thíc cña bµi to¸n. KÝch thíc ®Çu vµo mét bµi to¸n ®îc ®o b»ng sè l-îng d÷ liÖu vµo cÇn xö lý. VÝ dô nÕu d÷ liÖu vµo lµ mét d·y sè cã N sè h¹ng th× kÝch thíc bµi to¸n dîc xem b»ng N, nÕu d÷ liÖu vµo lµ mét ®å thÞ cã N ®Ønh, kÝch thíc bµi to¸n b»ng N, nÕu d÷ liÖu vµo lµ mét x©u ký tù ®é dµi L th× kÝch thíc bµi to¸n b»ng L, nÕu d÷ liÖu vµo lµ mét b¶ng cã M dßng vµ N cét th× kÝch thíc bµi to¸n b»ng MxN. . .

Khi ®ã, sè c¸c thao t¸c c¬ b¶n mµ mét thuËt gi¶i sÏ ®îc biÓu thÞ nh mét hµm f(K) cña biÕn sè K lµ kÝch thíc cña bµi to¸n. Khi ®¸nh gi¸ hµm f(K) ngêi ta thêng dïng ký hiÖu O hay chÝnh x¸c h¬n lµ kh¸i niÖm cña gi¶i tÝch cã nghÜa lµ cïng bËc. VÝ dô, gi¶i thuËt t×m Min-Max cña mét d·y sè trong Môc 8.1 cã ®é phøc t¹p 2N, ta nãi ®é phøc t¹p ®ã cì (N) cã nghÜa lµ cïng bËc víi N khi N tiÕn ®Õn v« cïng; t¬ng tù, gi¶i thuËt s¾p xÕp d·y sè cã ®é phøc t¹p cë (N2).

- 17 -

ViÖc dïng ký hiÖu ®Ó thÓ hiÖn ®é phøc t¹p cña gi¶i thuËt cho ta mét ®¸nh gi¸ tæng thÓ kh«ng bÞ sa vµo nh÷ng tÝnh to¸n tØ mØ h¬n nhng kh«ng thËt cÇn thiÕt. VÝ dô, cïng lµ hai phÐp to¸n céng vµ nh©n hai sè, râ rµng phÐp céng thùc hiÖn nhanh h¬n nhiÒu so víi phÐp nh©n nhng sù kh¸c biÖt ®ã chØ thÓ hiÖn b»ng viÖc thêi gian tÝnh to¸n sai kh¸c mét h»ng sè nh©n. Do ®ã, nÕu dïng ký hiÖu , ta cã thÓ bá qua sù kh¸c biÖt ®ã.

Khi nãi vÒ ®é phøc t¹p vÒ thêi gian, cã mét sè bËc ®îc sö dông th-êng xuyªn vµ ngêi ta ®· ®Æt tªn cho chóng. Mét c¸ch v¾n t¾t, nÕu mét thuËt to¸n cã ®é phøc t¹p lµ t vµ t < cn, víi n > n0 vµ c lµ mét h»ng sè d¬ng, cßn n lµ kÝch cì ®Çu vµo th× ngêi ta gäi thuËt to¸n ®ã cã ®é phøc t¹p tuyÕn tÝnh. NÕu t < cn2 th× t ®îc gäi lµ cã ®é phøc t¹p b×nh ph¬ng. T¬ng tù t ®îc gäi lµ cã ®é phøc t¹p lËp ph-¬ng, ®a thøc hay mò nÕu nã cã bËc lÇn lît cña c¸c hµm n3, nk hay an

, víi k vµ a lµ nh÷ng h»ng sè nµo ®ã.§Ó dÔ h×nh dung vÒ sù t¨ng cña mét sè hµm víi n lµ kÝch thíc cña bµi to¸n, díi ®©y ta ph¸c häa mét sè ®å thÞ cña ®é phøc t¹p loga, ®é phøc t¹p tuyÕn tÝnh, ®é phøc t¹p b×nh ph¬ng, ®é phøc t¹p lËp ph¬ng vµ ®é phøc t¹p mò.

- 18 -

O(log(n)

O(n)

O(n2)O(n3)

O(an)

H×nh 2.1: Ph¸c ho¹ c¸c ®êng biÓu diÔn ®é phøc t¹p cña mét sè thuËt gi¶i-----------------------------------------

1.3. Ph©n tÝch thuËt to¸n1.3.1. Kh¸i niÖm vÒ ph©n tÝch thuËt to¸n

Ph©n tÝch mét gi¶i thuËt cã nghÜa lµ ®¸nh gi¸ ®é phøc t¹p cña gi¶i thuËt ®ã.

Thùc ra kh«ng cã mét cÈm nang ®Ó ph©n tÝch thuËt to¸n mµ chñ yÕu lµ ta sö dông kiÕn thøc to¸n häc, sù trùc quan, suy luËn, vµ mét sè kÜ thuËt c¬ b¶n ®Ó tÝnh ®é phøc t¹p cña mét thuËt gi¶i.

Cã mét sè cÊu tróc phæ biÕn trong c¸c thuËt gi¶i: cÊu tróc tuÇn tù, cÊu tróc lÆp vµ cÊu tróc ®Ö quy.

Víi cÊu tróc tuÇn tù: NÕu ta cã hai ®o¹n tr×nh thùc hiÖn tuÇn tù lµ P1 vµ P2 , ®é phøc t¹p cña chóng lÇn lît lµ t1 = O(f(n)), t2 = O(g(n)) th× ®é phøc t¹p cña c¶ hai ®o¹n P1 vµ P2 chÝnh lµ O(max(f(n), g(n)).

VÝ dô: Khi ta thùc hiÖn tuÇn tù hai ®o¹n tr×nh P1 vµ P2, P1 cã ®é phøc t¹p lµ O(n2) vµ P2 cã ®é phøc t¹p lµ O(n3) th× hîp hai ®o¹n P1 vµ P2 sÏ cã ®é phøc t¹p lµ O(n3).T¬ng tù, nÕu P1 cã ®é phøc t¹p lµ O(2n) cßn P2 cã ®é phøc t¹p lµ O(n5) th× ®é phøc t¹p cña ®o¹n tr×nh hîp lµ O(2n).§Ó ý r»ng, víi n ®ñ lín ta lu«n cã: n! > an > nk > logn.

- 19 -

CÊu tróc lÆp thêng cã mét trong c¸c d¹ng sau

For i:=a to b do <nhãm lÖnh>; (1)While <§iÒu kiÖn l« gic> Do <Nhãm lÖnh>; (2)

Repeat <Nhãm lÖnh> Until <§iÒu kiÖn l« gic>; (3)

Sè thao t¸c cÇn thùc hiÖn trong mét cÊu tróc lÆp cã thÓ ®Ô dµng íc tÝnh ®îc sau khi ®· tÝnh ®îc c¸c thao t¸c cÇn thùc hiÖn trong <Nhãm lÖnh>. §èi víi cÊu tróc lÆp lo¹i (1), nÕu sè thao t¸c trong <Nhãm lÖnh> lµ S th× sè thao t¸c cÇn thùc hiÖn tæng céng kh«ng lín h¬n S(b-a).

VÝ dô: trong phÐp nh©n hai ma trËn vu«ng A vµ B cÊp n ta cã:Procedure Nhanmatran(A,B)

Var C;Begin

for i 1 to n dofor j 1 to n do

BeginC[i,j] 0for k 1 to n do

C[i,j] C[i,j] + a[i,k] * b[k,j]End;

Return C;End

Ta thÊy ngay lµ vßng lÆp trong cïng (k lµ biÕn ch¹y) cã ®é phøc t¹p O(n), vßng lÆp trong tiÕp theo (j lµ biÕn ch¹y) còng cã ®é phøc t¹p O(n) vµ vßng lÆp ngoµi cïng (víi i lµ biÕn ch¹y) víi ®é phøc t¹p O(n). Do ®ã toµn bé ch¬ng tr×nh cña ta cã ®é phøc t¹p O(n3).

§èi víi cÊu tróc lÆp lo¹i (2) vµ (3), c¨n cø vµo ®iÒu kiÖn l« gic, ta cã thÓ íc lîng ®îc sè lÇn lÆp tèi ®a do ®ã cã thÓ tÝnh ®îc sè tèi ®a c¸c thao t¸c cÇn thùc hiÖn.

- 20 -

§èi víi c¸c cÊu tróc ®Ö quy, viÖc íc lîng sè thao t¸c khã kh¨n h¬n v× nãi ta ph¶i tiÕn hµnh tÝnh sè thao t¸c theo mét c«ng thøc truy håi.

Sau ®©y ta sÏ xÐt mét sè vÝ dô n÷a.

VÝ dô 1. XÐt bµi to¸n

Input. M¶ng mét chiÒu A[1..N] gåm c¸c sè nguyªn;

Output. Gi¸ trÞ nhá nhÊt Min vµ gi¸ trÞ lín nhÊt Max cña c¸c phÇn tö cña m¶ng;

XÐt thuËt gi¶i cã tªn FindMin-Max(1,N) sau:

Bíc 1. NÕu N=1 th× nÕu Min = Max = A[1] vµ kÕt thóc nÕu kh«ng th× chuyÓn sang Bíc 2.

Bíc 2. NÕu N=2 th× (A[1]£A[2] th× Min = A[1] vµ Max = A[2] nÕu kh«ng th× Min = A[2] vµ Max = A[1] vµ kÕt thóc nÕu kh«ng th× chuyÓn sang Bíc 3.

Bíc 3. Gäi FindMin1-Max1(1,N Div 2) vµ FindMin2-Max2(N div 2 +1,N); nÕu Min1£Min2 th× Min = Min1 nÕu kh«ng th× Min=Min2 vµ nÕu Max1£Max2 th× Max = Max1 nÕu kh«ng th× Max=Max2; kÕt thóc.

NÕu dé phøc t¹p tÝnh theo sè lÇn so s¸nh C(N) c¸c sè th× ta cã

C(2) = 1;

C(2K) = 2C(K) +2 víi K>1;

C(2K+1) = C(K) + C(K+1) + 2;

Tõ ®ã ta cã thÓ tÝnh ®îc C(N) = 3N/2 - 2.

VÝ dô 2. Bµi to¸n Th¸p Hµ Néi

Ta sÏ diÔn t¶ bµi to¸n nµy b»ng ng«n ng÷ th«ng thêng. Cã N ®Üa trßn ®êng kÝnh kh¸c nhau víi lç thñng ë t©m vµ ba cäc 1, 2, 3. Ban ®Çu N ®Üa ®Æt trªn cäc 1, ®Üa lín h¬n n»m díi ®Üa nhá h¬n. Mét di chuyÓn ®Üa thùc hiÖn b»ng c¸ch chuyÓn ®Üa trªn cïng ë cäc A

- 21 -

(nÕu cã) ®Æt lªn trªn cïng mét cäc B kh¸c víi ®iÒu kiÖn ®Üa ®ã nhá h¬n ®Üa (nÕu cã) ®ang n»m trªn cïng ®Üa ë cäc B. CÇn tiÕn hµnh mét d·y c¸c di chuyÓn ®Üa sao cho cuèi cïng, N ®Üa ®îc chuyÓn sang cäc 2.

Bµi to¸n nµy g¾n víi mét giai tho¹i vÒ sù thö th¸ch cña Thîng ®Õ ®èi víi lßng kiªn tr× cña con ngêi. NÕu sè ®Üa b»ng 64, mçi di chuyÓn ®Üa thùc hiÖn trong 1 gi©y vµ mét ngêi thùc hiÖn mét d·y c¸c di chuyÓn ®óng ®¾n th× ngêi ®ã ph¶i mÊt 500 tû n¨m míi di chuyÓn xong.

ViÖc cÇn chuyÓn N ®Üa tõ cäc 1 sang cäc 2 mét c¸ch hîp lÖ vµ tèt nhÊt cã thÓ xem lµ trêng hîp riªng cña viÖc chuyÓn M ®Üa nhá nhÊt tõ cäc i sang cäc j ,1£i£3, 1£j£3, ij, mét c¸ch hîp lÖ vµ tèt nhÊt cã thÓ. NÕu ta thÓ hiÖn viÖc ®ã b»ng mét thñ tôc Procedure Hanoi(m,i,j); ViÖc ta cÇn lµm chÝnh lµ Hanoi(N,1,2);

§Ó lµm viÖc ®ã, do quy ®Þnh cña mét di chuyÓn ®Üa, ta cÇn chuyÓn m-1 ®Üa nhá nhÊt tõ cäc i sang cäc thø ba, ®ã lµ cäc k = 6-i-j, chuyÓn ®Üa thø M tõ cäc i sang cäc j vµ sau ®ã chuyÓn M-1 ®Üa tõ cäc k sang cäc j. NÕu viÕt b»ng Pascal, ta cã

Procedure Hanoi(M,i,j: Byte);BeginIf m=0 then Exit;Hanoi(M-1,i,6-i-j);Writeln(i,’ – ‘,j);Hanoi(M-1,6-i-j,j);End;

NÕu ký hiÖu T(M) lµ sè di chuyÓn cÇn thùc hiÖn (xem nh mét thao t¸c c¬ b¶n), ta cã

T(M) = 2.T(M-1) - 1 (*)

- 22 -

Nh vËy nÕu xem N lµ kÝch thíc cña bµi to¸n th× ®é phøc t¹p tÝnh to¸n cña thuËt gi¶i trªn lµ T(N). Tõ hÖ thøc (*), ta cã thÓ suy ra T(N) = 2N - 1.

HÖ thøc (*) lµ mét hÖ thøc truy håi.

1.3.2. Mét sè quan ®iÓm ph©n tÝch thuËt to¸n

C¸ch ph©n tÝch thuËt to¸n trong môc 8.2.2 cßn ®îc gäi lµ ph©n tÝch theo t×nh huèng xÊu nhÊt (Worst-Case Analysis). Víi mçi thuËt gi¶i ®èi víi bµi to¸n kÝch thíc K, ta lu«n ®¸nh gi¸ sè tèi ®a c¸c thao t¸c c¬ b¶n cÇn tiÕn hµnh lµ bao nhiªu.

Cã nhiÒu c¸ch kh¸c ®Ó ph©n tÝch thuËt gi¶i nh ph©n tÝch trung b×nh (Average Analysis), ph©n tÝch tiÖm cËn (Asymptotic Analysis).

Ta sÏ giíi thiÖu c¸ch ph©n tÝch trung b×nh. C©u chuyÖn b¾t ®Çu tõ viÖc xem xÐt thuËt gi¶i ®¬n h×nh ®èi víi bµi to¸n Quy ho¹ch tuyÕn tÝnh. Bµi to¸n nµy cã thÓ ph¸t biÓu trong ng«n ng÷ ®¹i sè tuyÕn tÝnh nh sau:

I. Ma trËn A gåm M dßng, N cét; VÐc t¬ cét B M chiÒu; vÐc t¬ dßng C N chiÒu;

O. CÇn t×m vÐc t¬ cét N chiÒu X sao cho AX£B vµ CX ®¹t gi¸ trÞ nhá nhÊt.

Theo c¸ch ®¸nh gi¸ xÊu nhÊt, ®é phøc t¹p cña thuËt to¸n ®¬n h×nh cì hµm mò. Tuy nhiªn, tr¶i qua mÊy chôc n¨m dïng thuËt gi¶i nµy ®Ó gi¶i rÊt nhiÒu bµi to¸n ph¸t sinh trong nhiÒu lÜnh vùc kh¸c nhau, c¸c ch¬ng tr×nh vÉn ch¹y trong thêi gian chÊp nhËn ®îc. C«ng tr×nh nghiªn cøu cña nhµ to¸n häc S.. Smale cho kÕt qu¶ ®é phøc t¹p trung b×nh cña thuËt to¸n ®¬n h×nh lµ ®a thøc (thËm chÝ bËc thÊp) ®èi víi kÝch thíc bµi to¸n.

- 23 -

Sau kÕt qu¶ nµy, ngêi ta còng chøng tá ®îc cã nhiÒu thu©t gi¶i kh«ng tèt theo c¸ch ®¸nh gi¸ xÊu nhÊt nhng tÝnh trung b×nh vÉn tèt.

VÒ ®¹i thÓ, ®Ó ®¸nh gi¸ ®é phøc t¹p trung b×nh mét thuËt gi¶i, ta gi¶ sö mäi d÷ liÖu ®Òu cã x¸c xuÊt xuÊt hiÖn nh nhau, trªn c¬ së ®ã, ®é phøc t¹p trung b×nh ®îc tÝnh nh trung b×nh x¸c suÊt cña c¸c sè bíc tÝnh to¸n ®èi víi c¸c t×nh huèng cña d÷ liÖu. Chi tiÕt vÒ vÊn ®Ò nµy còng sÏ ®îc lµm râ trong m«n lý thuyÕt ®é phøc t¹p tÝnh to¸n.

Bµi tËp

H·y ph¸t biÓu theo quan niÖm cña Tin häc vÒ bµi to¸n vµ tr×nh bµy thuËt gi¶i cho mçi mét trong c¸c bµi to¸n sau. §¸nh gi¸ ®é phøc t¹p cña tõng thuËt gi¶i.

Bµi 1. Gi¶i vµ biÖn luËn ph¬ng tr×nh bËc nhÊt tæng qu¸t: aX + b = 0.

Bµi 2. Gi¶i vµ biÖn luËn ph¬ng tr×nh bËc hai tæng qu¸t: aX2 + bX + c = 0.

Bµi 3. Gi¶i vµ biÖn luËn hÖ ph¬ng tr×nh bËc nhÊt hai Èn sè tæng qu¸t.

Bµi 4. Gi¶i vµ biÖn luËn ph¬ng tr×nh trïng ph¬ng tæng qu¸t: aX4 + bX2 + c = 0.

Bµi 5. Gi¶i vµ biÖn luËn hÖ hai ph¬ng tr×nh bËc hai a1X2 + b1X + c1

= 0 vµ a2X2 + b2X + c2 = 0.

Bµi 6. Cho mét h×nh ch÷ nhËt ABCD víi hai c¹nh nguyªn d¬ng AB = M vµ BC = N. H×nh ch÷ nhËt ®îc chia thµnh c¸c « vu«ng ®¬n vÞ. H·y t×m sè « vu«ng cã ®iÓm chung víi ®êng chÐo AC.

- 24 -

Bµi 7. Cho mét h×nh ch÷ nhËt ABCD víi hai c¹nh nguyªn d¬ng AB=M vµ BC= N. H×nh ch÷ nhËt ®îc chia thµnh c¸c « vu«ng ®¬n vÞ. H·y t×m sè « vu«ng cã ®iÓm trong chung víi ®êng chÐo AC.

Bµi 8. XÐt d·y v« h¹n c¸c ch÷ sè A nhËn ®îc b»ng c¸ch viÕt liªn tiÕp c¸c sè nguyªn d¬ng liªn tiÕp t¨ng dÇn b¾t ®Çu tõ 1, 2, 3, 4, . . . .

1234567891011121314151617181920212223.....

Cho sè nguyªn d¬ng N. H·y t×m ch÷ sè thø N cña d·y A.

VÝ dô víi N =13, ch÷ sè thø N cña d·y trªn lµ 1.

Bµi 9. Cho sè nguyªn d¬ng N. LËp d·y B c¸c ch÷ sè nhËn ®îc b»ng c¸ch viÕt c¸c sè nguyªn d¬ng liªn tiÕp t¨ng dÇn b¾t ®Çu tõ 1, 2, 3, 4, . . . cho tíi N. H·y t×m ch÷ sè thø N tÝnh tõ ch÷ sè cuèi cïng cña d·y B.

Bµi 10. XÐt tËp A c¸c sè nguyªn d¬ng ®îc x¸c ®Þnh nh sau:

1. 1ÎA.

2. NÕu KÎA th× 2K+1 vµ 3K+1 ÎA.

3. A gåm vµ chØ gåm c¸c sè tho¶ m·n mét trong hai ®iÒu kiªn 1 vµ 2.

Cho mét sè nguyªn d¬ng N kh«ng lín h¬n 60000. H·y t×m sè c¸c sè thuéc A kh«ng lín h¬n N.

Bµi 11. Hai ngêi A vµ B ch¬i trß ch¬i sau: A bÝ mËt chän mét sè nguyªn d¬ng N vµ nãi râ N kh«ng lín mét sè M nguyªn d¬ng vµ B ®o¸n xem A chän sè nµo. B ®îc quyÒn hái A mét sè c©u hái vµ A sÏ chØ tr¶ lêi ®óng hay sai vµ mäi c©u tr¶ lêi cña A lµ chÝnh x¸c. H·y chän cho B mét sè Ýt nhÊt c©u hái ®Ó sau khi hái xong, B ®o¸n ®óng ®îc sè N.

Bµi 12. §Ó tæng kÕt ®iÓm cuèi häc kú vµ tiÕn hµnh ph©n lo¹i kÕt qu¶ häc tËp cña c¸c häc sinh trong mét líp häc, gi¸o viªn chñ nhiÖm

- 25 -

cã sæ ®iÓm cña líp. CÇn tÝnh ®iÓm trung b×nh tõng m«n häc vµ tÝnh ®iÓm trung b×nh toµn häc kú cho tõng häc sinh.

Víi mçi m«n häc, c¸c ®iÓm kiÓm tra miÖng, kiÓm tra 15 phót tÝnh hÖ sè 1, c¸c ®iÓm kiÓm tra 1 tiÕt tÝnh hÖ sè 2, ®iÓm kiÓm tra häc kú tÝnh hÖ sè 3. Khi tÝnh ®iÓm trung b×nh toµn häc kú, c¸c ®iÓm trung b×nh m«n cña V¨n, To¸n tÝnh hÖ sè 3, cña Lý, Ho¸, Ngo¹i ng÷ - hÖ sè 2, c¸c m«n cßn l¹i - hÖ sè 1.

Cã n¨m møc ph©n lo¹i häc tËp: kÐm, trung b×nh, kh¸, giái vµ xuÊt s¾c t¬ng øng víi ®iÓm trung b×nh toµn häc kú thuéc c¸c miÒn: <5, [5,7), [7,8), [8,9) vµ [9,10]. H·y viÕt ra cho gi¸o viªn chñ nhiÖm c¸c bíc tiÕn hµnh c«ng viÖc nµy.

Bµi 13. Trªn mÆt ph¼ng to¹ ®é cho to¹ ®é cña bèn ®iÓm A, B, C, D trong ®ã kh«ng cã ba ®iÓm nµo th¼ng hµng. H·y cho biÕt hai ®o¹n AB vµ CD cã ®iÓm chung hay kh«ng.

Bµi 14. Trªn mÆt ph¼ng to¹ ®é cho to¹ ®é cña bèn ®iÓm A, B, C, D trong ®ã kh«ng cã ba ®iÓm nµo th¼ng hµng. H·y cho biÕt hai ®o¹n AB vµ CD cã ®iÓm trong chung hay kh«ng.

Bµi 15. Cho h×nh ch÷ nhËt ABCD vµ mét ®iÓm M trªn mÆt ph¼ng to¹ ®é. BiÕt to¹ ®é cña A, B, C, D, M. H·y cho biÕt kh¶ n¨ng nµo trong hai kh¶ n¨ng sau x¶y ra:

1. M thuéc h×nh ch÷ nhËt ABCD.

2. M kh«ng thuéc h×nh ch÷ nhËt ABCD.

Bµi 16. Cho h×nh ch÷ nhËt ABCD vµ hai ®iÓm kh¸c nhau M, N trªn mÆt ph¼ng to¹ ®é. BiÕt to¹ ®é cña A, B, C, D, M, N. H·y cho biÕt kh¶ n¨ng nµo trong ba kh¶ n¨ng sau x¶y ra:

1. §o¹n MN n»m trong (cã thÓ cã ®iÓm trªn biªn) h×nh ch÷ nhËt ABCD.

2. §o¹n MN n»m ngoµi h×nh ch÷ nhËt ABCD.

- 26 -

3. §o¹n MN cã ®iÓm n»m ngoµi h×nh ch÷ nhËt ABCD vµ cã ®iÓm n»m trong h×nh ch÷ nhËt ABCD.

Bµi 17. Trªn mÆt ph¼ng to¹ ®é cho ®a gi¸c P1 . . .PN. §a gi¸c ®îc gäi lµ tù c¾t nÕu cã hai c¹nh PIPI+1 vµ PJPJ+1 víi I<J-1 (quy íc ®Ønh PN+1 lµ ®Ønh P1) cã ®iÓm chung. §a gi¸c ®îc gäi lµ låi nÕu víi bÊt kú c¹nh nµo cña ®a gi¸c, toµn bé ®a gi¸c n»m vÒ mét phÝa cña ®êng th¼ng ®i qua c¹nh ®ã. BiÕt to¹ ®é c¸c ®Ønh cña ®a gi¸c. H·y cho biÕt ®a gi¸c cã tù c¾t kh«ng? NÕu ®a gi¸c kh«ng tù c¾t, h·y cho biÕt ®a gi¸c cã låi kh«ng?. NÕu ®a gi¸c kh«ng låi, h·y chän mét sè Ýt nhÊt c¸c ®Ønh sao cho mäi ®Ønh P1, . .,PN ®Òu thuéc ®a gi¸c låi cã c¸c ®Ønh lµ c¸c ®Ønh ®îc chän (®a gi¸c nµy ®îc gäi lµ bao låi cña tËp ®iÓm P1, . .,PN).

- 27 -

ch¬ng 2: Tæng quan vÒ kiÓu d÷ liÖu trõu tîng

Ch¬ng nµy giíi thiÖu vÒ kiÓu d÷ liÖu trõu tîng, ®ã lµ mét kh¸i niÖm rÊt quan träng trong lËp tr×nh. Kh¸i niÖm nµy cho phÐp ta t¹o ra nh÷ng ®¬n vÞ ch¬ng tr×nh dÔ b¶o tr×, an toµn vµ cã thÓ ®îc dïng bëi nhiÒu ch¬ng tr×nh kh¸c nhau. §Ó hiÓu tèt tõ ch¬ng 3 ®Õn ch-¬ng 6, b¹n ®äc cÇn dµnh thêi gian ®äc kÜ ch¬ng nµy.

2.1. Kh¸i niÖm vÒ kiÓu d÷ liÖu trõu tîng

Khi lËp tr×nh vµ gi¶i quyÕt c¸c bµi to¸n trªn m¸y tÝnh, mét trong nh÷ng ý tëng cã ý nghÜa nhÊt, cã søc m¹nh nhÊt lµ kh¸i niÖm trõu t-îng ho¸. §ã chÝnh lµ c¸ch nh×n bµi to¸n mét c¸ch kh¸i qu¸t, t¹m thêi bá qua tÊt c¶ nh÷ng chi tiÕt cô thÓ. Còng cã thÓ m« t¶ sù trõu tîng ho¸ sù vËt lµ viÖc nh×n nh÷ng nÐt bao qu¸t bªn ngoµi mµ cha ®Ó ý ®Õn nh÷ng chi tiÕt bªn trong. Trong c«ng viÖc nãi chung, nÕu kh«ng cã kh¸i niÖm trõu tîng ho¸ th× khã cã thÓ hiÓu vµ qu¶n lý ®îc nh÷ng hÖ thèng lín vµ phøc t¹p. Ch¼ng h¹n, ta h·y h×nh dung tæng gi¸m ®èc cña mét nhµ m¸y kh«ng qu¶n lý nhµ m¸y ®ã th«ng qua c¸c ph©n xëng mµ l¹i trùc tiÕp qu¶n lý tõng c«ng nh©n, tõng d©y chuyÒn s¶n xuÊt, tõng ®Çu m¸y th× sù viÖc sÏ khã biÕt chõng nµo.

Khi häc phÇn ®¹i c¬ng vÒ lËp tr×nh, häc sinh ®· ®îc lµm quen víi nh÷ng vÝ dô ®iÓn h×nh vÒ trõu tîng ho¸: Trõu tîng ho¸ thao t¸c, ®ã chÝnh lµ viÖc x©y dùng vµ sö dông c¸c ch¬ng tr×nh con. Mçi ch¬ng tr×nh con thùc hiÖn mét t¸c vô x¸c ®Þnh nµo ®ã vµ trong ch¬ng tr×nh chÝnh, cã thÓ xem nã nh mét thao t¸c mÆc dï trong thùc tÕ nã cã thÓ ®îc cµi ®Æt b»ng mét d·y gåm rÊt nhiÒu thao t¸c. Ch¼ng h¹n, dïng c¬ chÕ thñ tôc vµ hµm trong ng«n ng÷ Pascal, häc sinh ®· ®îc häc c¸ch x©y dùng nh÷ng ®¬n vÞ ch¬ng tr×nh vµ ®a

- 28 -

nã vµo th viÖn ®Ó sö dông. VÝ dô, ta cã ch¬ng tr×nh con s¾p xÕp nhanh Quicksort nh sau: Procedure Quicksort (A,n), s¾p sÕp mét m¶ng A gåm n sè thùc theo chiÒu t¨ng dÇn. Ta cã thÓ cµi ®Æt vµ ®a nã vµo th viÖn vµ sau ®ã nã ®îc xem nh lµ mét bé phËn cña ng«n ng÷. ë giai ®o¹n thiÕt kÕ thuËt to¸n, ta chØ quan t©m ®Õn viÖc mµ thñ tôc sÏ thùc hiÖn mµ kh«ng cÇn quan t©m nã thùc hiÖn viÖc ®ã nh thÕ nµo. Ch¼ng h¹n, nÕu ta viÕt ®o¹n ch¬ng tr×nh sau ®©y

For i:=1 to 300 doRead (DiemThi[i]);

Quicksort (DiemThi, 300);Ngêi ®äc sÏ thÊy hoµn toµn dÔ hiÓu cho dï hä cha cÇn biÕt chi tiÕt bªn trong thñ tôc Quicksort, tøc lµ cha cÇn biÕt nã s¾p xÕp c¸c phÇn tö cña m¶ng nh thÕ nµo. ViÖc giÊu ®îc nh÷ng chi tiÕt cµi ®Æt bªn trong ch¬ng tr×nh con lµm cho c¬ chÕ sö dông ch¬ng tr×nh con trë thµnh mét trong nh÷ng phÇn quan träng nhÊt cña bÊt k× mét ng«n ng÷ lËp tr×nh bËc cao nµo. C¸ch trõu tîng ho¸ ta võa nªu chÝnh lµ trõu tîng ho¸ thao t¸c.

Chän nh÷ng thao t¸c thÝch hîp thùc hiÖn trªn c¸c cÊu tróc d÷ liÖu hîp lý lµ mét c«ng viÖc hÕt søc quan träng cña lËp tr×nh. Còng nh viÖc cÇn thiÕt ph¶i trõu tîng ho¸ thao t¸c, b©y giê ta më réng ý tëng trõu tîng ho¸ cho cÊu tróc d÷ liÖu. Chóng ta sÏ x©y dùng kh¸i niÖm kiÓu d÷ liÖu trõu tîng. §Ó gi¶i thÝch kh¸i niÖm nµy, tríc hÕt ta xÐt s¬ ®å sau vÒ c¸c møc cÊu tróc d÷ liÖu:

Møc C.

- 29 -

KiÓu d÷ liÖu ®îc x©y dùng bëi ngêi lËp tr×nh ®Ò gi¶i nh÷ng bµi to¸n nµo ®ã.

Møc B.

Møc A.

ë møc thÊp nhÊt, møc A trong biÓu ®å chÝnh lµ nh÷ng kiÓu d÷ liÖu ®îc trùc tiÕp hç trî bëi phÇn cøng, vÝ dô kiÓu sè nguyªn, kiÓu sè thùc vµ kiÓu kÝ tù. Nh÷ng kiÓu d÷ liÖu nµy cßn ®îc gäi lµ kiÓu d÷ liÖu nguyªn thuû hay kiÓu ®¬n. Trong ®a sè c¸c ng«n ng÷ lËp tr×nh bËc cao, c¸c kiÓu d÷ liÖu ®· rÊt phong phó: KiÓu miÒn con, kiÓu v« híng, kiÓu boolean, kiÓu m¶ng, kiÓu b¶n ghi, kiÓu tËp hîp, kiÓu con trá... Nh÷ng kiÓu nµy kh«ng thùc sù tån t¹i theo nghÜa ®îc trùc tiÕp hç trî bëi phÇn cøng. NhiÒu khi chóng cßn ®îc gäi lµ kiÓu d÷ liÖu ¶o. Mét ch¬ng tr×nh, gäi lµ ch¬ng tr×nh dÞch ®· t¹o ra c¸c kiÓu d÷ liÖu nµy, chóng còng cßn ®îc gäi lµ c¸c kiÓu d÷ liÖu cña ng«n ng÷ bËc cao. Ch¼ng h¹n, ch¬ng tr×nh dÞch cã thÓ x©y dùng kiÓu d÷ liÖu Boolean b»ng viÖc ¸nh x¹ c¸c gi¸ trÞ logic True vµ False lªn tËp hai gi¸ trÞ nguyªn –1 vµ +1. ChÝnh ch¬ng tr×nh dÞch còng chuyÓn c¸c thao t¸c nh Not, And, Or thµnh c¸c thao t¸c trªn tËp hai sè nguyªn –1 vµ +1. §èi víi ngêi lËp tr×nh nh÷ng kiÓu d÷ liÖu ¶o nµy tån t¹i gièng nh nh÷ng kiÓu d÷ liÖu nguyªn thñy (møc A) vµ ng-êi lËp tr×nh cã thÓ trùc tiÕp sö dông nã trong c¸c ch¬ng tr×nh. ViÖc

- 30 -

KiÓu d÷ liÖu ®îc trùc tiÕp hç trî bëi phÇn cøng.

KiÓu d÷ liÖu ®îc cung cÊp bëi c¸c ng«n ng÷ lËp tr×nh bËc cao.

chuyÓn nh÷ng cÊu tróc d÷ liÖu ®ã thµnh c¸c chØ thÞ theo ng«n ng÷ m¸y hoÆc c¸c cÊu tróc d÷ liÖu nguyªn thñy lµ cña ch¬ng tr×nh dÞch chø kh«ng ph¶i cña ngêi lËp tr×nh. Lµ mét ngêi lËp tr×nh, ngêi thiÕt kÕ ch¬ng tr×nh, chóng ta kh«ng muèn m×nh chØ bÞ giíi h¹n bëi nh÷ng g× mµ phÇn cøng trùc tiÕp cho phÐp, chóng ta cã thÓ sö dông tÊt c¶ nh÷ng cÊu tróc d÷ liÖu ¶o mµ ngêi x©y dùng ng«n ng÷ ®· t¹o ra.

H¬n thÕ n÷a, ta còng kh«ng nªn chØ giíi h¹n m×nh bëi nh÷ng kiÓu d÷ liÖu mµ ng«n ng÷ cung cÊp. Ta cã thÓ t¹o ra nh÷ng kiÓu d÷ liÖu kh«ng cã s½n trong ng«n ng÷. Cô thÓ lµ ta cã thÓ s¸ng t¹o, x©y dùng nh÷ng kiÓu d÷ liÖu míi, phôc vô cho bµi to¸n cña ta. Ngay tõ ®Çu, ta cha cÇn ph¶i lo l¾ng ®Õn viÖc lµm thÕ nµo ®Ó dïng nh÷ng cÊu tróc d÷ liÖu s½n cã cña ng«n ng÷ ®Ó cµi ®Æt c¸c kiÓu d÷ liÖu míi ®ã. §ã chÝnh lµ mét trong nh÷ng c«ng viÖc quan träng nhÊt mµ ta cÇn thùc hiÖn - C«ng viÖc t¹o ra nh÷ng kiÓu d÷ liÖu míi - KiÓu d÷ liÖu ®îc s¸ng t¹o bëi ngêi lËp tr×nh hay ta cßn gäi lµ kiÓu d÷ liÖu trõu tîng. (Trong tiÕng Anh, kiÓu d÷ liÖu trõu tîng ®îc gäi lµ Abstract Data Type vµ viÕt t¾t lµ ADT). C¬ chÕ trªn cho phÐp ngêi lËp tr×nh kh«ng bÞ giíi h¹n vµo chØ nh÷ng cÊu tróc d÷ liÖu ng«n ng÷ lËp tr×nh cung cÊp mµ cho phÐp hä t¹o ra nh÷ng kiÓu d÷ liÖu míi, phï hîp víi bµi to¸n mµ hä cÇn gi¶i.

ViÖc trõu tîng ho¸ d÷ liÖu t¹o ra mét sù t¸ch biÖt (vÒ kh¸i niÖm) gi÷a c¸i nh×n kh¸i qu¸t mét kiÓu d÷ liÖu cña ngêi lËp tr×nh vµ sù cµi ®Æt cô thÓ kiÓu d÷ liÖu ®ã. VËy kiÓu d÷ liÖu trõu tîng lµ g×? Cã nhiÒu ®Þnh nghÜa cho kh¸i niÖm nµy nhng chóng ®Òu cã nh÷ng nÐt c¬ b¶n thèng nhÊt: Mét kiÓu d÷ liÖu trõu tîng lµ mét tËp hîp c¸c ®èi tîng vµ ®îc x¸c ®Þnh hoµn toµn bëi c¸c phÐp to¸n cã thÓ biÓu diÔn trªn c¸c ®èi tîng ®ã. Ngêi sö dông ®îc phÐp t×m hiÓu c¸c ®èi tîng vµ thùc hiÖn c¸c thao t¸c trªn c¸c ®èi tîng cña

- 31 -

kiÓu d÷ liÖu th«ng qua c¸c phÐp to¸n ®ã mµ kh«ng cÇn quan t©m ®Õn viÖc ®èi tîng ®îc cµi nh thÕ nµo trong ng«n ng÷ lËp tr×nh.

Cã hai lo¹i kiÓu d÷ liÖu trõu tîng: lo¹i nguyªn tö (cßn gäi lµ ®¬n) vµ lo¹i cã cÊu tróc (cßn gäi lµ phøc hîp). C¬ së cña viÖc ph©n lo¹i ®ã lµ dùa trªn miÒn c¸c gi¸ trÞ cña kiÓu d÷ liÖu, tøc lµ tËp c¸c gi¸ trÞ mµ c¸c biÕn thuéc kiÓu d÷ liÖu ®ã cã thÓ nhËn. KiÓu d÷ liÖu trõu tîng ®¬n lµ kiÓu cã miÒn gi¸ trÞ lµ nh÷ng gi¸ trÞ ®¬n (kh«ng t¸ch ra ®-îc n÷a), ch¼ng h¹n nh kiÓu sè nguyªn, sè thùc, kÝ tù. KiÓu d÷ liÖu cã cÊu tróc hay kiÓu phøc hîp lµ kiÓu mµ gi¸ trÞ cña nã cã thÓ chia thµnh nh÷ng thµnh phÇn ®¬n gi¶n h¬n hay nhá h¬n, vÝ dô nhm¶ng sè nguyªn gåm 5 phÇn tö [3, 7, -3, -7, 8] cã thÓ chia thµnh 5 thµnh phÇn, mçi thµnh phÇn lµ mét sè nguyªn. B¶n ghi còng lµ lo¹i cã cÊu tróc v× mçi b¶n ghi cã thÓ chia thµnh nh÷ng thµnh phÇn nhá h¬n, ®ã lµ nh÷ng trêng.

Víi mçi kiÓu d÷ liÖu trõu tîng phøc hîp, khi thiÕt kÕ ta cßn ph¶i chØ ra kiÓu d÷ liÖu cña c¸c thµnh phÇn cña nã, mçi quan hÖ cÊu tróc gi÷a c¸c thµnh phÇn cña nã. Cuèi cïng ta ph¶i chØ ra c¸c phÐp to¸n trªn kiÓu d÷ liÖu. §¬ng nhiªn ®èi víi kiÓu d÷ liÖu ®¬n ta kh«ng cÇn ph¶i nãi tíi kiÓu d÷ liÖu cña c¸c thµnh phÇn vµ quan hÖ cÊu tróc gi÷a c¸c thµnh phÇn.

Nh vËy, ta thÊy cã hai tÝnh chÊt lµm cho kiÓu d÷ liÖu trõu tîng trë nªn quan träng vµ h÷u dông. Thø nhÊt, ta ®· gom côm ®îc tËp c¸c gi¸ trÞ vµ c¸c thao t¸c trªn c¸c phÇn tö l¹i. ViÖc ®ã cßn cã tªn gäi lµ ®ãng gãi d÷ liÖu. (Trong tiÕng Anh nã ®îc gäi lµ Data Encapsulation). Thùc ra c¸c kiÓu d÷ liÖu trong c¸c ng«n ng÷ lËp tr×nh còng cã tÝnh chÊt nµy. VÝ dô: kiÓu sè nguyªn bao hµm c¸c sè nguyªn thuéc kho¶ng –Maxint ®Õn +Maxint vµ c¸c thao t¸c (céng: +, trõ: -, nh©n: *, chia: Div, lín h¬n: >, nhë h¬n: <,...). TÝnh chÊt

- 32 -

quan träng thø hai cña kiÓu d÷ liÖu trõu tîng lµ khi x©y dùng chóng ta cã thÓ kh«ng cho phÐp ngêi sö dông biÕt hay can thiÖp vµo qu¸ tr×nh cµi ®Æt bªn trong. Ngêi sö dông chØ ®îc phÐp truy cËp c¸c ®èi tîng cña kiÓu d÷ liÖu th«ng qua c¸c thao t¸c trªn kiÓu d÷ liÖu mµ th«i. TÝnh chÊt nµy cßn ®îc gäi lµ tÝnh che giÊu th«ng tin. TÝnh chÊt nµy tr¸nh ®îc viÖc ngêi sö dông v« t×nh hay h÷u ý sö dông sai dÉn ®Õn cã thÓ lµm háng ch¬ng tr×nh.

Nh vËy, viÖc ®ãng gãi d÷ liÖu vµ che giÊu th«ng tin lµ hai tÝnh chÊt quan träng nhÊt cña kiÓu d÷ liÖu trõu tîng. Ngêi sö dông chØ ®îc phÐp truy cËp ®èi tîng cña kiÓu d÷ liÖu trõu tîng th«ng qua c¸c thao t¸c trªn ®èi tîng. §Ó lµm vÝ dô, ta h·y h×nh dung trong MicrosoftWord, ngêi sö dông chØ ®îc phÐp thao t¸c trªn c¸c tÖp tin (file) th«ng qua nh÷ng thao t¸c vÒ tÖp tin ®· ®îc cung cÊp trªn menu file. S¬ ®å sau minh ho¹ ý tëng ®ã.

- 33 -

Ng êiSö dông

Ng êiSö dông

Ng êiSö dông

KiÓud÷ liÖutrõu t

îng

Ng êiSö dông

2. Mét sè vÝ dô vÒ kiÓu d÷ liÖu trõu tîng2.1. Líp häc: Mét kiÓu d÷ liÖu trõu tîng ®¬n

Trong phÇn nµy ta sÏ ®a ra hai vÝ dô. Ta sÏ dïng tiÕng Anh ®Ó ®Æt tªn cho c¸c thao t¸c, kiÓu d÷ liÖu, ®¬ng nhiªn chóng ®îc gi¶i thÝch ý nghÜa.TiÕng ViÖt lµ tiÕng cña d©n téc ta, cÇn ph¶i sö dông nã ë mäi n¬i cã thÓ. Tuy nhiªn, do tiÕng ViÖt cã dÊu nªn viÖc sö dông nã trong mét sè trêng hîp sÏ g©y khã hiÓu. Do ®ã, b¹n ®äc th«ng c¶m cho viÖc t¸c gi¶ dïng tiÕng Anh ®Ó ®Æt tªn mét sè thao t¸c trong c¸c vÝ dô sau. H¬n n÷a, yªu cÇu cña häc phÇn nµy lµ häc sinh còng ®· biÕt sö dông tiÕng Anh cho chuyªn ngµnh m¸y tÝnh.

§Ó lµm vÝ dô ®Çu tiªn, chóng ta t¹o ra mét kiÓu d÷ liÖu trõu tîng lµ Líp häc. Ch¼ng h¹n, ta quy íc mét líp häc cã thÓ cã tè ®a lµ 40 häc sinh. Mét ®èi tîng cña kiÓu d÷ liÖu trõu tîng nµy biÓu diÔn mét líp häc. §Ó ®¬n gi¶n ho¸, ta gi¶ ®Þnh mçi líp häc ®îc hoµn toµn ®Æc trng bëi sè häc sinh cña líp. MiÒn gi¸ trÞ cña kiÓu d÷ liÖu nµy lµ nh÷ng sè nguyªn tõ 0 ®Õn 40. Mçi gi¸ trÞ ®ã lµ mét ®¹i lîng ®¬n lÎ, kh«ng ph©n t¸ch ®îc n÷a, nªn ®©y lµ kiÓu d÷ liÖu trõu tîng nguyªn thuû. (§¬ng nhiªn ta còng cã thÓ thiÕt kÕ kiÓu líp häc phøc t¹p h¬n vÝ dô ngoµi sè häc sinh ta cßn cã thÓ cã sè häc sinh nam, sè häc sinh n÷,...).

- 34 -

H×nh 1.1: S¬ ®å minh ho¹ kiÓu d÷ liÖu trõu tîng

Víi kiÓu d÷ liÖu nguyªn thuû nµy ta kh«ng cÇn ph¶i quan t©m ®Õn c¸c thµnh phÇn cña mét ®èi tîng hay quan hÖ gi÷a c¸c thµnh phÇn cña mét ®èi tîng. Ta chØ cÇn quan t©m ®Õn nh÷ng thao t¸c cã thÓ trªn kiÓu d÷ liÖu mµ th«i. Thùc ra, bíc thiÕt kÕ hay x©y dùng c¸c thao t¸c cña mét kiÓu d÷ liÖu trõu tîng bao giê còng rÊt quan träng, bëi v× ngêi sö dông chØ truy cËp ®Õn ®èi tîng th«ng qua c¸c thao t¸c mµ ta cung cÊp. NÕu ta bá sãt mét thao t¸c cÇn thiÕt nµo ®ã th× ngêi sö dông sÏ kh«ng thÓ hoµn thµnh c«ng viÖc mµ ta mong muèn, còng ®¬n gi¶n nh lµ ®Ó lµm mét viÖc ta l¹i bÞ thiÕu c«ng cô hay ph¬ng tiÖn. ChÝnh v× vËy mµ viÖc thiÕt kÕ cÇn ph¶i ®îc thùc hiÖn cÈn träng vµ ®¶m b¶o r»ng kiÓu d÷ liÖu ph¶i cã mäi thao t¸c cÇn thiÕt. Th«ng thêng, cã 5 líp thao t¸c trªn mçi kiÓu d÷ liÖu trõu tîng.

Líp thao t¸c thø nhÊt cã nhiÖm vô t¹o lËp ra nh÷ng ®èi tîng míi cho kiÓu d÷ liÖu. Ta cã thÓ kÝ hiÖu to¸n tö t¹o lËp nh sau:

TaoLap: () --> T, hay dïng tiÕng Anh ta cã:Creator: () --> T

KÝ hiÖu nµy cã nghÜa lµ mét ®èi tîng míi cña kiÓu d÷ liÖu T ®îc t¹o lËp. VÝ dô, víi kiÓu líp häc nãi ë trªn, muèn t¹o lËp ra mét líp häc míi C, cha cã häc sinh nµo trong líp, ta cã thÓ viÕt:

C := TaoLop() hay C := CreateClass ()Trong ®ã to¸n tö CreateClass () lµ kÝ hiÖu to¸n tö t¹o lËp cña kiÓu d÷ liÖu Líp häc mµ ta kÝ hiÖu chung lµ T, gåm c¸c líp häc.

Líp thao t¸c thø hai gåm nh÷ng thao t¸c ®Ó biÕn ®æi (transform) c¸c ®èi tîng cña kiÓu d÷ liÖu. Nh÷ng thao t¸c nµy khi thùc hiÖn trªn c¸c ®èi tîng sÏ mang l¹i nh÷ng thay ®æi cÇn thiÕt trªn c¸c ®èi tîng ®ã. Líp nµy thêng ®îc kÝ hiÖu lµ:

Biendoi: T --> T hay Transformer: T --> T

- 35 -

Víi kiÓu líp häc, cã mét sè phÐp biÕn ®æi cÇn thiÕt nh: thªm häc sinh vµo líp, chuyÓn häc sinh khái líp. Ch¼ng h¹n,

C := ThemHocsinh (C,n) hay C :=AddStudent (C,n)PhÐp biÕn ®æi nµy thªm n häc sinh vµo líp häc C. Sè häc sinh cña líp C b©y giê b»ng sè häc sinh cò céng thªm n. NÕu sè ®ã lín h¬n 40 th× ®Æt nã b»ng 40.PhÐp biÕn ®æi C := ChuyenHocsinh (C,n)

hay C := RemoveStudent (C,n) thùc hiÖn phÐp chuyÓn n häc sinh khái líp C. Sè häc sinh cña líp C b»ng sè häc sinh cò trõ ®i n. NÕu sè n lín h¬n sè häc sinh ®· cã trong líp C th× ®Æt sè häc sinh míi trong C b»ng 0.

Líp thao t¸c thø 3 lµ líp thao t¸c quan s¸t. NhiÖm vô cña líp thao t¸c nµy lµ cho biÕt nh÷ng th«ng tin vÒ tr¹ng th¸i hiÖn t¹i cña ®èi tîng ®îc quan s¸t. §èi tîng ®îc qua s¸t kh«ng hÒ bÞ thay ®æi. Th«ng th-êng, nh÷ng thao t¸c nµy lµ nh÷ng mÖnh ®Ò hay hµm Boolean. Tuy nhiªn còng cã nh÷ng hµm tr¶ ra nh÷ng gi¸ trÞ cô thÓ, kiÓu sè nguyªn hay kiÓu sè thùc, m« t¶ ®Æc trng cña ®èi tîng. Líp nµy th-êng ®îc kÝ hiÖu lµ:

QuanSat : T --> BooleanObserver: T --> Boolean, hayT --> IntergerT --> Real

Víi kiÓu d÷ liÖu líp häc, ta cã thÓ cã 3 hµm sau:Hµm cho biÕt sè häc sinh cña líp:

I := Number (C).Hµm cho biÕt líp häc ®· ®ñ häc sinh cha:

B := IsFull (C)Hµm cho biÕt líp häc ®· cã häc sinh cha:

B := IsEmpty (C)

- 36 -

Líp thao t¸c thø t bao gåm nh÷ng thao t¸c biÕn ®æi. Nã cho phÐp chuyÓn nh÷ng ®èi tîng thuéc c¸c kiÓu kh¸c, ch¼ng h¹n kiÓu sè nguyªn, kiÓu sè thùc thµnh nh÷ng ®èi tîng thuéc kiÓu d÷ liÖu trõu tîng T. Ta cã thÓ kÝ hiÖu chóng nh sau:

i: Integer --> Tr: Real --> Ta: Array --> T

Ch¼ng h¹n, trong kiÓu trõu tîng líp häc T ë trªn, ta cã thÓ cã to¸n tö i chuyÓn mét sè nguyªn n, 0< n <= 40 thµnh sè häc sinh trong mét líp häc nµo ®ã mµ kh«ng cÇn ®Ó ý ®Õn sè häc sinh hiÖn t¹i cña líp. Ta cã thÓ viÕt nã nh sau:

C:= SetNumberStudent (C,n)

Líp thao t¸c cuèi cïng lµ líp thao t¸c vµo ra d÷ liÖu. HÇu nh tÊt c¶ c¸c ng«n ng÷ lËp tr×nh ®Òu cã nh÷ng thao t¸c vµo, ra d÷ liÖu cho c¸c kiÓu nguyªn thuû nh sè nguyªn, sè thùc, kÝ tù. Nh÷ng thao t¸c ®ã kh«ng ¸p dông cho mét kiÓu bÊt k×. Do vËy, ta ph¶i thiÕt lËp c¸c thao t¸c vµo, ra d÷ liÖu cho c¸c ®èi tîng cña kiÓu d÷ liÖu trõu t-îng. Ch¼ng h¹n, víi kiÓu d÷ liÖu trõu tîng líp häc ta cã thÓ cã thao t¸c:

WriteNumberStudent (C)Thao t¸c nµy in ra mµn h×nh sè häc sinh cña líp häc C.

Nh vËy, ta võa ®Æc t¶ c¸c thao t¸c cña kiÓu d÷ liÖu trõu tîng T, còng cã thÓ nãi ta võa cã b¶n thiÕt kÕ c¸c thao t¸c cña kiÓu d÷ liÖu T. Tríc khi chuyÓn sang phÇn tiÕp theo ta cÇn xem l¹ kÜ lìng c¸c thao t¸c võa thiÕt kÕ. Ta cÇn ph¶i ®Æt c©u hái liÖu kiÓu d÷ liÖu ta võa thiÕt kÕ ®· cã ®Çy ®ñ c¸c thao t¸c cÇn thiÕt cha? Ch¼ng h¹n, trong líp thao t¸c thø n¨m ë trªn, ta l¹i muèn t¹o ra mét líp häc ®· cã ®ñ 40 häc sinh:

C:= CreateFull ()

- 37 -

Khi thªm vµo mét thao t¸c nµo ®ã, ta ph¶i xÐt xem ®iÒu ®ã cã lµm cho b¶n thiÕt kÕ kiÓu d÷ liÖu trõu tîng cña ta thªm h÷u dông, linh ho¹t hay hay nã chØ lµm cho kiÓu d÷ liÖu cña ta thª cång kÒnh mµ th«i. ViÖc lùa chän c¸c thao t¸c cho mét kiÓu d÷ liÖu trõu tîng bao giê còng lµ viÖc khã kh¨n nhÊt cña nh÷ng nhµ thiÕt kÕ phÇn mÒm.

B©y giê ta chuyÓn sang thiÕt kÕ mét kiÓu d÷ liÖu trõu tîng cã cÊu tróc.

2.2 TÇu ho¶: Mét kiÓu d÷ liÖu trõu tîng cã cÊu tróc§Ó lµm vÝ dô thø hai, ta h·y h×nh dung ta ®ang x©y dùng mét ch-¬ng tr×nh qu¶n lý c¸c tÇu ho¶ trªn mét s©n ga. Ta cã thÓ dïng c¸c cÊu tróc d÷ liÖu nh m¶ng, b¶n ghi ®Ó x©y dùng kiÓu trõu tîng trªn. Tuy nhiªn, víi môc ®Ých minh ho¹ mét kiÓu d÷ liÖu trõu tîng (vµ thùc ra còng thuËn tiÖn h¬n), ta sÏ x©y dùng nã lµ mét kiÓu d÷ liÖu trõu tîng. Tªn gäi cña kiÓu d÷ liÖu lµ TÇu ho¶. §Ó ®¬n gi¶n ho¸ cho phÐp minh ho¹, ta xem mçi tÇu ho¶ bao gåm mét d·y cã thø tù nh÷ng ®Çu m¸y vµ nh÷ng toa xe. §Çu m¸y vµ toa xe ®îc gi¶ ®Þnh lµ nguyªn thuû, tøc kh«ng ph©n tÝch ®îc n÷a vµ b¶n th©n chóng còng lµ nh÷ng kiÓu d÷ liÖu trõu tîng vµ ta kh«ng ®Æc t¶ viÖc cµi ®Æt chóng ë ®©y.Cã thÓ cã rÊt nhiÒu thao t¸c ®îc thùc hiÖn trªn kiÓu tÇu ho¶. ë ®©y ta chØ thiÕt kÕ n¨m thao t¸c minh ho¹. 1. T:= TaoTauhoa(E) hay

T:= CreateTrain(E)Thao t¸c nµy t¹o mét tÇu ho¶ T, víi 1 ®Çu m¸y E.

2. ThemDaumay(E,T) hayAddEngine(E,T)

Thao t¸c nµy thªm mét ®Çu m¸y E vµo tÇu ho¶ T.

- 38 -

3. ThemToaxe(T, B)AddBoxcar(T, B)

Thao t¸c nµy thªm toa xe B vµo tÇu ho¶ T.

4. B:= Sosanh(T1, T2) hayB:= Compare(T1,T2)

Thao t¸c nµy so s¸nh hai tÇu ho¶ T1 vµ T2, kÕt qu¶ lµ True nÕu T1 vµ T2 cã cïng sè ®Çu m¸y vµ sè toa xe, ngîc l¹i sÏ cho kÕt qu¶ lµ False.

5. l:= Dodai(T) hayl:= Length(T)

Thao t¸c nµy cho biÕt ®é dµi cña tÇu ho¶ T (b»ng sè ®Çu m¸y céng víi sè toa xe).

§¬ng nhiªn, sè thao t¸c trªn lµ cha ®ñ. Ch¼ng h¹n ta cha ®a ra nh÷ng thao t¸c chuyÓn mét ®Çu m¸y hay toa xe khái tÇu ho¶. Ta còng cha ®a ra thao t¸c t¹o ra mét ®Çu m¸y hay mét toa xe. PhÇn nµy sÏ dµnh l¹i lµm bµi tËp.Khi ta hoµn thµnh viÖc cµi ®Æt kiÓu d÷ liÖu trõu tîng TÇu ho¶, ta cã thÓ sö dông nã ®Ó gi¶i quyÕt bµi to¸n ®iÒu phèi tµu ho¶ trªn mét s©n ga. Ta cã thÓ sö dông c¸c thao t¸c trªn kiÓu trõu tîng nµy thay cho viÖc sö dông c¸c thao t¸c ë møc díi, ch¼ng h¹n trªn kiÓu sè nguyªn, sè thùc, m¶ng hay b¶n ghi. Ta cã thÓ lùa chän c¸ch cµi ®Æt cho kiÓu d÷ liÖu trõu tîng. Ch¼ng h¹n, ta cã thÓ dïng m¶ng, hay dïng danh s¸ch mãc nèi ®¬n. TÊt nhiªn, viÖc cµi ®Æt kiÓu d÷ liÖu trõu tîng nh thÕ nµo kh«ng ph¶i lµ vÊn ®Ò quan träng nhÊt khi thiÕt kÕ kiÓu d÷ liÖu trõu tîng. C¸i mµ ngêi lËp tr×nh s¸ng t¹o vµ thiÕt kÕ ra lµ kiÓu d÷ liÖu trõu tîng TÇu ho¶ chø kh«ng ph¶i danh s¸ch mãc nèi ®¬n hay m¶ng. ViÖc thiÕt kÕ nh÷ng ®èi tîng trõu t-

- 39 -

îng hoµn toµn kh«ng bÞ ¶nh hëng bëi ph¬ng tiÖn hay kÜ thuËt ®îc sö dông ®Ó cµi ®Æt chóng.

Sau ®©y lµ b¶n tãm t¾t chi tiÕt b¶n thiÕt kÕ kiÓu d÷ liÖu trõu tîng TÇu ho¶:

MiÒn x¸c ®Þnh Mçi tÇu ho¶ bao gåm m ®Çu m¸y vµ n toa xe; m>=1, n>=0. Mçi tÇu ho¶ ®îc biÓu diÔn b»ng mét cÆp sè nguyªn (m,n), m>=1, n>= 0.

Thµnh phÇn Mçi tÇu ho¶ bao gåm nh÷ng ®èi tîng trõu tîng, nguyªn thuû lµ ®Çu m¸y vµ toa xe.

Quan hÖ gi÷a c¸c thµnh phÇn

Mçi tÇu ho¶ lµ mét d·y cã thø tù nh÷ng ®Çu m¸y vµ toa xe, c¸c ®Çu m¸y ë phÝa ®Çu tÇu, c¸c toa xe ë phÝa cuèi tÇu.

C¸c thao t¸c CreateTrain(E)AddEngine(E,T)AddBoxcar(T, B)Compare(T1,T2)Length(T)

Kh«ng ph¶i ng«n ng÷ lËp tr×nh nµo còng hç trî viÖc thiÕt lËp kiÓu d÷ liÖu trõu tîng. Ch¼ng h¹n, ng«n ng÷ Pascal chuÈn kh«ng hç trî kh¸i niÖm kiÓu d÷ liÖu trõu tîng. Ng«n ng÷ nµy kh«ng cho phÐp t¸ch riªng viÖc khai b¸o kiÓu d÷ liÖu vµ cµi ®Æt chóng. Ch¼ng h¹n, nÕu ta khai b¸o:

- 40 -

Type Train;th× nhÊt ®Þnh ch¬ng tr×nh dÞch Pascal sÏ b¸o lçi. Ta ph¶i ®ång thêi khai b¸o kiÓu d÷ liÖu vµ cÊu tróc bªn trong cña nã. VÝ dô:

Type Train = Array [1..100] of (Engine, Boxcar);

Pascal chuÈn còng kh«ng hç trî viÖc che giÊu th«ng tin. Tøc lµ kh¶ n¨ng giÊu nh÷ng chi tiÕt vÒ nh÷ng kiÓu d÷ liÖu dïng ®Ó cµi ®Æt kiÓu d÷ liÖu trõu tîng. Kh¸i niÖm kiÓu d÷ liÖu trõu tîng ®îc hç trî bëi rÊt nhiÒu ng«n ng÷ bËc cao nh Ada, Modula 2, C++ vµ mét sè phiªn b¶n sau cña Turbo Pascal.

Còng gièng nh viÖc trõu tîng ho¸ thao t¸c, viÖc trõu tîng ho¸ d÷ liÖu lµ mét c«ng cô rÊt cã søc m¹nh trong lËp tr×nh. Nã cho phÐp ta tù t¹o ra c¸c c¸ch biÓu diÔn d÷ liÖu vµ sö dông chóng th«ng qua c¸c thao t¸c, giÊu ®i toµn bé c¸c chi tiÕt cµi ®Æt bªn trong. ViÖc sö dông tèt c¸c ph¬ng tiÖn hç trî trõu tîng ho¸ d÷ liÖu trong ng«n ng÷ lËp tr×nh cho phÐp ta x©y dùng ®îc c¸c phÇn mÒm tèt, hiÖu qu¶ vµ dÔ b¶o tr×.

2.3 Có ph¸p vµ ng÷ nghÜa cña kiÓu d÷ kiÖu trõu tîngTrong môc tríc khi m« t¶ kiÓu d÷ liÖu trõu tîng Líp häc vµ kiÓu d÷ liÖu trõu tîng TÇu ho¶ ta ®· dïng ng«n ng÷ tù nhiªn ®Ó m« t¶ c¸c thao t¸c trªn c¸c ®èi tîng. ViÖc m« t¶ b»ng ng«n ng÷ tù nhiªn rÊt dÔ hiÓu, dÔ viÕt. Tuy nhiªn, trong nhiÒu trêng hîp dïng ng«n ng÷ tù nhiªn dÉn ®Õn sù m¬ hå, kh«ng râ nghÜa. Dïng ng«n ng÷ tù nhiªn, trong nhiÒu trêng hîp, khã cã thÓ ®Æc t¶ chÝnh x¸c viÖc thiÕt kÕ kiÓu d÷ liÖu trõu tîng. Ch¼ng h¹n, trong môc tríc, ta ®· m« t¶ hµm AddEngine (T,E) lµ ®a ®Çu m¸y E vµo tÇu ho¶ T.ViÖc m« t¶ nµy kh«ng m« t¶ ®îc kiÓu gi¸ trÞ cña hµm vµ còng kh«ng râ ®a

- 41 -

®Çu m¸y ®ã vµo t¹i trÝ nµo cña tÇu ho¶ T. §iÒu Êy dÉn ®Õn ta kh«ng biÕt râ thao t¸c sau lµ cã nghÜa hay kh«ng: Length(AddEngine (T,E)). T¬ng tù, ta h·y xem l¹i c¸ch ®Æc t¶ hµm so s¸nh hai tÇu ho¶: B:= Compare (T1,T2),so s¸nh hai tÇu ho¶ T1 vµ T2, kÕt qu¶ lµ True nÕu T1 vµ T2 cã cïng sè ®Çu m¸y vµ sè toa xe, ngîc l¹i sÏ cho kÕt qu¶ lµ False. ViÖc gi¶i thÝch ®ã thËt ra rÊt m¬ hå. Ta cã thÓ hiÓu lµ tæng sè ®Çu m¸y vµ toa xe cña mçi tÇu b»ng nhau th× hµm cho gi¸ trÞ True, nhng còng cã thÓ hiÓu lµ sè ®Çu m¸y cña T1 b»ng sè ®Çu m¸y cña T2 vµ sè toa xe cña T1 còng ph¶i b»ng sè toa xe cña T2. Sù m¬ hå trong thiÕt kÕ nhiÒu khi dÉn ®Õn nh÷ng lçi nghiªm träng trong thiÕt kÕ vµ cµi ®Æt vµ ®iÒu ®ã dÉn ®Õn viÖc t¨ng chi phÝ trong x©y dùng vµ b¶o tr× phÇn mÒm. §Ó tr¸nh ®iÒu nµy, ta cÇn ph¶i ®a ra nh÷ng kÝ hiÖu chÝnh x¸c ®Ó m« t¶ kiÓu d÷ liÖu trõu tîng, Nh÷ng kÝ hiÖu nµy cÇn ph¶i gi¶m thiÓu ®Õn møc tèi ®a sù m¬ hå, ®a nghÜa, gióp cho viÖc ®Æc t¶ ®îc râ rµng, thiÕt kÕ chÝnh x¸c c¸c ®¬n vÞ ch¬ng tr×nh. Ta sÏ ®a ra c¸c kÝ hiÖu nµy trong phÇn sau ®©y.

2.3.1 KÝ hiÖu có ph¸pTríc hÕt, ta x©y dùng kÝ hiÖu có ph¸p cho c¸c thao t¸c. KÝ hiÖu nµy m« t¶ viÖc ta dïng mét thao t¸c nh thÕ nµo mµ kh«ng nãi râ nã lµm g×.§Ó ®Þnh nghÜa mét kiÓu d÷ liÖu trõu tîng nguyªn thuû, ta chØ viÖc viÕt tªn cña kiÓu d÷ liÖu. VÝ dô:

Define Class§iÒu nµy chØ ®¬n gi¶n lµ cho biÕt c¸c thao t¸c ®Þnh nghÜa sau ®ã lµ ®Þnh nghÜa trªn c¸c ®èi tîng cña kiÓu Class (Líp häc).§Ó ®Þnh nghÜa kiÓu d÷ liÖu trõu tîng cã cÊu tróc, ta viÕt tªn cña kiÓu theo sau lµ c¸c kiÓu thµnh phÇn kiÕn t¹o lªn kiÓu ®ã. Tøc lµ ta viÕt:

- 42 -

Define TypeName [C1,C2,...Cn]§iÒu nµy chØ ra r»ng c¸c qui t¾c ®Þnh nghÜa có ph¸p cña c¸c thao t¸c sau ®ã lµ cña kiÓu d÷ liÖu cã tªn lµ TypeName ®îc kiÕn t¹o bëi c¸c kiÓu thµnh phÇn C1,C2,...,Cn. VÝ dô:

Define Train [Engine, Boxcar]

TiÕp theo viÖc khai b¸o tªn cña kiÓu d÷ liÖu trõu tîng ta ph¶i ®a ra m« t¶ có ph¸p cña c¸c thao t¸c trªn kiÓu ®ã. §Ó ®Æc t¶ c¸c có ph¸p cña mét thao t¸c, ta cÇn ®a ra 3 thµnh phÇn sau:1. Tªn cña thao t¸c2. KiÓu d÷ liÖu cña c¸c tham biÕn cña c¸c thao t¸c3. KiÓu kÕt qu¶ cña thao t¸c.

Ta sÏ dïng kÝ hiÖu sau ®©y ®Ó m« t¶ c¸c thao t¸c trªn kiÓu d÷ liÖu:OperationName (arg1, arg2,...,argn): ReturnType

trong ®ã OperationName lµ tªn cña thao t¸c ®ang ®îc ®Þnh nghÜa, cßn arg1, arg2,...,argn lÇn lît lµ kiÓu cña c¸c tham biÕn cña thao t¸c cßn ReturnType lµ kiÓu kÕt qu¶ cña thao t¸c. Trong tµi liÖu nµy, khi thiÕt kÕ thao t¸c, ta biÓu diÔn c¸c thao t¸c díi d¹ng hµm. Tuy nhiªn khi cµi ®Æt, chóng cã thÓ ®îc m· ho¸ lµ hµm hay thñ tôc, tuú theo sù lùa chän thÝch hîp.

Víi vÝ dô 1, kiÓu d÷ liÖu trõu tîng líp häc, thao t¸c ®Çu tiªn ®Ó t¹o líp häc cã thÓ m« t¶ nh sau:

CreateClass() : ClassC©u lÖnh trªn nãi r»ng thao t¸c cã tªn lµ CreateClass kh«ng cã tham biÕn nµo vµ kiÓu kÕt qu¶ chÝnh lµ kiÓu líp häc Class.

Thao t¸c thªm häc sinh vµo líp häc:AddStudent (Class,Integer): Class

- 43 -

thÓ hiÖn r»ng thao t¸c nµy nhËn 2 tham biÕn vµo, biÕn thø nhÊt kiÓu líp häc Class, biÕn thø hai kiÓu sè nguyªn vµ kiÓu kÕt qu¶ l¹i lµ kiÓu líp häc. ChØ cÇn nh×n vµo c¸ch m« t¶ hai thao t¸c trªn ta cã thÓ thÊy ngay phÐp gäi hµm lång nhau sau ®©y:

AddStudent (CreateClass(), 3)lµ hoµn toµn ®óng vÒ mÆt có ph¸p cho dï ta cha cÇn biÕt lµ chóng lµm g×. T¬ng tù, chóng ta cã thÓ biÕt r»ng phÐp gäi sau ®©y:

AddStudent (CreateClass(), AddStudent (CreateClass(), 3))lµ sai có ph¸p. ThËt vËy:AddStudent (C, AddStudent (CreateClass(), 3))AddStudent (C, AddStudent (C, 3))AddStudent (C, C) (*lçi*)do kiÓu d÷ liÖu cña hai tham sè trong hµm AddStudent lµ kh«ng thÝch hîp, kh«ng ®óng nh ®Þnh nghÜa có ph¸p cña hµm ®ã.

§Þnh nghÜa có ph¸p cña c¸c hµm trªn kiÓu d÷ liÖu Class ®îc m« t¶ ë b¶ng díi ®©y.

a. CreateClass(): Classb. AddStudent(Class, Integer): Classc. RemoveStudent(Class, Integer): Classd. NumberStudent (Class): Integere. IsFull (Class): Booleanf. IsEmpty (Class): Booleang. SetNumberStudent (Class,n): Classh. WriteNumberStudent (Class): Class

H×nh 2.2 Có ph¸p cña cÊu tróc d÷ liÖu Líp häc------------------------------------------------------------

- 44 -

Chóng ta còng dïng c¸c kÝ hiÖu t¬ng tù ®Ó ®Æc t¶ có ph¸p cña c¸c thao t¸c trªn cÊu tróc d÷ liÖu Tµu háa Train.

§Þnh nghÜa có ph¸p cña c¸c hµm trªn kiÓu d÷ liÖu Tµu ho¶ ®îc m« t¶ ë b¶ng díi ®©y.

a. CreateTrain (Engine): Train[Engine, Boxcar]b. AddEngine (Engine, Train[Engine, Boxcar]) : Train[Engine,

Boxcar]c. AddBoxcar (Boxcar, Train[Engine, Boxcar]) : Train[Engine,

Boxcar]d. Compare (Train[Engine, Boxcar], Train[Engine, Boxcar]):

Booleane. Length (Train[Engine, Boxcar]) : Integer

H×nh 2.3. Có ph¸p cña kiÓu d÷ liÖu trõu tîng Tµu ho¶-----------------------------------------------------------------------

VÝ dô: CreateTrain (Engine): Train[Engine, Boxcar] cã nghÜa lµ hµm ta võa viÕt cã mét tham sè vµo kiÓu ®Çu m¸y Engine vµ tr¶ ra gi¸ trÞ kiÓu tµu ho¶ Train. Hµm thªm ®Çu m¸y AddEngine ®îc ®Þnh nghÜa vÒ có ph¸p lµ:

AddEngine (Engine, Train[Engine, Boxcar]) : Train[Engine, Boxcar]

§Þnh nghÜa nµy lµm râ sù m¬ hå ®· nãi trong môc tríc, cô thÓ lµ nã chØ râ kiÓu cña kÕt qu¶ cña hµm thuéc kiÓu tµu ho¶ Train mµ kh«ng ph¶i lµ kiÓu ®Çu m¸y hay toa xe. Nh vËy b»ng c¸c phÐp

- 45 -

®Þnh nghÜa có ph¸p c¸c thao t¸c ta ®· lµm t¨ng thªm ®é chÝnh x¸c h¬n lµ ta dïng ng«n ng÷ tù nhiªn ®Ó m« t¶ c¸c thao t¸c.

2.3.2 Ng÷ nghÜa cña kiÓu d÷ liÖu trõu tîng

KÝ hiÖu CreateClass(): Class võa nh¾c tíi ë trªn chØ m« t¶ khÝa c¹nh có ph¸p cña thao t¸c, tøc lµ thao t¸c ®îc dïng nh thÕ nµo mµ kh«ng nãi g× vÒ ý nghÜa cña thao t¸c, tøc thao t¸c ®ã lµm g×. Cã thÓ h×nh dung ®iÒu ®ã gièng nh viÖc mét ngêi nµo ®ã biÕt ®¸nh vÇn mét tõ, thËm chÝ biÕt viÕt tõ ®ã nhng kh«ng hÒ biÕt ý nghÜa cña tõ ®ã, hay kh«ng biÕt sö dông nã trong c¸c c©u v¨n. ý nghÜa cña thao t¸c chÝnh lµ ng÷ nghÜa cña nã. Ng÷ nghÜa m« t¶ t¸c ®éng cña c¸c thao t¸c vµ hiÖu øng cña c¸c t¸c ®éng ®ã.

Cã nhiÒu kÜ thuËt ®Ó ®Æc t¶ ng÷ nghÜa cña thao t¸c trªn mét kiÓu d÷ liÖu trõu tîng. §©y còng lµ mét chñ ®Ò quan träng vµ phøc t¹p trong khoa häc m¸y tÝnh. Môc ®Ých cña chóng ta trong ph¹m vi cña gi¸o tr×nh nµy chØ lµ giíi thiÖu vÒ nã mµ th«i. C¸c m«n häc kh¸c nh ng«n ng÷ h×nh thøc vµ lý thuyÕt khoa häc m¸y tÝnh sÏ nghiªn cøu s©u s¾c h¬n c¸c kÜ thuËt ®ã.

KÜ thuËt mµ chóng ta sÏ dïng ë ®©y ®Ó m« t¶ hµnh vi cña mçi thao t¸c ®îc gäi lµ ng÷ nghÜa tiªn ®Ò. Nh ®éc gi¶ ®· biÕt, mét tiªn ®Ò lµ mét ch©n lý ®· ®îc thõa nhËn mét c¸ch phæ dông. §Ó m« t¶ ng÷ nghÜa cña mét kiÓu d÷ liÖu trõu tîng ta chØ ®Þnh râ nh÷ng tiªn ®Ò cho c¸c thao t¸c cña kiÓu d÷ liÖu trõu tîng. Nãi kh¸c ®i ta m« t¶ nh÷ng ®iÒu lu«n lu«n ®óng khi ¸p dông c¸c thao t¸c trªn c¸c ®èi tîng thuéc kiÓu nµy. TËp hîp nh÷ng tiªn ®Ò nµy sÏ ®Æc trng cho c¸c hµnh vi cña thao t¸c trªn kiÓu d÷ liÖu trõu tîng.

- 46 -

§Ó lµm vÝ dô, gi¶ sö chóng ta ph¶i m« t¶ hµnh vi cña phÐp to¸n (thao t¸c) céng + trªn tËp hîp c¸c sè nguyªn. Chóng ta sÏ b¾t ®Çu b»ng viÖc liÖt kª nh÷ng tÝnh chÊt cña phÐp céng lu«n lu«n ®óng víi mäi sè nguyªn:

x + y = y + x (tiªn ®Ò giao ho¸n) (x + y) + z = (x + y) + z (tiªn ®Ò kÕt hîp) x + 0 = 0 + x = x (tiªn ®Ò ®¬n vÞ)

Nh÷ng tiªn ®Ò nµy lu«n lu«n ®óng cho mäi sè nguyªn x, y, z. Nh÷ng tiªn ®Ò nµy sÏ ®Æc trng cho tÝnh chÊt cña phÐp céng.

T¬ng tù, chóng ta sÏ m« t¶ ng÷ nghÜa cña c¸c thao t¸c cña kiÓu d÷ liÖu trõu tîng ë trªn. B»ng c¸ch chØ ra c¸c tiªn ®Ò lu«n lu«n ®óng cho c¸c thao t¸c, chóng ta cã thÓ m« t¶ ®îc hµnh vi cña c¸c thao t¸c ®ã. Trong mét sè ®Þnh nghÜa ta cã dïng ®Õn kh¸i niÖm hµm hîp trong to¸n häc.

B©y giê ta b¾t ®Çu m« t¶ ng÷ nghÜa cña c¸c thao t¸c trªn kiÓu d÷ liÖu trõu tîng Líp häc Class. Ta sÏ liÖt kª chóng trªn mét b¶ng. Ta nhí l¹i r»ng thao t¸c CreateClass() t¹o ra mét líp häc cha cã häc sinh nµo. Nh vËy, nÕu ta t¸c ®éng thao t¸c NumberStudent vµo bÊt cø líp häc nµo võa ®îc t¹o ra th× ®Òu ®îc kÕt qu¶ lµ 0:

NumberStudent (CreateClass()) = 0§ã lµ mét tiªn ®Ò v× nã lu«n lu«n ®óng. T¬ng tù, líp häc ®îc t¹o ra bëi hµm CreateClass cha cã häc sinh nµo nªn ta cã hai tiªn ®Ò sau:

IsEmpty(CreateClass()) = TrueIsFull(CreateClass()) = False

Hai tiªn ®Ò cuèi nµy cho biÕt t¸c ®éng cña hai hµm IsEmpty vµ IsFull lªn nh÷ng líp häc võa ®îc t¹o ra bëi CreateClass. VËy t¸c ®éng cña nã ra sao lªn mét líp häc bÊt k×? C©u tr¶ lêi rÊt ®¬n

- 47 -

gi¶n: NÕu líp häc cha cã häc sinh nµo th× IsEmpty t¸c ®éng lªn sÏ cho kÕt qu¶ lµ True cßn nÕu líp häc ®· cã 40 häc sinh nh qui íc cña ta th× hµm IsFull khi t¸c ®éng lªn sÏ cho kÕt qu¶ lµ True. Chóng ta diÔn ®¹t ®iÒu ®ã nh sau:

If (NumberStudent (C) = 0) ThenIsEmpty (T) = True

ElseIsEmpty(T) = FalseIf (NumberStudent (C) = 40) Then

IsFull (T) = TrueElseIsFull(T) = False

§Ó ý r»ng tõ hai tiªn ®Ò cuèi nµy ta kh«ng cÇn ®Õn hai tiªn ®Ò IsEmpty(CreateClass()) = TrueIsFull(CreateClass()) = False

n÷a v× chóng hiÓn nhiªn ®îc suy ra tõ hai tiªn ®Ò trªn.

Cuèi cïng, chóng ta cßn ph¶i m« t¶ hµnh vi cña hai thao t¸c AddStudent vµ RemoveStudent. Hai thao t¸c nµy lµm thay ®æi sè häc sinh trong líp häc. Nã còng gi¶i quyÕt vÊn ®Ò giíi h¹n cña sè häc sinh trong mét líp häc lµ 40 vµ sè häc sinh trong mét líp häc kh«ng thÓ lµ sè ©m.

If (NumberStudent(C) + n) <= 40 then NumberStudent(AddStudent(C,n)) = NumberStudent (C) + nElse

NumberStudent(AddStudent(C,n)) = 40If (NumberStudent(C) - n) >= 0 then

- 48 -

NumberStudent(RemoveStudent(C,n)) = NumberStudent (C) - nElse

NumberStudent(RemoveStudent(C,n)) = 0

Tãm l¹i ta cã thÓ m« t¶ ng÷ nghÜa cña c¸c thao t¸c trªn kiÓu d÷ liÖu trõu tîng líp häc Class th«ng qua b¶ng tãm t¾t sau ®©y.

a. NumberStudent(CreateClass()) = 0b. If (NumberStudent (C) = 0) Then

IsEmpty (T) = TrueElse

IsEmpty(T) = Falsec. If (NumberStudent (C) = 40) Then

IsFull (T) = TrueElse

IsFull(T) = False

d. If (NumberStudent(C) + n) <= 40 then NumberStudent(AddStudent(C,n)) = NumberStudent (C) + nElse

NumberStudent(AddStudent(C,n)) = 40e. If (NumberStudent(C) - n) >= 0 then NumberStudent(RemoveStudent(C,n)) = NumberStudent (C) - nElse

NumberStudent(RemoveStudent(C,n)) = 0f. NumberStudent(SetNumberStudent (C,n)) = ng. NumberStudent(WriteNumberStudent(T)) = NumberStudent(T)

- 49 -

H×nh 2.4. Ng÷ nghÜa cña KiÓu d÷ liÖu trõu tîng líp häc Class-------------------------------------------------------------------------------

ViÖc m« t¶ ng÷ nghÜa cña kiÓu d÷ liÖu trõu tîng Tµu ho¶ Train còng ®îc tiÕn hµnh t¬ng tù nh viÖc m« t¶ ng÷ nghÜa cña kiÓu d÷ liÖu trõu tuîng líp häc ë trªn. §Ó gi¶i thÝch râ ý nghÜa cña c¸c tiªn ®Ò, chóng ta sÏ m« t¶ hµnh vi cña c¸c thao t¸c b»ng tríc hÕt lµ lµ ng«n ng÷ tù nhiªn vµ chóng ta sÏ cÇn thªm 4 thao t¸c phô trî mµ ta cha nãi ®Õn trong môc tríc. §ã lµ c¸c thao t¸c sau:

NumberEngine(Train) : Integer (*tr¶ ra sè ®Çu m¸y cña Tµu ho¶ *)

NumberBoxcar(Train) : Integer (*tr¶ ra sè toa xe cña Tµu ho¶ *)Front(Train): Engine (*tr¶ ra ®Çu m¸y ë ®Çu ®oµn

tµu*)Back(Train): Boxcar (*tr¶ ra toa xe ë cuèi ®oµn

tµu*)

Sau ®©y lµ m« t¶ ng÷ nghÜa cña c¸c thao t¸c cña kiÓu d÷ liÖu tµu háa Train.

a. Mét tµu ho¶ võa ®îc t¹o ra chØ gåm mét ®Çu m¸y Engine vµ kh«ng cã toa xe nµo.

NumberEngine(CreateTrain(E)) = 1NumberBoxcar(CreateTrain(E)) = 0Front(CreateTrain(E)) = E

b. Khi chóng ta thªm mét ®Çu m¸y Engine míi vµo mét tµu ho¶ Train, ta thªm nã vµo phÝa ®Çu ®oµn tµu mµ kh«ng ph¶i vµo phÝa cuèi ®oµn tµu.

- 50 -

NumberEngine (AddEngine(E,T)) = NumberEngine(T) + 1Front(AddEngine(E,T)) = EBack(AddEngine(E,T)) = Back(T)

c. Khi chóng ta thªm mét toa xe Boxcar míi vµo tµu ho¶ Train, ta thªm nã vµo cuèi ®oµn tµu.

NumberBoxcar (AddBoxcar(B,T)) = NumberBoxcar(T) + 1Front(AddBoxcar(B,T)) = Front(T)Back(AddBoxcar(B,T)) = B

d. §é dµi tµu ho¶ ®îc tÝnh b»ng tæng sè ®Çu m¸y vµ toa xe cña nã.

Length(T) =NumberEngine(T) + NumberBoxcar(T)

e. Thªm mét toa xe vµo tµu ho¶ th× sè ®Çu m¸y cña nã kh«ng thay ®æi vµ ngîc l¹i khi thªm mét ®Çu m¸y vµo tµu ho¶ th× sè toa xe cña nã kh«ng thay ®æi.

NumberEngine(AddBoxcar(B,T)) = NumberEngine(T)NumberBoxcar(AddEngine(E,T)) = NumberBoxcar(T)

f. Hai tµu ho¶ ®ù¬c coi lµ b»ng nhau nÕu nã cã cïng sè ®Çu m¸y vµ sè toa xe.

If (NumberEngine(T1) = NumberEngine(T2)) And(NumberBoxcar(T1) = NumberBoxcar(T2))

ThenCompare (T1,T2) = True

Else Compare (T1,T2) = False

- 51 -

Tiªn ®Ò cuèi cïng ®· lµm s¸ng tá sù lÉn lén mµ chóng ta ®· ®Ò cËp ®Õn ë môc tríc vÒ hµm Compare so s¸nh hai tµu ho¶. B¶ng sau ®©y chØ ra ®Çy ®ñ c¸c ng÷ nghÜa cña c¸c thao t¸c ®îc ®Ò cËp trªn kiÓu d÷ liÖu tµu ho¶.

a. NumberEngine(CreateTrain(E)) = 1b. NumberBoxcar(CreateTrain(E)) = 0c. Front(CreateTrain(E)) = Ed. NumberEngine (AddEngine(E,T)) = NumberEngine(T) + 1e. Front(AddEngine(E,T)) = Ef. Back(AddEngine(E,T)) = Back(T)g. NumberBoxcar (AddBoxcar(B,T)) = NumberBoxcar(T) + 1h. Front(AddBoxcar(B,T)) = Front(T)i. Back(AddBoxcar(B,T)) = Bj. Length(T) =NumberEngine(T) + NumberBoxcar(T)k. NumberEngine(AddBoxcar(B,T)) = NumberEngine(T)l. NumberBoxcar(AddEngine(E,T)) = NumberBoxcar(T)m. If (NumberEngine(T1) = NumberEngine(T2)) And

(NumberBoxcar(T1) = NumberBoxcar(T2))Then

Compare (T1,T2) = TrueElse Compare (T1,T2) = False

H×nh 2.5. Ng÷ nghÜa cña kiÓu d÷ liÖu trõu tîng tµu ho¶ Train-------------------------------------------------------------------------------

Tiªn ®Ò cuèi cïng cho phÐp ta lµm râ thao t¸c so s¸nh ®· nãi trong môc tríc. B¶ng c¸c tiªn ®Ò trªn gióp ta x¸c ®Þnh têng minh hµnh vi

- 52 -

vµ ý nghÜa cña c¸c thao t¸c, ®Æc biÖt lµ d·y thao t¸c liªn tiÕp nhau trong kiÓu d÷ liÖu Tµu ho¶ Train. Ch¼ng h¹n ta cã d·y thao t¸c:

Length(AddEngine(E2,AddBoxcar(B, CreateTrain(E1))))

= Length(AddEngine(E2, AddBoxcar(B,T1))) trong ®ã:

NumberEngine(T1) = 1 do tiªn ®Ò a NumberBoxcar(T1) = 0 do tiªn ®Ò b Length(T1) = 1 do tiªn ®Ò j

Front (T1) = E1 do tiªn ®Ò c = Length(AddEngine(E2,T2))

trong ®ã:NumberEngine(T2) = 1 do tiªn ®Ò k

NumberBoxcar(T2) = 0 do tiªn ®Ò g Length(T2) = 2 do tiªn ®Ò j

Back (T2) = B do tiªn ®Ò h Front (T1) = E1 do tiªn ®Ò i

= Length(T3)trong ®ã:

NumberEngine(T3) = 2 do tiªn ®Ò d NumberBoxcar(T3) = 1 do tiªn ®Ò l

Front(T3) = E2 do tiªn ®Ò e Back(T3) =ss do tiªn ®Ò f

= 3 do tiªn ®Ò j

- 53 -

B»ng d·y thao t¸c trªn chóng ta võa cã mét tµu ho¶ gåm 3 thµnh phÇn, ®Çu m¸y E2 ë ®Çu tµu vµ toa xe B ë cuèi tµu. Ta còng cã ph©n tÝch t¬ng tù nh vËy cho nh÷ng d·y thao t¸c hîp lÖ (®óng có ph¸p).Chóng ta cÇn nhí r»ng hµnh vi cña c¸c tiªn ®Ò kh«ng ph¶i lµ tiÒn ®Þnh mµ ta hoµn toµn cã quyÒn thiÕt kÕ nh÷ng thao t¸c sao cho nã thùc hiÖn tèt nhÊt yªu cÇu cña chóng ta. Ch¼ng h¹n, trong thao t¸c so s¸nh hai tµu ë trªn ta hoµn toµn cã thÓ coi hai tµu háa lµ nh nhau nÕu chóng cã tæng sè ®Çu m¸y vµ toa xe gièng nhau mµ kh«ng cÇn ph¶i tõng thµnh phÇn mét b»ng nhau.

2.3.3 §iÒu kiÖn ®Çu vµ ®iÒu kiÖn cuèiCã hai vÊn ®Ò chóng ta cßn cÇn ph¶i ®Ò cËp thªm khi nãi ®Õn ng÷ nghÜa tiªn ®Ò trong môc tríc. Tríc hÕt, kh«ng ph¶i mäi thao t¸c ®Òu thùc hiÖn ®îc trong mäi ®iÒu kiÖn. Nh chóng ta ®· biÕt mét sè phÐp to¸n kh«ng ph¶i bao giê còng ®îc thùc hiÖn trªn tËp c¸c sè nguyªn hay c¸c sè thùc. Ch¼ng h¹n phÐp chia a/ b cÇn cã ®iÒu kiÖn b kh¸c 0, phÐp khai c¨n cña mét sè thùc a cÇn cã ®iÒu kiÖn a kh«ng ©m. Trong vÝ dô vÒ kiÓu d÷ liÖu trõu tîng tµu háa ë trªn ta còng sÏ thÊy n¶y sinh nh÷ng vÊn ®Ò t¬ng tù. Ch¼ng h¹n trong d·y thao t¸c:

Back(CreateTrain(E))Ta nhí r»ng thao t¸c Back tr¶ ra toa xe (Boxcar) ®ang ë cuèi cña tµu háa. Tuy nhiªn, ë trªn, CreateTrain(E) l¹i t¹o ra tµu háa cha cã toa xe nµo vµ v× vËy trong trêng hîp nµy hµm Back kh«ng ®îc x¸c ®Þnh.

§Ó gi¶i quyÕt nh÷ng vÊn ®Ò nªu trªn, trong m« t¶ ng÷ nghÜa cña thao t¸c, ta ph¶i chØ râ ®iÒu kiÖn cÇn thiÕt ®Ó thao t¸c cã thÓ x¸c ®Þnh vµ thùc hiÖn ®îc. §iÒu kiÖn ®ã ®îc gäi lµ ®iÒu kiÖn ®Çu

- 54 -

cña thao t¸c. Nh÷ng thao t¸c ta võa th¶o luËn ë trªn cã nh÷ng ®iÒu kiÖn ®Çu nh sau:

Thao t¸c §iÒu kiÖn ®Çua/b b 0sqrt(c) c 0Back(T) BoxcarLength(T) > 0

Ngoµi hiÖu øng trùc tiÕp lµ mçi thao t¸c khi thùc hiÖn cÇn ph¶i ®a ra kÕt qu¶, nã cßn cã hiÖu øng gi¸n tiÕp ®Õn hÖ thèng hay m«i tr-êng mµ chóng ta rÊt khã m« t¶ mét c¸ch chÝnh thèng. Nh÷ng hiÖu øng gi¸n tiÕp nh vËy cã thÓ liªn quan ®Õn c¸c thao t¸c vµo, ra th× chóng ta thêng m« t¶ b»ng ng«n ng÷ tù nhiªn. Tùu chung l¹i, viÖc m« t¶ hiÖu øng trùc tiÕp vµ gi¸n tiÕp cña mét thao t¸c ta gäi lµ ®iÒu kiÖn cuèi (postcondition) cña thao t¸c ®ã.§Ó minh häa cho kh¸i niÖm ®iÒu kiÖn cuèi, ta lÊy mét vÝ dô; gi¶ sö ta cã mét biÕn toµn côc ta gäi lµ baoloi (b¸o lçi). B¸o lçi sÏ cã gi¸ trÞ lµ True nÕu ta ¸p dông hµm Back(T) vµo tµu háa T nÕu T kh«ng cã toa xe nµo. Ta cã thÓ diÔn ®¹t hiÖu øng ®ã nh sau:

Back(T) §iÒu kiÖn ®Çu: BoxcarLength(T) > 0§iÒu kiÕn cuèi: baoloi = True nÕu ®iÒu kiÖn ®Çu bÞ vi

ph¹m baoloi = False nÕu ngîc l¹i

T¬ng tù nh vËy, thao t¸c WriteNumberStudent (C) víi líp häc C kh«ng hÒ cã hiÖu øng trùc tiÕp trªn líp häc C hay sè häc sinh cña líp häc. Nã chØ t¹o ra hiÖu øng lµ in sè häc sinh cña líp häc C ra mµn h×nh:

WriteNumberStudent (C): §iÒu kiÖn ®Çu: kh«ng§iÒu kiÖn cuèi: In sè häc sinh cña líp häc

C ra mµn h×nh.

- 55 -

Nh÷ng ®iÒu kiÖn ®Çu vµ cuèi nµy sÏ ®îc hµm chøa trong m« t¶ ng÷ nghÜa cña kiÓu d÷ liÖu trõu tîng. Chóng ta sÏ thÊy râ trong mét sè vÝ dô ë phÇn sau.

Tãm l¹i, ®Ó ®Æc t¶ mét kiÓu d÷ liÖu trõu tîng mét c¸ch ®Çy ®ñ, ta ph¶i ®a ra tÊt c¶ 6 lo¹i th«ng tin sau:

1. MiÒn c¸c gi¸ trÞ thuéc kiÓu ®ã.2. C¸c thµnh phÇn cña mét kiÓu d÷ liÖu trõu tîng cã cÊu tróc.3. Quan hÖ gi÷a c¸c thµnh phÇn trong mét kiÓu d÷ liÖu trõu tîng cã cÊu tróc.4. Có ph¸p cña c¸c thao t¸c.5. Ng÷ nghÜa cña c¸c thao t¸c.6. §iÒu kiÖn ®Çu vµ ®iÒu kiÖn cuèi cña c¸c thao t¸c.

Trong môc tiÕp theo, ta sÏ t×m hiÓu vÒ nh÷ng ph¬ng tiÖn thuËn lîi ®Ó x©y dùng kiÓu d÷ liÖu trõu tîng trong mét sè ng«n ng÷ lËp tr×nh bËc cao.

2.4 Ng«n ng÷ lËp tr×nh hç trî kiÓu d÷ liÖu trõu tîng

Trong nh÷ng môc tríc chóng ta võa nhÊn m¹nh tÝnh quan träng cña kiÓu d÷ liÖu trõu tîng §ã chÝnh lµ c«ng cô ®Ó thiÕt kÕ vµ x©y dùng nh÷ng phÇn mÒm ®¸ng tin cËy, dÔ kiÓm thö vµ b¶o tr×. ChÝnh v× vËy, mét c©u hái quan träng ®Æt ra lµ c¸c ng«n ng÷ lËp tr×nh ®· hç trî viÖc x©y dùng kiÓu d÷ liÖu trõu tîng nh thÕ nµo? LiÖu nh÷ng ý tëng ta ®a ra trong c¸c môc tríc chØ lµ vÊn ®Ò lý thuyÕt ®Ó chóng ta nghiªn cøu chø kh«ng ph¶i ®Ó sö dông? Thùc ra, nh÷ng kh¸i niÖm Êy thùc sù lµ nh÷ng c«ng cô lËp tr×nh h÷u dông vµ thùc tÕ trong viÖc x©y dùng vµ ph¸t triÓn c¸c phÇn mÒm. Cã rÊt nhiÒu ng«n ng÷ lËp tr×nh hç trî cho kh¸i niÖm kiÓu d÷ liÖu

- 56 -

trõu tîng. Sau ®©y ta sÏ nghiªn cøu nh÷ng cÊu phÇn cÇn thiÕt ®Ó mét ng«n ng÷ lËp tr×nh cã thÓ cung cÊp nh÷ng ph¬ng tiÖn ®Ó x©y dùng kiÓu d÷ liÖu trõu tîng ®· nãi trong môc tríc. Tríc hÕt chóng ta sÏ m« t¶ nh÷ng kiÓu d÷ liÖu trõu tîng díi d¹ng gi¶ m·. Sau ®ã ta sÏ xem viÖc chuyÓn nh÷ng m« t¶ nµy vÒ có ph¸p cña c¸c ng«n ng÷ lËp tr×nh nh ADA, Modula-2, C++ hay Turbo Pascal.

Ta chän gi¶ m· lµ c¸ch tr×nh bµy kiÓu d÷ liÖu trõu tîng chø kh«ng chän mét ng«n ng÷ cô thÓ nµo. Nguyªn nh©n nh vËy lµ do kh¸i niÖm rÊt quan träng ta ®ang nghiªn cøu lµ sù trõu tîng hãa d÷ liÖu, ®ãng gãi vµ che giÊu th«ng tin, chø kh«ng ph¶i lµ có ph¸p cña mét ng«n ng÷ cô thÓ nµo. ViÖc dïng gi¶ m· cho phÐp ta tËp trung chó ý vµo ®Æc t¶, thiÕt kÕ vµ x©y dùng kiÓu d÷ liÖu trõu tîng, kh«ng phô thuéc vµo mét ng«n ng÷ hay hÖ thèng cô thÓ nµo.

2.4.1 Nh÷ng kh¶ n¨ng cÇn thiÕt cña ng«n ng÷.Cã bèn kh¶ n¨ng cÇn thiÕt cña mét ng«n ng÷ ®Ó nã cã thÓ hç trî kiÓu d÷ liÖu trõu tîng lµ:

1. Kh¶ n¨ng t¸ch viÖc khai b¸o tªn cña c¸c ®èi tîng ra khái phÇn cµi ®Æt vµ ®Æt hai thµnh phÇn nµy vµo hai ®¬n vÞ ch¬ng tr×nh riªng rÏ.2. Kh¶ n¨ng h¹n chÕ ngêi sö dông truy cËp vµo phÇn cµi ®Æt.3. Kh¶ n¨ng t¸ch riªng ®îc viÖc dÞch hai ®¬n vÞ ch¬ng tr×nh, mét chøa phÇn khai b¸o vµ mét chøa phÇn cµi ®Æt ®èi tîng.4. Nh÷ng lÖnh cho phÐp ngêi sö dông truy cËp vµo tµi nguyªn ®îc t¹o ra trong nh÷ng ®¬n vÞ ch¬ng tr×nh nµy.

Khi chóng ta muèn t¹o mét kiÓu d÷ liÖu míi trong ng«n ng÷ Pascal chuÈn, kh«ng nh÷ng chóng ta ph¶i khai b¸o tªn cña nã mµ cßn c¶

- 57 -

phÇn cµi ®Æt n÷a. C¸ch khai b¸o ®ã gäi lµ khai b¸o c¸ch khai b¸o râ. VÝ dô:

Type Complex = Recorda : Real;b : Real;

End;

ViÖc khai b¸o trªn t¹o ra mét kiÓu d÷ liÖu míi cã tªn lµ Complex vµ còng chØ râ kiÓu nµy ®îc cµi ®Æt nh lµ mét b¶n ghi víi hai trêng thùc. NÕu mét m« ®un nµo ®ã sö dông c¸ch khai b¸o nµy vµ t¹o ra mét biÕn kiÓu nµy th× nã hoµn toµn cã thÓ sö dông c¸ch cµi ®Æt trªn. VÝ dô:

Var x,y,z : Complexx.a := 1.0;y.a := 1.5;x.b := 2.0;y.b := 2.5;z.a := x.a + y.a;z.b := x.b + y.b;

Víi kiÓu d÷ liÖu râ nh thÕ nµy, ta kh«ng thÓ nµo thay ®æi ®îc c¸ch cµi ®Æt b»ng b¶n ghi mµ ta ®· khai b¸o cho kiÓu d÷ liÖu Complex mµ l¹i kh«ng cã t¸c ®éng lín ®Õn ngêi sö dông. BÊt cø sù thay ®æi nµo vÒ c¸ch cµi ®Æt kiÓu d÷ liÖu Complex còng dÉn ®Õn sù thay ®æi toµn bé m· cña nh÷ng phÇn cña ch¬ng tr×nh sö dông kiÓu d÷ liÖu nµy. H¬n thÕ n÷a, ta ®ang nãi nhiÒu ®Õn viÖc che giÊu c¸ch cµi ®Æt kiÓu d÷ liÖu trõu tîng, cho phÐp ngêi sö dông truy cËp cµo cÊu tróc chØ qua c¸c thao t¸c chóng ta x©y dùng trªn cÊu tróc ®ã.

- 58 -

KiÓu d÷ liÖu râ kh«ng thÓ cã kh¶ n¨ng ®ã mµ kh¶ n¨ng nµy chØ cã ®îc b»ng kiÓu d÷ liÖu mµ ta gäi lµ mê mµ ta sÏ nãi sau ®©y.

Có ph¸p cña kiÓu d÷ liÖu mê rÊt ®¬n gi¶n nh sau:Type Identifier;Khai b¸o nµy chØ chØ ra tªn cña kiÓu d÷ liÖu mµ kh«ng m« t¶ kiÓu d÷ liÖu nµy ®îc cµi ®Æt nh thÕ nµo. ChÝnh viÖc t¸ch nh÷ng chi tiÕt vÒ cµi ®Æt khái phÇn khai b¸o tªn cña kiÓu cho phÐp che giÊu th«ng tin. Víi vÝ dô vÒ kiÓu Complex ë trªn ta cã khai b¸o kiÓu mê nh sau:

Type Complex;Víi phÐp khai b¸o nµy, khi c¸c ®¬n vÞ ch¬ng tr×nh kh¸c dïng kiÓu d÷ liÖu nµy th× chØ truy cËp vµo tªn cña kiÓu. VÝ dô, sau khai b¸o nµy ta cã thÓ viÕt:

Var x,y,z : Complexvµ viÖc viÕt nµy hoµn toµn hîp lÖ.

ThÕ nhng, nÕu ta truy cËp vµo tõng trêng cña biÕn X hay Y, ch¼ng h¹n X.a hay Y.a, ta sÏ bÞ ch¬ng tr×nh dÞch b¸o lçi ngay lËp tøc. Thùc ra, ngêi sö dông kh«ng hÒ biÕt ta dïng b¶n ghi ®Ó cµi ®Æt c¸c sè phøc hay ta cã thÓ dïng m¶ng, con trá... hay bÊt cø c¸ch nµo kh¸c.

VËy lµm c¸ch nµo ngêi sö dông cã thÓ thùc hiÖn c¸c thao t¸c trªn kiÓu d÷ liÖu mê? §óng nh ta ®· nãi trong môc tríc, ngêi sö dông sÏ chØ thùc hiÖn c¸c thao t¸c mµ ta x©y dùng cho kiÓu d÷ liÖu trõu t-îng. VÝ dô, víi phÐp céng hai sè phøc bÊt k×, ta cã thÓ x©y dùng thao t¸c víi tªn ComplexAdd ®Ó cho ra kÕt qu¶ cña phÐp céng. NÕu

- 59 -

ngêi sö dông muèn céng hai sè phøc, hä kh«ng ®îc phÐp céng trùc tiÕp: Z.a : = X.a + Y.a hay Z[1] := X[1] + Y[1];

Z.b : = X.b + Y.b Z[2] := X[2] + Y [2]

TÊt c¶ nh÷ng thao t¸c nµy ®Òu kh«ng hîp lÖ ®íi víi kiÓu d÷ liÖu mê. Thay vµo ®ã, ngêi sö dông chØ cÇn thùc hiÖn phÐp céng b»ng c¸ch sau:

Z := ComplexAdd(X,Y) (* tøc lµ Z: X + Y *)

NÕu khi x©y dùng kiÓu d÷ liÖu trõu tîng Complex ta bá qua phÐp to¸n céng trªn th× ngêi sö dông kh«ng cã c¸ch nµo mµ thùc hiÖn phÐp to¸n ®ã. VÝ dô nµy minh häa tÇm quan träng cña viÖc cÇn x©y dùng ®Çy ®ñ c¸c thao t¸c cÇn thiÕt cña mét kiÓu d÷ liÖu trõu tîng.

Nh÷ng thao t¸c mµ ta x©y dùng cho mét kiÓu d÷ liÖu mê sÏ ®îc cµi ®Æt thµnh nh÷ng thñ tôc hoÆc hµm. Vµ còng gièng nh chÝnh kiÓu d÷ liÖu mê, chóng còng ®îc t¸ch thµnh hai phÇn: phÇn ®Çu chÝnh lµ phÇn khai b¸o tªn thñ tôc vµ c¸c tham biÕn, cßn phÇn th©n, cho biÕt néi hµm cña thñ tôc ®îc cµi ®Æt nh thÕ nµo. PhÇn ®Çu cña thao t¸c ComplexAdd cã thÓ nh sau:

Procedure/function ComplexAdd(X: Complex; Y: Complex) : Complex;

PhÇn ®Çu nµy bao giê còng hiÓn thÞ ®èi víi ngêi sö dông nhng nh÷ng c©u lÖnh bªn trong th× hoµn toµn kh«ng nh vËy. Ngêi sö

- 60 -

dông kh«ng hÒ nhËn biÕt ®îc nh÷ng thao t¸c nµy ®îc cµi ®Æt nh thÕ nµo vµ nh÷ng thuËt to¸n nµo dïng ®Ó cµi ®Æt chóng. Hä chØ nhËn biÕt ®îc giao diÖn bªn ngoµi – ®ã lµ thao t¸c nµy yªu cÇu ®Çu vµo lµ g× vµ ®Çu ra cña nã lµ g×.Trong phÇn gi¶ m· chóng ta viÕt mét kiÓu d÷ liÖu trõu tîng sÏ gåm hai phÇn riªng nhng t¬ng thÝch nhau, mçi phÇn ®îc gäi lµ mét m« ®un. Mét m« ®un bao gåm phÇn hiÓn thÞ ®îc hay m« ®un ngoµi cña kiÓu d÷ liÖu trõu tîng, m« ®un kia bao gåm phÇn Èn hay m« ®un trong.M« ®un ngoµi bao gåm khai b¸o tÊt c¶ c¸c ®èi tîng ta muèn hiÓn thÞ ®îc cho ngêi sö dông. Nã bao hµm viÖc khai b¸o c¸c h»ng sè, khai b¸o c¸c kiÓu râ vµ kiÓu mê, khai b¸o c¸c biÕn vµ phÇn ®Çu cña c¸c thñ tôc, hµm ®îc thao t¸c trªn c¸c ®èi tîng. KÝ hiÖu mµ ta dïng cho m« ®un ngoµi lµ:

External Module Name; (* Khai b¸o tªn m« ®un *)Constant declarations; (* Khai b¸o h»ng *)Type declarations; (* Khai b¸o kiÓu, kÓ c¶ kiÓu râ vµ kiÓu

mê*)Var Declarations; (* Khai b¸o c¸c biÕn *)Procedure headings; (* Khai b¸o ®Çu c¸c thñ tôc hoÆc

hµm*)End Name;

H×nh 2.6 díi ®©y sÏ minh häa m« ®un ngoµi cña kiÓu d÷ liÖu trõu tîng Complex (cÇn chó ý r»ng ®©y cha ph¶i lµ minh häa ®Çy ®ñ, chóng ta cã thÓ thªm mét sè thao t¸c n÷a ®Ó lµm cho nã thùc sù h÷u dông trong thùc tÕ). M« ®un ngoµi nµy lµ mét ®¬n vÞ ch¬ng tr×nh ®éc lËp, nã cã thÓ ®îc viÕt, dÞch vµ lu tr÷ trong th viÖn cña ch¬ng tr×nh. Nã gåm nh÷ng thµnh tè mµ ngêi sö dông cã thÓ truy cËp ®èi víi kiÓu d÷ liÖu Complex.

- 61 -

§¬n vÞ ch¬ng tr×nh thø hai cÇn ph¶i ®îc hoµn thiÖn ®èi víi kiÓu d÷ liÖu trõu tîng nµy chÝnh lµ m« ®un trong. Nã cã hai chøc n¨ng:1. Nã chØ râ phÇn cµi ®Æt cña tÊt c¶ c¸c kiÓu mê chøa trong m« ®un ngoµi t¬ng thÝch víi nã.2. Nã chØ râ phÇn th©n cña tÊt c¶ c¸c thñ tôc ®· ®îc khai b¸o phÇn ®Çu trong m« ®un ngoµi t¬ng thÝch víi nã.

Trong khi m« ®un ngoµi nªu tÊt c¶ nh÷ng tµi nguyªn nµo ngêi sö dông cã thÓ truy cËp th× m« ®un trong ph¶i chØ râ c¸c kiÓu d÷ liÖu trõu tîng ®îc cµi ®Æt nh thÕ nµo. Tuy nhiªn, ngêi sö dông kh«ng ®îc truy cËp vµo nh÷ng th«ng tin vÒ phÇn cµi ®Æt nµy. H¬n thÕ n÷a, tÊt c¶ nh÷ng ®èi tîng trong m« ®un trong ®îc coi nh nh÷ng ®èi tîng ®Þa ph¬ng cña m« ®un ®ã vµ do ®ã kh«ng thÓ truy cËp ®îc.

Sau ®©y lµ vÝ dô minh häa m« ®un ngoµi, m« ®un trong cña kiÓu d÷ liÖu trõu tîng sè phøc ComplexNumbers nªu ë môc tríc.

M« ®un ngoµi ®Þnh nghÜa sè phøc vµ nh÷ng thao t¸c trªn c¸c sè phøc. KiÓu d÷ liÖu vµ nh÷ng thao t¸c trªn kiÓu d÷ liÖu ta ®· m« t¶ trong môc tríc. §Ó tiÖn víi thùc tÕ khi viÕt ch¬ng tr×nh, ta dïng tiÕng Anh ë phÇn minh häa nµy.

External Module ComplexNumber

Type Complex; (*KiÓu d÷ liÖu mê*)

Procedure ComplexAdd (X: Complex; Y: Complex) : Complex;(* BiÓu diÔn phÐp céng sè phøc*)

- 62 -

Procedure CreateComplex (A; Real; B: Real) : Complex;(*t¹o sè phøc cã phÇn thùc lµ A, phÇn ¶o lµ B*)

Procedure WriteComplex (X: Complex);(*ViÕt sè phøc ®· cho ra mµn h×nh*)End ComplexNumbers;

H×nh 2.6. M« ®un ngoµi cña kiÓu sè phøc----------------------------------------------------

Sau ®©y lµ nh÷ng kÝ hiÖu ta sÏ dïng ®Ó viÕt m« ®un trong.Internal Module Name;(Tªn ë ®©y gièng y nh tªn ë m« ®un ngoµi)

Constant declarations; (h»ng sè ë ®©y lµ ®Þa ph¬ng ®èi víi m« ®un trong)

Var declarations; (c¸c biÕn sè còng lµ ®Þa ph¬ng ®èi víi m« ®un trong)

Type declarations; (ë ®©y khai b¸o chi tiÕt c¸c kiÓu mê)

Procedure Name (Parameters); (ë ®©y cµi ®Æt phÇn th©n c¸c thñ tôc cã phÇn ®Çu n»m ë m« ®un ngoµi)

Begin...

End;...

- 63 -

End Name.

TiÕp sau ®©y, ta sÏ viÕt m« ®un trong cho kiÓu d÷ liÓu trõu tîng sè phøc mµ m« ®un ngoµi ®· ®îc viÕt ë trªn. B¶n th©n m« ®un trong còng lµ mét ®¬n vÞ ch¬ng tr×nh. Sau khi viÕt xong, nã sÏ ®îc dÞch vµ lu tr÷ trong th viÖn ch¬ng tr×nh. M« ®un trong nµy cïng víi m« ®un ngoµi sÏ t¹o nªn c¸i mµ ta thêng gäi lµ gãi (package) kiÓu d÷ liÖu trõu tîng.

--------------------------------------------------------------------------------------------(*Sau ®©y lµ m« ®un hµm chøa nh÷ng chi tiÕt bªn trong cña kiÓu d÷ liÖu trõu tîng Complex cïng víi viÖc cµi ®Æt c¸c thao t¸c cña kiÓu ®ã. KiÓu d÷ liÖu vµ nh÷ng thao t¸c nµy ®· ®îc nãi kÜ ë phÇn trªn*).

Internal Module ComplexNumbers;

TypeComplex = Record (*cÊu tróc bªn trong cña kiÓu d÷ liÖu trõu t-

îng*)a : Real;b : Real;

End;

(* Thao t¸c céng hai sè phøc*)Procedure ComplexAdd(X: Complex; Y : Complex) : Complex;

- 64 -

VarC : Complex;

BeginC.a := X.a + Y.a;C.b := X.n + Y.b;Return C;

End ComplexAdd;

(Thao t¸c t¹o mét sè phøc khi cho biÕt phÇn thùc vµ phÇn ¶o*)Procedure CreateComplex (A : real; B : Real) : Complex;Var

C : Complex;Begin

C.a := A;C.b := B;Return C;

End CreateComplex

(* ViÕt sè phøc ra mµn h×nh*)Procedure WriteComplex( X : Complex);Begin

Write(X.a, ‘+’, X.b, ‘i’); (* ViÕt ra x©u A + Bi*)End Write Complex;End ComplexNumbers;

H×nh 2.7: M« ®un trong cña kiÓu d÷ liÖu trõu tîng ComplexNumbers----------------------------------------------------------------------------------------

- 65 -

Ch¬ng tr×nh dÞch cã thÓ dÞch m« ®un trong vµ m« ®un ngoµi vµo nh÷ng thêi ®iÓm kh¸c nhau, tuy nhiªn nã ph¶i ®¶m b¶o ch¾c ch¾n ®îc sù t¬ng thÝch vÒ có ph¸p cña hai m« ®un nµy. Sù t¬ng thÝch nµy lµ rÊt cÇn thiÕt ®Ó ®¶m b¶o tÝnh ®óng ®¾n cña mét kiÓu d÷ liÖu trõu tîng. VÝ dô, gi¶ sö r»ng trong m« ®un ngoµi chøa phÇn ®Çu cña mét thñ tôc nh sau:

Procedure Kiemtra (A: Integer) : Boolean;nhng trong m« ®un trong t¬ng øng thao t¸c ®ã l¹i ®îc cµi ®Æt nh sau:

Procedure Kiemtra (X: Real; Y: Real) : Char; (sau ®ã ta míi cµi ®Æt phÇn th©n thñ tôc).NÕu nh vËy, ch¾c ch¾n ta còng bÞ ch¬ng tr×nh dÞch c¶nh b¸o vÒ sù kh«ng t¬ng thÝch ®ã vµ cho phÐp ta söa ch÷a tríc khi thñ tôc ®ã ®îc ®a vµo sö dông. Mét sè ng«n ng÷ lËp tr×nh chØ kiÓm tra kiÓu t¬ng thÝch trong mét ®¬n vÞ ch¬ng tr×nh chø kh«ng kiÓm tra kiÓu gi÷a c¸c ®¬n vÞ ch¬ng tr×nh ®· dÞch. ViÖc kiÓm tra nh thÕ cha ®ñ ®Ó hç trî kiÓu d÷ liÖu trõu tîng v× ®Þnh nghÜa kiÓu d÷ liÖu trõu tîng n»m trong hai m« ®un ch¬ng tr×nh kh¸c nhau.

ViÖc dÞch t¸ch rêi hai m« ®un trong ®Þnh nghÜa kiÓu d÷ liÖu trõu tîng sÏ ph¸t hiÖn ®îc nh÷ng lçi sau ®©y:

Kh«ng cµi ®Æt kiÓu d÷ liÖu trõu tîng ®· ®îc nªu trong m« ®un ngoµi.

Kh«ng cµi ®Æt th©n cña thñ tôc ®· ®îc khai b¸o trong m« ®un ngoµi.

Sù kh«ng t¬ng thÝch cña c¸c tham sè trong mçi thao t¸c ë m« ®un trong vµ m« ®un ngoµi.

- 66 -

Cßn mét vÊn ®Ò n÷a ta còng cÇn ph¶i nãi ®Õn lµ ch¬ng tr×nh øng dông sÏ truy cËp vµ sö dông tµi nguyªn mµ mét m« ®un ngoµi ®· t¹o ra vµ ®Æt trong th viÖn nh thÕ nµo. (Mét ch¬ng tr×nh sö dông tµi nguyªn cña mét m« ®un ngoµi thêng ®îc gäi lµ ch¬ng tr×nh cña kh¸ch hµng). Bëi v× m« ®un ngoµi ®îc dÞch t¸ch rêi vµ ®éc lËp víi ch¬ng tr×nh øng dông, nªn chóng ta kh«ng thÓ dïng luËt ph¹m vi cña nh÷ng ng«n ng÷ nh Pascal ®Ó chuyÓn mét ®èi tîng vµo ch¬ng tr×nh øng dông, ch¼ng h¹n nh trong vÝ dô sau ®©y:

Procedure A;Var x,y : Interger;

.

.

.Procedure B;

Trong vÝ dô trªn, biÕn x vµ biÕn y cã thÓ ®îc sö dông bëi thñ tôc B trong ph¹m vi thñ tôc A. Tuy nhiªn, kÜ thuËt nµy kh«ng cßn ®óng n÷a trong nh÷ng m« ®un ®éc lËp trong th viÖn cña kiÓu d÷ liÖu trõu tîng. Mét ch¬ng tr×nh øng dông muèn dïng mét kiÓu d÷ liÖu trõu tîng ph¶i chuyÓn kiÓu Êy vÒ chÝnh ch¬ng tr×nh ®ã. Qu¸ tr×nh chuyÓn tµi nguyªn tõ mét m« ®un ngoµi vµo mét ch¬ng tr×nh øng dông ®îc gäi lµ nhËp tµi nguyªn. Nã dîc thùc hiÖn khi ta khai b¸o lÖnh nhËp nh sau:

Import Tªnm«®unngoµi;ViÖc khai b¸o nµy cã ý nghÜa lµ ch¬ng tr×nh khai b¸o lÖnh nhËp khÈu ®ã cã thÓ sö dông mäi ®èi tîng t¹o ra trong m« ®un ngoµi Êy (h»ng, kiÓu trõu tîng, biÕn, tªn thñ tôc). VÝ dô nµy lµ sù khai b¸o nhËp khÈu toµn côc, hiÖu øng cña nã lµ mét tµi nguyªn trong m« ®un ngoµi ®Òu cã thÓ ®îc dïng bëi ngêi sö dông. Mét sè ng«n ng÷

- 67 -

cho phÐp nhËp khÈu chØ mét sè ®èi tîng trong m« ®un ngoµi, vÝ dô:

From TªnM«®unngoµi ImportObject1, Object2,..., Objectn;

lÖnh nµy cho phÐp b¹n chän nhËp nh÷ng ®èi tîng b¹n muèn chø kh«ng ph¶i tù ®éng nhËp tÊt c¶ mäi ®èi tîng.

H×nh 8 díi ®©y sÏ minh häa mét vÝ dô ®¬n gi¶n vÒ mét ch¬ng tr×nh nhËp kiÓu d÷ liÖu trõu tîng sè phøc Complex vµ ba phÐp to¸n trªn kiÓu nµy. Ch¬ng tr×nh sÏ dïng c¸c thao t¸c nµy t¹o ra hai sè phøc X vµ Y, sau ®ã céng hai sè nµy ®Ó ®îc mét sè phøc míi lµ Z vµ viÕt ra sè phøc Z mµ kh«ng cÇn biÕt c¸c sè phøc ®îc biÓu diÔn chi tiÕt ra sao.

(* M« ®un kh¸ch hµng ComplexExample sö dông kiÓu d÷ liÖu trõu t-îng ComplexNumbers ®· ®îc m« t¶ trong môc tríc*).

Module ComplexExample;

From ComplexNumbers ImportComplex, (* KiÓu d÷ liÖu trõu tîng)ComplexAdd, (* Hµm céng hai sè phøc*)CreateComplex, (* Hµm t¹o ra c¸c sè phøc*)WriteComplex;(* Thñ tôc biÓu diÔn mét sè phøc*)

Var X : Complex;Y : Complex;Z : Complex;

- 68 -

Begin(* T¹o ra sè phøc 4 + 5i*)X := CreateComplex (4.0, 5.0);

(* T¹o ra sè phøc 2 + 3i*)Y := CreateComplex(2.0,3.0 );

(*Céng hai sè phøc ®· t¹o ra vµ biÓu diÔn kÕt qu¶*)Z:= ComplexAdd (X,Y);WriteComplex(Z);

End ComplexExample.

H×nh 2.8: Minh häa mét ch¬ng tr×nh sö dông kiÓu d÷ liÖu trõu tîng sè phøc --------------------------------------------------------------------------------------------

§Ó thùc hiÖn m« ®un kh¸ch hµng trªn, tríc hÕt ta cÇn ph¶i dÞch nã sau ®ã liªn kÕt nã víi nh÷ng m« ®un ngoµi t¬ng øng. Có ph¸p cña nh÷ng lÖnh liªn kÕt nµy phô thuéc vµo tõng ng«n ng÷ lËp tr×nh vµ hÖ ®iÒu hµnh.

Tr×nh tù dÞch vµ liªn kÕt cÇn thùc hiÖn ®îc tãm t¾t trong s¬ ®å sau:

- 69 -

DÞch m« ®un ngoµi

DÞch m« ®un trong DÞch ch ¬ng tr×nh øng dông

Liªn kÕt ch ¬ng tr×nh øng dông víi m« ®un ngoµi vµ m« ®un trong

H×nh 2.9: Tr×nh tù dÞch c¸c m« ®un---------------------------------------------NÕu cã mét thay ®æi trong ch¬ng tr×nh øng dông th× còng kh«ng cÇn ph¶i dÞch l¹i nh÷ng m« ®un ngoµi vµ m« ®un trong, chØ ph¶i dÞch l¹i ch¬ng tr×nh øng dông vµ liªn kÕt l¹i nã víi c¸c m« ®un ngoµi vµ trong cña kiÓu d÷ liÖu trõu tîng. NÕu cã thay ®æi ë m« ®un trong th× th× còng kh«ng cÇn dÞch l¹i c¶ m« ®un ngoµi øng víi nã vµ ch¬ng tr×nh øng dông. Khi ®ã chØ viÖc dÞch l¹i m« ®un trong vµ liªn kÕt l¹i. Do nh÷ng chi tiÕt trong m« ®un trong bÞ che giÊu khái ch¬ng tr×nh øng dông nªn ch¬ng tr×nh øng dông kh«ng hÒ bÞ ¶nh hëng bëi nh÷ng thay ®æi trong m« ®un trong. Tuy nhiªn, nÕu m« ®un ngoµi thay ®æi ta sÏ ph¶i dÞch l¹i toµn bé m« ®un ngoµi, m« ®un trong vµ nh÷ng ch¬ng tr×nh øng dông sö dông nã. ChÝnh v× vËy, bÊt ®¾c dÜ míi ph¶i thay ®æi m« ®un ngoµi. §iÒu ®ã còng cho ta hiÓu mét lý do v× sao khi x©y dùng kiÓu d÷ liÖu trõu tîng ta cÇn ph¶i dµnh nhiÒu thêi gian cho c«ng ®o¹n thiÕt kÕ ban ®Çu. Mçi thay ®æi ë m« ®un ngoµi cã thÓ t¹o nªn nh÷ng thay ®æi rÊt lín cña toµn hÖ thèng.NÕu nh ta kh«ng dÞch l¹i mét m« ®un hay ch¬ng tr×nh nµo ë trong h×nh 9 th× ®a phÇn c¸c ng«n ng÷ lËp tr×nh hç trî kiÓu d÷ liÖu trõu tîng sÏ ®a ra th«ng b¸o lçi khi liªn kÕt lµ chóng ta ®ang sö dông nh÷ng m« ®un kh«ng t¬ng thÝch. NÕu chóng ta nhËn ®îc nh÷ng lçi ®ã ta cÇn ph¶i dÞch l¹i vµ liªn kÕt l¹i c¸c ®¬n vÞ ®ã theo ®óng thø tù.

- 70 -

2.4.2 Cµi ®Æt kiÓu d÷ liÖu trõu tîng líp häc trong ng«n ng÷ lËp tr×nh bËc cao

NÕu chóng ta ®· thùc hiÖn tèt viÖc thiÕt kÕ kiÓu d÷ liÖu trõu tîng th× viÖc chuyÓn nã thµnh m« ®un ngoµi lµ rÊt dÔ dµng.

TÊt c¶ nh÷ng nhËn xÐt, m« t¶, c¸c thµnh phÇn vµ c¸c cÊu tróc thêng ®îc viÕt ë ®Çu tiªn. Sau ®ã ®Õn phÇn kiÓu d÷ liÖu trõu tîng. Víi mçi thao t¸c cña kiÓu d÷ liÖu trõu tîng ta viÕt phÇn ®Çu cña thñ tôc. TÊt c¶ nh÷ng tµi nguyªn kh¸c, ch¼ng h¹n c¸c h»ng sè còng ®îc khai b¸o, gièng nh khai b¸o ë m« ®un ngoµi.

§Ó ngêi sö dông hiÓu râ chøc n¨ng cô thÓ cña mçi thao t¸c, viÖc m« t¶ ng÷ nghÜa cña mçi thao t¸c cÇn ph¶i bao hµm phÇn chó gi¶i ë ®Çu mçi thñ tôc. PhÇn nµy cÇn nãi thËt râ thñ tôc lµm g× vµ kÕt qu¶ cña thñ tôc lµ g×. TÊt nhiªn ta cã thÓ ®Æc t¶ phÇn nµy b»ng ng«n ng÷ tù nhiªn, nhng ®«i khi ph¶i kÕt hîp ng«n ng÷ tù nhiªn vµ ng÷ nghÜa tiªn ®Ò cña mçi thao t¸c.

Khi ®Þnh nghÜa kiÓu d÷ liÖu trõu tîng, ta nªn tu©n thñ ®Þnh d¹ng trong h×nh 10 díi ®©y. Nguyªn nh©n lµ do m« ®un ngoµi cã ý nghÜa nhiÒu h¬n so víi mét ®¬n vÞ ch¬ng tr×nh. Nã chÝnh lµ b¶n ®Æc t¶ chi tiÕt, râ rµng tÊt c¶ nh÷ng thao t¸c cña mét kiÓu d÷ liÖu trõu tîng. Nã chøa ®ùng tÊt c¶ nh÷ng th«ng tin cÇn thiÕt nhÊt cho ngêi lËp tr×nh cµi ®Æt m« ®un trong t¬ng øng. Nã còng ph¶i chøa c¶ nh÷ng th«ng tin ®Ó ngêi sö dông cã thÓ dùa vµo ®ã mµ quyÕt ®Þnh r»ng liÖu bé ch¬ng tr×nh ®ã cã ®óng lµ c¸i mµ hä cÇn kh«ng. Theo mét nghÜa nµo ®ã th× m« ®un ngoµi nh lµ mét b¶n

- 71 -

hîp ®ång gi÷a ngêi sö dông vµ ngêi thiÕt kÕ ch¬ng tr×nh, nã ph¶i m« t¶ chÝnh x¸c nh÷ng g× mµ nã sÏ lµm. Do vËy nã ph¶i ®îc viÕt chÝnh x¸c, ®Çy ®ñ vµ dÔ hiÓu.

Sau ®©y ta sÏ ®a ra ®Þnh nghÜa kiÓu d÷ liÖu trõu tîng Líp häc mµ ta ®· nãi nhiÒu ®Õn trong phÇn ®Çu cña ch¬ng. VÒ kiÓu d÷ liÖu Tµu háa ta dµnh cho ®éc gi¶ thùc hiÖn nh bµi tËp. External Module ClassPackage;Type Class; (* kiÓu d÷ liÖu trõu tîng *)

(* Thñ tôc Create tr¶ ra mét líp häc míi cha cã häc sinh nµo.Precondition: NonePostcondition: NumberStudent(CreateClass()) = 0 *)Procedure CreateClass(): Class;

(* Thñ tôc AddStudent thªm n häc sinh vµo sè häc sinh cña líp häc, tr¶ ra líp häc cã sè häc sinh b»ng sè häc sinh cò cña nã céng thªm n, nÕu tæng ®ã cha vît qu¸ 40.Precondition : C lµ mét líp häc, n lµ mét sè tù nhiªn kh«ng vît qu¸ 40.Postcondition : NÕu sè häc sinh cña C céng víi n kh«ng vît qu¸ 40 th× thñ tôc tr¶ ra kÕt qu¶ lµ mét líp häc cã sè häc sinh b»ng sè häc sinh cña C céng víi n, ngîc l¹i nã tr¶ ra líp häc cã sè häc sinh b»ng 40 *)Procedure AddStudent(Class, Integer): Class

(* Thñ tôc RemoveStudent, víi líp häc C vµ sè tù nhiªn n, tr¶ ra líp häc sau khi ®· bít ®i n häc sinh khái C, tÊt nhiªn, thñ tôc nµy sÏ tr¶ ra líp häc víi sè häc sinh lµ 0 nÕu n lín h¬n sè häc sinh ®· cã trong C.Precondition : C lµ mét líp häc, n lµ mét sè tù nhiªn kh«ng vît qu¸ 40.

- 72 -

n lµ mét sè tù nhiªn, 0<= n <= 40.Postcondition : If (NumberStudent(C) - n) >= 0 then NumberStudent(RemoveStudent(C,n)) = NumberStudent (C) - nElse

NumberStudent(RemoveStudent(C,n)) = 0Procedure RemoveStudent(Class, Integer): Class

(* Thñ tôc NumberStudent tr¶ ra sè häc sinh hiÖn t¹i cña líp häcPrecondition: C lµ mét líp häcPostcondition : Tr¶ ra sè häc sinh hiÖn t¹i cña líp häc *)Procedure NumberStudent (Class): Integer

(* Thñ tôc IsFull tr¶ ra gi¸ trÞ True nÕu líp häc ®· cã ®ñ 40 häc sinh, tr¶ ra gi¸ trÞ False nÕu ngîc l¹i.Precondition : C lµ mét líp häcPostcondition : If (NumberStudent (C) = 40) Then

IsFull (T) = TrueElse

IsFull(T) = False *)Procedure IsFull (Class): Boolean

(* Thñ tôc IsEmpty tr¶ ra gi¸ trÞ true nÕu líp häc kh«ng cã häc sinh nµo, ngîc l¹i, nã tr¶ ra gi¸ trÞ False.Precondition : C lµ mét líp häcPostcondition : If (NumberStudent (C) = 0) Then

IsEmpty (T) = TrueElse

IsEmpty(T) = False *)Procedure IsEmpty (Class): Boolean

- 73 -

End ClassPackage;

H×nh 2.10: M« ®un ngoµi cho kiÓu d÷ liÖu trõu tîng Líp häc-------------------------------------------------------------------------------

2.4.3 Ph¬ng tiÖn hç trî kiÓu d÷ liÖu trõu tîng trong mét sè ng«n ng÷ lËp tr×nh C¸ch viÕt gi¶ m· ®îc giíi thiÖu trong môc tríc lµ kh¸i qu¸t chung cho mét sè ng«n ng÷ lËp tr×nh th«ng dông, trõ mét sè nh÷ng chi tiÕt cô thÓ ®Æc thï cho tõng ng«n ng÷ hay trong mét sè m«i trêng lËp tr×nh cô thÓ. Sau ®©y ta sÏ m« t¶ v¾n t¾t kh¸i niÖm trõu tîng hãa d÷ liÖu trong mét sè ng«n ng÷ lËp tr×nh th«ng dông. Chóng ta kh«ng nãi thËt nhiÒu hay chi tiÕt vÒ tõng ng«n ng÷ mµ chóng ta sÏ chØ nãi kh¶ n¨ng hç trî viÖc x©y dùng kiÓu d÷ liÖu trõu tîng cña chóng, sù t¬ng tù vµ bµn vÒ c¶ sù kh¸c biÖt gi÷a chóng.

Ng«n ng÷ Modula-2

Ng«n ng÷ nµy rÊt gièng nh gi¶ m· mµ chóng ta ®· viÕt. Modula-2 ®-îc s¸ng t¹o bëi gi¸o s Niklaus Wirth, còng lµ t¸c gi¶ cña ng«n ng÷ lËp tr×nh Pascal. Modula-2 ®îc thiÕt kÕ ®Ó më réng kh¶ n¨ng cña Pascal vÒ hç trî trõu tîng hãa d÷ liÖu, ®ång thêi cã thÓ truy cËp ë møc thÊp. Trong Modula-2, viÖc m« t¶ kiÓu d÷ liÖu trõu tîng ®îc chia thµnh hai ®¬n vÞ cã thÓ dÞch t¸ch biÖt, ®ã lµ m« ®un ®Þnh nghÜa definition module vµ m« ®un cµi ®Æt implementation module. M« ®un ®Þnh nghÜa bao gåm tÊt c¶ c¸c khai b¸o kiÓu râ vµ kiÓu mê, c¸c h»ng, c¸c biÕn vµ phÇn ®Çu cña mçi ch¬ng tr×nh con. TÊt c¶ c¸c ®èi tîng khai b¸o trong m« ®un ®Þnh nghÜa ®Òu cã thÓ thÊy ®îc vµ cã thÓ ®îc nhËp bëi c¸c ®¬n vÞ kh¸c.

- 74 -

M« ®un cµi ®Æt bao gåm phÇn cµi ®Æt bªn trong cña c¸c kiÓu d÷ liÖu mê còng nh phÇn th©n cña c¸c thñ tôc cã phÇn ®Çu khai b¸o trong m« ®un ®Þnh nghÜa. H×nh 11 sau ®©y sÏ cho ta vÝ dô vÒ c¸ch cµi ®Æt mét kiÓu d÷ liÖu trõu tîng Date cïng víi hai thao t¸c cña nã lµ Tomorrow vµ WriteDate. Ta sÏ thÊy sù gièng nhau rÊt nhiÒu vÒ c¸ch viÕt m« ®un ngoµi, m« ®un trong cña chóng ta ë trªn víi m« ®un ®Þnh nghÜa vµ m« ®un cµi dÆt trong ng«n ng÷ Modula-2.

Modula-2 dïng c©u lÖnh Import dÓ truy cËp kiÓu d÷ liÖu ®· ®îc khai b¸o trong nh÷ng m« ®un ®Þnh nghÜa kh¸c. Trong vÝ dô sau ta sÏ dïng lÖnh Import ®Ó nhËp hai thao t¸c cÇn thiÕt lµ Write vµ WriteInt cho thñ tôc WriteDate. Nh÷ng thao t¸c hay thñ thôc nµy ®-îc nhËp tõ mét ®un hÖ thèng cã tªn lµ InOut. Modula-2 cã c¶ c¸c lÖnh toµn côc vµ lÖnh lùa chän.

Mét h¹n chÕ c¬ b¶n cña Modula-2 vÒ kiÓu d÷ liÖu trõu tîng lµ viÖc cµi ®Æt c¸c kiÓu d÷ liÖu mê nhÊt thiÕt chØ cã thÓ lµ kiÓu v« híng hoÆc kiÓu con trá. C¸c kiÓu cã cÊu tróc nh kiÓu m¶ng, kiÓu b¶n ghi lµ kh«ng ®îc phÐp sö dông. PhÐp h¹n chÕ nµy cho phÐp ch¬ng tr×nh dÞch biÕt chÝnh x¸c phÇn vµ ph©n bæ dung lîng bé nhí cÇn thiÕt cho c¸c kiÓu mê nµy mµ kh«ng cÇn biÕt vÒ viÖc cµi ®Æt c¸c kiÓu mê nµy (nh÷ng th«ng tin nµy ë trong m« ®un cµi ®Æt vµ cã thÓ viÕt vµ dÞch ë nh÷ng thêi ®iÓm kh¸c nhau). Thùc ra sù h¹n chÕ nµy còng kh«ng ®Õn nçi qu¸ nghiªm träng nh ta tëng. Nã chØ ®¬n gi¶n lµ nÕu b¹n muèn cµi ®Æt mét kiÓu d÷ liÖu mê T b»ng kiÓu cã cÊu tróc V, th× kiÓu nµy sÏ ®îc cµi ®Æt nh mét con trá trá ®Õn kiÓu cã cÊu tróc ®ã:

(* kiÓu d÷ liÖu trõu tîng trong Modula-2 *)

- 75 -

Definition module DatePackage;Type

Date; (* KiÓu d÷ liÖu trõu tîng *)

Procedure Tomorrow (D: Date) : Date;Procedure WriteDate (D:Date);

End DatePackage;

Implementation Module DatePackage;From InOut Import Write, WriteInt;Type Date = Pointer To

RecordMonth, Day, year : Integer;

End;Procedure Tomorrow (D : Date): Date;Begin

If D^.day = 31 Then (* §©y chØ lµ vÝ dô, ta kh«ng quan t©m ®Õn th¸ng cã Ýt h¬n 31 ngµy *)

D^.day :=1D^.Month := D^.Month + 1

ElseD^.day := D^.Day + 1

EndIf;If D^.Month := 13 Then

D^.Month := 1D^.Year := D^.Year + 1

EndIf;Return D

End Tomorrow;

- 76 -

Procedure WriteDate (D: Date);Begin

WriteInt(D^.Month,2); Write (‘/’);WriteInt(D^.Day,2); Write (‘/’);WriteInt(D^.Year,2);

End WriteDate;End DatePackage.

H×nh 2.11: KiÓu d÷ liÖu trõu tîng trong Modula-2----------------------------------------------------------------

Ng«n ng÷ Ada

Ada lµ mét ng«n ng÷ lËp tr×nh ®îc x©y dùng bëi Bé Quèc phßng Mü trong nh÷ng n¨m 1980. Ng«n ng÷ nµy ®îc x©y dùng nh»m ®Ó sö dông cµi ®Æt cho tÊt c¶ mäi hÖ thèng vµ phÇn mÒm cña qu©n ®éi Mü. Nã lµ mét ng«n ng÷ phøc t¹p vµ lín nhÊt lóc ®ã. Nã hç trî rÊt nhiÒu kh¸i niÖm míi ®Ó x©y dùng phÇn mÒm kÓ c¶ trõu tîng hãa d÷ liÖu, lËp tr×nh song song, xö lý c¸c ngo¹i lÖ,...Kh¶ n¨ng trõu tîng hãa d÷ liÖu cña nã t¬ng tù nh phÇn gi¶ m· ®· m« t¶ trong nh÷ng môc tríc.Trong Ada, nh÷ng ®¬n vÞ ch¬ng tr×nh trõu tîng hãa d÷ liÖu ®îc gäi lµ nh÷ng gãi (Package). PhÇn nh×n thÊy ®îc cña Package ®îc ®Ó ë phÇn ®Çu cña gãi ®îc gäi lµ Package header, cßn phÇn cµi ®Æt chi tiÕt ®îc ®Ó trong phÇn th©n cña gãi, gäi lµ Package body. Sù kh¸c biÖt gi÷a Ada vµ Modula-2 chñ yÕu lµ ë chç Ada cho phÐp mét kiÓu d÷ liÖu mê, thêng ®îc gäi lµ kiÓu riªng (private type), ®îc cµi ®Æt b»ng c¸ch sö dông bÊt cø kiÓu d÷ liÖu nµo cã trong ng«n ng÷ chø kh«ng ph¶i chØ lµ kiÓu v« híng vµ con trá. Sau ®©y ta sÏ viÕt kiÓu d÷ liÖu trõu tîng Date trong Ada. Ta sÏ thÊy r»ng Date ®îc cµi ®Æt lµ b¶n ghi chø kh«ng ph¶i con trá trá ®Õn b¶n ghi. Tuy

- 77 -

nhiªn, viÖc linh ho¹t nµy l¹i yªu cÇu phÇn m· m« t¶ sù cµi ®Æt bªn trong cña kiÓu riªng l¹i ph¶i ®Æt trong phÇn riªng cña package header chø kh«ng ph¶i ®Æt trong package body nh ë Modula-2. Nh vËy, ch¬ng tr×nh dÞch sÏ truy cËp phÇn chi tiÕt cµi ®Æt khi dÞch phÇn ®Çu cña gãi vµ x¸c ®Þnh râ kh«ng gian nhí cÇn thiÕt cho nh÷ng ®èi tîng thuéc kiÓu d÷ liÖu mê. C¸ch tiÕp cËn nµy cã nhîc ®iÓm lµ nÕu cã mét sù thay ®æi nµo ®ã trong phÐp cµi ®Æt còng yªu cÇu ph¶i dÞch l¹i c¶ phÇn ®Çu gãi vµ phÇn th©n gãi.Ada chØ hç trî d¹ng toµn côc cña lÖnh nhËp Import mµ kh«ng hç trî d¹ng lùa chän nh trong Modula-2. LÖnh nhËp cña Ada lµ:

With PackageName;

LÖnh nµy nhËp toµn bé c¸c tµi nguyªn râ ë phÇn ®Çu cña gãi cã tªn lµ PackageName. VÝ dô, lÖnh With Text_IO trong h×nh 12 sÏ nhËp toµn bé tµi nguyªn cña package Text_IO, bao hµm c¶ c¸c lÖnh ®äc vµ ghi d÷ liÖu kiÓu nguyªn n ReadInt, WriteInt.

LÖnh Use Text_IO trong h×nh 12 cho phÐp ta sö dông c¸c tµi nguyªn ®· nhËp mµ kh«ng cÇn ph¶i viÕt tªn package khi sö dông c¸c tµi nguyªn nµy n÷a. Tøc lµ ta kh«ng cÇn viÕt d¹ng PackageName.ResourceName mµ chØ cÇn viÕt ReourceName. Trong th©n cña thñ tôc WriteDate ta chØ cÇn viÕt WriteInt mµ kh«ng cÇn viÕt Text_IO.WriteInt.

(* KiÓu d÷ liÖu trõu tîng trong Ada *)Package DatePackage is

Type Date is Private;Procedure Tomorrow(D : In Date) Return Date;Procedure WriteDate(D: In Date);

- 78 -

PrivateType Date is Record

month, day, year : Integer; End;

End DatePakage.

With Text_IO; Use Text_IO;Package Body DatePackage is

Procedure Tomorrow (D : In Date) return Date;.. (* phÇn th©n thñ tôc Tomorrow *).

End Tomorrow;

Procedure WriteDate(D: In Date);.. (* phÇn th©n thñ tôc WriteDate *).

End WriteDate;

End DatePackage.

H×nh 2.12: KiÓu d÷ liÖu trõu tîng trong Ada---------------------------------------------------------

Ng«n ng÷ C ++Ng«n ng÷ cµi ®Æt hÖ thèng rÊt phæ dông lµ C l¹i kh«ng hç trî cho viÖc trõu tîng hãa d÷ liÖu, nhng C++ l¹i hç trî tèt vÊn ®Ò nµy. Ng«n ng÷ nµy cµi ®Æt kiÓu d÷ liÖu trõu tîng th«ng qua kh¸i niÖm

- 79 -

líp (class) ®îc mîn tõ ng«n ng÷ Simula-67. Mét class lµ mét cÊu tróc d÷ liÖu ®îc ®Þnh nghÜa bëi ngêi sö dông vµ cã c¶ phÇn chung vµ phÇn riªng. Thùc ra, mét class chÝnh lµ mét kiÓu d÷ liÖu trõu t-îng. PhÇn riªng bao gåm viÖc cµi ®Æt chi tiÕt c¸c cÊu tróc d÷ liÖu, phÇn chung bao gåm giao diÖn cña kiÓu d÷ liÖu trõu tîng, phÇn ®Çu cña mçi hµm mµ c¸c ®èi tîng cña class sö dông. Trong C++, kh«ng cã phÇn t¬ng ®¬ng víi m« ®un trong nh ta ®· nãi trong môc tríc. PhÇn th©n cña c¸c hµm cã thÓ ®Æt bÊt k× ë chç nµo trong ch-¬ng tr×nh.Bëi v× cã thÓ cã nh÷ng hµm cã cïng tªn nhng l¹i thuéc vÒ nh÷ng class kh¸c nhau nªn ta dïng kh¸i niÖm ClassName::FunctionName ®Ó chØ r»ng phÇn sau ®ã lµ th©n cña hµm cã tªn FunctionName ®· ®îc khai b¸o trong phÇn chung cña class cã tªn lµ ClassName.Trong C++ còng kh«ng cã c¬ chÕ nhËp têng minh. §Ó dïng mét hµm lµ thµnh viªn cña mét class, chóng ta chØ viÖc t¹o ra mét ®èi t-îng thuéc class ®ã vµ ¸p dông nh÷ng hµm cho ®èi tîng ®ã b»ng c¸ch viÕt: ClassName.FunctionName, ch¼ng h¹n:

Date t // Gi¶ sö t sÏ lµ biÕn chøa ngµy h«m nay

Void PrintTomorrowsDate() { t:= t.Tomorrow(); // ChuyÓn t thµnh ngµy mai

t.WriteDate(); // vµ in ngµy ®ã ra

}

// KiÓu d÷ liÖu trõu tîng trong C++class Date { // ®©y lµ phÇn riªng

int month, day, year; // Date cã ba thµnh phÇn kiÓu sè nguyªn

- 80 -

public: // §©y lµ phÇn nh×n thÊyDate Tomorrow ()Void WriteDate()

};Date Date::Tomorrow(){

... // §©y lµ th©n cña hµm Tomorrow};Void Date::WriteDate(){

... // §©y lµ th©n cña hµm WriteDate};

H×nh 2.13: KiÓu d÷ liÖu trõu tîng trong C++-----------------------------------------------------------

Ng«n ng÷ Turbo PascalVÝ dô cuèi cïng cña chóng ta vÒ mét ng«n ng÷ hç trî kiÓu d÷ liÖu trõu tîng n÷a, ®ã lµ ng«n ng÷ Turbo Pascal. Ng«n ng÷ Pascal chuÈn kh«ng hç trî viÖc trõu tîng hãa d÷ liÖu mµ ta ®· th¶o luËn trong ch¬ng nµy. (viÖc hç trî kiÓu d÷ liÖu trõu tîng lµ mét trong nh÷ng nguyªn nh©n chÝnh ®Ó xuÊt ph¸t tõ Pascal chuÈn, ngêi ta ®· x©y dùng vµ ph¸t triÓn ng«n ng÷ Modula-2). Tuy nhiªn, nh÷ng phiªn b¶n míi ®©y cña Turbo Pascal l¹i hç trî mét phÇn (chø kh«ng ph¶i lµ tÊt c¶) nh÷ng kh¸i niÖm trõu tîng hãa mµ ta võa th¶o luËn trong chong nµy. Nãi riªng, nh÷ng phiªn b¶n nµy cña Pascal hç trî ý tëng ®ãng gãi, trong ®ã mét kiÓu d÷ liÖu ®îc ®ãng gãi cïng víi nh÷ng thao t¸c trªn kiÓu d÷ liÖu ®ã, vµ c¶ víi tÊt c¶ nh÷ng tµi nguyªn ®îc nhËp nh lµ mét ®¬n vÞ vµo trong ch¬ng tr×nh. Tuy nhiªn, ta nãi ng«n ng÷ nµy kh«ng hç trî hoµn toµn kh¸i niÖm che giÊu th«ng tin qua viÖc sö dông kiÓu d÷ liÖu mê. Trong Turbo

- 81 -

Pascal, viÖc khai b¸o mét kiÓu d÷ liÖu nhÊt thiÕt kh«ng chØ gåm tªn cña nã mµ ph¶i cã c¶ phÇn cµi ®Æt bªn trong cña nã.

Mçi gãi tin trong Turbo Pascal ®îc gäi lµ mét ®¬n vÞ. Nã bao gåm phÇn giao diÖn (interface section) chøa nh÷ng tµi nguyªn nh×n thÊy cña ®¬n vÞ ch¼ng h¹n nh khai b¸o h»ng, khai b¸o biÕn, c¸c kiÓu d÷ liÖu râ vµ nh÷ng phÇn ®Çu thñ tôc. PhÇn thø hai cña mét ®¬n vÞ chÝnh lµ phÇn cµi ®Æt (implementation section), nã chøa ®ùng phÇn th©n cña c¸c thñ tôc khai b¸o trong phÇn giao diÖn. Hai phÇn giao diÖn vµ cµi ®Æt cña mét ®¬n vÞ ch¬ng tr×nh kh«ng ®îc dÞch t¸ch rêi nhau mµ chØ lµ hai phÇn cña mét ®¬n vÞ. §Ó nhËp tµi nguyªn cña mét ®¬n vÞ vµo mét ch¬ng tr×nh, ta dïng c©u lÖnh:

Uses UnitName;C©u lÖnh nµy sÏ lµm cho ch¬ng tr×nh cã thÓ sö dông tÊt c¶ mäi tµi nguyªn râ cña ®¬n vÞ cã tªn lµ UnitName. Turbo Pascal kh«ng hç trî kh¶ n¨ng nhËp lùa chän nh trong Mudula-2. Sau ®©y ta sÏ ®a ra vÝ dô cµi ®Æt kiÓu d÷ liÖu Date trong Turbo Pascal.

(* KiÓu d÷ liÖu trõu tîng trong Turbo Pascal *)Unit DatePackage;

InterfaceType Date = Record

month, day, year : Interger; End;

Function Tomorrow (D: Date) : Date;Procedure WriteDate (D: Date);

ImplementationUses SomeUnit; (* Gi¶ sö chóng ta cÇn tµi nguyªn cña

unit nµy *)

- 82 -

Function Tomorrow (D: Date): Date;Begin

... (* §©y lµ th©n cña hµm Tomorrow *)End;

Procedure WriteDate (D : Date);Begin

... (* §©y lµ th©n cña thñ tôc WriteDate *)End;

End.

H×nh 2.14 : KiÓu d÷ liÖu trõu tîng trong Turbo Pascal-----------------------------------------------------------------------

Khi nh×n l¹i nh÷ng vÝ dô võa nªu ta thÊy cã sù t¬ng tù rÊt nhiÒu vÒ nh÷ng kh¸i niÖm vµ kh¶ n¨ng cña bèn ng«n ng÷ mµ chóng ta võa th¶o luËn, cho dï chóng cã sù kh¸c nhau vÒ nh÷ng chi tiÕt cµi ®Æt. B»ng viÖc sö dông gi¶ m· ®¬n gi¶n vµ dÔ hiÓu chø kh«ng ph¶i tù trãi buéc vµo mét ng«n ng÷ cô thÓ, chóng ta cã thÓ tËp trung vµo nh÷ng nÐt quan träng cña nh÷ng kiÓu d÷ liÖu trõu tîng vµ cÊu tróc d÷ liÖu chø kh«ng bÞ sa lÇy vµo nh÷ng chi tiÕt thuéc có ph¸p hay nh÷ng chi tiÕt phôc thuéc vµo hÖ thèng hay h·ng s¶n xuÊt. T¹i giai ®o¹n nµy cña viÖc ph¸t triÓn phÇn mÒm th× viÖc quan t©m vµo nh÷ng chi tiÕt cña mét ng«n ng÷ kh«ng thËt sù quan träng b»ng quan t©m tíi nh÷ng nguyªn lý c¬ b¶n nh trõu tîng hãa d÷ liÖu, trõu tîng hãa thao t¸c vµ thiÕt kÕ c¸u tróc d÷ liÖu.Tuy nhiªn, viÖc th¶o luËn vÒ nh÷ng ng«n ng÷ trong môc nµy gióp cho nh÷ng häc sinh mong muèn cµi ®Æt vµ sö dông kiÓu d÷ liÖu trõu tîng lµm quen víi nh÷ng kh¶ n¨ng cña nh÷ng ng«n ng÷ ®ang ®îc sö dông réng r·i. Chóng ta còng khuyÕn khÝch ®éc gi¶ t×m

- 83 -

hiÓu thªm nh÷ng chi tiÕt vÒ kiÓu d÷ liÖu trõu tîng trong bèn ng«n ng÷ trªn.Ta sÏ tãm t¾t nh÷ng kÝ hiÖu gi¶ m· mµ chóng ta thêng dïng ®Ó diÔn ®¹t c¸c kiÓu d÷ liÖu trõu tîng trong s¬ ®å sau:

External Modules

External Module Module Name;Const Declarations;Type declarations; (* tÊt c¶ c¸c kiÓu râ vµ mê ®Òu khai b¸o ë

®©y *)Var Declarations;Procedure headings; (* chØ cã phÇn ®Çu chø kh«ng ph¶i lµ

phÇn th©n*)End ModuleName;

Opaque TypesType

Opaque TypeName;

Internal modulesInternal Module ModuleName;

Const declarations;Var Declarations;Type Declarations;

Procedure PName (parameters)Begin..

- 84 -

.End;

End ModuleName;

Import declarationsImport declarationsImport ModuleName;From ModuleName ImportName, Name,...

H×nh 2.15 : Tãm t¾t có ph¸p kiÓu d÷ liÖu trõu tîng---------------------------------------------------------------------

2.5 Nh÷ng u thÕ cña kiÓu d÷ liÖu trõu tîng

Sau khi ®· dµnh kh¸ nhiÒu thêi gian trong ch¬ng nµy nghiªn cøu vÒ ph¬ng ph¸p ®Æc t¶, thiÕt kÕ vµ x©y dùng kiÓu d÷ liÖu trõu tîng, ta cã thÓ ®Æt mét c©u hái rÊt tù nhiªn lµ: KiÓu d÷ liÖu trõu tîng cã vai trß nh thÕ nµo? KiÓu d÷ liÖu trõu tîng ®· trî gióp g× trong viÖc x©y dùng nh÷ng phÇn mÒm chÝnh x¸c, hiÖu qu¶ vµ dÔ b¶o tr×? Sau ®©y chóng ta sÏ nghiªn cøu mét sè vai trß quan träng cña kiÓu d÷ liÖu trõu tîng.øng dông ®Çu tiªn cña kiÓu d÷ liÖu trõu tîng mµ chóng ta nghiªn cøu lµ viÖc hç trî cho sù an toµn vµ nhÊt qu¸n cña phÇn mÒm. Víi kiÓu d÷ liÖu trõu tîng, ngêi sö dông chØ ®îc sö dông c¸c thao t¸c mµ ngêi thiÕt kÕ cung cÊp. Nh vËy, b¹n, víi t c¸ch lµ ngêi thiÕt kÕ phÇn mÒm, b¹n hoµn toµn kiÓm so¸t ®îc c¸c tµi nguyªn trong phÇn mÒm cña b¹n. §iÒu ®ã hç trî rÊt lín cho viÖc h¹n chÕ ngêi sö dông truy cËp kh«ng ®óng, truy cËp tr¸i phÐp hay sö dông nh÷ng thao t¸c nguy h¹i cho phÇn mÒm. Ch¼ng h¹n, gi¶ sö trong kiÓu d÷ liÖu

- 85 -

trõu tîng líp häc mµ ta ®· nghiªn cøu, vµ ngêi sö dông biÕt ta dïng biÕn con trá trá tíi biÕn nguyªn ®Ó chØ sè häc sinh trong mét líp häc. Khi ®ã, cã thÓ anh ta sÏ muèn cã mét líp häc cã nhiÒu h¬n 40 häc sinh, vµ anh ta sÏ biÓu diÔn thao t¸c sau:n^:= 45 (* xÕp mét líp häc cã vît qu¸ 40 häc sinh, ¾t h¼n lµ kh«ng ®îc phÐp*).Víi viÖc dïng kiÓu d÷ liÖu mê, thao t¸c nh trªn lµ kh«ng ®îc phÐp vµ nh vËy, tÝnh nhÊt qu¸n cña phÇn mÒm ®îc b¶o toµn.øng dông thø hai lµ tÝnh dÔ b¶o tr× phÇn mÒm khi dïng kiÓu d÷ liÖu trõu tîng. Nh÷ng gãi phÇn mÒm ®îc dïng liªn tôc mµ kh«ng ph¶i cËp nhËt hay b¶o tr× trong mét kho¶ng thêi gian 5, 10 hay 15 n¨m lµ gÇn nh kh«ng cã. Sau mét kho¶ng thêi gian sö dông, chóng thêng ®îc thay ®æi. Cã thÓ lµ chóng ®îc cËp nhËt, thay ®æi hay n©ng cÊp kh«ng ph¶i mét mµ cã thÓ nhiÒu lÇn. §Ó ®ì l·ng phÝ c«ng søc khi b¶o tr×, ta thêng muèn mçi sù thay ®æi cã ¶nh hëng Ýt nhÊt ®Õn c¸c m« ®un cña ch¬ng tr×nh. §iÒu ®ã ®· ®îc thÓ hiÖn trong viÖc trõu tîng ho¸ thao t¸c. Ch¼ng h¹n, khi b¹n viÕt lÖnh g¸n:y:= sin(x) - cos(x);b¹n kh«ng cÇn ph¶i quan t©m g× ®Õn thuËt to¸n dïng ®Ó cµi ®Æt c¸c hµm lîng gi¸c sin(x) vµ cos(x). Sù viÖc còng diÔn ra t¬ng tù ®èi víi viÖc trõu tîng ho¸ d÷ liÖu. M« ®un ngoµi lµ ®éc lËp víi viÖc cµi ®Æt bªn trong. ChÝnh v× vËy, c¶ m« ®un ngoµi vµ c¸c m« ®un øng dông sÏ kh«ng bÞ ¶nh hëng khi thay ®æi m« ®un trong liªn kÕt víi nã. (ThËt ra khi m« ®un trong thay ®æi th× m« ®un ngoµi t¬ng øng vµ c¸c m« ®un øng dông kh«ng cÇn ph¶i ®îc dÞch l¹i mµ chØ cÇn liªn kÕt l¹i víi m« ®un trong míi mµ th«i). Lîi thÕ nµy ®· t¹o ®iÒu kiÖn rÊt thuËn lîi cho viÖc b¶o tr× vµ gióp cho chi phÝ cña phÇn mÒm gi¶m ®¸ng kÓ trong thêi gian phÇn mÒm tån t¹i.

- 86 -

ViÖc trõu tîng ho¸ d÷ liÖu còng t¹o ®iÒu kiÖn thuËn lîi cho viÖc chia xÎ vµ sö dông l¹i c¸c phÇn mÒm. B»ng viÖc ®ãng gãi d÷ liÖu vµ c¸c thao t¸c ®ã l¹i råi dÞch riªng vµ ®a m« ®un ®ã vµo th viÖn, ta ®· lµm cho c¸c ch¬ng tr×nh kh¸c cã thÓ vµ sö dông nã. Nh c¸c b¹n ®· vµ sÏ biÕt, trong qu¸ tr×nh lËp tr×nh, ta vÉn thêng hay nhËp nh÷ng m« ®un mµ ta coi nh tµi nguyªn cña hÖ thèng, ch¼ng h¹n, ta nhËp m« ®un vÒ sö dông x©u kÝ tù, vÒ ®å ho¹, vÒ c¸c chøc n¨ng vµo ra d÷ liÖu hay nh÷ng thao t¸c trªn c¸c tÖp tin. ViÖc chia xÎ vµ sö dông l¹i lµm cho c«ng viÖc cña ngêi lËp tr×nh thªm hiÖu qu¶ vµ gióp cho gi¸ thµnh phÇn mÒm gi¶m ®¸ng kÓ.øng dông cuèi cïng cã thÓ trõu tîng nhÊt nhng còng cã thÓ lµ quan träng nhÊt. ViÖc trõu tîng hãa cho phÐp ta n©ng cao kh¶ n¨ng kh¸i qu¸t vÊn ®Ò. Chóng ta ®· më ®Çu ch¬ng nµy b»ng viÖc nãi vÒ sù trõu tîng ho¸ thñ tôc. Nã cho phÐp ta nh×n mét thao t¸c rÊt phøc t¹p (vÝ dô cña chóng ta lµ thñ tôc QuickSort) díi d¹ng mét giao diÖn hÕt søc ®¬n gi¶n, trong s¸ng Procedure QuickSort (List, N). Chóng ta kh«ng cÇn ph¶i hiÓu g× vÒ thuËt to¸n ®Ö qui t¬ng ®èi phøc t¹p QuickSort. Mét kiÓu d÷ liÖu trõu tîng còng cho chóng ta lîi thÕ t¬ng tù nh vËy. Chóng ta cã thÓ xem mét kiÓu d÷ liÖu phøc t¹p nh kiÓu d÷ liÖu Tµu ho¶ (Train) mµ ta võa nghiªn cøu díi d¹ng mét tËp hîp gåm c¸c thao t¸c rÊt ®¬n gi¶n vµ trong s¸ng (CreateTrain, Length, AddEngine, AddBoxcar). Chóng ta kh«ng cÇn ph¶i biÕt vÒ viÖc cµi ®Æt bªn trong víi hµng chôc hay hµng tr¨m dßng m· lÖnh. Khi ch-¬ng tr×nh lín gåm hµng ngµn dßng m· lÖnh, kh¶ n¨ng che giÊu bít c¸c chi tiÕt bªn trong vÒ cµi ®Æt mµ chØ quan t©m vµo nh÷ng chi tiÕt lín h¬n trë lªn hÕt søc quan träng. ThiÕu kh¶ n¨ng nµy ta dêng nh kh«ng thÓ nµo viÕt ®îc nh÷ng ch¬ng tr×nh lín. ChÝnh v× vËy mµ viÖc trõu tîng ho¸ thñ tôc vµ trõu tîng ho¸ d÷ liÖu lµ hai kÜ thuËt quan träng nhÊt trong qu¸ tr×nh x©y dùng vµ ph¸t triÓn phÇn mÒm.

- 87 -

KÕt luËnChóng ta võa nghiªn cøu ph¬ng ph¸p ®Æc t¶, thiÕt kÕ vµ x©y dùng kiÓu d÷ liÖu trõu tîng. Ta còng võa nghiªn cøu tÇm quan träng cña kiÓu d÷ liÖu trõu tîng vµ nh vËy chøng tá r»ng kiÓu d÷ liÖu trõu tîng lµ mét c«ng cô rÊt quan träng trong lËp tr×nh. Trong c¸c ch¬ng tiÕp theo ta sÏ dïng kiÓu d÷ liÖu trõu tîng ®Ó x©y dùng nh÷ng cÊu tróc d÷ liÖu nh danh s¸ch, ng¨n xÕp, c©y. Nh÷ng cÊu tróc nµy ®îc dïng rÊt nhiÒu trong khoa häc m¸y tÝnh.KiÓu d÷ liÖu trõu tîng ®Òu ®îc nghiªn cøu trong nh÷ng ng«n ng÷ lËp tr×nh ph¸t triÓn trong nh÷ng n¨m gÇn ®©y. Tuy nhiªn, cã mét líp ng«n ng÷ lËp tr×nh bËc cao ®· coi kiÓu d÷ liÖu trõu tîng nh mét nÐt ®Æc trng næi bËt cña nã, ®ã lµ líp ng«n ng÷ lËp tr×nh híng ®èi tîng. Kh¸i niÖm ®èi tîng lµ mét kh¸i niÖm c¬ b¶n cña líp ng«n ng÷ nµy. Nã gièng nh kh¸i niÖm kiÓu d÷ liÖu trõu tîng mµ chóng ta võa nghiªn cøu. Tuy nhiªn, c¸c ng«n ng÷ lËp tr×nh híng ®èi tîng còng cßn cã rÊt nhiÒu kh¶ n¨ng kh¸c n÷a. ThËt ra, Modula-2 hay Ada kh«ng ®îc xem lµ thuéc líp ng«n ng÷ nµy. Líp ng«n ng÷ híng ®èi tîng ®· ®ãng mét vai trß rÊt quan träng trong kÜ thuËt lËp tr×nh, gãp phÇn t¹o ra nh÷ng phÇn mÒm tèt, gi¸ c¶ ph¶i ch¨ng vµ dÔ b¶o tr×.

Víi nh÷ng kiÓu d÷ liÖu trõu tîng mµ ta sÏ nghiªn cøu trong nh÷ng ch¬ng sau nh ng¨n xÕp (Stack), hµng ®îi (Queue), c©y (Tree)...chóng t«i sÏ ®Æc t¶ nh÷ng thao t¸c chÝnh vµ híng dÉn cµi ®Æt mét sè trong nh÷ng thao t¸c ®ã. B¹n ®äc cÇn tham kh¶o híng dÉn cña ch¬ng nµy vµ cµi ®Æt chóng trong mét ng«n ng÷ lËp tr×nh cô thÓ ®Ó ®a vµo sö dông. ChØ khi biÕt c¸ch sö dông chóng b¹n míi thÊy râ hÕt ®îc tÝnh u viÖt cña kiÓu d÷ liÖu trõu tîng.

C©u hái vµ bµi tËp

- 88 -

1. H·y dïng kiÓu m¶ng trong ng«n ng÷ lËp tr×nh Pascal, cho vÝ dô vÒ:

a. Mét thao t¸c biÕn ®æib. Mét thao t¸c t¹o lËpc. Mét thao t¸c quan s¸t

trªn m¶ng.

2. Cho biÕt nh÷ng kiÓu d÷ liÖu sau ®©y lµ kiÓu d÷ liÖu ®¬n (nguyªn thuû) hay kiÓu d÷ liÖu phøc hîp (cã cÊu tróc)? Gi¶i thÝch.

a. TÖpb. Con trác. TËp hîpd. KiÓu liÖt kª

3. H·y thªm nh÷ng thao t¸c sau ®©y vµo kiÓu d÷ liÖu trõu tîng líp häc (Class). Víi mçi thao t¸c ®ã, h·y viÕt có ph¸p, ng÷ nghÜa, ®iÒu kiÖn tríc, ®iÒu kiÖn sau cña nã.

a. ReadNumberStudent(C): Cho kÕt qu¶ lµ sè häc sinh trong líp häc C.

b. CreateFullClass(C): T¹o ra mét líp häc cã ®ñ 40 häc sinh.c. EmptyOutClass(C): §Æt sè häc sinh cña líp häc C b»ng 0.d. Transfer(C1, C2): ChuyÓn toµn bé sè häc sinh cña líp häc

C1 sang líp häc C2, sè häc sinh cña líp häc C1 trë thµnh 0.

4. B¹n cã thÓ nghÜ thªm ra thao t¸c nµo kh¸c víi nh÷ng thao t¸c ®· nªu trong bµi tËp sè 3 ë trªn ®èi víi kiÓu d÷ liÖu trõu tîng Líp häc. H·y thùc hiÖn c¸c c«ng viÖc nh bµi tËp sè 3 ®èi víi mçi thao t¸c míi ®ã.

- 89 -

5. H·y hoµn thiÖn viÖc thiÕt kÕ kiÓu d÷ liÖu trõu tîng tµu ho¶ Train trong bµi häc b»ng c¸ch thªm vµo nh÷ng thao t¸c hîp lý. Víi mçi thao t¸c míi ®ã, h·y viÕt có ph¸p, ng÷ nghÜa, ®iÒu kiÖn tríc, ®iÒu kiÖn sau cña nã.

6. Thay ®æi c¸c qui t¾c ng÷ nghÜa cña kiÓu d÷ liÖu Líp häc trong h×nh 4 ®Ó nÕu khi ta ®Þnh thªm häc sinh vµo Líp häc mµ sè häc sinh cña líp cã thÓ vît qu¸ giíi h¹n cho phÐp lµ 40, hoÆc nÕu ta ®Þnh chuyÓn ®i mét sè häc sinh nhiÒu h¬n so víi sè häc sinh ®ang ë trong líp th× cã th«ng b¸o lçi.

7. H·y gi¶i thÝch t¹i sao trong Turbo Pascal ta kh«ng cÇn cã lÖnh Import.

8. M« ®un ngoµi kh«ng chØ cÇn thiÕt khi x©y dùng kiÓu d÷ liÖu trõu tîng mµ cßn cÇn ®Ó cã thÓ nhãm mét sè tµi nguyªn cÇn thiÕt vµo mét gãi (package). H·y viÕt mét m« ®un ngoµi chøa nh÷ng phÐp ®æi ®¬n vÞ ®o sau ®©y l¹i:

a. 2.54cm = 1 inchb. 3.79 lÝt = 1 galonc. 28.35 gam = 1 ounced. 0.3048 mÐt = 1 foot.

9. Gi¶i thÝch t¹i sao ng«n ng÷ lËp tr×nh Pascal kh«ng hç trî c¸c kiÓu mê.

10. Cã ®iÒu g× sai ®èi víi hai m« ®un ngoµi sau:

External Module M;From N Import Y;

External Module N;From M Import X;

- 90 -

Procedure X;Procedure Z;End M.

Procedure Y;End N;

11. H·y viÕt mét m« ®un øng dông, m« ®un nµy dïng m« ®un ngoµi ComplexNumber ë h×nh 6 trong ch¬ng ®Ó thùc hiÖn phÐp céng vµ in ra kÕt qu¶ cña tæng sau:

(2 + 3i) + (7 – i) + 8

12. ViÕt mét m« ®un øng dông, dïng cÊu tróc d÷ liÖu trõu tîng líp häc ë h×nh 10, thùc hiÖn c¸c thao t¸c sau:

a. T¹o mét líp häc míi Cb. NhËp mét sè nguyªn d¬ng nc. Thªm n häc sinh vµo líp häc Cd. LÆp l¹i c¸c bíc b vµ c cho ®Õn khi líp häc ®ñ häc sinh hoÆc sè häc sinh bÞ vît qu¸ giíi h¹n cho phÐp.

13. H·y viÕt m« ®un ngoµi cho kiÓu d÷ liÖu trõu tîng Tµu ho¶ ®-îc m« t¶ trong ch¬ng.

14. H·y cµi ®Æt m« ®un trong cho c¸c kiÓu d÷ liÖu trõu tîng Líp häc vµ Tµu ho¶, §Çu m¸y, Toa xe ®· nãi trong ch¬ng.

15. H·y thiÕt kÕ, ®Æc t¶, cµi ®Æt kiÓu d÷ liÖu trõu tîng Ma trËn víi c¸c phÐp to¸n th«ng thêng: céng, nh©n, chuyÓn vÞ. Chó ý theo híng dÉn cña ch¬ng vÒ có ph¸p, ng÷ nghÜa, ®iÒu kiÖn tríc, ®iÒu kiÖn sau vµ thiÕt kÕ m« ®un. Dïng mét ng«n ng÷ lËp tr×nh nµo ®ã, hç trî cho kiÓu d÷ liÖu trõu tîng.

- 91 -

16. H·y viÕt m« ®un trong cho c¸c sè phøc ë h×nh 6 nÕu dïng c¸ch cµi ®Æt sau ®©y:TypeComplex = Array [ 1..2 ] of Real;SÏ cã nh÷ng thay ®æi g× ®èi víi ngêi sö dông kiÓu d÷ liÖu trõu tîng sè phøc?

- 92 -

Ch¬ng 3 CÊu tróc d÷ liÖu tuyÕn tÝnh vµ cµi ®Æt

Trong ch¬ng nµy chóng ta sÏ nghiªn cøu kiÓu d÷ liÖu trõu tîng danh s¸ch. §©y lµ mét trong nh÷ng kiÓu d÷ liÖu trõu tîng c¬ b¶n nhÊt vµ thêng xuyªn ®îc sö dông khi x©y dùng c¸c ch¬ng tr×nh øng dông. Tríc hÕt nh÷ng ®Æc t¶ (mang tÝnh h×nh thøc) vÒ danh s¸ch ®îc tr×nh bµy. TiÕp theo ®ã, chóng ta sÏ xem xÐt mét vµi c¸ch cµi ®Æt kh¸c nhau cña kiÓu danh s¸ch vµ so s¸nh chóng. Hai trêng hîp ®Æc biÖt cña danh s¸ch : ng¨n xÕp (stack), trong ®ã c¸c phÇn tö ®îc thªm vµo vµ bá ®i chØ t¹i mét ®Çu; hµng ®îi (queue), trong ®ã c¸c phÇn tö ®îc thªm vµo t¹i mét ®Çu vµ lo¹i bá ®i t¹i ®Çu kia còng sÏ ®îc ®Ò cËp ®Õn. Mét vµi vÝ dô øng dông sÏ ®îc giíi thiÖu kÌm theo mçi kiÓu d÷ liÖu trõu tîng tr×nh bµy trong ch¬ng.

3.1 Ph©n lo¹i c¸c cÊu tróc d÷ liÖuKiÓu d÷ liÖu lµ mét tËp c¸c gi¸ trÞ cïng víi tËp c¸c thao t¸c ®îc

x¸c ®Þnh trªn nh÷ng gi¸ trÞ nµy. Nh÷ng kiÓu d÷ liÖu ®¬n gi¶n (cßn gäi lµ kiÓu v« híng) lµ nh÷ng kiÓu ®îc t¹o nªn tõ c¸c gi¸ trÞ kh«ng thÓ ph©n chia thµnh nh÷ng thµnh phÇn nhá h¬n. Ch¼ng h¹n trong ng«n ng÷ lËp tr×nh quen thuéc nh Pascal th× integer, real, char, boolean lµ nh÷ng kiÓu d÷ liÖu ®¬n gi¶n. Nh÷ng kiÓu d÷ liÖu phøc hîp, (thêng gäi lµ nh÷ng cÊu tróc d÷ liÖu) ®îc t¹o nªn tõ nh÷ng phÇn tö mµ mçi phÇn tö ®ã ®Òu cã thÓ ph©n t¸ch ®îc thµnh c¸c thµnh phÇn thuéc kiÓu d÷ liÖu ®¬n gi¶n hay thuéc kiÓu d÷ liÖu phøc hîp kh¸c. KiÓu m¶ng hay kiÓu b¶n ghi, vèn quen thuéc víi chóng ta trong ng«n ng÷ Pascal vµ trong nhiÒu ng«n ng÷ lËp tr×nh kh¸c, lµ nh÷ng vÝ dô dÔ thÊy vÒ kiÓu d÷ liÖu cã cÊu tróc. Tuy nhiªn ®ã vÉn lµ nh÷ng kiÓu d÷ liÖu tiÒn ®Þnh, hiÓu theo nghÜa do mét ng«n ng÷ lËp tr×nh cung cÊp s½n. ViÖc lËp tr×nh gi¶i quyÕt mét bµi to¸n ®Æt ra trong thùc tÕ cã thÓ ®îc tiÕn hµnh qua hai giai

- 93 -

®o¹n. Tríc hÕt chóng ta thÓ hiÖn thÕ giíi thùc cña bµi to¸n b»ng m« h×nh to¸n häc phï hîp tøc lµ chän vµ x©y dùng kiÓu d÷ liÖu trõu t-îng phï hîp. Sau ®ã chóng ta cµi ®Æt (hay cßn gäi lµ thÓ hiÖn) c¸c kiÓu d÷ liÖu trõu tîng nµy tõ c¸c kiÓu d÷ liÖu tiÒn ®Þnh cña mét ng«n ng÷ lËp tr×nh cô thÓ, theo nh÷ng ph¬ng thøc x©y dùng ®îc phÐp, råi trªn c¬ së ®ã cµi ®Æt c¸c thuËt to¸n ®Ó cã kÕt qu¶ nhê m¸y. Nh÷ng kiÓu d÷ liÖu míi ®îc x©y dùng theo nh÷ng ph¬ng thøc nµo ®ã tõ nh÷ng kiÓu d÷ liÖu tiÒn ®Þnh cña mét ng«n ng÷ lËp tr×nh còng lµ nh÷ng kiÓu d÷ liÖu cã cÊu tróc (cßn gäi lµ nh÷ng cÊu tróc d÷ liÖu)

C¸c cÊu tróc d÷ liÖu cã thÓ ®îc ph©n lo¹i dùa vµo mèi quan hÖ mang tÝnh cÊu tróc gi÷a c¸c phÇn tö cña kiÓu d÷ liÖu ®ã. Víi ý tëng ph©n lo¹i nh vËy, cã bèn lo¹i cÊu tróc d÷ liÖu ®îc kÓ ®Õn:

CÊu tróc d÷ liÖu tuyÕn tÝnh. §Æc ®iÓm cña nh÷ng cÊu tróc d÷ liÖu thuéc lo¹i nµy lµ gi÷a c¸c phÇn tö cã mèi quan hÖ mét:mét, hiÓu theo nghÜa: mçi phÇn tö (trõ phÇn tö ®Çu vµ phÇn tö cuèi) ®Òu cã ®óng mét phÇn tö kÒ tríc vµ cã ®óng mét phÇn tö kÒ sau. KiÓu cÊu tróc nh vËy ®îc minh häa ë h×nh 3.1a. Ngay trong ch¬ng nµy chóng ta sÏ kh¶o s¸t nh÷ng cÊu tróc d÷ liÖu tuyÕn tÝnh.

- 94 -

- 95 -

PhÇn tö ®Çu tiªnStart

PhÇn tö cuèi cïngFinish

Cã duy nhÊt mét tiÒn bèi (ngay tr íc)

Cã duy nhÊt mét hËu bèi (ngay sau)

NhiÒu tiÒn bèi

NhiÒu hËu bèi

PhÇn tö ë ®Ønh (Top)

Duy nhÊt mét tiÒn bèi

Cã thÓ nhiÒu hËu bèi

Kh«ng cã tiÒn bèi Kh«ng cã hËu bèi

a)

b)

c)

d)H×nh

3.1

CÊu tróc d÷ liÖu ph©n cÊp. §Æc ®iÓm cña nh÷ng cÊu tróc d÷ liÖu thuéc kiÓu nµy lµ gi÷a c¸c phÇn tö cã mèi quan hÖ mét:nhiÒu, hiÓu theo nghÜa: mçi phÇn tö cã thÓ cã nhiÒu phÇn tö con nhng chØ cã ®óng mét phÇn tö cha (trõ mét phÇn tö ®Æc biÖt gäi lµ root th× kh«ng cã cha). KiÓu cÊu tróc nh vËy ®îc minh häa ë h×nh 3.1b. Mçi cÊu tróc d÷ liÖu ph©n cÊp nh vËy cßn ®îc gäi lµ mét c©y. CÊu tróc d÷ liÖu c©y sÏ ®îc tr×nh bµy ë ch¬ng 5

CÊu tróc ®å thÞ. §Æc ®iÓm cña nh÷ng cÊu tróc ®å thÞ lµ gi÷a c¸c phÇn tö cã mèi quan hÖ nhiÒu:nhiÒu, hiÓu theo nghÜa: mçi phÇn tö cã thÓ nèi víi nhiÒu phÇn tö kh¸c vµ cã thÓ ®îc nèi víi nhiÒu phÇn tö kh¸c. CÊu tróc ®å thÞ lµ kiÓu biÓu diÔn d÷ liÖu phøc t¹p nhÊt. KiÓu cÊu tróc nh vËy ®îc minh häa ë h×nh 3.1c. Víi ch¬ng 7, chóng ta sÏ xem xÐt c¸c cÊu tróc ®å thÞ.

CÊu tróc tËp hîp. Kh¸c víi ba lo¹i cÊu tróc ®· nªu trªn, trong mét tËp hîp kh«ng cã mét mèi quan hÖ trùc tiÕp gi÷a c¸c phÇn tö nµo ®ã. TÊt c¶ c¸c phÇn tö cña tËp hîp ®Òu cã chung mét mèi quan hÖ duy nhÊt: chóng ®Òu lµ thµnh viªn cña cïng mét tËp hîp t¹o nªn bëi chóng. Kh«ng cã kh¸i niÖm vÒ vÞ trÝ chÝnh x¸c cña mét phÇn tö trong mét tËp hîp. KiÓu cÊu tróc tËp hîp ®îc minh häa ë h×nh 3.1d. KiÓu cÊu tróc nµy vµ mét sè d¹ng kh¸c cña nã, ch¼ng h¹n nh b¶ng, sÏ ®îc tr×nh bµy ë ch¬ng 6.

3.2 KiÓu d÷ liÖu trõu tîng "danh s¸ch" (list)

- 96 -

Mét c¸ch to¸n häc, danh s¸ch lµ mét d·y h÷u h¹n phÇn tö cïng thuéc mét kiÓu nµo ®ã (gäi lµ kiÓu_ phÇn_ tö). Chóng ta thêng biÓu diÔn mét danh s¸ch nh vËy bëi mét d·y c¸c phÇn tö, c¸c phÇn tö c¸ch nhau bëi mét dÊu phÈy

a1,a2, ........,an

trong ®ã n 0 , vµ mäi ai ®Òu thuéc kiÓu kiÓu_phÇn_tö. Sè n lµ sè c¸c phÇn tö cßn ®îc gäi lµ ®é dµi cña danh s¸ch. Gi¶ sö n 1 , chóng ta nãi r»ng a1 lµ phÇn tö ®Çu tiªn vµ an lµ phÇn tö cuèi cïng. NÕu n = 0, chóng ta cã mét danh s¸ch rçng, nghÜa lµ mét danh s¸ch kh«ng cã mét phÇn tö nµo.

Trong ®êi sèng, tõ danh s¸ch còng thêng ®îc dïng, ch¼ng h¹n: danh s¸ch nh÷ng ngêi ®¨ng ký tham gia mét cuéc thi, danh s¸ch nh÷ng quyÓn s¸ch xuÊt b¶n n¨m 2003, danh s¸ch nhiÖt ®é trung b×nh cña mçi ngµy trong th¸ng,...Chóng ta coi nh÷ng danh s¸ch kÓ trªn lµ nh÷ng vÝ dô lÊy tõ thùc tÕ, cã tÝnh trùc quan khi minh häa cho kiÓu d÷ liÖu trõu tîng danh s¸ch ®ang ®îc xem xÐt ë ®©y.

Danh s¸ch lµ mét cÊu tróc ®Æc biÖt linh ho¹t bëi chóng ta cã thÓ lµm mét danh s¸ch dµi ra hay co ng¾n l¹i. §èi víi mét vÞ trÝ bÊt kú trong danh s¸ch, chóng ta cã thÓ truy nhËp vµo phÇn tö t¹i vÞ trÝ nµy, xãa bá ®i phÇn tö t¹i vÞ trÝ kia vµ còng cã thÓ thªm mét phÇn tö vµo mét vÞ trÝ nµo ®ã trong danh s¸ch. C¸c danh s¸ch còng cã thÓ nèi l¹i ®îc víi nhau hay t¸ch ra thµnh nh÷ng danh s¸ch con. Danh s¸ch thêng sinh ra trong nh÷ng øng dông ch¼ng h¹n nh t×m kiÕm th«ng tin, ch¬ng tr×nh dÞch vµ m« pháng.Danh s¸ch cã mét ®Æc trng quan träng lµ c¸c phÇn tö cña

danh s¸ch cã thÓ xÕp tuyÕn tÝnh t¬ng øng víi vÞ trÝ cña chóng trong danh s¸ch. Chóng ta nãi r»ng ai ®øng tríc ai+1 ®èi víi i= 1,2,3, ... n-1, vµ ai theo sau ai-1 víi i = 2,3,4, ....n, r»ng phÇn tö a i ë vÞ trÝ i.

- 97 -

§Ó t¹o nªn mét kiÓu d÷ liÖu trõu tîng t¬ng øng víi kh¸i niÖm cã tÝnh chÊt to¸n häc cña danh s¸ch, chóng ta cÇn ph¶i ®Þnh nghÜa mét tËp hîp c¸c thao t¸c trªn c¸c ®èi tîng thuéc kiÓu danh_s¸ch Còng nh nhiÒu kiÓu d÷ liÖu trõu tîng kh¸c ®îc tr×nh bµy trong gi¸o tr×nh nµy, kh«ng mét tËp hîp nµo cña c¸c thao t¸c l¹i thÝch hîp víi tÊt c¶ c¸c øng dông. ë ®©y chóng ta sÏ chØ ®a ra mét tËp hîp c¸c thao t¸c mang tÝnh ®¹i diÖn. Chó ý, trong phÇn m« t¶ thao t¸c, L lµ danh s¸ch, I lµ trêng th«ng tin cña mét phÇn tö, P lµ vÞ trÝ cña mét phÇn tö nµo ®ã trong danh s¸ch.

C¸c thao t¸c t¹o vµ huû

1. L:=Create(). Thao t¸c nµy tr¶ vÒ mét danh s¸ch rçng, tøc lµ danh s¸ch kh«ng cã phÇn tö.

2. Destroy(L). Thao t¸c nµy kÕt thóc sù tån t¹i cña L.

C¸c thao t¸c kiÓm tra

3. Size(L). Hµm nµy tr¶ vÒ mét gi¸ trÞ nguyªn, t¬ng øng víi sè phÇn tö hiÖn cã trong danh s¸ch L. NÕu danh s¸ch L rçng th× hµm nµy sÏ tr¶ vÒ 0.

4. Locate(L,P). Hµm nµy tr¶ vÒ gi¸ trÞ nguyªn tõ 0 ®Õn N, t¬ng øng víi thø tù cña phÇn tö ë vÞ trÝ P trong danh s¸ch. NÕu lµ phÇn tö ®Çu tiªn trong danh s¸ch th× hµm nµy tr¶ vÒ gi¸ trÞ 1. NÕu L rçng, hµm nµy sÏ tr¶ vÒ gi¸ trÞ 0.

C¸c thao t¸c x¸c ®Þnh vÞ trÝ

5. P = First(L). Thao t¸c nµy tr¶ vÒ phÇn tö ®Çu tiªn trong danh s¸ch. NÕu L rçng th× tr¶ vÒ Null.

6. P = End(L). Thao t¸c tr¶ vÒ phÇn tö cuèi cïng cña danh s¸ch L. NÕu L rçng th× tr¶ vÒ Null

- 98 -

7. P = Next(L,P). Thao t¸c nµy tr¶ vÒ phÇn tö kÕ tiÕp P trong danh s¸ch. NÕu P lµ Null hoÆc P ®ang trá tíi phÇn tö cuèi cïng trong danh s¸ch th× hµm nµy sÏ tr¶ vÒ gi¸ trÞ Null.

8. P = Previous(P,L). Thao t¸c nµy tr¶ vÒ phÇn tö kÒ tríc P trong danh s¸ch. NÕu P lµ Null hoÆc P ®ang trá tíi phÇn tö ®Çu tiªn trong danh s¸ch th× hµm nµy sÏ tr¶ vÒ gi¸ trÞ Null.

C¸c thao t¸c bæ sung vµ lo¹i bá

C¸c thao t¸c nµy sÏ lµm thay ®æi danh s¸ch vµ tr¶ vÒ danh s¸ch ®· bÞ thay ®æi

9. InsertFirst(L,I). Thao t¸c nµy bæ sung mét phÇn tö míi cã gi¸ trÞ I vµo ®Çu danh s¸ch.

10. InsertAfter(L,P,I). Thao t¸c nµy bæ sung mét phÇn tö míi cã gi¸ trÞ I vµo ngay sau phÇn tö ë vÞ trÝ P. NÕu P lµ Null th× thao t¸c sÏ kh«ng tr¶ kÕt qu¶ ®óng.

11. Delete(L,P). Thao t¸c nµy xo¸ phÇn tö ë vÞ trÝ P ra khái danh s¸ch. NÕu tríc khi xo¸ P b»ng Null th× thao t¸c nµy tr¶ kÕt qu¶ kh«ng chÝnh x¸c.

Thao t¸c lÊy th«ng tin

Thao t¸c nµy lÊy néi dung trêng th«ng tin cña mét phÇn tö nµo ®ã trong danh s¸ch. §©y lµ thao t¸c kiÓm tra v× nã kh«ng lµm thay ®æi danh s¸ch.

12. I:=Retrieve(L,P). Thao t¸c nµy sÏ lÊy th«ng tin cña phÇn tö ë vÞ trÝ P trong danh s¸ch L vµ g¸n cho I. NÕu P b»ng Null, thao t¸c nµy kh«ng tr¶ vÒ gi¸ trÞ ®óng. Danh s¸ch L kh«ng bÞ thay ®æi sau khi thùc hiÖn thao t¸c nµy.

Tuy nhiªn, nh ®· ®Ò cËp tõ tríc, cßn cã rÊt nhiÒu thao t¸c kh¸c còng cã thÓ ®îc lùa chän ®Ó ®a vµo package. VÝ dô nh c¸c thao t¸c sau:

- 99 -

InsertAtEnd(L,I) bæ sung mét phÇn tö cã gi¸ trÞ I vµo cuèi danh s¸ch L

DeleteFirst(L) xo¸ phÇn tö ®Çu tiªn cña danh s¸ch L

Concatenate(L1,L2) ghÐp hai danh s¸ch (gièng nh ghÐp hai String )

Sort(L) s¾p xÕp L theo thø tù

Split(L,N,L1,L2) t¸ch L thµnh 2 danh s¸ch ë vÞ trÝ N. L1 chøa N phÇn tö ®Çu tiªn cña L vµ L2 chøa phÇn cßn l¹i.

Sau ®©y lµ External Module cña kiÓu d÷ liÖu trõu tîng danh s¸ch tuyÕn tÝnh víi mêi mét thao t¸c chÝnh ®· m« t¶ ë trªn.

- 100 -

External Module LinearListPackage;From ElementModule Import Element;Type

LinearListType; (*KiÓu d÷ liÖu cña c¸c phÇn tö trong danh s¸ch*)

Position; (*KiÓu vÞ trÝ*)Procedure Create() : LinearListType;(* Create t¹o ra mét danh s¸ch tuyÕn tÝnh rçng.

§iÒu kiÖn tr íc: None §iÒu kiÖn sau: Size(Create()) = 0*)

Procedure Destroy(Var L : LinearListType);(* Destroy xo¸ tÊt c¶ c¸c nót trong danh s¸ch L, kÕt thóc sù tån t¹i cña L.

§iÒu kiÖn tr íc: None §iÒu kiÖn sau: BÊt kú c¸c thao t¸c nµo thùc hiÖn

trªn L ®Òu bÞ lçi*)

Procedure Size(L : LinearListType) : Integer;(* Size tr¶ vÒ sè lîng c¸c nót trong danh s¸ch L.

§iÒu kiÖn tríc: None §iÒu kiÖn sau: Tr¶ vÒ sè lîng c¸c nót trong L*)

Procedure Locate(L : LinearListType, P: Position) : Integer;(* Locate tr¶ vÒ thø tù cña phÇn tö ®îc x¸c ®Þnh bëi P.

§iÒu kiÖn tríc: P<>Null §iÒu kiÖn sau: NÕu ®iÒu kiÖn tríc tho¶ m·n th× tr¶ vÒ

vÞ trÝ cña nót ®îc x¸c ®Þnh bëi P. NÕu ®iÒu kiÖn tríc kh«ng tho¶ m·n th× tr¶

vÒ gi¸ trÞ 0*)Procedure First(L : LinearListType):Position;(* First tr¶ vÒ vÞ trÝ cña phÇn tö ®Çu tiªn trong danh s¸ch.

§iÒu kiÖn tríc: Size(L)>0§iÒu kiÖn sau: NÕu ®iÒu kiÖn tríc tho¶ m·n th× tr¶ vÒ

vÞ trÝ cña phÇn tö ®Çu tiªn trong danh s¸ch NÕu ®iÒu kiÖn tríc kh«ng tho¶ m·n th× tr¶

vÒ Null*)Procedure End(L : LinearListType):Position;(* End tr¶ vÒ vÞ trÝ cña phÇn tö cuèi cïng trong danh s¸ch.

§iÒu kiÖn tríc: Size(L)>0§iÒu kiÖn sau:NÕu ®iÒu kiÖn tríc tho¶ m·n th× tr¶ vÒ vÞ

trÝ cña phÇn tö cuèi cïng trong danh s¸ch NÕu ®iÒu kiÖn tríc kh«ng tho¶ m·n th× tr¶

vÒ Null*)Procedure Next(P:Position, L : LinearListType):Position;(* Next tr¶ vÒ vÞ trÝ cña phÇn tö ®øng kÒ sau phÇn tö ®îc x¸c ®Þnh bëi P. NÕu phÇn tö ®îc x¸c ®Þnh bëi P kh«ng cã phÇn tö kÒ sau th× tr¶ vÒ Null.

§iÒu kiÖn tríc: P<>Null vµ Locate(P,L)<Size(L)§iÒu kiÖn sau: NÕu ®iÒu kiÖn tríc tho¶ m·n th× tr¶ vÒ

vÞ trÝ cña phÇn tö kÒ sau phÇn tö ®îc x¸c ®Þnh bëi P.

NÕu ®iÒu kiÖn tríc kh«ng tho¶ m·n th× tr¶ vÒ Null*)Procedure Previous(P:Position, L : LinearListType):Position;(* Next tr¶ vÒ vÞ trÝ cña phÇn tö ®øng kÒ tríc phÇn tö ®îc x¸c

§Ó minh häa cho nh÷ng thao t¸c thêng gÆp trªn danh s¸ch, h·y xem xÐt mét øng dông ®¬n gi¶n sau ®©y.

VÝ dô 3.1 Chóng ta cã mét danh s¸ch vµ b©y giê chóng ta ph¶i lo¹i bá

khái nã nh÷ng phÇn tö lÆp (tøc lµ lo¹i bá nh÷ng phÇn tö trïng víi

- 101 -

Procedure InsertAfter(E: Element, P:PostionType,Var L : LinearListType);(* InsertAfter chÌn thªm mét phÇn tö vµo sau phÇn tö ® îc x¸c ®Þnh bëi P.

§iÒu kiÖn tr íc: P<>Null §iÒu kiÖn sau: NÕu ®iÒu kiÖn tr íc tho¶ m·n th×

Retrieve(P,InsertAfter(E,P,L)) = E Locate(P,L)+1 =Locate(P,InsertAfter(E,P,L))

NÕu ®iÒu kiÖn tr íc kh«ng tho¶ m·n th× InsertAfter sÏ kh«ng cho kÕt qu¶ ®óng*)Procedure Delete(P: PostionType, Var L : LinearListType);(* Delete xo¸ phÇn tö ® îc x¸c ®inh bëi P.

§iÒu kiÖn tr íc: P<>Null §iÒu kiÖn sau: NÕu ®iÒu kiÖn tr íc tho¶ m·n th×

Retrieve(Next(P,L),L) = Retrieve(P,Delete(P,L)) Size(Delete(P,L)) = Size(L) - 1

NÕu ®iÒu kiÖn tr íc kh«ng tho¶ m·n th× Delete sÏ kh«ng cho kÕt qu¶ ®óng*)

Procedure Retrieve( P:Position, L : LinearListType) : Element;(* Tr¶ vÒ phÇn tö ® îc x¸c ®Þnh bëi P

§iÒu kiÖn tr íc: P<>Null§iÒu kiÖn sau: NÕu ®iÒu kiÖn tr íc tho¶ m·n th× tr¶

vÒ phÇn tö ® îc x¸c ®Þnh bëi PNÕu ®iÒu kiÖn tr íc kh«ng tho¶ m·n th× Retrieve sÏ kh«ng cho kÕt qu¶ ®óng*)

nh÷ng phÇn tö ®· cã mÆt trong danh s¸ch). ý tëng gi¶i quyÕt bµi to¸n nµy kh¸ ®¬n gi¶n: ®èi víi mçi mét thµnh phÇn (phÇn tö) trong danh s¸ch chóng ta lo¹i bá nh÷ng thµnh phÇn b»ng nã ®øng ë sau. §Ó diÔn ®¹t thuËt to¸n nµy chóng ta sÏ cÇn ®Õn c¸c thao t¸c x¸c ®Þnh ®îc phÇn tö ®Çu tiªn trong danh s¸ch, råi tõng bíc ®i ®Õn tÊt c¶ c¸c phÇn tö tiÕp theo, truy nhËp vµ lo¹i bá mét sè phÇn tö. Chóng ta viÕt thñ tôc Purge (var L: danh_s¸ch), thñ tôc nµy coi danh s¸ch nh mét tham sè vµ lo¹i bá nh÷ng phÇn tö lÆp l¹i khái danh s¸ch L. C¸c phÇn tö cña danh s¸ch thuéc kiÓu kiÓu_phÇn_tö vµ mét danh s¸ch c¸c phÇn tö nh vËy cã kiÓu danh_s¸ch.

Ngoµi mét sè trong nh÷ng thao t¸c ®· kÓ ra ë trªn, sÏ rÊt tiÖn lîi nÕu chóng ta cã thªm hµm Same(x,y). C¸c tham sè x vµ y cña hµm nµy thuéc kiÓu kiÓu_phÇn_tö, hµm cã gi¸ trÞ TRUE nÕu x vµ y lµ "nh nhau ", cã gi¸ trÞ FALSE trong trêng hîp ngîc l¹i. Kh¸i niÖm "nh nhau" tïy thuéc vµo nh÷ng trêng hîp cô thÓ. NÕu kiÓu_phÇn_tö lµ thùc ch¼ng h¹n, chóng ta cã thÓ coi Same(x,y) lµ true nÕu vµ chØ nÕu x=y. Cßn nÕu kiÓu_phÇn_tö lµ b¶n ghi bao gåm sè tµi kho¶n, tªn vµ ®Þa chØ ®îc m« t¶ nh sau

typekiÓu_phÇn_tö = record

accno: integer;name: packed array[1..20] of char;address: packed array[1..50] of char;

end

th× chóng ta cã thÓ coi Same(x,y) lµ true khi x.accno=y.accno.

Thñ tôc Purge ®îc cho ë h×nh 3.2 díi ®©y. C¸c biÕn p vµ q ®-îc dïng ®Ó biÓu diÔn hai vÞ trÝ trong danh s¸ch. Theo qu¸ tr×nh thùc hiÖn thñ tôc nµy, nh÷ng b¶n sao cña phÇn tö ë vÞ trÝ p sÏ bÞ

- 102 -

lo¹i bá khái danh s¸ch L. Trong vßng lÆp (2) - (8) biÕn q ®îc sö dông ®Ó duyÖt qua c¸c phÇn tö trong danh s¸ch kÓ tõ phÇn tö ë vÞ trÝ tiÕp sau vÞ trÝ p ®Õn cuèi danh s¸ch. Mçi phÇn tö ®îc duyÖt qua theo biÕn q sÏ ®îc kiÓm tra bëi hµm Same vµ cã thÓ bÞ lo¹i bá khi Same ph¸t hiÖn ®îc nã lµ b¶n sao cña phÇn tö ë vÞ trÝ p. Thñ tôc ®-îc b¾t ®Çu víi p lµ vÞ trÝ ®Çu tiªn trong danh s¸ch, mçi khi thanh trõ xong c¸c b¶n sao cña phÇn tö ë vÞ trÝ p th× p ®îc chuyÓn dÞch xuèng vÞ trÝ tiÕp theo vµ qu¸ tr×nh l¹i ®îc lÆp l¹i.

KÕt qu¶ cña viÖc thùc hiÖn thñ tôc Purge díi ®©y kh«ng phô thuéc vµo c¸c c¸ch cµi ®Æt kh¸c nhau cña kiÓu d÷ liÖu trõu tîng danh_s¸ch

procedure Purge (var L: danh_s¸ch);(*Purge bá ®i nh÷ng phÇn tö lÆp l¹i trong danh s¸ch*)var p,q : vÞ_trÝ;

(*p sÏ lµ vÞ trÝ hiÖn thêi trong danh s¸ch, q sÏ tiÕn lªn ®Ó t×m c¸c phÇn tö trïng lÆp*)

begin(1) p:=First(L);(2) while p<> End(L) do begin(3) q:=Next(L,p);(4) while q<>End(L) do(5) if Same(Retrieve(L,p),Retrieve(L,q)) then(6) Delete(L,q)

else (7) q:=Next(L,q);(8) p:=Next(L,p);

end;end;{Purge}

- 103 -

H×nh 3.2 Thñ tôc lo¹i bá nh÷ng phÇn tö lÆp l¹i

H·y ®Ó ý ®Õn th©n cña vßng lÆp trong, c¸c dßng tõ (4) ®Õn (7) trong h×nh 3.2. Khi chóng ta lo¹i bá khái danh s¸ch phÇn tö t¹i vÞ trÝ q (ë dßng 6), c¸c phÇn tö ë c¸c vÞ trÝ q+1, q+2, . . . , chuyÓn dÞch lªn tríc mét vÞ trÝ trong danh s¸ch. Trêng hîp riªng nÕu q lµ vÞ trÝ cuèi trong danh s¸ch, gi¸ trÞ cña q sÏ lµ End(L). NÕu chóng ta thùc hiÖn sau ®ã Next(End(L),L) th× kÕt qu¶ lµ kh«ng x¸c ®Þnh. Bëi vËy chØ (6) hoÆc chØ (7) ®îc thùc hiÖn, kh«ng bao giê c¶ hai dßng nµy cïng ®îc thùc hiÖn trong cïng mét bíc lÆp theo ®iÒu kiÖn q=End(L) ë dßng (4).

3.3 Cµi ®Æt c¸c danh s¸ch

Môc nµy tr×nh bµy mét sè cÊu tróc d÷ liÖu cã thÓ dïng ®Ó biÓu diÔn c¸c danh s¸ch. Chóng ta sÏ xem xÐt ®Õn c¸c c¸ch cµi ®Æt danh s¸ch b»ng m¶ng, b»ng con trá mãc nèi. T¬ng øng víi mçi c¸ch cµi ®Æt sÏ cã mét tËp hîp c¸c thao t¸c nµo ®ã trªn danh s¸ch hiÖu qu¶ h¬n mét sè nh÷ng thao t¸c kh¸c .

3.3.1 Cµi ®Æt c¸c danh s¸ch b»ng m¶ng

HiÖn nay c¸c ng«n ng÷ lËp tr×nh th«ng dông ®Òu cung cÊp kiÓu d÷ liÖu cã cÊu tróc m¶ng (array). Mét c¸ch tù nhiªn, chóng ta cã thÓ nghÜ ngay ®Õn viÖc lu tr÷ c¸c phÇn tö kÕ tiÕp nhau trong mét danh s¸ch vµo c¸c thµnh phÇn kÕ tiÕp nhau cña mét m¶ng. KiÓu phÇn tö cña m¶ng sÏ ph¶i lµ kiÓu_phÇn_tö ë danh s¸ch. ChØ sè mçi thµnh phÇn cña m¶ng cho chóng ta th«ng tin vÒ vÞ trÝ cña phÇn tö danh s¸ch ®îc lu tr÷ trong thµnh phÇn ®ã. Khi khai b¸o sö dông mét m¶ng, kÝch thíc cña m¶ng ®îc ®Þnh s½n vµ kh«ng thay ®æi trong qu¸ tr×nh thùc hiÖn ch¬ng tr×nh. Tuy nhiªn danh s¸ch ®îc cµi ®Æt

- 104 -

b»ng m¶ng nµy l¹i cã ®é dµi thay ®æi. Gi¶ sö r»ng phÇn tö ®Çu tiªn trong danh s¸ch (nÕu danh s¸ch kh¸c rçng) lu«n ®Æt ë thµnh phÇn ®Çu tiªn cña m¶ng. Nh vËy khi dïng kiÓu d÷ liÖu m¶ng (trong mét ng«n ng÷ lËp tr×nh) ®Ó thÓ hiÖn mét danh s¸ch, cã hai th«ng tin cho phÐp x¸c ®Þnh danh s¸ch ë thêi ®iÓm hiÖn t¹i, ®ã lµ: m¶ng (chøa phÇn tö cña danh s¸ch) vµ sè phÇn tö hiÖn cã cña danh s¸ch.

Trong cµi ®Æt b»ng m¶ng chóng ta cã thÓ ®Þnh nghÜa kiÓu danh_s¸ch (trong khai b¸o díi ®©y dïng tiÕng Anh)* lµ mét b¶n ghi gåm hai trêng. Trêng thø nhÊt lµ mét m¶ng c¸c phÇn tö, ®é dµi cña m¶ng ®ñ víi kÝch thíc tèi ®a cña danh s¸ch mµ chóng ta sÏ gÆp. Tr-êng thø hai lµ mét sè nguyªn End chØ ®Õn vÞ trÝ phÇn tö cuèi cïng cña danh s¸ch trong m¶ng. PhÇn tö thø i cña danh s¸ch ë ng¨n thø i cña m¶ng víi 1£ i £ End, nh trong h×nh 3.3. C¸c vÞ trÝ trong danh s¸ch ®îc biÓu diÔn b»ng c¸c sè nguyªn, vÞ trÝ thø i bëi sè nguyªn i.(*) list : danh_s¸ch

elementtype: kiÓu_phÇn_töposition: vÞ_trÝ

H×nh 3.3 Dïng m¶ng biÓu diÔn danh s¸ch

C¸c khai b¸o quan träng lµ :

const

- 105 -

PhÇn tö ®Çu tiªn elementPhÇn tö thø

hai

PhÇn tö cuèi cïng element

12

max length

End

Danh s¸ch

Kh«ng thuéc danh s¸ch

maxlength=100 {mét h»ng nµo ®ã thÝch hîp}type

list=recordelement: array[1..maxlength] of element_type;End:integer;

end;position:integer

Víi c¸ch biÓu diÔn mét danh s¸ch nh vËy mét sè thao t¸c trªn danh s¸ch ®îc cµi ®Æt mét c¸ch rÊt dÔ dµng:

- First(L) ®a ra chØ sè ®Çu tiªn cña m¶ng (th«ng thêng lµ 1) - End(L) chØ ®a ra L.End +1;- Next(p, L) ®a ra p+1;- Creat(L) g¸n sè nguyªn ®øng liÒn tríc chØ sè ®Çu tiªn cña

m¶ng cho L.End - Full(L) chØ kiÓm tra tÝnh ®óng cña ®¼ng thøc L.End =

maxlength- Empty(L) chØ kiÓm tra tÝnh ®óng cña bÊt ®¼ng thøc L.End <

First(L)- Retrieve (p, L) ®¬n gi¶n lµ hµm ®a ra phÇn tö ë chØ sè p cña

m¶ng chøa danh s¸ch L, nghÜa lµ tr¶ ra L.element[p]

Khi viÕt ch¬ng tr×nh cã sö dông kiÓu d÷ liÖu trõu tîng danh s¸ch víi cµi ®Æt b»ng m¶ng, mét sè trong nh÷ng thao t¸c ®¬n gi¶n kÓ trªn cã thÓ ®îc viÕt nh mét c©u lÖnh thay v× ®îc tæ chøc riªng biÖt thµnh hµm hay thñ tôc.

Giê ®©y chóng ta h·y xem xÐt c¸c thao t¸c kh¸c. ViÖc duyÖt danh s¸ch vµ t×m kiÕm mét ®èi tîng trong danh s¸ch thùc chÊt lµ viÖc duyÖt vµ t×m kiÕm mét ®èi tîng trong mét ®o¹n cña m¶ng, tõ ®Çu m¶ng cho ®Õn vÞ trÝ End. Khi danh s¸ch cha ®Çy, nghÜa lµ cha cho¸n hÕt m¶ng, chóng ta sÏ kh«ng gÆp khã kh¨n víi ý ®Þnh

- 106 -

thªm phÇn tö míi vµo cuèi danh s¸ch. Tuy nhiªn viÖc chÌn thªm mét phÇn tö vµo gi÷a danh s¸ch, ch¼ng h¹n ë vÞ trÝ p, ®ßi hái dÞch chuyÓn tÊt c¶ c¸c phÇn tö ®ang ë vÞ trÝ p vµ sau p ra sau mét vÞ trÝ (trong m¶ng) ®Ó t¹o thµnh mét ng¨n cho phÇn tö míi. T¬ng tù, viÖc xãa ®i mét phÇn tö bÊt k× trõ phi nã lµ phÇn tö cuèi còng ®ßi hái dÞch mét sè phÇn tö lªn ®Ó lÊp l¹i kho¶ng trèng.

Theo c¸ch cµi ®Æt danh s¸ch b»ng m¶ng ®· tr×nh bµy ë trªn chóng ta cã thÓ cµi ®Æt c¸c thao t¸c Insert, Delete, vµ Locate nh ë h×nh 3.3. Insert chuyÓn dÞch c¸c phÇn tö t¹i c¸c vÞ trÝ p, p+1, . . . , End xuèng c¸c vÞ trÝ p+1, p+2, . . . . , End+1 vµ sau ®ã chÌn phÇn tö míi vµo vÞ trÝ p. NÕu kh«ng cßn chç trong m¶ng ®Ó thªm mét phÇn tö th× thñ tôc error() ®îc gäi ®Ó th«ng b¸o lçi vµ sau ®ã ch¬ng tr×nh bÞ ng¾t kh«ng tiÕp tôc thùc hiÖn n÷a. Delete sÏ lo¹i bá ®i phÇn tö t¹i vÞ trÝ p b»ng viÖc dÞch chuyÓn c¸c phÇn tö t¹i c¸c vÞ trÝ p+1, p+2, . . . , End lªn vÞ trÝ p, p+1, . . . , End -1. Locate tuÇn tù quÐt trªn m¶ng ®Ó t×m mét phÇn tö ®· biÕt. NÕu kh«ng t×m thÊy phÇn tö nµy, Locate sÏ tr¶ ra L.End+1.

procedure Insert (var L : list; x: elementtype; p : position);(*ChÌn thªm x vµo vÞ trÝ p trong danh s¸ch*)

var q: position;

beginif L.End >= maxlength then

error(' danh s¸ch ®· ®Çy ')else if (p>L.End+1) or (p<1) then

error (' kh«ng cã vÞ trÝ nµy')else begin

for q:= L.End downto p do

- 107 -

(*chuyÓn dÞch c¸c phÇn tö t¹i p, p+1, ... xuèng mét vÞ trÝ *)

L. element [q+1] := L. element [q];L.End:=L.End+1;L. element [p]:= x;

end;end; {Insert}.

procedure Delete (p : position; var L : list);(*Xãa phÇn tö ë vÞ trÝ p trong danh s¸ch L*)

var q: position;

beginif (p >L.End) or (p<1) then

error(' kh«ng cã vÞ trÝ nµy ')else begin

L.End:=L.End-1;for q := p to L.End do(*chuyÓn dÞch c¸c phÇn tö t¹i p+1, p+2, . . . lªn mét vÞ

trÝ*) L.element [q]:= L.element [q+1];

end;end; {Delete}

function Locate (x: position; var L :list) : position ;(*T×m vµ ®a ra vÞ trÝ cña x trong danh s¸ch L*)

var q: position;

beginfor q:= 1 to L.End do

if L. element [q] = x then

- 108 -

return(q);return (L.End + 1); (* nÕu kh«ng t×m thÊy *)

end; {Locate}H×nh 3.4 Cµi ®Æt c¸c thao t¸c khi dïng m¶ng biÓu diÔn danh

s¸ch

NÕu tríc khi x©y dùng thñ tôc Purge ë h×nh 3.2 chóng ta ®· cã: 1. c¸c ®Þnh nghÜa vÒ kiÓu phÇn tö elementtype vµ hµm

Same(x,y),2. c¸c ®Þnh nghÜa vÒ danh s¸ch list, vÞ trÝ position nh ë trªn,3. ®Þnh nghÜa vÒ Delete nh ë h×nh 3.4 vµ4. ®Þnh nghÜa thÝch hîp cho c¸c thñ tôc tÇm thêng End, First, Next,

vµ Retrieve,th× chóng ta ®· cã ®ñ ®iÒu kiÖn ®Ó thùc hiÖn ®îc Purge Cã thÓ thÊy r»ng: ch¬ng tr×nh cña chóng ta kh«ng bÞ lÖ thuéc vµo nh÷ng cÊu tróc d÷ liÖu c¬ së, khi chóng ta sö dông c¸c thao t¸c trªn c¸c kiÓu d÷ liÖu trõu tîng thay v× dïng nh÷ng cµi ®Æt cô thÓ chi tiÕt. NÕu ph¶i thay ®æi nh÷ng cÊu tróc d÷ liÖu c¬ së th× chØ cÇn cµi ®Æt l¹i c¸c thao t¸c mµ ch¬ng tr×nh dïng ®Õn. 3.3.2 Cµi ®Æt danh s¸ch dïng con trá mãc nèi

ë ®©y chóng ta xem xÐt c¸ch thø hai vÒ cµi ®Æt danh s¸ch. Cã thÓ coi mét danh s¸ch ®îc t¹o nªn tõ c¸c thµnh phÇn, c¸c thµnh phÇn nµy ®îc nèi víi nhau. Mçi thµnh phÇn nh vËy kh«ng chØ chøa mét phÇn tö cña danh s¸ch mµ cßn chøa mét con trá trá ®Õn thµnh phÇn ngay sau. C¸ch cµi ®Æt nh vËy kh«ng ®ßi hái viÖc sö dông c¸c vïng nhí kÒ nhau ®Ó lu tr÷ mét danh s¸ch vµ chÝnh v× thÕ chóng ta sÏ kh«ng ph¶i dÞch chuyÓn c¸c phÇn tö ®Ó lÊy chç cho phÇn tö míi thªm vµo danh s¸ch hay khÐp l¹i kho¶ng trèng sinh ra khi võa

- 109 -

xãa bít phÇn tö. Tuy nhiªn chóng ta ph¶i tèn thªm vïng nhí cho c¸c con trá.Trong c¸ch biÓu diÔn nµy, danh s¸ch ®îc t¹o bëi c¸c b¶n ghi cïng kiÓu cell, mçi b¶n ghi thuéc kiÓu cell gåm hai trêng: mét trêng info chøa mét phÇn tö cña danh s¸ch vµ mét trêng next chøa con trá trá ®Õn cell chøa phÇn tö tiÕp theo trong danh s¸ch. NÕu danh s¸ch lµ a1,a2, . . . ,an th× cell chøa ai cã mét con trá trá ®Õn cell chøa ai+1, víi i=1, 2, 3, . . . , n-1. Cell chøa an cã con trá nil (rçng). Chóng ta sÏ sö dông mét con trá gäi lµ head trá ®Õn cell chøa phÇn tö ®Çu tiªn trong danh s¸ch. §Ó tiÖn lîi ngêi ta hay dïng mét cell header cã chøa con trá trá ®Õn cell chøa a1, cell header kh«ng chøa mét phÇn tö nµo. Trong trêng hîp danh s¸ch rçng th× con trá cña cell header lµ nil. H×nh 3.5 cho h×nh ¶nh mét danh s¸ch ®îc cµi ®Æt theo ý tëng nªu trªn. Chóng ta gäi ®ã lµ mét danh s¸ch mãc nèi ®¬n (tõ ®©y nÕu kh«ng sî nhÇm lÉn cã thÓ gäi t¾t lµ danh s¸ch mãc nèi)

H×nh 3.5 Mét danh s¸ch mãc nèi ®¬nCÇn ph©n tÝch kh¸i niÖm vÞ trÝ mét phÇn tö trong danh s¸ch ë tr-êng hîp nµy. §èi víi nh÷ng danh s¸ch tæ chøc theo kiÓu mãc nèi ®¬n (h×nh 3.5), ngêi ta thêng cã quan niÖm vÒ vÞ trÝ kh¸c ®i mét chót so víi kh¸i niÖm vÞ trÝ trong mét cµi ®Æt b»ng m¶ng: vÞ trÝ cña phÇn tö ai lµ mét con trá trá ®Õn mét cell, mµ cell nµy chøa con trá trá ®Õn ai, víi i = 2, 3, 4, . . . ,n. VÞ trÝ cña phÇn tö ®Çu tiªn trong danh s¸ch lµ con trá trá ®Õn header vµ vÞ trÝ End(L) lµ con trá trá ®Õn cell cuèi cña L. C¸ch quan niÖm nµy tho¹t ®Çu cã vÎ kh«ng thËt tù nhiªn, tuy vËy sau nµy chóng ta sÏ thÊy trong nhiÒu trêng hîp

- 110 -

header

a1

a2

an

nã thuËn lîi h¬n viÖc coi vÞ trÝ cña phÇn tö a i lµ mét con trá trá ®Õn cell chøa ai, víi i = 2, 3, 4, . . . , n. Do cã cÊu tróc mãc nèi nhau tõ phÇn tö thø nhÊt ®Õn phÇn tö thø hai, phÇn tö thø hai ®Õn phÇn tö thø ba,... cho ®Õn phÇn tö cuèi, nªn danh s¸ch hoµn toµn x¸c ®Þnh khi biÕt ®îc vÞ trÝ cña phÇn tö ®Çu tiªn. VËy kiÓu cña mét danh s¸ch ph¶i cïng kiÓu víi vÞ trÝ , tøc lµ kiÓu con trá trá ®Õn mét cell. Cho mét danh s¸ch lµ cho mét con trá trá ®Õn cell header. Chóng ta cã thÓ ®Þnh nghÜa mét c¸ch h×nh thøc c¸c thµnh phÇn chÝnh cña mét cÊu tróc d÷ liÖu danh s¸ch mãc nèi nh sautype

celltype = recordinfo : elementtype;next : ^ celltype;

end;list = ^ celltype;position = ^ celltype;

Chóng ta h·y xem mçi thao t¸c cña kiÓu d÷ liÖu trõu tîng danh s¸ch sÏ ®îc cµi ®Æt nh thÕ nµo víi c¸ch biÓu diÔn danh s¸ch b»ng con trá mãc nèi.

Muèn khëi t¹o mét danh s¸ch rçng, chóng ta chØ cÇn t¹o ra mét cell header víi gi¸ trÞ trêng next cña b¶n ghi nµy lµ con trá nill. Mét c¸ch t¬ng øng hµm kiÓm tra mét danh s¸ch cã rçng hay kh«ng chØ cÇn kiÓm tra tÝnh ®óng cña ®¼ng thøc L^.next=nil (víi L lµ con trá trá ®Õn ®Çu danh s¸ch, vµ còng cã nghÜa lµ L trá ®Õn cell header)

function Creat (var L : list) : position ;

- 111 -

beginnew(L) ;L^.next:=nil;return (L) ;

end {Create}

H×nh 3.6

First(L) ®a ra vÞ trÝ ®Çu tiªn cña danh s¸ch L, theo quan niÖm vÒ vÞ trÝ cña chóng ta First(L) lµ hµm tr¶ ra con trá L, nh vËy ®©y lµ mét hµm tÇm thêng (*). Hµm Next(p, L) ®¬n gi¶n sÏ tr¶ ra p^.next (h×nh 3.6) v× p^.next lµ vÞ trÝ tiÕp ngay sau vÞ trÝ p trong danh s¸ch L. Tuy vËy Hµm Previous(p, L) l¹i kh«ng ®¬n gi¶n nh vËy do c¸c con trá cã híng trá ra phÇn tö ®øng sau. Muèn t×m ®îc vÞ trÝ ®øng ngay tríc vÞ trÝ p, chóng ta ph¶i lÇn tõ ®Çu danh s¸ch xuèng vµ dõng l¹i ë vÞ trÝ q nµo ®ã mµ Next(q, L) = p. §iÒu nµy kh¸c víi c¸ch cµi ®Æt b»ng m¶ng. Trong mét danh s¸ch cµi ®Æt b¶ng m¶ng, tõ mét phÇn tö nµo ®ã, chóng ta dÔ dµng “®i ®Õn” phÇn tö ë phÝa tr-íc còng nh dÔ dµng “®i ®Õn” phÇn tö ë phÝa sau. Trong danh s¸ch cµi ®Æt b»ng con trá mãc nèi ®¬n th× chóng ta chØ dÔ dµng “®i ®Õn” phÇn tö ®øng sau. Víi nh÷ng øng dông lu«n cÇn ®Õn c¶ hai thao t¸c Next vµ Previous, khi cµi ®Æt b»ng con trá mãc nèi cã thÓ dïng danh s¸ch mãc nèi kÐp (chóng ta sÏ xem xÐt cÊu tróc ®ã ë cuèi môc nµy)

Hµm End(L) cÇn ®a ra vÞ trÝ ®øng sau vÞ trÝ phÇn tö cuèi trong danh s¸ch, nghÜa lµ nã cÇn tr¶ ra con trá trá ®Õn cell cuèi cïng trong danh s¸ch. Mét c¸ch ®¬n gi¶n ®Ó t×m ®îc kÕt qu¶ nµy lµ di chuyÓn con trá q tõ vÞ trÝ ®Çu danh s¸ch xuèng nh÷ng vÞ trÝ tiÕp

- 112 -

header

a1

a2

an

•a2

p

sau trong danh s¸ch cho tíi khi ®Õn ®îc ®Çu cuèi, nghÜa lµ cho ®Õn khi q trá tíi ng¨n cã chøa con trá nil (c¸ch lµm nh vËy ®îc ®a ra ë h×nh 3.7).------------------------------------------------------------------------------------------------(*) Víi c¸ch tæ chøc danh s¸ch b»ng con trá mãc nèi nh vËy th× kh«ng cÇn cµi ®Æt hµm nµy

CÇn chó ý r»ng cµi ®Æt End(L) nh vËy lµ kh«ng hiÖu qu¶, bëi chóng ta ph¶i quÐt toµn bé danh s¸ch mçi khi chóng ta cÇn t×m End(L). NÕu øng dông cña chóng ta thêng xuyªn cÇn hµm End(L), ch¼ng h¹n nh ë thñ tôc Purge (h×nh 3.2), th× cã hai c¸ch kh¾c phôc nh sau:

- HoÆc lµ sö dông c¸ch biÓu diÔn danh s¸ch cã thªm mét con trá trá ®Õn cell cuèi cïng

- HoÆc lµ thay thÕ sö dông End(L) ë nh÷ng chç cã thÓ. VÝ dô ®iÒu kiÖn p <> End(L) trong dßng (2) ë h×nh 3.2 cã thÓ ®îc thay thÕ bëi p^.next <> nil, nªn nhí r»ng ®iÒu ®ã lµm ch¬ng tr×nh phô thuéc vµo cµi ®Æt cô thÓ cña danh s¸ch

function End ( L : list) : position ;(*§a ra con trá trá vµo ng¨n cuèi cña danh s¸ch L*)var

q: position;begin

q := L ;while q^.next <> nil do

q := q^.next ;return (q) ;

end; {End}H×nh 3.7 Hµm End.

- 113 -

Hµm Retrieve (p, L) cÇn ®a ra phÇn tö ®îc chøa ë cell cã vÞ trÝ lµ con trá p, mét c¸ch ®¬n gi¶n, nã tr¶ ra p^.next^.info

VÒ b¶n chÊt, viÖc duyÖt lÇn lît tõng phÇn tö däc theo danh s¸ch tõ phÇn tö ®Çu tiªn ®Õn phÇn tö cuèi cïng còng gièng nh chóng ta ®· tõng duyÖt danh s¸ch trong m¶ng. NghÜa lµ chóng ta lÆp ®i lÆp l¹i viÖc chuyÓn dÞch xuèng vÞ trÝ tiÕp theo cña vÞ trÝ hiÖn t¹i, b¾t ®Çu tõ vÞ trÝ ®Çu danh s¸ch. ChØ kh¸c lµ trong m¶ng vÞ trÝ i+1 lµ vÞ trÝ tiÕp theo cña i, cßn trong danh s¸ch mãc nèi ®¬n p^.next lµ vÞ trÝ tiÕp theo cña p. DÜ nhiªn viÖc “®i xuèng” ph¶i dõng khi ®· ®¹t ®Õn cuèi danh s¸ch.

Hµm Locate(x,L) x¸c ®Þnh vÞ trÝ cña phÇn tö x trong danh s¸ch L còng ®îc gi¶i quyÕt gièng nh khi cµi ®Æt danh s¸ch b»ng m¶ng. Chóng ta còng duyÖt däc tõ ®Çu danh s¸ch vµ theo chiÒu xuèng cuèi danh s¸ch, cho ®Õn khi hoÆc gÆp ®îc phÇn tö cÇn t×m hoÆc ®· ®Õn cuèi danh s¸ch. VÉn nh trong cµi ®Æt b»ng m¶ng, nÕu x xuÊt hiÖn h¬n mét lÇn th× vÞ trÝ cña lÇn xuÊt hiÖn ®Çu tiªn ®îc ®-a ra. NÕu x kh«ng xuÊt hiÖn mét lÇn nµo th× kÕt qu¶ cña hµm nµy lµ gi¸ trÞ End(L).

function Locate (x : elementtype ; L :list) : position ;var

p : position ;begin

p := L ;while p^.next <> nil do

if p^.next^.info = x thenreturn(p)

else p := p^.next ;

return(p) ; (*nÕu kh«ng thÊy*)

- 114 -

end; {Locate}H×nh 3.8 Hµm Locate trong biÓu diÔn danh s¸ch dïng con trá

mãc nèi

H×nh 3.9 díi ®©y cho thÊy hai thao t¸c Insert(x, p, L) vµ Delete (p, L) ®îc cµi ®Æt nh thÕ nµo khi biÓu diÔn danh s¸ch dïng con trá mãc nèi. C¬ chÕ thao t¸c cña con trá trong thñ tôc Insert ë h×nh 3.9 ®îc chØ ra ë h×nh 3.10. H×nh 3.10 (a) cho thÊy t×nh tr¹ng danh s¸ch tríc khi Insert. Chóng ta muèn thªm mét phÇn tö míi vµo tríc phÇn tö b trong danh s¸ch. §Ó lµm ®îc ®iÒu ®ã chóng ta cÇn ph¶i:

- t¹o ra mét cell míi ®Ó chøa phÇn tö míi lµ x- thay ®æi mãc nèi ®Ó cã ®îc sù s¾p ®Æt vÞ trÝ nh mong

muèn: ngay sau phÇn tö a sÏ lµ phÇn tö x (chø kh«ng ph¶i lµ b nh tríc) vµ ngay sau phÇn tö x lµ b.

ViÖc t¹o ra mét cell míi ®Ó chøa x ®îc thùc hiÖn bëi c©u lÖnh ë dßng (2). T¹i dßng (3) trêng info cña cell míi ®îc chøa x. Do phÇn tö x ph¶i ë ngay sau phÇn tö a nªn con trá ë trêng next cña cell chøa a ®îc lµm cho trá vµo cell míi ®ã. Nh vËy, tríc khi Insert, trêng next cña cell chøa a trá vµo cell chøa b th× ë (2) nã bÞ thay ®æi. NÕu tr-íc khi thay ®æi ®Ých mãc nèi cña con trá next thuéc cell chøa a mµ chóng ta kh«ng lu gi÷ ®Çu mèi ®Ó truy nhËp ®îc tíi cell chøa b th×

procedure Insert (x: elementtype ; p : position) ;var temp : position ;begin

(1) temp := p^.next ;(2) new(p^.next) ;(3) p^.next^.info := x ;(4) p^.next^.next := temp ;

- 115 -

end; {Insert}

procedure Delete (p : position) ;begin

p^.next := p^.next^.next ;end; {Delete}

H×nh 3.9 Mét sè thao t¸c dïng cµi ®Æt danh s¸ch mãc nèi

H×nh 3.10 S¬ ®å cña Insert

H×nh 3.11 S¬ ®å cña Delete

chóng ta sÏ ph¹m ph¶i sai lÇm bëi sau ®ã kh«ng thÓ nèi ®îc phÇn ®Çu cña danh s¸ch (tõ phÇn tö ®Çu ®Õn phÇn tö x) víi phÇn sau cña danh s¸ch (tõ phÇn tö b ®Õn phÇn tö cuèi cña danh s¸ch). T¹i

- 116 -

a b

a

x

b

(1)

p

p

temp

(2)

(3) (4)

(a)

(b)

a cb

dßng (1), temp ®îc t¹o ra ®Ó trá ®Õn cell chøa b víi môc ®Ých gi÷ l¹i mèi liªn hÖ ®Õn phÇn sau cña danh s¸ch tríc khi (2) thùc hiÖn “c¾t“ phÇn sau ra ®Ó thªm phÇn tö x vµo cuèi cña phÇn ®Çu. Cuèi cïng dßng (4) lµm nhiÖm vô nèi ®u«i cña phÇn ®Çu danh s¸ch (lóc nµy x ®· trë thµnh phÇn tö cuèi cïng trong phÇn ®Çu danh s¸ch) víi phÇn sau cña danh s¸ch, cô thÓ lµ trêng next cña cell chøa x ®îc g¸n gi¸ trÞ cña temp ®Ó lµm cho nã trá ®Õn ng¨n chøa b.H×nh 3.10 (b) cho thÊy kÕt qu¶ cña viÖc thùc hiÖn Insert. C¸c con trá míi ®îc biÓu diÔn víi nÐt g¹ch ®øt qu·ng vµ ®îc ®¸nh dÊu víi bíc mµ t¹i ®ã chóng ®îc sinh ra.

Thñ tôc Delete kh¸ ®¬n gi¶n. H×nh 3.11 cho thÊy c¸c thao t¸c con trá cña thñ tôc Delete. C¸c con trá cò vÏ nÐt liÒn cßn c¸c con trá míi nÐt g¹ch ng¾t qu·ng.

Trong c¸ch cµi ®Æt dïng con trá mãc nèi chóng ta kh«ng bÞ buéc ph¶i x¸c ®Þnh tríc sè phÇn tö tèi ®a cho phÐp cña danh s¸ch nh khi cµi ®Æt dïng m¶ng. Chóng ta chØ kh«ng thÓ thªm ®îc phÇn tö vµo danh s¸ch khi kh«ng cßn kh«ng gian nhí ®Ó cÊp ph¸t cho phÇn tö míi ®ã. Cã thÓ gi¶ thiÕt r»ng ®iÒu ®ã kh«ng x¶y ra trong c¸c øng dông ®îc xem xÐt.T¹i ®©y chóng ta h·y bµn luËn thªm vÒ quan niÖm vÞ trÝ cña mét phÇn tö trong c¸ch cµi ®Æt nµy. LiÖu cã thÓ quan niÖm mét c¸ch tù nhiªn h¬n ®îc kh«ng, r»ng vÞ trÝ cña phÇn tö a lµ con trá trá vµo cell cã chøa a, nghÜa lµ mét danh s¸ch kh«ng cÇn cã cell ®Æc biÖt header ë ®Çu? T¬ng øng víi c¸ch quan niÖm nh vËy chóng ta vÉn cµi ®Æt ®îc c¸c thao t¸c thêng gÆp trªn danh s¸ch, tÊt nhiªn cã kh¸c ®i so víi mét sè cµi ®Æt ®· tr×nh bµy trªn ®©y. Khi ®ã thñ tôc Creat(L) sÏ kh«ng cÇn t¹o mét cell nµo c¶ mµ chØ cÇn t¹o mét con trá víi gi¸ trÞ lµ nil vµ hµm End(L) lu«n tr¶ ra nill. Hµm Locate(x,L) sÏ tr¶ ra con trá nill nÕu kh«ng t×m thÊy x trong danh s¸ch L vµ tr¶ ra con trá trá ®Õn cell chøa x. Tuy nhiªn thuËt to¸n

- 117 -

t×m x vÉn lµ duyÖt tõ vÞ trÝ ®Çu tiªn, chuyÓn dÞch ®Õn vÞ trÝ tiÕp theo, cho ®Õn khi t×m thÊy hoÆc hÕt danh s¸ch. ChØ cã hai thao t¸c Insert(x,p,L) vµ Delete(p,L) lµ thay ®æi h¼n vÒ cµi ®Æt. Muèn chÌn thªm phÇn tö míi x vµo gi÷a phÇn tö a vµ phÇn tö b trong danh s¸ch (h×nh 3.10), viÖc t¹o cell míi chøa x vÉn nh trong thñ tôc Insert tríc ®©y. LÖnh nèi cell míi nµy víi cell chøa b sao cho b lµ phÇn tö ngay sau phÇn tö x sÏ chØ cÇn dïng ®Õn con trá temp vµ con trá p (p ®ang lµ vÞ trÝ cña phÇn tö b - theo quan niÖm ®ang ®-îc gi¶ thiÕt. Nhng ®Ó nèi cell míi chøa x vµo ngay sau cell chøa a th× cÇn ph¶i thay ®æi gi¸ trÞ trêng next cña cell chøa a, ®iÒu ®ã còng cã nghÜa lµ cÇn dïng con trá trá vµo cell chøa a (®ã lµ con trá ngay tríc p trong d·y con trá mãc nèi t¹o nªn danh s¸ch). Tõ nhËn xÐt nµy, chóng ta cã thÓ thÊy hai c¸ch kh¸c nhau ®Ó cµi ®Æt Insert(x,p,L) nÕu coi vÞ trÝ cña mét phÇn tö trong danh s¸ch lµ con trá trá vµo cell chøa phÇn tö ®ã:- C¸ch thø nhÊt lµ dïng Previous(p,L) ®Ó nèi cell míi vµo sau cell

chøa phÇn tö a víi c©u lÖnh Previous(p,L)^.next:= temp. Khi ph¶i thùc hiÖn Previous(p,L), râ rµng phÐp Insert bao gåm c¶ viÖc duyÖt tõ ®Çu danh s¸ch ®Õn khi gÆp con trá q.

- C¸ch thø hai gåm hai ®o¹n viÖc: tríc hÕt, thay v× mãc nèi cell míi (chøa x) vµo ngay tríc cell chøa b, th× chóng ta mãc nèi nã vµo ngay sau cell chøa b; sau ®ã chóng ta tr¸o ®æi gi¸ trÞ trêng info cña nã víi gi¸ trÞ trêng info cña cell chøa b. NghÜa lµ sau khi tr¸o ®æi, phÇn tö x trë thµnh ®øng tríc phÇn tö b trong danh s¸ch, mÆc dï cell chøa x kh«ng ph¶i lµ míi võa ®îc t¹o ra. §o¹n viÖc thø nhÊt, mãc nèi cell míi vµo ngay sau cell chøa b, ®îc cµi ®Æt hÖt nh phÐp Insert(x,p, L) ë h×nh 3.9. §o¹n viÖc tiÕp theo, tr¸o ®æi gi¸ trÞ cña hai trêng info lµ ®o¹n viÖc ph¶i lµm thªm so víi phÐp Insert ®· tr×nh bµy tríc ®©y

- 118 -

H×nh 3.12 Danh s¸ch kh«ng cã head

T¬ng tù, khi cµi ®Æt phÐp Delete(p,L) t¬ng øng víi quan niÖm vÒ vÞ trÝ nh ®ang gi¶ thiÕt, chóng ta còng cÇn ®Õn con trá ngay tríc p trong d·y con trá mãc nèi t¹o nªn danh s¸ch, nghÜa lµ cÇn dïng phÐp Previous(p,L). Chóng ta sÏ kÕt thóc nh÷ng th¶o luËn vÒ viÖc chän con trá nµo lµm vÞ trÝ cña mét phÇn tö b»ng nhËn xÐt sau ®©y. C¸ch coi vÞ trÝ cña mét phÇn tö lµ con trá ®øng ngay tríc con trá trá vµo phÇn tö ®ã sÏ ®i kÌm víi viÖc sö dông thªm mét cell header. Tuy mÊt thªm mét vïng nhí cho cell header nhng c¸ch cµi ®Æt nµy hiÖu qu¶ h¬n (sè thao t¸c ph¶i thùc hiÖn lµ Ýt h¬n) trong nh÷ng øng dông mµ c¸c phÐp Insert, Delete thêng xuyªn ®îc gäi ®Õn. So s¸nh hai ph¬ng ph¸p cµi ®Æt

Chóng ta cÇn tr¶ lêi mét c©u hái, r»ng trong mét øng dông nµo ®ã th× dïng cµi ®Æt danh s¸ch víi m¶ng lµm c¬ së tèt h¬n hay cµi ®Æt víi con trá lµm mãc nèi tèt h¬n. Nãi chung c©u tr¶ lêi sÏ phô thuéc vµo c¸c thao t¸c mµ øng dông nµy thêng xuyªn cÇn ®Õn. MÆt kh¸c quyÕt ®Þnh lùa chän Êy cßn phô thuéc vµo ®é dµi cña danh s¸ch. Mét sè ®iÒu cã tÝnh chÊt nguyªn lý ®Ó xem xÐt lµ :

1. Cµi ®Æt m¶ng ®ßi hái chóng ta ®Þnh râ kÝch thíc tèi ®a cña mét danh s¸ch t¹i thêi gian dÞch. NÕu kh«ng thÓ ®Æt mét giíi h¹n cho ®é dµi tèi ®a cña danh s¸ch, chóng ta cã thÓ nªn chän cµi ®Æt víi con trá mãc nèi.

2. Mét sè thao t¸c nµo ®ã sÏ ch¹y l©u h¬n trong cµi ®Æt nµy so víi cµi ®Æt kh¸c. Ch»ng h¹n, Insert(x,p,L) vµ Delete(p,L) tèn mét h»ng sè c¸c bíc ®èi víi mét danh s¸ch dïng con trá mãc nèi nhng

- 119 -

a1

a2

an

•a2

l¹i yªu cÇu mét thêi gian tû lÖ víi sè c¸c phÇn tö ®øng sau vÞ trÝ p khi cµi ®Æt dïng m¶ng. Ngîc l¹i, thùc hiÖn Previous vµ End ®ßi hái thêi gian h»ng sè víi cµi ®Æt m¶ng nhng l¹i ®ßi hái thêi gian tû lÖ víi ®é dµi cña danh s¸ch nÕu c¸c con trá ®îc sö dông.

3. Cµi ®Æt m¶ng cã thÓ lµm l·ng phÝ bé nhí do nã dïng mét lîng tèi ®a vïng nhí phô thuéc sè c¸c phÇn tö cã trong danh s¸ch t¹i mét thêi ®iÓm bÊt kú. Cµi ®Æt con trá chØ dïng nh÷ng vïng nhí cho nh÷ng phÇn tö hiÖn cã trªn danh s¸ch, nhng l¹i ®ßi hái kho¶ng nhí cho c¸c con trá dïng ®Ó mãc nèi c¸c phÇn tö víi nhau. Nh vËy, viÖc ®¸nh gi¸ ph¬ng ph¸p cµi ®Æt nµo ®ã lµm tèn phÝ bé nhí h¬n ph¬ng ph¸p kh¸c lµ phô thuéc vµo nh÷ng øng dông cô thÓ.

Nh vËy, chóng ta thÊy r»ng mçi ph¬ng ph¸p cµi ®Æt ®Òu cã nh÷ng u ®iÓm vµ nhîc ®iÓm riªng, nhng ®iÒu quan träng mµ ta cÇn ph¶i nhí lµ: dï sö dông ph¬ng ph¸p cµi ®Æt nµo th× External Module cña kiÓu d÷ liÖu danh s¸ch tuyÕn tÝnh vÉn kh«ng thay ®æi. Ngêi sö dông kh«ng cÇn quan t©m ®Õn v« sè c¸c chi tiÕt kü thuËt liªn quan ®Õn m¶ng, con trá, khai b¸o, hiÖu qu¶ hay kh«ng gian nhí. TÊt c¶ nh÷ng g× mµ hä cÇn lµ c¸c tµi nguyªn s½n cã, c¸ch truy cËp vµ sö dông tµi nguyªn ®ã nh thÕ nµo. §©y chÝnh lµ u ®iÓm to lín cña viÖc trõu tîng ho¸ d÷ liÖu.

3.3.3 C¸c d¹ng danh s¸ch mãc nèi kh¸c

3.3.3.1 Danh s¸ch mãc nèi vßngNh ®· biÕt, ®Ó t×m kiÕm phÇn tö x trong mét danh s¸ch mãc

nèi ®¬n L, chóng ta ®· duyÖt tuÇn tù c¸c phÇn tö trong danh s¸ch, b¾t ®Çu tõ phÇn tö ®Çu tiªn. ViÖc kiÓm tra tõng phÇn tö vµ trît xuèng phÇn tö tiÕp theo sÏ dõng l¹i khi t×m thÊy x hoÆc ®· ®¹t ®îc vÞ trÝ End(L). Nãi chung ®©y lµ mét c¸ch lµm hiÖu qu¶. Tuy nhiªn ë mét sè trêng hîp øng dông, c¸ch t×m mét phÇn tö nh vËy l¹i kh«ng phï hîp. H·y xÐt vÝ dô cô thÓ sau.

- 120 -

VÝ dô

Gi¶ sö chóng ta cã mét danh s¸ch tªn vµ m· nhËn diÖn cña c¸c tµi nguyªn m¸y tÝnh cã thÓ cÊp cho mét ch¬ng tr×nh, ch¼ng h¹n danh s¸ch c¸c m¸y in. T¹i mçi thêi ®iÓm, mçi tµi nguyªn nh vËy hoÆc ë tr¹ng th¸i “®ang sö dông” (InUse) hoÆc ë tr¹ng th¸i “®ang rçi”(Free). Khi xuÊt hiÖn mét yªu cÇu tõ ch¬ng tr×nh, r»ng: “cÇn mét m¸y in”, chóng ta sÏ ph¶i duyÖt di duyÖt l¹i danh s¸ch cho ®Õn khi t×m thÊy mét m¸y in ë tr¹ng th¸i Free. Lóc nµy chóng ta ph¶i ®¸nh dÊu m¸y in ®ã ®· chuyÓn vÒ tr¹ng th¸i InUse råi chuyÓn m· nhËn diÖn cña nã cho ch¬ng tr×nh ®· yªu cÇu. Ch¬ng tr×nh nãi trªn lµ ngêi chñ duy nhÊt ®îc quyÒn sö dông m¸y in Êy, kÓ tõ lóc nµy cho ®Õn khi ch¬ng tr×nh dïng xong m¸y in. ë thêi ®iÓm kÕt thóc viÖc sö dông m¸y in cña ch¬ng tr×nh th× tr¹ng th¸i cña m¸y in l¹i ®îc tr¶ vÒ Free. NÕu mçi lÇn duyÖt danh s¸ch ®Ó t×m mét m¸y in rçi, chóng ta ®Òu b¾t ®Çu tõ phÇn tö ®Çu tiªn th× tÇn suÊt sö dông c¸c m¸y in ®øng gÇn ®Çu danh s¸ch sÏ lín h¬n c¸c m¸y in ®øng gÇn cuèi danh s¸ch. §Ó cã thÓ sö dông c¸c m¸y in trong danh s¸ch mét c¸ch “c«ng b»ng” h¬n, cÇn cã m« h×nh danh s¸ch sao cho c¸c phÇn tö trong danh s¸ch trë nªn “b×nh ®¼ng” víi nhau h¬n. Mét d¹ng c¶i tiÕn cña danh s¸ch mãc nèi ®¬n sÏ thÝch hîp víi øng dông trong vÝ dô nµy, ®ã lµ danh s¸ch mãc nèi vßng. NÕu kh«ng ®Ó con trá next cña thµnh phÇn cuèi cïng trong danh s¸ch mãc nèi ®¬n nhËn gi¸ trÞ nil, mµ cho nã trá vµo thµnh phÇn chøa phÇn tö ®Çu tiªn, th× chóng ta cã mét danh s¸ch mãc nèi vßng. Trong danh s¸ch mãc nèi vßng, mçi thµnh phÇn ®Òu cã thµnh phÇn ngay sau vµ tõ mét thµnh phÇn bÊt kú chóng ta cã thÓ ®i ®Õn mét thµnh phÇn bÊt kú kh¸c trong danh s¸ch.

Mét danh s¸ch mãc nèi vßng ®îc minh häa ë h×nh 3.13. C¸c khai b¸o vµ cµi ®Æt danh s¸ch mãc nèi vßng hÇu nh kh«ng kh¸c g× danh s¸ch mãc nèi ®¬n, ngo¹i trõ viÖc khëi t¹o mét danh s¸ch mãc nèi vßng rçng vµ kh«ng tån t¹i hµm End(L). Trong trêng hîp nµy, khi

- 121 -

x©y dùng Creat(L) ®Ó khëi t¹o mét danh s¸ch rçng, chóng ta ph¶i cho con trá L^.next trá vµo chÝnh cell header chøa nã, thay v× g¸n cho nã gi¸ trÞ nil.

H×nh 3.12 H×nh ¶nh mét danh s¸ch mãc nèi vßng

Quay l¹i gi¶i quyÕt vÝ dô øng dông mµ chóng ta ®a ra trªn ®©y. Khi tæ chøc qu¶n lý c¸c m¸y in trong mét danh s¸ch mãc nèi vßng, cÇn gi÷ mét con trá StartSearch cho biÕt thµnh phÇn sÏ ®îc b¾t ®Çu kiÓm tra trong lÇn duyÖt t×m tiÕp theo. §©y còng chÝnh lµ thµnh phÇn tiÕp theo cña ®iÓm dõng trong lÇn duyÖt t×m ngay tríc ®ã. H×nh 3.14 cho mét hµm GetResource thùc hiÖn viÖc t×m kiÕm mét m¸y in cã tr¹ng th¸i Free trong danh s¸ch (vßng). §Ó thñ tôc ®ã lµm viÖc ®îc chóng ta ph¶i cã nh÷ng khai b¸o thÝch hîp cho kiÓu CircularList vµ ®©y lµ kiÓu danh s¸ch mãc nèi vßng ®îc tæ chøc theo c¸ch bµn luËn ë trªn. Mçi cell thµnh phÇn t¹o nªn danh s¸ch, ngoµi trêng info chøa th«ng tin vÒ m¸y in (ch¼ng h¹n tªn hay m· nhËn diÖn, ...), chóng ta dïng thªm trêng status ®Ó qu¶n lý tr¹ng th¸i cña m¸y in. Trêng nµy nhËn mét trong hai gi¸ trÞ InUse vµ Free t¬ng øng víi tr¹ng th¸i m¸y in ®ã ®ang ®îc sö dông hay ®ang rçi. Tuy nhiªn ë cell header, status sÏ cã gi¸ trÞ Header ®Ó ph©n biÖt víi nh÷ng cell thùc sù chøa phÇn tö cña danh s¸ch. Cã thÓ thÊy nh÷ng khai b¸o nh vËy ë h×nh 3.14 díi ®©y.

type

- 122 -

Data Data DataHead

Danh s¸ch mãc nèi ®¬n vßng

l1 l2 lnHead

Danh s¸ch mãc nèi ®¬n

status_value = (InUse, Free, Header)celltype = record

info : elementtype;status: status_value;next : ^ celltype;

end;position = ^ celltype;CircularList = position;

H×nh 3.14 Mét c¸ch khai b¸o kiÓu d÷ liÖu cho danh s¸ch c¸c m¸y in

Function GetResource(L: CircularList; var StartSearch:position):position;Var p: position;Begin

p:=StartSearch;While (p^.status <> Free) And (p^.next<>StartSearch) do

p:=p^.next;If ( p^.status = Free) then begin

StartSearch:=p^.next;p^.status:=InUse;Return(p)

endelse begin

(* Th«ng b¸o: §· duyÖt xong mét vßng vµ kh«ng cã m¸y in nµo rçi c¶ *)

p:=nil;Return(nil);

end;End;{GetResource}

- 123 -

H×nh 3.15 T×m kiÕm trªn danh s¸ch mãc nèi vßng

Hµm GetResource sÏ b¾t ®Çu t×m kiÕm tõ StartSearch. NÕu t×m thÊy mét m¸y in ë tr¹ng th¸i Free, nã sÏ tr¶ ra con trá trá ®Õn cell chøa th«ng tin vÒ m¸y in nµy sau khi ®¸nh dÊu r»ng m¸y in bÞ chiÕm dông. §ång thêi con trá StartSearch trá vµo m¸y in ®øng ngay sau m¸y in võa bÞ chiÕm dông, chuÈn bÞ tríc ®iÓm b¾t ®Çu t×m kiÕm cho lÇn t×m kiÕm sau. NÕu ®i hÕt mét vßng danh s¸ch mµ kh«ng t×m ®îc m¸y in nµo rçi th× GetResource tr¶ ra con trá nil. KÌm theo ®ã lµ th«ng b¸o vÒ viÖc ®· duyÖt hÕt mét vßng mµ cha cã m¸y in rçi, con trá StartSearch kh«ng cã g× thay ®æi. Nh mét bµi tËp, ngêi ®äc cã thÓ tù tæ chøc mét danh s¸ch mãc nèi vßng kh«ng cã header vµ øng dông ®Ó gi¶i quyÕt bµi to¸n nªu trong vÝ dô vÒ ph©n phèi sö dông tµi nguyªn m¸y tÝnh.

3.3.3.1 Danh s¸ch mãc nèi kÐp

ë mét sè øng dông chóng ta cÇn duyÖt mét danh s¸ch theo c¶ hai híng (híng vÒ phÝa tríc lÉn híng vÒ phÝa sau) mét c¸ch hiÖu qu¶. HoÆc lµ, khi cho mét phÇn tö, chóng ta muèn x¸c ®Þnh c¸c phÇn tö ®øng tríc vµ ®øng sau phÇn tö nµy mét c¸ch nhanh chãng. Trong nh÷ng trêng hîp nh vËy chóng ta muèn mçi cell cña danh s¸ch võa cã con trá trá ®Õn cell tiÕp theo vµ võa c¶ con trá trá ®Õn cell ®øng tríc. Mét danh s¸ch mãc nèi kÐp nh vËy ®îc minh häa ë h×nh 3.16.

- 124 -

H×nh 3.16 Mét danh s¸ch mãc nèi kÐp

Mét u ®iÓm quan träng cña danh s¸ch mãc nèi kÐp lµ chóng ta cã thÓ dïng mét con trá trá ®Õn cell chøa phÇn tö thø i trong danh s¸ch ®Ó biÓu thÞ vÞ trÝ i, chø kh«ng ph¶i lµ mét con trá trá ®Õn cell ®øng ë tríc mét c¸ch thiÕu tù nhiªn. Gi¸ chóng ta ph¶i tr¶ cho ®Æc ®iÓm nµy lµ sù cã mÆt cña mét con trá thªm vµo trong mçi cell, vµ mét sè thao t¸c c¬ së cña danh s¸ch cã thÓ dµi h¬n trong cµi ®Æt. Chóng ta cã thÓ khai b¸o kiÓu cell chøa mét phÇn tö vµ hai con trá nh ë h×nh 3.17 díi ®©y

type celltype = record

info : elementtype;previous, next : ^ celltype ;

end;position = ^ celltype ;

H×nh 3.17 Khai b¸o khi cµi ®Æt danh s¸ch mãc nèi kÐp

Thñ tôc lo¹i bá phÇn tö t¹i vÞ trÝ p trong mét danh s¸ch nèi kÐp ®îc ®a ra ë h×nh 3.18. H×nh 3.19 cho thÊy sù thay ®æi cña c¸c con trá khi thñ tôc ë h×nh 3.18 ®îc thùc hiÖn: con trá cò ®îc vÏ nÐt liÒn vµ con trá míi vÏ b»ng nÐt g¹ch ®øt (víi gi¶ thiÕt cell bÞ lo¹i bá kh«ng ph¶i lµ cell ®Çu tiªn vµ còng kh«ng lµ cell cuèi cïng. Tríc hÕt chóng ta t×m cell ®øng tríc b»ng c¸ch sö dông trêng previous. Chóng ta lµm cho trêng next cña cell nµy trá ®Õn cell tiÕp theo cña cell ë vÞ trÝ p . Sau ®ã chóng ta lµm trêng previous cña cell tiÕp theo trá ®Õn cell ®øng tríc cell ë vÞ trÝ p. Cell ®îc trá bëi p trë thµnh kh«ng ®îc sö dông trong danh s¸ch n÷a.

procedure Delete (var p : position) ;

- 125 -

beginif p^.previous <> nil then

(*xãa cell kh«ng ph¶i lµ cell ®Çu tiªn*)p^.previous^.next := p^.next ;

if p^.next <> nil then(*xãa cell kh«ng lµ cell cuèi cïng*)p^.next^.previous := p^.previous ;

end;{Delete}H×nh 3.18 PhÐp lo¹i bá mét phÇn tö ®èi víi danh s¸ch mãc

nèi kÐp

H×nh 3.19 Sù thay ®æi con trá khi thùc hiÖn phÐp lo¹i bá phÇn tö khái danh s¸ch mãc nèi kÐp

H×nh 3.20 lµ thñ tôc chÌn thªm phÇn tö x vµo gi÷a hai phÇn tö a vµ b trong danh s¸ch. Tríc hÕt chóng ta t¹o mét cell míi chøa phÇn tö x víi hai c©u lÖnh (1) vµ (2). Hai c©u lÖnh tiÕp theo dïng ®Ó mãc nèi phÇn tö míi x vµo danh s¸ch b»ng c¸c con trá ë trêng next, gièng nh phÐp chÌn thªm phÇn tö x vµo gi÷a a vµ b trong trêng hîp danh s¸ch mãc nèi ®¬n. Hai c©u lÖnh cuèi cïng lµm nèt nhiÖm vô mãc nèi c¸c con trá ë trêng previous cña c¸c cell liªn quan.

procedure Insert (x: elementtype ; p : position) ;var

temp : position ;begin

(1) new(temp) ;

- 126 -

(2) temp^.info:=x ;(3) temp^.next:= p ;(4) p^.previous^.next := temp ;(5) temp^.previous:=p^.previuos;(6) p^.previous:=temp;

end; {Insert}

H×nh 3.20 PhÐp thªm mét phÇn tö ®èi víi danh s¸ch mãc nèi kÐp

H×nh 3.21 Sù thay ®æi con trá khi thùc hiÖn phÐp thªm phÇn tö ë danh s¸ch mãc nèi kÐp

ViÖc cµi ®Æt c¸c thao t¸c kh¸c trong danh s¸ch mãc nèi kÐp ®îc coi lµ bµi tËp dµnh cho ngêi ®äc.

3.4 Mét vÝ dô øng dông danh s¸ch mãc nèi: Qu¶n lý bé nhíMét trong nh÷ng thµnh phÇn quan träng nhÊt cña hÖ ®iÒu hµnh

®a ngêi dïng lµ bé phËn qu¶n lý bé nhí. Nã cã nhiÖm vô ®¸p øng nh÷ng yªu cÇu cÊp ph¸t vïng nhí cho c¸c tiÕn tr×nh kh¸c vµ thu håi nh÷ng vïng nhí ®· dïng xong tr¶ vÒ kh«ng gian nhí s½n sµng cho cÊp ph¸t. Bé nhí nh vËy cã thÓ ®îc sö dông khi mét sè nhu cÇu n¶y sinh, ch¼ng h¹n do c¸c tiÕn tr×nh míi, c¸c cÊu tróc d÷ liÖu ®éng, c¸c vïng nhí ®Öm cho Input/Output.

Chóng ta gäi mét khèi nhí lµ mét tËp c¸c « nhí liªn tiÕp t¹o nªn mét ®¬n vÞ nhí trong xö lý. Bé phËn qu¶n lý bé nhí sÏ ph¶i qu¶n lý mét tËp c¸c b¶n ghi, mµ mçi b¶n ghi ®ã lu gi÷ th«ng tin mét khèi nhí trong hÖ thèng. C¸c b¶n ghi m« t¶ c¸c khèi nhí ®îc mãc nèi víi nhau theo m« h×nh danh s¸ch mãc nèi ®¬n, trong thø tù t¨ng dÇn cña

- 127 -

a b c

x

1

1 22

®Þa chØ nhí nh ë h×nh 3.22. C¸c d÷ kiÖn m« t¶ vÒ khèi nhí trong c¸c hÖ ®iÒu hµnh kh¸c nhau cã thÓ kh¸c nhau, tuy nhiªn Ýt nhÊt nã ph¶i gåm ba th«ng tin sau:

(1)§Þa chØ nhí b¾t ®Çu cña khèi nhí(2)KÝch thíc cña khèi nhí tÝnh theo sè « nhí(3)Tr¹ng th¸i cña khèi nhí (®ang rçi hay ®ang bÞ chiÕm dông)

Nh÷ng th«ng tin kh¸c kh«ng thÓ thiÕu, ch¼ng h¹n nh tªn cña tiÕn tr×nh ®ang sö dông khèi nhí vµ thêi gian khèi nhí ®ã ®· bÞ chiÕm dông, kh«ng thùc sù cÇn tr×nh bµy ë ®©y.

H×nh 3.22Bé qu¶n lý bé nhí cung cÊp c¸c dÞch vô cña nã th«ng qua hÖ

thèng c¸c thñ tôc, nh÷ng thñ tôc nµy hoÆc ®îc gäi bëi c¸c thñ tôc kh¸c cña hÖ ®iÒu hµnh hoÆc bëi c¸c tiÕn tr×nh cña ngêi sö dông. Bé qu¶n lý bé nhí chóng ta ®Ò cËp ®Õn ë ®©y cã tr¸ch nhiÖm ®¸p øng bèn lo¹i yªu cÇu: Initialize, Allocate, Free vµ Map. Nªn nhí r»ng

- 128 -

KÝch th íc khèi nhí

Tr¹ng th¸i

§Þa chØ b¾t ®Çu khèi nhí

Free (rçi)

In Use (sö

dông)Free

0A1

A2

Khèi nhí 0

Khèi nhí 1

Khèi nhí 2

S0

S1

S2

M« t¶ Khèi 0

M« t¶Khèi 1

M« t¶ Khèi 1 ΛHea

d

FreeSo0 FreeS1A1 FreeS2A2Head

trong thùc tÕ bé qu¶n lý bé nhí cã thÓ cã nhiÒu lo¹i yªu cÇu h¬n vµ cã nhiÒu dÞch vô tiÖn Ých h¬n.

Thñ tôc Initialize khëi t¹o mét danh s¸ch m« t¶ c¸c khèi nhí chØ gåm hearder vµ hai b¶n ghi. B¶n ghi thø nhÊt m« t¶ khèi nhí vèn lu«n lµ nh©n thêng tró cña hÖ ®iÒu hµnh (nh¾c l¹i r»ng bé qu¶n lý bé nhí chØ lµ mét bé phËn cña hÖ ®iÒu hµnh). Khèi nhí nµy ®îc gi¶ sö b¾t ®Çu tõ ®Þa chØ 0 ®Õn ®Þa chØ KernelSpace. Toµn bé phÇn cßn l¹i cña bé nhí, tõ ®Þa chØ ®Þa chØ KernelSpace ®Õn ®Þa chØ EndMemoryAddress, lµ mét khèi nhí lín ë tr¹ng th¸i ®ang rçi (Free). Tãm l¹i thñ tôc Initialize sÏ t¹o ra mét cÊu tróc nh ë h×nh 3.23. TÊt c¶ c¸c thao t¸c kh¸c cña viÖc qu¶n lý bé nhí chØ lµm viÖc ®îc sau khi Initialize ®· ®îc gäi thùc hiÖn.

Thñ tôc Allocate(N) lµ thñ tôc thø hai cña qu¶n lý bé nhí. Khi cã mét tiÕn tr×nh yªu cÇu sö dông khèi nhí gåm N « nhí, nÕu yªu cÇu nµy cã thÓ ®îc tháa, nghÜa lµ nÕu cã mét khèi nhí lín nh yªu cÇu, th× Allocate sÏ tr¶ ra cho tiÕn tr×nh yªu cÇu mét ®Þa chØ A. §©y lµ ®Þa chØ cña « nhí ®Çu tiªn cña khèi nhí mµ Allocate(N) võa cÊp ph¸t cho tiÕn tr×nh Êy. C¸c « nhí A, A+1, . . ., A+N-1 bÞ thñ tôc Allocate(N) ®æi vÒ tr¹ng th¸i ®ang ®îc sö dông (InUse). ChiÕn lîc cÊp ph¸t vïng nhí ë ®©y ®îc gäi lµ “chän c¸i ®Çu tiªn nÕu ®îc” (first fit). Së dÜ cã tªn gäi

- 129 -

H×nh 3.23nh vËy lµ v× Allocate duyÖt tuÇn tù ®Ó t×m mét khèi nhí ë tr¹ng th¸i Free. Nã sÏ dõng l¹i ngay khi t×m thÊy mét khèi nhí nh vËy cã

- 130 -

Operating System Kernel

(Nh©n hÖ ®iÒu hµnh)Free

kÝch th íc

Kernel Space

End Memory Address

- Kernel Space + 1

Bé nhí §Þa chØ b¾t ®Çu0

Kernel Space

End Memory Address(§Þa chØ cuèi cña bé nhí)Hea

dKernelSpace InUse0 Kernel

SpaceEnd Memory

Address- Kernel Space +

1

Free

Λ

Tr íc khi gäi Allocate(50)

InUse

Free

Size Address

5005,50

0

0500

Head

500 InUse

0 500 5,500

Free

Λ

Sau khi gäi Allocate(50):

50050

0500

5,450

550

InUse

InUse

Free

Head

500 InUse

0 50050 InUse

New node

550 5,450

Free

Λ

kÝch thíc M, víi M lín h¬n N. Cã mét chiÕn lîc cÊp ph¸t kh¸c gäi lµ “ chän c¸i võa vÆn tèt nhÊt” (best fit). KiÓu cÊp ph¸t ®ã t×m mét khèi nhí ®ang rçi sao cho (M-N) nhá nhÊt cã thÓ ®îc, nghÜa lµ t×m khèi nhí cã kÝch thíc lín h¬n nhng gÇn nhÊt víi kÝch thíc ®îc yªu cÇu. Quay l¹i thñ tôc Allocate víi chiÕn lîc First fit mµ chóng ta ®ang xem xÐt ë ®©y. Khi t×m thÊy mét khèi nhí cha ®îc sö dông cã kÝch thíc M ch¼ng h¹n, khèi nhí sÏ nµy ®îc t¸ch thµnh hai khèi nhá h¬n: mét khèi kÝch thíc N, ®îc cÊp ph¸t cho tiÕn tr×nh yªu cÇu vµ bÞ ®¸nh dÊu ë tr¹ng th¸i InUse; khèi thø hai cã kÝch thíc M-N vÉn cßn gi÷ nguyªn ë tr¹ng th¸i Free. §Ó ®¶m b¶o r»ng c¸ch cÊp ph¸t nh vËy sÏ kh«ng sinh ra nh÷ng khèi nhí qu¸ nhá kh«ng thÓ sö dông l¹i ®îc, chóng ta cã thÓ sö dông mét h»ng sè MinBlockSize ®Ó qui ®Þnh kÝch thíc nhá nhÊt ®îc phÐp cña mçi khèi nhí. NÕu sau khi t×m ®îc khèi nhí M ®Ó cÊp ph¸t mµ khèi nhí cßn l¹i ë tr¹ng th¸i Free cã kÝch thíc nhá h¬n MinBlockSize (nghÜa lµ M-N<MinBlockSize), th× ®¬n gi¶n lµ chóng ta cÊp ph¸t toµn bé khèi nhí kÝch thíc M nµy cho tiÕn tr×nh yªu cÇu.

Thñ tôc Free(addr) lµ thao t¸c ngîc l¹i cña Allocate. Nã thu håi khèi nhí mµ ®Þa chØ cña « nhí ®Çu tiªn thuéc khèi nhí nµy ®îc cho bëi addr. Tuy nhiªn chØ thay ®æi trêng tr¹ng th¸i (tõ InUse sang thµnh Free) thuéc b¶n ghi m« t¶ khèi nhí ®ã th× kh«ng ®ñ. Chóng ta ph¶i hîp nhÊt khèi nhí nµy víi khèi nhí cha ®îc sö dông ngay tríc hoÆc ngay sau nã( nÕu cã). Mét c¸ch cô thÓ h¬n, khi thu håi mét khèi nhí, sÏ x¶y ra mét trong bèn trêng hîp nh ë h×nh 3.24.

- 131 -

Khèi nhí ® îc thu håi

InUse

InUsea. Kh«ng thÓ

hîp nhÊt

Free

InUseb. Hîp nhÊt víi

khèi nhí tr íc

InUse

Freec. Hîp nhÊt víi

khèi nhí sau

Free

Freeb. Hîp nhÊt víi

c¶ hai khèi nhí tr íc vµ sau

H×nh 3.24NÕu x¶y ra trêng hîp b hay c th× hai b¶n ghi thµnh phÇn cña danh

s¸ch, t¬ng øng víi m« t¶ cña hai khèi nhí liÒn nhau vµ ë tr¹ng th¸i Free, sÏ ®îc kÕt hîp l¹i thµnh chØ cßn mét b¶n ghi. NÕu x¶y ra trêng hîp d, c¶ ba b¶n ghi sÏ ®îc kÕt hîp l¹i trë thµnh chØ cßn mét b¶n ghi.

Thñ tôc cuèi cïng cÇn ®îc ph©n tÝch lµ thñ tôc Map. Thñ tôc nµy cã nhiÖm vô hiÓn thÞ mét b¶ng ®îc ®Þnh d¹ng thuËn tiÖn cho viÖc theo dâi t×nh tr¹ng sö dông bé nhí. B¶ng nµy cho thÊy toµn bé c¸c khèi nhí cïng c¸c th«ng tin vÒ chóng ch¼ng h¹n tr¹ng th¸i cña chóng, tØ lÖ (phÇn tr¨m) vïng nhí ®· sö dông.

Khi thiÕt kÕ kiÓu danh s¸ch dïng trong øng dông nµy, cã hai vÊn ®Ò ®îc gi¶i quyÕt linh ho¹t. Thø nhÊt, chóng ta tr¸nh viÖc lu«n duyÖt tõ ®Çu danh s¸ch mçi khi cÇn t×m mét khèi nhí ®Ó cÊp ph¸t. NÕu lu«n duyÖt tõ ®Çu th× hÇu hÕt c¸c khèi nhí trong tr¹ng th¸i InUse sÏ ë gÇn ®Çu danh s¸ch, ®Ó t×m ®îc khèi nhí trong tr¹ng th¸i Free sÏ ph¶i duyÖt qua rÊt nhiÒu khèi nhí ®øng trªn ®Çu, sÏ tèn nhiÒu thêi gian. §Ó tr¸nh ®iÒu ®ã, chóng ta sö dông danh s¸ch mãc nèi vßng vµ gi÷ mét con trá StartSearch trá vµo b¶n ghi m« t¶ khèi nhí cuèi cïng cã tr¹ng th¸i Free. ViÖc duyÖt t×m ®Ó cÊp ph¸t khèi nhí lu«n b¾t ®Çu tõ vÞ trÝ do StartSearch x¸c ®Þnh. C¸ch gi¶i quyÕt nµy ®em ®Õn sù cÊp ph¸t “c«ng b»ng” h¬n (gi÷a c¸c vïng nhí)vµ gi¶m ®îc thêi gian duyÖt t×m khi cÊp ph¸t. VÊn ®Ò thø hai lµ vÒ viÖc hîp nhÊt c¸c khèi nhí. Mét khèi nhí cã thÓ ®îc hîp nhÊt víi khèi nhí ®øng ngay tríc hay ngay sau nã. NÕu chóng ta dïng danh s¸ch mãc nèi ®¬n, nghÜa lµ chØ thuËn tiÖn khi dÞch chuyÓn tõ ®Çu ®Õn cuèi danh s¸ch, th× còng sÏ kh«ng thuËn tiÖn cho viÖc hîp nhÊt mét khèi nhí víi khèi nhí ®øng tríc nã. Bëi vËy chóng ta sÏ dïng m« h×nh danh s¸ch mãc nèi kÐp (nh ®· giíi thiÖu ë môc 3.3.3.1 trang 20). Tãm l¹i cÊu tróc d÷ liÖu mµ chóng ta sÏ x©y dùng ®Ó qu¶n lý bé nhí sÏ lµ mét danh s¸ch mãc vßng vµ kÐp (danh s¸ch mãc nèi vßng vµ mãc nèi hai chiÒu)

- 132 -

ConstEndMemoryAddress = ...... ; (* khai b¸o ®Þa chØ cao nhÊt cña bé

nhí*)Type

Ptr = ^Celltype; (*con trá trá ®Õn b¶n ghi m« t¶ mét khèi*)HeadPtr = ^ HeadRecord ; (*con trá trá ®Õn b¶n ghi ®Æc biÖt

Head*)Celltype = Record

StartingAddress : 0..EndMemoryAddress;(*®Þa chØ b¾t ®Çu khèi*)

BlockSize : Integer; (*kÝch thíc cña khèi*) Status : (Free, InUse); (*tr¹ng th¸icña khèi*) Next : Ptr; (*trá ®Õn khèi nhí ngay sau*) Previous : Ptr ; (*trá ®Õn khèi nhí ngay tríc*)

end;HeadRecord = Record

First : Ptr ; (*trá ®Õn ®Çu danh s¸ch*)StartSearch : Ptr ; (*trá ®Õn vÞ trÝ sÏ b¾t ®Çu

duyÖt*)CurrentPos : Ptr ; (*trá ®Õn vÞ trÝ hiÖn thêi*)

end;

VarMemoryList : HeadPtr

H×nh 3.25 Khai b¸o danh s¸ch c¸c b¶n ghi m« t¶ khèi nhí cho qu¶n lý bé nhí

- 133 -

Díi ®©y lµ phÇn cµi ®Æt Module MemoryManager theo nh÷ng ý t-ëng thiÕt kÕ bé ®· tr×nh bµy ë trªn.Module MemoryManager ; (*Module Qu¶n lý bé nhí*)Const KernelSpaceSize = . . . ;Type

AddressType = -1 . . EndMemoryAddress ; (*®Þa chØ ®îc biÓu diÔn b»ng sè nguyªn*)(* -1 lµ ®Þa chØ kh«ng hîp lÖ, chØ dïng ®Ó biÓu thÞ lçi*)Ptr = ^Celltype; (*con trá trá ®Õn b¶n ghi m« t¶ mét khèi*)HeadPtr = ^ HeadRecord ; (*con trá trá ®Õn b¶n ghi ®Æc biÖt

Head*)Celltype = Record

StartingAddress : AddressType ;(*®Þa chØ b¾t ®Çu khèi*) BlockSize : Integer; (*kÝch thíc cña khèi*) Status : (Free, InUse); (*tr¹ng th¸icña khèi*) Next : Ptr; (*trá ®Õn khèi nhí ngay sau*) Previous : Ptr ; (*trá ®Õn khèi nhí ngay tríc*)

end;HeadRecord = Record

First : Ptr ; (*trá ®Õn ®Çu danh s¸ch*)StartSearch : Ptr ; (*trá ®Õn vÞ trÝ sÏ b¾t ®Çu

duyÖt*)CurrentPos : Ptr ; (*trá ®Õn vÞ trÝ hiÖn thêi*)

end;MemoryErrorTypes = (None, IllegalParameter,

NotEnoughMemory, BlockNotAlloc);(*c¸c lo¹i lçi cã thÓ gÆp*)

Var

- 134 -

MemoryList : HeadPtr ;Error : MemoryErrorTypes ;

Procedure Initialize ();Var

KernelMemPtr : Ptr;(*con trá trá ®Õn b¶n ghi m« t¶ khèi nhí giµnh cho hÖ ®iÒu

hµnh*)FreeMemPtr : Ptr;(*con trá trá ®Õn b¶n ghi m« t¶ khèi nhí cßn l¹i *)

BeginNew(KernelMemPtr) ;New(FreeMemPtr);KernelMemPtr^.StartingAddress := 0;(*khèi nhí giµnh cho hÖ ®iÒu hµnh b¾t ®Çu tõ ®Þa chØ 0*)KernelMemPtr^.BlockSize := KernelSpaceSize;KernelMemPtr^.Status := InUse ; (*khèi nhí nµy bÞ chiÕm dông

trong suèt thêi gian MemoryManager lµm viÖc*)

FreeMemPtr^.StartingAddress := KernelSpace;(* khèi nhí cßn l¹i cã thÓ cÊp ph¸t cho c¸c tiÕn tr×nh b¾t ®Çu

tõ ®Þa chØ KernelSpace *)FreeMemPtr^.BlockSize := EndMemoryAddress - KernelSpace ;FreeMemPtr^.Status := Free ; (*khèi nhí cã thÓ cÊp ph¸t cho

c¸c tiÕn tr×nh*)

KernelMemPtr^.Next:= FreeMemPtr ; (*Mãc nèi hai b¶n ghi l¹i víi nhau*)

KernelMemPtr^.Previous:= FreeMemPtr ; (*mãc nèi vßng*)

- 135 -

FreeMemPtr^.Next := KernelMemPtr ; (*mãc nèi kÐp*) FreeMemPtr^.Previous := KernelMemPtr ;New(MemoryList) ;

MemoryList^.First := KernelMemPtr ;MemoryList^.StartSearch := FreeMemPtr ;Error := None;

End; {Initialize}

Procedure Allocate(Size: Integer) ;Var

P : Ptr ;NewCell : Ptr;Addr : AddressType ;

BeginIf (Size < 1) Or (Size > EndMemoryAddress) then begin

Error := IllegalParameter ; (*kh«ng thÓ cÊp ph¸t Ýt h¬n mét « nhí hay nhiÒu h¬n tæng dung lîng nhí *)

Return ;end;P := MemoryList^.StartSearch ; While ((P^.Status = InUse) Or (P^.BlockSize < Size)) And

(P^.Next <> MemoryList^.StartSearch) DoP:=P^.Next;

If ((P^.Status = Free) And (P^.BlockSize >= Size ) then begin

(*®· t×m thÊy mét khèi nhí ®ñ lín vµ cha ®îc sö dông*)If ((P^.BlockSize - Size) < MinBlockSize ) then begin(*cÊp ph¸t toµn bé khèi nhí nµy*)

P^.Status := InUse ;MemoryList^.StartSearch := P

- 136 -

endelse begin

(* chØ cÊp ph¸t mét phÇn khèi nhívõa t×m thÊy*)New(NewCell);NewCell^.Status := Free;NewCell^.StartingAddress := P^.StartingAddress +

Size;NewCell^.BlockSize := P^.BlockSize - Size ;NewCell^.Previous := P ;NewCell^.Next := P^.Next ;P^.Next^.Previous := NewCell;P^.Next := P ;P^.Status := InUse ; P^.BlockSize := Size ;MemoryList^.StartSearch := NewCell;

end;Addr := P^.StartingAddress ;Error := None;

end; (* kÕt thóc trêng hîp t×m thÊy mét khèi ®ñ lín cha ®îc sö dông*)

Else begin(*kh«ng t×m thÊy mét khèi nhí cha sö dông ®ñ lín nh yªu cÇu*)

Addr := -1 ;Error := NotEnoughMemory ; (*lçi cßn kh«ng ®ñ bé nhí*)

end;Return(Addr);

End; {Allocate}

Procedure Free (Addr : AddressType);Var

FreeP : Ptr ;

- 137 -

P : Ptr;Begin

FreeP := MemoryList^.Head^.Next ; (*b¾t ®Çu duyÖt t×m khèi nhí ngay sau ®Þa chØ KernelSpace)

While (FreeP^. StartingAddress <> Addr) And (FreeP <> MemoryList^.Head) Do

FreeP := FreeP^.Next ;If (FreeP = MemoryList^.Head) Or (FreeP^.Status = Free) then

Error := BlockNotAlloc ; Return ;

end;FreeP^.Status := Free ;P := FreeP^.Next ; (*kiÓm tra khèi nhí ngay sau *)If (P^.Status = Free) then begin (*nÕu nã còng cha ®îc sö dông *)

FreeP^.BlockSize := FreeP^.BlockSize + P^.BlockSize ;FreeP^.Next := P^.Next ; (*hîp nhÊt hai khèi nhí l¹i thµnh mét

*)P^.Next^.Previous := FreeP ;Dispose(P);

end;P := FreeP^.Previous ; (*t¬ng tù kiÓm tra khèi nhí ngay tríc *)If (P^.Status = Free) then begin (*nÕu nã còng cha ®îc sö dông *)

FreeP^.BlockSize := FreeP^.BlockSize + P^.BlockSize ;FreeP^.Previous := P^.Previous ; (*hîp nhÊt hai khèi nhí l¹i

thµnh mét *)P^.Previous^.Next := FreeP ;Dispose(P);

end;

- 138 -

End; {Free}

Procedure Map () ;Var

P : Ptr;Begin

P := MemoryList^.Head ; (* b¾t ®Çu tõ ®Çu bé nhí *)Repeat

Write (P^.StartingAddress : 10, P^.BlockSize :10);(*hiÓn thÞ ®Þa chØ ®Çu vµ kÝch thíc cña khèi nhí hiÖn thêi*)If (P^.Status = Free) then Writeln(‘Free’)else Writeln(‘InUse’);P := P^.Next ;

Until (P = MemoryList^.Head)End; {Map}End. { Module MemoryManager}3.5 C¸c danh s¸ch ®Æc biÖt: Stack vµ queue 3.5.1 Ng¨n xÕp (Stack)

Ng¨n xÕp lµ mét d¹ng ®Æc biÖt cña danh s¸ch trong ®ã tÊt c¶ c¸c phÐp thªm vµo vµ xãa ®i ®Òu thùc hiÖn t¹i mét ®Çu cña danh s¸ch gäi lµ top (®Ønh). Ng¨n xÕp cßn cã mét sè tªn gäi kh¸c n÷a nh " danh s¸ch ®Èy xuèng" (pushdown list), "LIFO" hay danh s¸ch "vµo_sau_ra_tríc". Mét m« h×nh cã tÝnh trùc quan cña ng¨n xÕp lµ mét chång s¸ch trªn sµn nhµ , hoÆc chång ®Üa trªn gi¸, víi ®Æc tÝnh chØ cã hai viÖc thuËn tiÖn lµ nhÊc ra vËt thÓ n»m trªn cïng hoÆc thªm mét c¸i míi chång lªn trªn cïng. Mét kiÓu d÷ liÖu trõu tîng trong hä Stack thêng bao gåm s¸u thao t¸c sau

1. Creat (S) lµm mét ng¨n xÕp S trë thµnh rçng. Thao t¸c nµy chÝnh lµ thao t¸c cïng tªn trong trêng hîp danh s¸ch tæng qu¸t.

- 139 -

2. Top(S) ®a ra phÇn tö t¹i ®Ønh cña ng¨n xÕp S. Th«ng thêng chóng ta ®ång nhÊt ®Ønh cña ng¨n xÕp víi vÞ trÝ 1 th× Top(S) chÝnh lµ thao t¸c Retrieve(First(S),S) cña danh s¸ch.

3. Pop(S) lo¹i bá phÇn tö ë ®Ønh cña ng¨n xÕp, tøc lµ Delete(First(S),S). Cã hai c¸ch kh¸c n÷a vÒ tæ chøc ch¬ng tr×nh con Pop. Mét lµ cµi ®Æt thñ tôc Pop cã thªm tham biÕn thø hai chøa phÇn tö võa bÞ lo¹i bá. Hai lµ cµi ®Æt Pop nh mét hµm cã gi¸ trÞ lµ phÇn tö võa bÞ bá ®i. Tuy nhiªn chóng ta sÏ kh«ng thÓ hiÖn hai c¸ch kh¸c ®ã ë ®©y.

4. Push(x,S) thªm phÇn tö x vµo t¹i ®Ønh cña ng¨n xÕp S. PhÇn tö vèn ë ®Ønh sÏ trë thµnh ®øng kÒ sau ®Ønh, vµ cø thÕ .. . Trong thuËt ng÷ cña danh s¸ch ban ®Çu th× thao t¸c nµy chÝnh lµ Insert(x,First(S),S).

5. Empty(S) lµ hµm tr¶ ra TRUE nÕu S lµ mét ng¨n xÕp rçng vµ tr¶ FALSE trong trêng hîp ngîc l¹i.

6. Full(S) kiÓm tra xem ng¨n xÕp S ®· ®Çy cha, hµm nµy tr¶ ra TRUE nÕu S ®Çy vµ tr¶ FALSE trong trêng hîp ngîc l¹i

Víi c¸c thao t¸c võa nªu ë trªn ta sÏ ®Þnh nghÜa có ph¸p cña chóng:

Khi thùc hiÖn c¸c thao t¸c trªn Stack, thêng x¶y ra 4 lo¹i lçi sau:

- 140 -

Có ph¸p:Define Stack[Element]Create(): Stack[Element]Full(Stack[Element]): BooleanEmpty(Stack[Element]): BooleanTop(Stack[Element]): ElementPush(Element, Stack[Element]): Stack[Element]Pop(Stack[Element]): Stack[Element]

Lçi ý nghÜa

None Kh«ng x¶y ra bÊt kú lçi nµo trong thao t¸c

StackUnderFlow

X¶y ra khi ¸p dông theo t¸c Pop trªn mét stack rçng

StackOverFlow X¶y ra khi ¸p dông thao t¸c Push cho mét stack ®Çy

TopOfEmptyStack

X¶y ra khi muèn lÊy phÇn tö ®Çu tiªn cña stack rçng

Sau ®©y lµ External Module cña kiÓu d÷ liÖu trõu tîng Stack

- 141 -

(*Module nµy ®Þnh nghÜa c¸c ®Æc t¶ bªn ngoµi ®Ó cµi ®Æt kiÓu d÷ liÖu trõu t îng Stack *)External Module StackPackage;From ElementModule Import

StackElementType; (*kiÓu d÷ liÖu cña c¸c phÇn tö trong Stack*)Type

StackErrorType = (None. StackUnderFlow, StackOverFlow, TopOfEmptyStack);

StackType; (*kiÓu d÷ liÖu Stack*)Var

Error : StackErrorType;(*khi mçi thao t¸c cã lçi sÏ g¸n lçi cho nã*)Procedure Create(): StackType;(* Create tr¶ vÒ mét Stack míi, rçng

§iÒu kiÖn ®Çu: None §iÒu kiÖn cuèi: Error = None vµ mét stack míi, rçng ® îc

t¹o ra *)Procedure Empty(Stack: StackType): Boolean;(* Empty kiÓm tra Stack rçng. NÕu cã tr¶ vÒ true, ng îc l¹i tr¶ vÒ false

§iÒu kiÖn ®Çu: None§iÒu kiÖn cuèi: Error = None

Empty(Create()) = trueEmpty(Push(X,S)) = false *)

Procedure Full(Stack: StackType): Boolean;(* Full kiÓm tra Stack ®Çy. NÕu cã tr¶ vÒ true, ng îc l¹i tr¶ vÒ false

§iÒu kiÖn ®Çu: None§iÒu kiÖn cuèi: Error = None

Full(Create()) = falseIf Push(X,S) = Error Then Full(S) =trueElse

Full(S) = false *)

- 142 -

Procedure Pop(Var Stack: StackType);(* Pop xo¸ phÇn tö ë ®Ønh Stack

§iÒu kiÖn ®Çu: Empty(S) = false§iÒu kiÖn cuèi: Error = None nÕu ®iÒu kiÖn ®Çu ® îc

tho¶ m·n.Pop(Create()) = Create()Pop(Push(X,S)) =S

Error=StackUnderFlow nÕu ®iÒu kiÖn ®Çu kh«ng tho¶*)Procedure Push(Item: StackElementType,Var Stack: StackType);(* Push bæ sung thªm mét phÇn tö vµo ®Ønh Stack

§iÒu kiÖn ®Çu: Full(S) = false§iÒu kiÖn cuèi: Error = None nÕu ®iÒu kiÖn ®Çu ® îc

tho¶ m·n.Error=StackOverFlow nÕu ®iÒu kiÖn ®Çu kh«ng

tho¶ *)Procedure Top(Stack: StackType):StackElementType;(* Top lÊy phÇn tö ë ®Ønh Stack

§iÒu kiÖn ®Çu: Empty(S) = false§iÒu kiÖn cuèi: Error = None nÕu ®iÒu kiÖn ®Çu ® îc

tho¶ m·n vµ tr¶ vÒ phÇn tö cuèi cïng ® îc bæ sung vµo Stack.

Error=StackUnderFlow nÕu ®iÒu kiÖn ®Çu kh«ng tho¶

Top(Create()) = NullTop(Push(X,S)) =X *)

End StackPackage

VÝ dô C¸c hÖ so¹n th¶o v¨n b¶n lu«n cho phÐp mét sè kÝ tù (vÝ dô "back space") ®îc dïng nh kÝ tù xãa, c¸c kÝ tù nµy cã thÓ huû bá nh÷ng kÝ tù ®øng tríc cha bÞ xãa. VÝ dô nÕu "#" lµ kÝ tù xãa th× d·y kÝ tù abc#d##e thùc ra lµ d·y kÝ tù ae. KÝ tù "#" ®Çu tiªn xãa c, c¸i thø hai xãa d vµ thø ba xãa b.C¸c hÖ so¹n th¶o v¨n b¶n còng cã mét kÝ tù ®Æc biÖt, t¸c ®éng cña nã lµ hñy bá tÊt c¶ c¸c kÝ tù ®øng tríc nã trªn dßng hiÖn thêi.Ttrong vÝ dô nµy chóng ta sÏ dïng '@' nh lµ ký tù ®Æc biÖt ®ã.Mét hÖ so¹n th¶o v¨n b¶n cã thÓ xö lý mét dßng v¨n b¶n b»ng c¸ch sö dông mét ng¨n xÕp. HÖ so¹n th¶o ®äc mét kÝ tù vµo t¹i mét thêi ®iÓm. NÕu kÝ tù ®îc ®äc kh«ng lµ @ hay # th× ®Èy kÝ tù nµy vµo ng¨n xÕp. NÕu kÝ tù ®äc ®îc lµ kÝ tù # th× hÖ so¹n th¶o ®Èy mét kÝ tù ra khái ng¨n xÕp. Vµ nÕu kÝ tù ®äc ®îc lµ @ th× hÖ so¹n th¶o lµm cho ng¨n xÕp trë thµnh rçng. Mét ch¬ng tr×nh thùc hiÖn nh÷ng t¸c ®éng nh vËy ®îc ®a ra ë h×nh 3.26

procedure Edit ;var

S : stack ;

- 143 -

c : char ;begin

Create (S) ; while not eoln do begin

read(c) ;if c = '#' then

Pop(S) ;else if c = '@' then

Create (S) ;else { c lµ mét kÝ tù b×nh thêng}

Push(c,S)end;In S theo tr×nh tù ®¶o ngîc ;

end ; {Edit}H×nh 3.26 Ch¬ng tr×nh ®a ra t¸c ®éng xãa vµ hñy nhiÒu kÝ

Trong ch¬ng tr×nh nµy, kiÓu stack ph¶i ®îc khai b¸o nh mét danh s¸ch c¸c kÝ tù (char). Qu¸ tr×nh viÕt ra stack theo tr×nh tù ®¶o ngîc trong dßng cuèi cña ch¬ng tr×nh cã mét chót tÕ nhÞ. ViÖc ®Èy ra khái stack mçi lÇn mét kÝ tù sÏ ®a ra c¸c kÝ tù trªn dßng v¨n b¶n ®ã theo thø tù ®¶o ngîc. NÕu cµi ®Æt stack b»ng m¶ng (stack còng lµ mét danh s¸ch) th× chóng ta dÔ dµng viÕt ®îc mét thñ tôc in ra stack b¾t ®Çu tõ ®¸y. Tuy nhiªn nÕu tu©n theo c¬ chÕ ho¹t ®éng cña stack mét c¸ch nghiªm ngÆt , r»ng thªm vµo vµ lo¹i bá phÇn tö lu«n chØ ë top, th× ®Ó ®¶o ngîc mét stack chóng ta ph¶i ®Èy ra khái stack nµy tõng phÇn tö vµ tuÇn tù ®Èy chóng vµo mét stack thø hai; råi sau ®ã ®Õn lît c¸c phÇn tö ®îc ®Èy ra khái stack thø hai vµ ®îc in trong thø tù ®Èy ra.Mét cµi ®Æt ng¨n xÕp b»ng m¶ng

- 144 -

C¸ch cµi ®Æt danh s¸ch dïng m¶ng chóng ta ®a ra ë phÇn 3.3.1 kh«ng thuËn lîi cho biÓu diÔn stack, do mçi lÇn Pop hay Push ®ßi hái dÞch chuyÓn toµn bé phÇn cßn l¹i cña danh s¸ch lªn hay xuèng, nh vËy tèn thêi gian tû lÖ víi sè phÇn tö trong stack. §æi l¹i mét chót, cã thÓ lÊy ®¸y cña stack lµ ®¸y cña m¶ng (n¬i cã chØ sè cao nhÊt) vµ ®Ó stack lín lªn phÝa ®Ønh cña m¶ng (n¬i cã chØ sè thÊp). Chóng ta sÏ dïng mét biÕn top cho vÞ trÝ cña phÇn tö ®Çu tiªn trong stack. ý tëng tæ chøc mét stack nh vËy nµy ®îc minh häa ë h×nh 3.27

H×nh 3.27 Mét cµi ®Æt ng¨n xÕp b»ng m¶ng

§èi víi c¸ch cµi ®Æt stack dïng m¶ng nh vËy chóng ta ®Þnh nghÜa kiÓu d÷ liÖu trõu tîng stack nh sautype

Stack = recordtop : integer ;element : array[1.. maxlength] of elementtype ;

end;

Mét thÓ hiÖn cña stack bao gåm mét d·y element[top], element[top+1],. . , element[maxlength]. Chó ý r»ng nÕu top = maxlength +1 th× stack rçng.

- 145 -

maxlength

phÇn tö cuèi

phÇn tö thø nhÊt

1

top phÇn tö

thø hai

S¸u thao t¸c thêng gÆp ®îc cµi ®Æt nh trong h×nh 3.28. Chó ý r»ng ®Ó hµm Top(S) ®a ra mét gi¸ trÞ thuéc kiÓu elementtype th× elementtype ph¶i hîp lÖ víi kÕt qu¶ cña mét hµm. NÕu kh«ng hoÆc Top ph¶i lµ mét thñ tôc cã tham sè thø hai lµ tham biÕn chøa kÕt qu¶ tr¶ ra, hoÆc Top lµ mét hµm tr¶ ra con trá trá ®Õn elementtype

Procedure Create (var S : stack) ;begin

S.top := maxlength + 1 ;end; {Create}

Function Empty (S : stack) : boolean ;begin

if S.top > maxlength thenreturn (true)

elsereturn (false)

end; {Empty}

Function Full (S : stack) : boolean ;begin

if S.top =1 thenreturn (true)

elsereturn (false)

end; {Full}

Function Top (var S : stack) : elementtype;begin

if Empty(S) thenerror('ng¨n xÕp rçng')

- 146 -

else Top := S.element[S.top];

end; {Top}

Procedure Pop (var S : stack) ;begin

if Empty(S) thenerror('ng¨n xÕp rçng')

else S.top := S.top + 1 ;

end; {Pop}

Procedure Push (x: elementtype ; S : stack);begin

if Full(S) thenerror('ng¨n xÕp ®Çy')

else beginS.top :=S.top - 1 ;S.element[S.top] := x ;

end;end; {Push}

H×nh 3.28 Dïng m¶ng cµi ®Æt c¸c thao t¸c trªn stack

Mét cµi ®Æt ng¨n xÕp dïng con trá mãc nèiBiÓu diÔn stack b»ng con trá mãc nèi dÔ dµng do Pop vµ Push

lµm viÖc chØ ë vÞ trÝ ®Çu tiªn cña danh s¸ch. Nh vËy chóng ta kh«ng cÇn sö dông cell header vµ thùc ra kh«ng cÇn kh¸i niÖm “vÞ trÝ” trong stack. Tãm l¹i, cã thÓ coi stack lµ mét danh s¸ch mãc nèi ®¬n, kh«ng cã header vµ con trá trá vµo ®Çu cña danh s¸ch nµy lµ top cña stack. H×nh 3.29 díi ®©y cho chóng ta mét cµi ®Æt stack theo quan niÖm ®ã

- 147 -

type celltype = record

info : elementtype;next : ^ celltype;

end;stack = ^ celltype;

Procedure Create (var S : stack) ;begin

New(S);S := nil;

end; {Create}

Function Empty (S : stack) : boolean ;begin

if S = nil thenEmpty:= true

elseEmpty:= false

end; {Empty}

Function Top (var S : stack) : elementtype;begin

if Empty(S) thenerror('ng¨n xÕp rçng')

else Top := S^.info;

end; {Top}

Procedure Pop (var S : stack) ;begin

- 148 -

if Empty(S) thenerror('ng¨n xÕp rçng')

else S := S^.next ;

end; {Pop}

Procedure Push (x: elementtype ; S : stack);var p: ^celltype;begin

New(p); p^.info:=x;p^.next:=S;S := p

end; {Push}H×nh 3.29 Dïng con trá mãc nèi cµi ®Æt c¸c thao t¸c trªn stack

§Ó ý r»ng trong cµi ®Æt trªn ®©y kh«ng xuÊt hiÖn hµm Full (kiÓm tra stack ®· ®Çy hay cha). ë phÇn cµi ®Æt danh s¸ch chóng ta ®· tõng gi¶i thÝch khi gi¶ thiÕt r»ng c¸c øng dông chóng ta xÐt ®Õn kh«ng ®ßi hái dung lîng nhí vît qu¸ kh¶ n¨ng cÊp ph¸t cña m¸y tÝnh. Còng cÇn nh¾c l¹i r»ng nÕu elementtype lµ kiÓu d÷ liÖu kh«ng ®îc phÐp ®èi víi gi¸ trÞ cña hµm th× c©u lÖnh Top:=S^.info trªn ®©y cÇn ®îc viÕt l¹i.

Mét vÝ dô øng dông ng¨n xÕp KiÓu d÷ liÖu trõu tîng ng¨n xÕp ®îc sö dông trong nhiÒu bµi to¸n ®Æt ra trong lÜnh vùc khoa häc m¸y tÝnh. Mét trong nh÷ng øng dông ng¨n xÕp quen thuéc lµ bµi to¸n chuyÓn mét biÓu thøc sè häc ë d¹ng (kÝ ph¸p) trung tè sang d¹ng hËu tè. Nh chóng ta ®· biÕt, mét biÓu thøc ë d¹ng trung tè cã c¸c to¸n tö ®øng gi÷a c¸c to¸n h¹ng,

- 149 -

cßn biÓu thøc ë d¹ng hËu tè th× c¸c to¸n tö ®i ngay sau c¸c to¸n h¹ng cña thao t¸c ®ã. VÝ dô

BiÓu thøc ë d¹ng trung tè

BiÓu thøc ë d¹ng hËu tè

a + bd/e x c +2

a b +d e / c x 2 +

Chó ý r»ng trong biÓu thøc ë d¹ng hËu tè mét to¸n tö lu«n ®îc ¸p dông cho c¸c to¸n h¹ng ®øng ngay tríc to¸n tö ®ã. Víi mét biÓu thøc, thø tù xuÊt hiÖn c¸c to¸n h¹ng trong d¹ng hËu tè gièng nh trong d¹ng trung tè, chØ thø tù c¸c to¸n tö lµ kh¸c ®i. Thø tù thùc hiÖn c¸c thao t¸c trong mét biÓu thøc ë d¹ng hËu tè lµ têng minh, trong khi ®ã, ®Ó thÓ hiÖn ®îc chÝnh x¸c thø tù thùc hiÖn c¸c thao t¸c trong mét biÓu thøc trung tè ngêi ta cã thÓ ph¶i dïng thªm c¸c dÊu ngoÆc (ngoµi c¸c kÝ hiÖu to¸n tö vµ c¸c to¸n h¹ng). Ch¼ng h¹n biÓu thøc ë d¹ng trung tè viÕt nh sau: a + b *c cã thÓ g©y ra sù hiÓu nhÇm gi÷a hai trêng hîp:(a+b)*c vµ trêng hîp a + (b*c). Trong khi ®ã nÕu viÕt ë d¹ng hËu tè lµ a b c * + th× kh«ng g©y mét sù hiÓu lÇm nµo, ch¾c ch¾n lµ phÐp * ®îc thùc hiÖn víi hai tãan h¹ng viÕt ngay tríc nã lµ b vµ c. Cßn nÕu muèn biÓu diÔn (a + b) * c th× chóng ta ph¶i viÕt nh sau trong d¹ng hËu tè: a b + c *.

Chóng ta cã thÓ dïng mét ng¨n xÕp ®Ó chuyÓn ®æi mét biÓu thøc ë d¹ng trung tè vÒ d¹ng hËu tè. Trong øng dông nµy ng¨n xÕp cã nhiÖm vô t¹m gi÷ nh÷ng to¸n tö cha ®îc xö lý cho ®Õn khi c¸c to¸n h¹ng t¬ng øng cña nã ®· s½n sµng. D÷ liÖu vµo cña thuËt to¸n sÏ lµ mét biÓu thøc ë d¹ng trung tè, kÕt qu¶ tr¶ ra lµ biÓu thøc nµy ë d¹ng hËu tè.

ý tëng cña thuËt to¸n nh sau: §äc x©u input tõ tr¸i sang ph¶i. NÕu ký tù tiÕp theo trong x©u input lµ mét to¸n h¹ng th× ®Æt to¸n

- 150 -

h¹ng nµy vµo x©u ouput mµ kh«ng cÇn cã thªm mét xö lý nµo. NÕu ký tù tiÕp theo trong x©u input lµ mét to¸n tö , sÏ chØ x¶y ra mét trong hai trêng hîp sau ®©y. Trêng hîp thø nhÊt, ng¨n xÕp S rçng hoÆc to¸n tö ë ®Ønh ng¨n xÕp cã ®é u tiªn thÊp h¬n ®é u tiªn cña võa ®äc ®îc, khi ®ã ph¶i thùc hiÖn Push(, S) tríc khi ®äc tiÕp. Trêng hîp thø hai lµ trêng hîp to¸n tö ë ®Ønh ng¨n xÕp cã ®é u tiªn cao h¬n ®é u tiªn cña . Lóc ®ã ph¶i lÆp ®i lÆp l¹i viÖc lÊy phÇn tö ë ®Ønh ng¨n xÕp ®Æt vµo x©u output cho ®Õn khi ng¨n xÕp rçng hay to¸n tö ë ®Ønh ng¨n xÕp cã ®é u tiªn thÊp h¬n ®é u tiªn cña võa ®äc ®îc. Nh vËy ë trêng hîp thø hai nµy, sau khi thùc hiÖn (mét hay nhiÒu lÇn) thñ tôc Pop(S), chóng ta gÆp l¹i trêng hîp thø nhÊt vµ t¹i ®©y viÖc ®äc trªn x©u input ®îc tiÕp tôc. S¬ ®å sau minh häa thuËt to¸n trong mét Input cô thÓ

§äc trªn x©u input

Ng¨n xÕp S

Hµnh ®éng X©u output sau hµnh

®énga + b * c - d

a + b * c - d a + b * c - d a + b * c - d a + b * c - d a + b * c - d

a + b * c - d

(rçng)

(rçng)

+

+

+ *

+ *

®a ‘a’ vµo output, ®äc tiÕp

Push(‘+’, S), ®äc tiÕp

®a ‘b’ vµo output, ®äc tiÕp

Push(‘*’,S), ®äc tiÕp

®a ‘c’ vµo output, ®äc tiÕp

a

a

a b

a b

a b c

a b c *

- 151 -

a + b * c - d a + b * c - d a + b * c - d

a + b * c - d

+

(rçng)

-

-

(rçng)

®a Top(S) vµo x©u output vµ Pop(S)

®a Top(S) vµo x©u output vµ Pop(S)

Push(‘-‘,S), ®äc tiÕp

®a ‘d’ vµo output, hÕt x©u output

®a Top(S) vµo x©u output vµ Pop(S)

KÕt thóc

a b c * +

a b c * +

a b c * + d

a b c * + d -

a b c * + d -

H×nh 3.20 cho mét Module InfixToPostfixPackage cã chøc n¨ng chuyÓn mét biÓu thøc ë d¹ng trung tè sang d¹ng hËu tè theo thuËt to¸n chóng ta võa xem xÐt trªn ®©y.

Module InfixToPostfixPackage;From Stack Import

StackType, (*kiÓu d÷ liÖu trõu tîng ng¨n xÕp*)Create, (* thñ tôc khëi t¹o mét ng¨n xÕp míi rçng*)Empty , (* hµm kiÓm tra ng¨n xÕp cã rçng hay

kh«ng*)Pop, (* thñ tôc lo¹i bá phÇn tö ë ®Ønh ng¨n xÕp*)Push, (*thñ tôc thªm mét phÇn tö vµo ®Ønh ng¨n

xÕp*)Top; (*hµm tr¶ ra phÇn tö ë ®Ønh ng¨n xÕp)

- 152 -

From UserModule ImportNextChar, (* hµm tr¶ ra kÝ tù tiÕp theo trong biÓu thøc,

ngoµi ra hµm cßn cã mét tham biÕn kiÓu boolean nhËn gi¸ trÞ TRUE nÕu ®· ®äc ®Õn kÝ tù cuèi cña biÓu thøc vµ nhËn gi¸ trÞ FALSE trong trêng hîp ngîc l¹i*)

Error; (*hµm b¸o lçi ®îc gäi khi gÆp lçi trong qu¸ tr×nh chuyÓn ®æi mét biÓu thøc tõ d¹ng trung tè sang d¹ng hËu tè*)

Function Precedence (Op : Char) : Integer;(* Hµm g¸n cho mçi to¸n tö Op mét sè nguyªn biÓu diÔn ®é u tiªn thùc hiÖn*)Var

p : Integer;Begin

Case Op of ‘(‘ : p:= 0;(* NgoÆc më ®¸nh dÊu sù chê gÆp c¸c to¸n tö cho ®Õn khi gÆp ngoÆc ®ãng *)‘+’, ‘-‘, ’)’ : p:=1;‘*’, ‘/‘ : p:=2; (* PhÐp nh©n vµ phÐp chia cã ®é u tiªn cao nhÊt *)

End; {case}Precedence := p;

End; {Precedence}

Procedure InfixToPostfix;VarOpStack : StackType; (*KiÓu ng¨n xÕp chøa c¸c to¸n tö *) c : Char; (*KÝ tù ®ang ®îc xö lý *)

- 153 -

Done : Boolean (*nhËn gi¸ trÞ True khi ®äc hÕt x©u input *)

BeginCreate(OpStack);Done:= false;c := NextChar(Done);(* Vßng lÆp díi ®©y lµ vßng lÆp chÝnh ®Ó xö lý biÓu thøc. Khi vßng lÆp nµy kÕt thóc th× tÊt c¶ c¸c to¸n h¹ng sÏ ®îc xö lý vµ sÏ chØ cßn l¹i mét sè to¸n tö trong ng¨n xÕp*) While Not Done Do begin

Case c of‘a’, .. ’z’, ‘A’, .. ’Z’, ‘0’, .. ‘9’: Write(c);(* §a ra output c¸c h»ng vµ c¸c biÕn mµ kh«ng cÇn xö lý g× thªm

*)‘+’, ’-’, ‘*’, ’/’ :

While ((Not Empty(OpStack)) And(Precedence(c) <= Precedence(Top(OpStack))))

Do begin

Write(Top(OpStack));Pop(OpStack);

end; {While}(* §a ra output nh÷ng to¸n tö cßn l¹i trong ng¨n xÕp mµ ®é u tiªn cña chóng kh«ng nhá h¬n ®é u tiªn cña to¸n tö míi võa ®äc ®îc trªn x©u input *) Push(c,OpStack);(* §a to¸n tö míi ®äc ®îc vµo ng¨n xÕp *)

‘(’ : Push(c,OpStack);(*§a ngoÆc më vµo ng¨n xÕp*)

‘)’ :

- 154 -

While ((Not Empty(OpStack)) And(Precedence(c) <= Precedence(Top(OpStack))))

Do begin

Write(Top(OpStack));Pop(OpStack);

end; {While}(*§a ra output tÊt c¶ c¸c to¸n tö n»m trªn dÊu ngoÆc më gÆp ngay tríc ®ã *)If (Empty(OpStack) Or (Top(OpStack) <> ‘(‘)) Then

beginError; (*Kh«ng cßn mét ngoÆc më nµo trong ng¨n xÕp lµ v« lý *) Return;

end; {If}Pop(Opstack); (*Bá ®i dÊu ngoÆc më khi ®· xö lý xong ®o¹n biÓu thøc con ®îc ®¸nh dÊu bëi ngoÆc më nµy *)

end; {case}c := NextChar(Done); (*§äc kÝ tù tiÕp theo trªn x©u Input *)

end; {While}(* Sau vßng lÆp trªn biÓu thøc ®· ®îc ®äc hÕt. Vßng lÆp tiÕp theo sÏ hoµn thµnh viÖc ®a ra output nh÷ng to¸n tö cßn l¹i trong ng¨n xÕp *)While (Not Empty(OpStack)) Do begin

If (Top(OpStack) = ‘)’) Then begin Pop(OpStack); (* bá ®i dÊu ngoÆc ®ãng *)

If (Empty(OpStack) Or (Top(OpStack) <> ‘(‘)) Then begin

Error;Return;

- 155 -

end; {If}endelse

If (Top(OpStack)=’(‘) Then begin (*kh«ng thÓ cßn l¹i dÊu më ngoÆc ë ®Ønh ng¨n xÕp ®-îc*)

Error;Return;

endelse (*®a ra output to¸n tö kh¸c dÊu ngoÆc ë ®Ønh ng¨n xÕp*)

Write(Top(OpStack));Pop(OpStack); (*Bá ®i phÇn tö ë ®Ønh ng¨n xÕp ®Ó xö lý

to¸n tö tiÕp theo*)End; {While}

End; {InfixToPostfix}End; {InfixToPostfixPakage}

H×nh 3.31 Cµi ®Æt øng dông chuyÓn mét biÓu thøc trung tè sang d¹ng hËu tè

1.3 Hµng (hµng ®îi - Queue)

Hµng lµ mét d¹ng ®Æc biÖt kh¸c cña danh s¸ch, trong ®ã mçi thµnh phÇn ®îc thªm vµo ë mét ®Çu cña danh s¸ch gäi lµ “®Çu sau” (the rear) vµ xo¸ ®i t¹i ®Çu kia gäi lµ “®Çu tríc”(the front). Mét tªn gäi kh¸c cña hµng lµ danh s¸ch "FIFO" hay danh s¸ch "vµo_tríc_ra_tríc". C¸c thao t¸c trªn hµng t¬ng tù nh trªn ng¨n xÕp, kh¸c biÖt chÝnh lµ ë chç viÖc thªm phÇn tö vµo tiÕn hµnh t¹i ®Çu sau cña danh s¸ch chø kh«ng ph¶i t¹i ®Çu tríc. Chóng ta sÏ sö dông nh÷ng thao t¸c sau trªn hµng

- 156 -

1. Creat(Q) t¹o mét hµng Q rçng. Thao t¸c nµy chÝnh lµ thao t¸c cïng tªn trong trêng hîp danh s¸ch tæng qu¸t.

2. Front(Q) ®a ra phÇn tö ®Çu tiªn cña hµng Q. Front(Q) cã thÓ ®îc viÕt trong thuËt ng÷ cña c¸c thao t¸c trªn danh s¸ch nh lµ Retrieve(First(Q),Q).

3. Enqueue(x,Q) thªm phÇn tö x vµo hµng Q (thªm x vµo ®Çu sau cña Q). Trong thuËt ng÷ cña c¸c thao t¸c trªn danh s¸ch Enqueue(x,Q) lµ Insert(x,End(Q),Q).

4. Dequeue(Q) xo¸ bá phÇn tö ®Çu tiªn cña Q, nãi c¸ch kh¸c Dequeue(Q) lµ Delete(First(Q),Q). Còng nh thao t¸c Pop trong kiÓu d÷ liÖu trõu tîng ng¨n xÕp, cßn cã thÓ cµi ®Æt Dequeue h¬i kh¸c ®i. Mét lµ, cµi ®Æt thñ tôc Dequeue cã thªm tham biÕn thø hai chøa phÇn tö võa bÞ lo¹i bá. Hai lµ cµi ®Æt Dequeue nh mét hµm cã gi¸ trÞ lµ phÇn tö võa bÞ bá ®i

5. Empty(Q) tr¶ ra TRUE nÕu vµ chØ nÕu Q lµ mét hµng rçng.6. Full(Q) tr¶ ra TRUE nÕu vµ chØ nÕu Q lµ mét hµng ®Çy.Sau đây ta sẽ trình bày về cú pháp và ngữ nghĩa của các thao tác trên và cuối cùng là

External Module của kiểu dữ liệu trừu tượng Queue

- 157 -

Có ph¸p:Define Queue[Element]Create(): Queue[Element]Enqueue(Element, Queue[Element]) : Queue[Element]Dequeue(Queue[Element]) : Queue[Element]First(Queue[Element]) : ElementLast(Queue[Element]) : ElementFull(Queue[Element]) : BooleanEmpty(Queue[Element]) : BooleanNg÷ nghÜa:Empty(Create()) = trueEmpty(Enqueue(X,Q)) = falseFull(Create()) = falseIf Enqueue(X,Q) = ‘Error’ Then

Full(Q) = trueElseFull(Q) = false

If Not Empty(Q) Then First(Enqueue(X,Q)) = First(Q)First(Enqueue(X,Create())) = XFirst(Create()) kh«ng x¸c ®ÞnhLast(Enqueue(X,Create())) = XLast(Create()) kh«ng x¸c ®ÞnhDequeue(Create()) kh«ng x¸c ®ÞnhDequeue(Enqueue(X,Create())) = Create()If Not Empty(Q) Then

Dequeue(Enqueue(X,Q)) =Enqueue(X, Dequeue(Q))

- 158 -

- 159 -

(*Module nµy cµi ®Æt kiÓu d÷ liÖu trõu tîng Queue*)External Module QueuePackage;From ElementModule Import

QueueElementType; (*KiÓu d÷ liÖu cña c¸c phÇn tö trong Queue*)Type

QueueErrorType = (None. QueueUnderFlow, QueueOverFlow, FirstOfEmptyQueue)

QueueType;Var

Error: QueueErrorType (*BiÕn nµy sÏ bÞ g¸n khi c¸c thao t¸c trªn Queue x¶y ra lçi*)Procedure Create(): QueueType;

§iÒu kiÖn ®Çu: None§iÒu kiÖn cuèi: Error = None vµ mét Queue míi, rçng ®îc t¹o

raProcedure Dequeue(Var Q: QueueType);

§iÒu kiÖn ®Çu: Empty(Q) = false§iÒu kiÖn cuèi: NÕu tho¶ m·n ®iÒu kiÖn ®Çu th× Error =

None vµ xo¸ phÇn tö ®Çu tiªn ra khái Queue NÕu kh«ng tho¶ m·n ®iÒu kiÖn ®Çu th× Error =QueueUnderFlow

Dequeue(Create()) kh«ng x¸c ®Þnh Dequeue(Enqueue(X,Create())) = Create()

Dequeue(Enqueue(X,Q)) = Enqueue(X,Dequeue(Q))Procedure Empty(Q: QueueType): Boolean;

§iÒu kiÖn ®Çu: None§iÒu kiÖn cuèi: Error = None vµ tr¶ vÒ true nÕu Q rçng, tr¶

vÒ false nÕu ngîc l¹i . Empty(Create()) = true Empty(Enqueue(X,Q)) = false

Procedure Enqueue(Item: QueueElementType, Var Q: QueueType);

§iÒu kiÖn ®Çu: Full(Q) = false§iÒu kiÖn cuèi: NÕu tho¶ m·n ®iÒu kiÖn ®Çu th× Error =

None vµ bæ sung thªm mét phÇn tö vµo cuèi Queue.

NÕu kh«ng tho¶ m·n ®iÒu kiÖn ®Çu th× Error =QueueOverFlowProcedure First(Q: QueueType): QueueElementType;

§iÒu kiÖn ®Çu: Empty(Q) = false

Mét cµi ®Æt hµng b»ng con trá

Gièng nh ®èi víi ng¨n xÕp, bÊt cø mét cµi ®Æt nµo cña danh s¸ch còng hîp lÖ ®èi víi hµng. Tuy nhiªn, cÇn nhí r»ng c¸c phÐp thªm phÇn tö vµo chØ thùc hiÖn t¹i ®Çu sau. NÕu chóng ta lu«n cã s½n th«ng tin vÒ vÞ trÝ cuèi hµng, n¬i sÏ ®Æt thªm phÇn tö míi, th× thao t¸c Enqueue sÏ hiÖu qu¶ h¬n h¼n so víi viÖc ph¶i ch¹y däc danh s¸ch tõ ®Çu ®Õn cuèi mçi khi muèn thªm vµo hµng. Do ®ã chóng ta sÏ gi÷ mét con trá trá ®Õn phÇn tö cuèi. §ång thêi, nh ®èi víi tÊt c¶ c¸c d¹ng danh s¸ch, cÇn gi÷ mét con trá trá ®Õn ®Çu danh s¸ch. Trong trêng hîp danh s¸ch lµ mét hµng, con trá trá ®Õn ®Çu danh s¸ch cã Ých cho viÖc thùc hiÖn thao t¸c Front vµ Dequeue. Tãm l¹i, nÕu thÓ hiÖn mét hµng theo kiÓu mét danh s¸ch mãc nèi ®¬n th× chØ cÇn hai th«ng tin sau ®©y sÏ cho phÐp x¸c ®Þnh mét hµng: con trá trá vµo ®Çu tríc cña hµng vµ con trá trá vµo ®Çu sau cña hµng. Tríc hÕt chóng ta cÇn ®Þnh nghÜa c¸c thµnh phÇn cã kiÓu celltype nh tríc ®©y. Hµng sÏ ®îc cho bëi mét b¶n ghi chøa hai con trá x¸c ®Þnh ®Çu tríc vµ ®Çu sau cña hµng. H×nh 3.32 cho thÊy h×nh ¶nh cña mét hµng. TiÕp ®Õn lµ phÇn cµi ®Æt cô thÓ c¸c thao t¸c cña hµng trong c¸ch tæ chøc d÷ liÖu nµy (H×nh 3.33)

- 160 -

Procedure Full(Q: QueueType): Boolean;§iÒu kiÖn ®Çu: None

§iÒu kiÖn cuèi: Error = None vµ tr¶ vÒ true nÕu Q ®Çy, tr¶ vÒ false nÕu ng îc l¹i.

Full(Create()) = false If Enqueue(X,Q) = Error Then Full(Q) =true Else

Full(Q) = false

H×nh 3.32 Mét hµng tæ chøc theo kiÓu danh s¸ch mãc nèi ®¬n

Type celltype = record

info : elementtype ;next : ^ celltype ;

end; Queue = record

front, rear : ^celltype ;end;

procedure Create(var Q : queue) ;begin

Q.front := nil ;end; {Create}

function Empty(Q : queue) : boolean ;begin

if Q.front = nil then return(true)

else return(false)

end; {Empty}

- 161 -

l2 l3 lnl1

front

rear

function Front(Q : queue) : elementtype ;begin

if Empty(Q) then error(' hµng rçng ')

else return(Q.front^.info) ;

end; {Front}

procedure Endqueue(x:elementtype; var Q : queue) ;begin

new(Q.rear^.next) ; {t¹o ng¨n míi cho ®Çu cuèi cña hµng} Q.rear := Q.rear^.next ;

Q.rear^.info := x ; Q.rear ^.next := nil ;

end; {Endqueue}

procedure Dequeue (var Q : queue) ;begin

if Empty(Q) then error(' hµng rçng')

elseQ.front := Q.front^.next

end; {Dequeue}

H×nh 3.33 Cµi ®Æt kiÓu d÷ liÖu trõu tîng hµng sö dông con trá mãc nèi

Cµi ®Æt hµng b»ng m¶ng cuén trßn

Hµng còng lµ mét lo¹i danh s¸ch, mét cµi ®Æt danh s¸ch dïng m¶ng (®îc tr×nh bµy trong môc 3.31) còng ¸p dông ®îc ®èi víi

- 162 -

hµng. Tuy nhiªn chóng ta sÏ nhanh chãng nhËn ra c¸ch cµi ®Æt nh vËy lµ kh«ng hiÖu qu¶. §óng lµ víi con trá trá ®Õn phÇn tö cuèi chóng ta cã thÓ thùc hiÖn Enqueue víi mét h»ng sè c¸c bíc. Nhng Dequeue lo¹i bá ®i phÇn tö ë ®Çu tríc cña hµng l¹i ®ßi hái toµn bé phÇn cßn l¹i cña hµng ph¶i dÞch chuyÓn lªn tríc mét vÞ trÝ trong m¶ng. Nh vËy thêi gian thùc hiÖn Dequeue lµ O(n) nÕu hµng cã ®é dµi n. §Ó kh¾c phôc ®iÒu ®ã, chóng ta cã thÓ coi ®Çu tríc cña hµng t¬ng øng nh ®Ønh cña ng¨n xÕp vµ ®Ó lo¹i bá mét phÇn tö ë ®Çu tríc chØ ®¬n gi¶n lµ ®iÒu chØnh vÞ trÝ ®Çu tríc cña hµng lïi vÒ sau mét vÞ trÝ.

H×nh 3.34 Dïng m¶ng biÓu diÔn hµng (kh«ng cuén trßn)

DÔ thÊy r»ng sau mét lo¹t c¸c phÐp thªm phÇn tö (Endqueue), bá bít phÇn tö (Dequeue), c¸c phÇn tö cña hµng di tró dÇn vÒ phÝa chØ sè lín cña m¶ng. NghÜa lµ nh÷ng thµnh phÇn cña m¶ng tríc ®©y vèn chøa phÇn tö cña hµng, sau khi phÇn tö nµy bÞ lo¹i bá th× kh«ng cßn ®îc sö dông l¹i n÷a (kh«ng bao giê chøa phÇn tö nµo n÷a). Muèn tr¸nh tèn phÝ nµy, chóng ta cÇn cã mét c¸ch nh×n kh¸c. H·y h×nh dung mét m¶ng ®îc cuén trßn l¹i, vÞ trÝ ®Çu tiªn tiÕp theo sau vÞ trÝ cuèi cïng, nh ë h×nh 3.35. Khi ®ã c¸c phÇn tö cña hµng ®îc thÊy trong c¸c vÞ trÝ liªn tôc tõ vÞ trÝ ®Çu tríc ®Õn ®Çu sau theo chiÒu kim ®ång hå. §Ó bá ®i mét phÇn tö cña hµng,

- 163 -

front

rear

maxlength

C¸c phÇn

tö cña

hµng

chóng ta chØ cÇn chuyÓn dÞch Q.front mét vÞ trÝ theo chiÒu kim ®ång hå. Nh vËy, hµng di tró theo híng kim ®ång hå khi chóng ta thªm vµ c¸c bít phÇn tö. Quan s¸t ®Ó thÊy r»ng thñ tôc Enqueue vµ Dequeue cã thÓ ®îc viÕt víi mét h»ng sè c¸c bíc nÕu m« h×nh vßng trßn cña m¶ng ®îc sö dông.

H×nh 3.35 Hµng n»m trong mét m¶ng cuén trßn

Cã mét chót tÕ nhÞ trong biÓu diÔn ë h×nh 3.35 trªn. VÊn ®Ò lµ ë chç chóng ta cÇn ph©n biÖt trêng hîp hµng rçng víi trêng hîp hµng ®Çy. §Ó xem thö v× sao l¹i nh vËy, gi¶ sö hµng cho ë h×nh 3.35 cã maxlength phÇn tö. Khi ®ã Q.front sÏ chØ qu¸ mét vÞ trÝ theo chiÒu kim ®ång hå ®èi víi Q.rear. Cßn mét hµng rçng th× sao? §Ó xem mét hµng rçng ®îc biÓu diÔn nh thÕ nµo, tríc tiªn chóng ta h·y xem mét hµng chØ cã mét phÇn tö. Lóc nµy Q.front vµ Q.rear cïng chØ ®Õn mét phÇn tö. NÕu chóng ta bá ®i mét phÇn tö, Q.front sÏ dÞch chuyÓn mét vÞ trÝ theo chiÒu kim ®ång hå ®Ó t¹o thµnh hiÖn tr¹ng mét hµng rçng. Nh vËy mét hµng rçng cã Q.front qu¸ mét vÞ trÝ so víi Q.rear theo chiÒu kim ®ång hå, ®©y còng chÝnh lµ hiÖn tr¹ng khi hµng cã maxlength phÇn tö. Tõ ®ã chóng ta thÊy r»ng thËm chÝ m¶ng cã maxlength chç, chóng ta kh«ng thÓ ®Ó mét hµng lín qu¸ maxlength -1 trõ phi chóng ta giíi thiÖu mét c¬

- 164 -

1

2

maxlength

Q. front

Q. rear Queu

e

chÕ kh¸c ®Ó ph©n biÖt ®îc, ch¼ng h¹n lu«n duy tr× mét biÕn dïng ®Ó ®Õm sè phÇn tö cña hµng.

Tãm l¹i chóng ta sÏ sö dông m« h×nh mét m¶ng “cuén trßn” ®Ó cµi ®Æt kiÓu d÷ liÖu trõu tîng hµng (queue). §Ó x¸c ®Þnh ®îc n¬i c tró hiÖn t¹i cña hµng ë trong m¶ng, cÇn duy tr× th«ng tin vÒ vÞ trÝ ®Çu tríc vµ vÞ trÝ ®Çu sau cña hµng. NÕu m¶ng cã kÝch thíc tèi ®a lµ maxlength, chóng ta sÏ chØ cho phÐp hµng cã tèi ®a maxlength-1 phÇn tö. Chóng ta lµm ®iÒu nµy ®Ó ph©n biÖt trêng hîp hµng rçng víi trêng hîp hµng ®Çy. Khi hµng rçng, Q.front qu¸ mét vÞ trÝ so víi Q.rear theo chiÒu kim ®ång hå, cßn khi hµng ®Çy Q.front qu¸ hai vÞ trÝ so víi Q.rear theo chiÒu kim ®ång hå. Mét c¸ch h×nh thøc hµng ®îc ®Þnh nghÜa nh h×nh 3.36Type

Queue = recordelement : array[1..maxlength] of elementtype ;front, rear : integer ;

end ;

H×nh 3.36

- 165 -

H×nh 3.37

Chóng ta h·y viÕt s¸u thao t¸c cña hµng t¬ng øng víi m« h×nh biÓu diÔn dïng m¶ng “cuén trßn”. C¸c thao t¸c nµy xuÊt hiÖn trong h×nh 3.38. Hµm Addone(i) cho vÞ trÝ ngay sau vÞ trÝ i trong h×nh dung m¶ng “cuén trßn”.

function Addone(i : integer) : integer ;

- 166 -

Q. front

Q. rear

Hµng chØ cã mét phÇn tö

Q. front

Hµng kh«ng cßn phÇn tö nµo

Q. rear

Hµng ®Çy

Q. front

Q. rear

beginreturn(i mod maxlength +1) ;

end; {Addone}

procedure Create(var Q : queue) ;begin

Q.front :=1 ;Q.rear := maxlength;

end; {Create}

function Empty(var Q : queue) : boolean ;begin

if Addone(Q.rear) = Q.front thenreturn(true)

elsereturn(false)

end; {Empty}

function Full(var Q : queue) : boolean ;begin

if Addone(Addone(Q.rear)) = Q.front thenreturn(true)

elsereturn(false)

end; {Full}

function Front(var Q : queue) : elementtype ;begin

if Empty(Q) thenerror(' hµng rçng')

else

- 167 -

return(Q.element[Q.front])end; {Front}

procedure Enqueue(x : elementtype ; var Q : queue) ;begin

if Full(Q) thenerror('hµng ®Çy')

else begin Q.rear := addone(Q.rear) ;Q.element[Q.rear] := x ;

endend; {Enqueue}

procedure Dequeue(var Q : queue) ;begin

if Empty(Q) thenerror('hµng rçng')

elseQ.front := addone (Q.front) ;

end; {Dequeue}H×nh 3.38 Cµi ®Æt hµng vßng trßn

Mét vÝ dô øng dông hµng ®îi

Ngµy nay nh÷ng ngêi thêng xuyªn sö dông m¸y tÝnh kh«ng l¹ g× ®Üa tõ. §Üa tõ lµ mét thiÕt bÞ lu tr÷ truy nhËp trùc tiÕp. Cã thÓ m« t¶ mét c¸ch chi tiÕt h¬n nh sau. Trªn bÒ mÆt ®Üa máng b»ng kim lo¹i cã c¸c vßng trßn ®ång t©m gäi lµ c¸c track (r·nh), d÷ liÖu ®îc ghi (b»ng tõ tÝnh) trªn c¸c track nµy. Mçi track l¹i bao gåm c¸c sector (cung). Mçi sector cã mét ®Þa chØ vµ cã mét dung lîng x¸c ®Þnh thêng lµ 256, 512 hay 1 024 byte. Sector lµ ®¬n vÞ nhá nhÊt trong viÖc giao chuyÓn th«ng tin gi÷a ®Üa tõ vµ bé nhí trong. Khi

- 168 -

chóng ta thùc hiÖn mét thao t¸c ®äc hay viÕt, ®ã lµ khi chóng ta ®äc hay viÕt toµn bé mét sector. Mçi sector cã mét ®Þa chØ duy nhÊt, bëi vËy chóng ta cã thÓ x¸c ®Þnh vµ ®Õn th¼ng mét sector bÊt kú. Cã mét ®Çu ®äc/ghi víi kh¶ n¨ng di chuyÓn vµo trong hay ra khái kh«ng gian phÝa trªn mét track nµo ®ã vµ chóng ta cã thÓ ®äc mét sector tïy ý cña track nµy. BÒ mÆt cña mét ®Üa tõ ®îc minh häa ë h×nh 3.39.

Thêi gian ®Ó giao chuyÓn ®îc d÷ liÖu chøa trong mét sector ®· biÕt trªn ®Üa bao gåm:

1. Thêi gian t×m kiÕm. §©y lµ thêi gian ®Ó ®Þnh vÞ ®Çu ®äc/ghi trªn ®óng track chøa d÷ liÖu ®ã

2. Thêi gian quay. §©y lµ thêi gian ®Ó toµn bé sector chøa d÷ liÖu ®ã quay qua hÕt díi ®Çu ®äc/ghi

3. Thêi gian chuyÓn d÷ liÖu. §©y lµ thêi gian ®Ó ®äc d÷ liÖu chøa trong mét sector vµ chuyÓn d÷ liÖu ®ã vµo bé nhí trong.

H×nh 3.39 H×nh ¶nh m« t¶ mét ®Üa tõ

Thêi gian t×m kiÕm lµ lín nhÊt do ph¶i thùc hiÖn nh÷ng thao t¸c dÞch chuyÓn mét cÇn g¾n ®Çu ®äc/ghi, ®©y lµ nh÷ng dÞch

- 169 -

Sector

Tracks

§Çu ®äc/ghi

Vµo

vµ ra

BÒ mÆt ®Üa

chuyÓn mang tÝnh c¬ khÝ nªn chËm h¬n nhiÒu so víi nh÷ng thao t¸c kh¸c. Th«ng thêng thêi gian t×m kiÕm cña mét ®Üa lµ tõ 10 ®Õn 50miligi©y* (mét miligi©y lµ mét phÇn ngh×n cña gi©y), gÊp kho¶ng 10000 lÇn thêi gian ®Ó bé xö lý thùc hiÖn mét chØ thÞ trong ng«n ng÷ m¸y. Bëi vËy chóng ta rÊt quan t©m ®Õn nh÷ng thuËt to¸n lËp mét lÞch tr×nh nh»m gi¶m tèi ®a chuyÓn ®éng cña cÇn g¾n ®Çu ®äc/ghi.

C¸ch nghÜ ®¬n gi¶n nhng cã lÏ lµ kÐm hiÖu qu¶ nhÊt (theo quan ®iÓm hÖ thèng) lµ ®¸p øng ngay yªu cÇu cña ngêi dïng khi nhËn ®îc yªu cÇu ®ã mµ kh«ng cÇn xem xÐt néi dung cña yªu cÇu. Gi¶ sö chóng ta lµm viÖc víi mét ®Üa cã 500 track vµ theo thø tù chóng ta nhËn ®îc c¸c yªu cÇu vÒ d÷ liÖu ë c¸c track 1, 499, 1, 499. NÕu chóng ta ®¸p øng yªu cÇu theo ®óng thø tù nhËn ®îc th× chóng ta ph¶i di chuyÓn cÇn g¾n ®Çu ®äc/ghi mét kho¶ng lín (1

499 1 499). Thêi gian ®¸p øng nh÷ng yªu cÇu nµy chñ yÕu lµ thêi gian t×m kiÕm chø kh«ng ph¶i lµ thêi gian ®Ó ®äc d÷ liÖu. Chóng ta cã thÓ linh ho¹t mét chót, ®¸p øng c¶ hai yªu cÇu ë track 1 sau ®ã míi di chuyÓn cÇn g¾n ®Çu ®äc ®Õn track 499 ®Ó ®¸p øng lu«n c¶ hai yªu cÇu cßn l¹i. KiÓu lËp lÞch tr×nh nh vËy ®îc gäi lµ SSTF (shortest seek time first- Thêi gian t×m kiÕm ng¾n nhÊt tríc). Yªu cÇu tiÕp theo ®îc chän ®Ó ®¸p øng l¹i kh«ng ph¶i lµ yªu cÇu tiÕp theo trong thø tù xuÊt hiÖn, mµ lµ yªu cÇu liªn quan ®Õn track gÇn nhÊt (so víi track võa ®îc ®äc). C¸ch xö sù ®ã dùa theo tiªu chÝ chän gi¶i quyÕt yªu cÇu mµ thêi gian t×m kiÕm lµ Ýt nhÊt, bëi vËy nã cã tªn ‘Thêi gian t×m kiÕm ng¾n nhÊt tríc '.

Cã thÓ dÔ dµng cµi ®Æt SSTF b»ng c¸ch dïng mét m¶ng c¸c hµng, mçi hµng t¬ng øng víi mét track cña ®Üa. Gi¶ sö c¸c track trªn ®Üa ®îc ®¸nh sè tõ 1 ®Õn Max. Khi nhËn ®îc mét yªu cÇu ®äc hay ghi d÷ liÖu trªn track N (1£ N £ Max), chóng ta thªm yªu cÇu nµy vµo cuèi hµng t¬ng øng víi track N (Endqueue) nh ë h×nh 3.40. Khi ®Çu ®äc/ghi ë trªn track i, nã sÏ phôc vô tÊt c¶ c¸c yªu cÇu cã

- 170 -

trong hµng t¬ng øng víi track i tríc khi nã chuyÓn sang track tiÕp theo.

H×nh 3.40 Minh häa c¸ch tæ chøc hµng yªu cÇu trong cµi ®Æt SSTF

Tuy vËy, ph¬ng ¸n trªn vÉn cã mét nhîc ®iÓm. NÕu tiªu chuÈn cña chóng ta chØ lµ ‘thêi gian t×m kiÕm ng¾n nhÊt’ th× cã thÓ ®Çu ®äc/ghi cø lµm viÖc m·i trªn mét phÇn cña ®Üa mµ kh«ng di chuyÓn ®Õn mét track ë xa ®Ó phôc vô nh÷ng yªu cÇu d÷ liÖu ë ®ã. Ch¼ng h¹n, gi¶ sö ®Çu ®äc/ghi hiÖn ®ang ë trªn track 5 vµ cã nhiÒu yªu cÇu d÷ liÖu ë c¸c track 3, 4, 5, 6 vµ 99. ThÕ th× ®Çu ®äc/ghi lu«n di chuyÓn trong vïng tõ track 3 ®Õn track 6 mµ kh«ng chuyÓn dÕn track 99 ®Ó ®¸p øng yªu cÇu d÷ liÖu ë track nµy. NhvËy, vÒ ph¬ng diÖn lý thuyÕt SSTF ®· xö sù kh«ng c«ng b»ng, cã thÓ mét sè yªu cÇu kh«ng bao giê ®îc ®¸p øng.

§Ó ®¶m b¶o r»ng tÊt c¶ c¸c yªu cÇu cña ngêi sö dông ®Òu ®-îc ®¸p øng víi mét sù quan t©m c«ng b»ng, cÇn ph¶i thay ®æi thuËt to¸n SSTF mét chót. Chóng ta sÏ chuyÓn ®éng cÇn g¾n ®Çu ®äc/ghi theo mét híng trong mét thêi gian, ch¼ng h¹n theo híng tõ track 1 ®Õn track Max, sau ®ã ®æi l¹i chuyÓn ®éng theo híng tõ track Max vÒ track 1. Ph¬ng ¸n nµy cã tªn lµ SSTF - mét híng hay cßn gäi lµ Sweep-SSTF. Yªu cÇu tiÕp theo ®îc chän ®¸p øng sÏ lµ yªu

- 171 -

1 2 3 4 5 Max• • • • • •• • • • •• • •

• •

§Çu ®äc/ghi

M¶ng c¸c

hµng yªu cÇu

F

R

F

RYªu cÇu

cÇu tháa ®iÒu kiÖn thêi gian t×m kiÕm ng¾n nhÊt theo híng dÞch chuyÓn hiÖn thêi.

ViÖc cµi ®Æt Sweep-SSTF ®îc giíi thiÖu ë h×nh 3.41. Trong module ®ã, chóng ta tæ chøc thñ tôc: Initialize, DiskRequest vµ NextRequest. Initialize sÏ khëi t¹o mét m¶ng c¸c hµng rçng, mçi hµng t¬ng øng víi mét track cña ®Üa. DiskRequest(R, N) cã nhiÖm vô thªm yªu cÇu R vµo cuèi hµng t¬ng øng víi track N, nÕu hµng nµy cha ®Çy. DÜ nhiªn yªu cÇu R ph¶i lµ yªu cÇu d÷ liÖu ë track N nªn ta míi xÕp R vµo hµng ®ã. Trong trêng hîp hµng ®· ®Çy hay kh«ng tån t¹i track thø N th× sÏ cã mét th«ng b¸o lçi xuÊt hiÖn vµ ®ång thêi yªu cÇu nµy bÞ lo¹i bá *( gi¶ sö hÖ ®iÒu hµnh sÏ cã nh÷ng øng xö thÝch hîp). NextRequest(R) sÏ ®a ra yªu cÇu tiÕp theo sÏ ®îc ®¸p øng theo c¸ch chän cña Sweep-SSTF, cô thÓ lµ:

1. NÕu cã mét yªu cÇu trong hµng t¬ng øng víi track hiÖn thêi th× ®©y lµ yªu cÇu tiÕp theo sÏ ®îc phôc vô vµ lo¹i bá yªu cÇu nµy ra khái hµng (Dequeue)

2. NÕu hµng t¬ng øng víi track hiÖn thêi lµ hµng rçng th× chuyÓn dÞch cÇn g¾n ®Çu ®äc theo híng ®ang ph¶i tu©n theo cho ®Õn khi t×m thÊy mét hµng kh¸c rçng hoÆc ®Õn khi hÕt ®Üa. Khi ®ã ®æi híng chuyÓn ®éng vµ lÆp l¹i bíc 2 nµy cho ®Õn khi tÊt c¶ c¸c track ®Òu ®· ®îc kiÓm tra.

3. NÕu kh«ng cßn mét yªu cÇu trong bÊt cø mét hµng nµo th× thñ tôc NextRequest sÏ th«ng b¸o r»ng tÊt c¶ c¸c yªu cÇu ®· ®-îc ®¸p øng vµ kÕt thóc c«ng viÖc.

Module SweepSSTF;From QueuePackage Import

QueueType, (*kiÓu d÷ liÖu trõu tîng queue*)QueuErrorTypes, (*c¸c d¹ng lçi cã thÓ xuÊt hiÖn khi

thùc hiÖnc¸c thao t¸c trªn queue *)

- 172 -

Error, (*thñ tôc b¸o lçi thùc hiÖn c¸c thao t¸c trªn queue*)

Create, (*thñ tôc khëi t¹o mét queue míi rçng*)Endqueue, (*thñ tôc thªm mét phÇn tö míi vµo

queue*)Dequeue, (*thñ tôc lo¹i bá mét phÇn tö khái

queue*)Front, (*hµm tr¶ ra phÇn tö ë ®Çu tríc cña

queue*)

Type(* Nh÷ng lçi cã thÓ xuÊt hiÖn *)

DiskSchedErrTypes = (None, IllegalTrack, TooManyReq, NoReq);

Var(*m¶ng c¸c phÇn tö lµ c¸c queue, mçi queue øng víi mét

track*)RequestList : Array[1.. NumberOfTrack] Of QueueType ;(*cê b¸o lçi*)DiskSchedErr : DiskSchedErrTypes ;(*VÞ trÝ hiÖn thêi cña ®Çu ®äc/ghi trªn ®Üa*)CurrentTrack : 1.. NumberOfTrack ;(*Híng t×m kiÕm hiÖn thêi cña ®Çu ®äc/ghi *)Direction : (Up, Down) ;

Procedure Initialize ;Var

i : Integer;Begin

For i:=1 To NumberOfTrack Do Create(RequestList[i]);

- 173 -

DiskSchedErr := None;End; {Initialize}

Procedure DiskRequest (R : Request ; N : Integer);Begin

If (N < 1) Or (N > NumberOfTrack) Then begin(*kh«ng cã track nµo cã sè hiÖu nh vËy*)DiskSchedErr := IllegalTrack ;Return;

end; {If}If (Full(RequestList[N] )) Then begin

(*hµng c¸c yªu cÇu t¬ng øng víi track N ®· ®Çy*)DiskSchedErr := TooManyReq ;Return;

end; {If}(*Thªm yªu cÇu R vµo hµng*)Enqueue (R, RequestList[N]) ;DiskSchedErr := None;

End; {DiskRequest}

Procedure NextRequest (Var R: Request) ;Var

HitOneEnd : Boolean; (* cê b¸o hÕt ®Üa*)Begin

HitOneEnd := False ;(*LÆp cho ®Õn khi t×m thÊy mét hµng kh¸c rçng*)While (Empty(RequestList[Current Track])) Do begin

If (Direction = Up) Then If (CurrentTrack = NumberOfTrack) Then

If (HitOneEnd) Then begin

- 174 -

(*§· duyÖt ®Õn cuèi, kh«ng cßn yªu cÇu nµo trong hµng*)

DiskSchedErr := NoRequest ;Return;

end {If 3}else (*CurrentTrack <> NumberOfTrack*)

CurrentTrack:= CurrentTrack + 1else (*Direction = Down*)

If (CurrentTrack = 1) Then beginIf (HitOneEnd) Then begin

DiskSchedErr := NoRequest ;Return;

end;HitOneEnd := True ;Direction := Up ;CurrentTrack:= CurrentTrack + 1

end else (*CurrentTrack <> 1*)

CurrentTrack:= CurrentTrack - 1;end; {While} (*T×m thÊy mét yªu cÇu ®Ó phôc vô vµ lo¹i bá nã khái hµng*)R := Front(RequestList[CurrentTrack]) ;Dequeue (RequestList[CurrentTrack]);

End; {NextRequest}End. {Module SweepSSTF}H×nh 3.41 Cµi ®Æt Module SweepSSTF xö lý c¸c yªu cÇu

®äc/ghi d÷ liÖu trªn ®Üa

C©u hái vµ bµi tËp1. H·y ph¸t biÓu mét sè bµi to¸n øng dông mµ khi gi¶i quyÕt

chóng anh/chÞ nghÜ tíi viÖc sö dông kiÓu d÷ liÖu trõu tîng

- 175 -

danh s¸ch. Víi mçi øng dông ®ã, h·y cho biÕt c¸c thao t¸c (c¸c thao t¸c) thêng ®îc sö dông trªn kiÓu d÷ liÖu trõu tîng danh s¸ch mµ anh/chÞ ®· dïng ®Ó m« h×nh hãa hiÖn thùc.

2. Cµi ®Æt danh s¸ch (®Þnh nghÜa danh s¸ch vµ c¸c thao t¸c cña danh s¸ch) b»ng m¶ng.

3. Cµi ®Æt mét Module phôc vô cho viÖc qu¶n lý gi¸o viªn trong mét trêng häc víi th«ng tin vÒ gi¸o viªn ®îc tæ chøc theo kiÓu danh s¸ch mãc nèi ®¬n. ViÖc qu¶n lý gi¸o viªn nh vËy thêng cã nh÷ng nhiÖm vô cô thÓ nh sau:

a) NhËp d÷ liÖu vÒ gi¸o viªn. Mçi gi¸o viªn cÇn lu c¸c th«ng tin sau: Hä vµ tªn, sè ®iÖn tho¹i, d¹y m«n häc nµo (gi¶ sö mçi gi¸o viªn chØ d¹y mét m«n häc), l¬ng th¸ng.

b) In ra th«ng tin cña tÊt c¶ gi¸o viªn trong danh s¸ch, th«ng tin vÒ mçi gi¸o viªn in trªn mét dßng

c) T×m mét gi¸o viªn khi biÕt hä tªn vµ m«n häc do gi¸o viªn nµy gi¶ng d¹y. Hä tªn vµ m«n häc nhËp tõ bµn phÝm, cÇn tr¶ lêi “cã” hay “kh«ng cã” gi¸o viªn nh vËy trong danh s¸ch, cho biÕt sè ®iÖn tho¹i cña gi¸o viªn nµy nÕu c©u tr¶ lêi lµ “cã”

d) Th«ng b¸o sè gi¸o viªn gi¶ng d¹y cña mçi m«n häc, tªn m«n häc nhËp tõ bµn phÝm

e) Th«ng b¸o trung b×nh céng l¬ng cña c¸c gi¸o viªn trong trêng

4. Cho mét ®a thøc P(x) ®îc tæ chøc díi d¹ng danh s¸ch mãc nèi ®¬n, p lµ con trá trá ®Õn danh s¸ch ®ã. ViÕt thñ tôc tÝnh gi¸ trÞ cña P(x) víi gi¸ trÞ x cho biÕt.

5. BiÓu diÔn mét ®a thøc díi d¹ng mét danh s¸ch mãc nèi ®¬n. ViÕt thñ tôc céng vµ nh©n hai ®a thøc

6. ViÕt thñ tôc tr¸o ®æi hai phÇn tö ë vÞ trÝ p vµ Next(p) trong mét danh s¸ch mãc nèi ®¬n.

- 176 -

7. ViÕt ch¬ng tr×nh trén hai danh s¸ch ®· ®îc s¾p xÕp8. T¹i sao khi dïng danh s¸ch mãc nèi vßng, chóng ta thêng dïng

mét cell ®Æc biÖt head ë ®Çu vßng? H·y ®a ra nhËn xÐt so s¸nh trêng hîp danh s¸ch mãc nèi vßng cã head vµ kh«ng cã head.

9. Cµi ®Æt hai thñ tôc thªm mét phÇn tö vµ lo¹i bá mét phÇn tö trong mét danh s¸ch mãc nèi kÐp (thªm mét phÇn tö vµo tríc phÇn tö thø k, xãa ®i phÇn tö thø k, k lµ sè nguyªn d¬ng)

10. So s¸nh c¬ chÕ cña hai lo¹i danh s¸ch ®Æc biÖt : ng¨n xÕp (stack) vµ hµng ®îi (queue)

11. Cµi ®Æt kiÓu d÷ liÖu trõu tîng ng¨n xÕp12. Cµi ®Æt kiÓu d÷ liÖu trõu tîng hµng ®îi13. Cã thÓ lu hai ng¨n xÕp trong mét m¶ng mét chiÒu, h·y

thÓ hiÖn ý tëng nµy.14. Gi¶ sö chóng ta dïng mét “ng¨n” cña hµng ®Ó chøa th«ng tin hµng rçng hay kh«ng. Söa l¹i c¸c khai b¸o vµ c¸c thao t¸c cho mét hµng trong cµi ®Æt dïng m¶ng cuén trßn ®Ó phï hîp víi gi¶ sö nµy. NhËn xÐt thuËn lîi vµ h¹n chÕ trong c¸ch thÓ hiÖn hµng theo c¸ch nh vËy.

- 177 -

CH¦¥NG 4: C¢Y4.1. GIíI THIÖUTrong ch¬ng nµy, chóng ta sÏ nghiªn cøu cÊu tróc d÷ liÖu ph©n cÊp. Nh ®· ®Þnh nghÜa trong ch¬ng 3, cÊu tróc d÷ liÖu ph©n cÊp lµ cÊu tróc d÷ liÖu mµ mçi phÇn tö trong cÊu tróc chØ cã duy nhÊt mét phÇn tö cha vµ nhiÒu phÇn tö con. Trong khoa häc m¸y tÝnh, ngêi ta gäi cÊu tróc ph©n cÊp lµ c©y.

Trong thùc tÕ, nhiÒu khi chóng ta còng b¾t gÆp cÊu tróc nµy. VÝ dô, cÊu tróc gia ph¶ cña mét dßng hä, s¬ ®å tæ chøc cña mét c«ng ty, môc lôc cña mét quyÓn s¸ch …

§Çu tiªn, chóng ta sÏ t×m hiÓu vÒ c©y tæng qu¸t vµ c¸c ®Þnh nghÜa c¬ b¶n. Sau ®ã lµ mét lo¹i c©y ®îc sö dông rÊt phæ biÕn trong khoa häc m¸y tÝnh – c©y nhÞ ph©n. Cuèi cïng, sÏ tr×nh bµy vÒ mét sè lo¹i c©y phôc vô cho c¸c môc ®Ých ®Æc biÖt nh t×m kiÕm, lu tr÷ d÷ liÖu …

4.2. C¢Y TæNG QU¸TC©y tæng qu¸t hay cßn gäi lµ c©y, ®îc ®Þnh nghÜa mét c¸ch ®Ö quy nh sau:

§Þnh nghÜa: T lµ mét c©y nÕu nã rçng hoÆc chøa mét tËp h÷u h¹n c¸c nót, trong ®ã cã mét nót gèc t T vµ ta cã thÓ ph©n t¸ch T – {t} thµnh nhiÒu c©y con kh¸c, ®éc lËp nhau T1, T2, … , Tn.

Nót lµ c¸c phÇn tö trªn c©y ®Ó lu tr÷ d÷ liÖu. Mçi nót chøa mét thµnh phÇn d÷ liÖu vµ c¸c liªn kÕt ®Õn c¸c nót kh¸c. Liªn kÕt gi÷a c¸c nót thêng ®îc gäi lµ cung hay c¹nh cña c©y. Theo ®Þnh nghÜa trªn, ta cã thÓ nãi r»ng mçi nót trªn c©y lµ mét nót gèc cña mét c©y con nµo ®ã trong c©y tæng qu¸t ban ®Çu. VÝ dô, ta xÐt h×nh 4-1:

- 178 -

C©y T = {a, b, c, d, e, f, g}

Cã nót gèc lµ {a} vµ 2 c©y con cña nã lµ

T1 = {b} vµ T2 = {c, d, e, f, g}

Gèc cña c©y T1 lµ b, vµ T1 kh«ng cã c©y con. Gèc cña c©y T2 lµ c vµ T2 cã c¸c c©y con lµ {d}, {e}, {f,g}.

Tuy nhiªn, chóng ta l¹i kh«ng thÓ ph©n t¸ch ®îc c©y sau thµnh mét nót gèc vµ c¸c c©y con ®éc lËp víi nhau.

NÕu ta gäi a lµ gèc cña c©y, th× c¸c c©y con cã thÓ lµ {b, d, c} vµ {c, d, b}, nhng c¸c c©y con nµy l¹i kh«ng ®éc lËp víi nhau. KiÓu d÷

- 179 -

a

b c

d fe

g

H×nh 4-1: VÝ dô vÒ mét c©y

a

b c

d

liÖu nh vËy, ta gäi lµ ®å thÞ, vµ chóng ta sÏ nghiªn cøu kü ë ch¬ng sau.

Sè lîng c©y con cña mét nót ta gäi lµ cÊp cña nót ®ã. Trong h×nh 4-1, nót a cã cÊp lµ 2, b cã cÊp 0 vµ c cã cÊp 3 …Nót kh«ng cã c©y con gäi lµ nót l¸ hay cßn gäi lµ nót tËn cïng. Nót l¸ trong h×nh 4-1 lµ: b, d, e, g. TÊt c¶ c¸c nót cßn l¹i gäi lµ nót trung gian hay nót nh¸nh. H×nh 4-1, nót trung gian lµ a, c vµ f.

Ta cã thÓ sö dông mét sè thuËt ng÷ sau: Trong h×nh 4-1, a lµ cha cña b, c vµ b, c lµ con cña a. C¸c nót mµ cã cïng cha gäi lµ anh em, b vµ c lµ anh em.

§êng ®i lµ mét chuçi duy nhÊt c¸c nót n1, n2, …, nk trong ®ã ni+1 lµ con cña ni víi i=1, 2,… , k-1 (khi ®i tõ trªn xuèng) hoÆc ni+1 lµ cha cña ni víi i= 1, 2, … , k-1 (khi ®i tõ dêi lªn). Tæ tiªn cña nót N lµ tÊt c¶ c¸c nót n»m trªn ®êng tõ gèc tíi nót ®ã. VÝ dô, h×nh 4-1 tæ tiªn cña nót g lµ a, c, f. Con ch¸u cña nót N lµ tÊt c¶ c¸c nót n»m trªn c©y con mµ N lµ nót gèc. ChiÒu cao cña c©y lµ ®êng ®i dµi nhÊt tõ nót gèc tíi bÊt kú mét nót nµo ®ã trªn c©y. ChiÒu cao cña c©y trªn h×nh 4-1 lµ 3, v× ®êng ®i dµi nhÊt tõ nót tíi bÊt kú ®Ønh nµo ®ã trªn c©y chÝnh lµ {a, c, f, g} cã 3 c¹nh.

Møc cña mét nót lµ gi¸ trÞ nguyªn ®Ó ®o kho¶ng c¸ch tõ nót ®ã tíi gèc. Nót gèc cã møc lµ 0. Møc cña mét nót trªn c©y ®îc ®Þnh nghÜa b»ng møc cña cha cña nót ®ã + 1. ChiÒu cao cña c©y chÝnh lµ møc lín nhÊt cña mét nót nµo ®ã trªn c©y.

Víi nh÷ng kh¸i niÖm trªn, ta cã thÓ rót ra ®Þnh nghÜa vÒ mét c©y nh sau:

1. Víi mäi nót trªn c©y chØ cã mét ®êng ®i duy nhÊt tõ nót ®ã ®Õn gèc.

2. Mäi nót trªn c©y, trõ nót gèc ®Òu cã duy nhÊt mét cha.

- 180 -

Nh vËy, víi cÊu tróc cña ®å thÞ 4 nót trªn kh«ng ph¶i lµ c©y v×: nót d cã hai cha lµ b vµ c; vµ tõ d cã hai ®êng ®i tíi gèc {d, b, a} vµ {d, c, a}.

KiÓu c©y mµ chóng ta m« t¶ ë trªn lµ c©y tæng qu¸t. C¸c nót trªn c©y tæng qu¸t cã cÊp tuú ý, do ®ã sè lîng con cña mçi nót trªn c©y lµ tuú ý.

M« t¶ c©y tæng qu¸t th× kh¸ ®¬n gi¶n, nhng ®Ó cµi ®Æt ®îc chóng l¹i rÊt phøc t¹p. Vµ c©y tæng qu¸t thêng Ýt ®îc sö dông trong khoa häc m¸y tÝnh. §Ó hiÓu t¹i sao l¹i nh vËy, chóng ta h·y xem xÐt c¸ch cµi ®Æt cÊu tróc bªn trong cña c©y tæng qu¸t.

Ta cã thÓ coi mçi nót lµ mét b¶n ghi gåm tõ mét ®Õn n¨m con trá trá ®Õn con cña nã. CÊu tróc nµy ®îc m« t¶ trong h×nh 4-2. Tuy nhiªn, nã kh«ng tho¶ m·n ®iÒu kiÖn mçi nót trªn c©y tæng qu¸t cã sè lîng nót con tuú ý. V× ë ®©y, ta chØ cho phÐp tèi ®a mçi nót cã 5 nót con. B©y giê, b¹n cã thÓ nghÜ r»ng ta cã thÓ t¨ng sè nót con cho phÐp lªn 10, 15 hay N nµo ®ã. Tuy nhiªn, víi bÊt kú mét gi¸ trÞ N nµo cho tríc th× vÉn cã thÓ x¶y ra trêng hîp mét nót nµo ®ã trªn c©y tæng qu¸t cã N+1 nót con.

Cßn nhiÒu c¸ch kh¸c ®Ó cµi ®Æt c©y tæng qu¸t vµ tr¸nh ®îc nh÷ng vÊn ®Ò nµy. VÝ dô, thay v× trªn mét nót ph¶i chøa c¸c con trá trá ®Õn nót con cña nã, ta sö dông danh s¸ch liªn kÕt. Tøc lµ, ta

- 181 -

TypeTree = Pointer To Node;Node = RecordData : Char;Children : Array[1..5] of Tree;End;

Var Root : Tree;

H×nh 4-2: Mét ph ¬ng ph¸p cµi ®Æt c©y tæng qu¸t

1

2 3

4 65 7

sö dông mét m¶ng A, trong ®ã c¸c phÇn tö A[i] lµ Header cña danh s¸ch liªn kÕt chøa c¸c nót con cña nót i. VÝ dô, ta cã mét c©y sau:

th× cÊu tróc bªn trong cña c©y ®ã nh sau:

CÊu tróc nµy cho phÐp mçi nót trªn c©y tæng qu¸t cã sè lîng nót con tuú ý. Tuy nhiªn, chóng ta vÉn gÆp ph¶i mét vÊn ®Ò t¬ng tù nh khi

- 182 -

Data

Data

Data

Data

Data

Data

1

2

3

4

5

6

7

4 5 6

2 3

cµi ®Æt Stack vµ Queue b»ng m¶ng. Do ®ã, tæng sè nót tèi ®a mµ mét c©y cã thÓ cã vÉn ph¶i khai b¸o tríc. H¬n n÷a, viÖc x¸c ®Þnh nót con cña mét nót nµo ®ã b¾t buéc ph¶i duyÖt trªn danh s¸ch liªn kÕt. V× vËy, ph¶i mÊt nhiÒu thêi gian t×m kiÕm.

§Ó kh¾c phôc nhîc ®iÓm nµy, ngêi ta thêng sö dông c©y nhÞ ph©n. Trong phÇn tiÕp theo, chóng ta sÏ t×m hiÓu vÒ c©y nhÞ ph©n.

4.3. C¢Y NHÞ PH¢N

4.3.1. Giíi thiÖu

C©y nhÞ ph©n kh¸c c©y tæng qu¸t ë hai ®iÓm c¬ b¶n sau: C¸c nót trªn c©y nhÞ ph©n cã nhá h¬n hoÆc b»ng 2, tøc lµ mçi nót cã tèi ®a 2 nót con, vµ c¸c nót con ®ã lµ nót con tr¸i hoÆc nót con ph¶i.

§Þnh nghÜa: C©y nhÞ ph©n lµ mét tËp rçng hoÆc tËp h÷u h¹n c¸c nót chøa mét nót gèc vµ hai c©y nhÞ ph©n tr¸i vµ ph¶i ®éc lËp nhau.

H×nh 4-3 biÓu diÔn mét sè vÝ dô vÒ c©y nhÞ ph©n

C©y nhÞ ph©n trªn h×nh 4-3a, b cã cÊu tróc gièng nhau, chØ kh¸c nhau vÒ trêng d÷ liÖu trªn c¸c nòt. Tuy nhiªn, c©y nhÞ ph©n trªn h×nh 4-3e, d kh¸c nhau vÒ cÊu tróc. H×nh 4-3d lµ c©y nhÞ ph©n lÖch tr¸i, h×nh 4-3e lµ c©y nhÞ ph©n lÖch ph¶i. Nh vËy, mét c©y ®îc x¸c ®Þnh kh«ng chØ th«ng qua trêng d÷ liÖu chøa trªn c¸c nót, mµ cßn phô thuéc vµo vÞ trÝ cña c©y con tr¸i vµ c©y con ph¶i trªn mçi nót. Do ®ã, b¹n ph¶i thËt cÈn thËn khi vÏ c©y nhÞ ph©n, ph¶i ph©n biÖt râ c©y con tr¸i vµ c©y con ph¶i. Trong trêng hîp, b¹n vÏ kh«ng râ rµng:

- 183 -

a

b

th× ngêi ta cã thÓ hiÓu lµ

- 184 -

C©y nhÞ ph©n lµ mét trêng hîp ®Æc biÖt cña c©y tæng qu¸t, nhng nã ®îc sö dông nhiÒu h¬n c©y tæng qu¸t. V× vËy, tiÕp theo chóng ta sÏ nghiªn cøu kü h¬n vÒ c¸c thao t¸c trªn c©y nhÞ ph©n vµ c¸ch cµi ®Æt c©y nhÞ ph©n.

4.3.2. C¸c thao t¸c trªn c©y nhÞ ph©n

- 185 -

a

b

a

b

a

cb

a.

d

fe

b.

c.

h

ki

g

ml

a

bd.

a

ce.

H×nh 4-3: Mét sè vi dô vÒ c©y nhÞ ph©n

§Ó x©y dùng external module cña kiÓu d÷ liÖu trõu tîng - C©y nhÞ ph©n, tríc tiªn chóng ta ph¶i x¸c ®Þnh c¸c thao t¸c mµ ta sÏ thùc hiÖn trªn c©y nhÞ ph©n. Thao t¸c phæ biÕn nhÊt lµ thao thao t¸c duyÖt c©y. Thao t¸c duyÖt c©y b¾t ®Çu tõ nót gèc vµ tíi th¨m c¸c nót trªn c©y ®óng mét lÇn, “th¨m” mét nót cã nghÜa lµ xö lý d÷ liÖu chøa trªn nót ®ã. (ý nghÜa cña viÖc th¨m mét nót hoµn toµn phô thuéc vµo tõng øng dông cña b¹n).

Cã nhiÒu c¸ch ®Ó th¨m c¸c nót trªn c©y. Ta cã thÓ b¾t ®Çu th¨m nót gèc, sau ®ã duyÖt c¸c nót tiÕp theo trªn c©y con tr¸i hoÆc c©y con ph¶i. NÕu b¹n th¨m c¸c nót trªn c©y con tr¸i tríc, råi ®Õn c¸c nót trªn c©y con ph¶i th× ®ã lµ ph¬ng ph¸p duyÖt theo thø tù tríc (preorder traversal).

VÝ dô, ta xÐt h×nh 4-4. ThuËt to¸n duyÖt theo thø tù tríc sÏ ®îc thùc hiÖn nh sau:

1. Th¨m gèc (+)

2. DuyÖt c©y con tr¸i (* a b)

3. DuyÖt c©y con ph¶i (c)

Bíc 2 vµ 3 l¹i thùc hiÖn duyÖt c©y con tr¸i vµ ph¶i. Qu¸ tr×nh diÔn ra nh sau:

1. Th¨m gèc (+)

2. DuyÖt c©y con tr¸i (* a b)

2.1. Th¨m gèc (*)

2.2. DuyÖt c©y con tr¸i (a)

2.3. DuyÖt c©y con ph¶i (b)

3. DuyÖt c©y con ph¶i (c)

3.1. Th¨m gèc (c)

3.2. DuyÖt c©y con tr¸i (rçng)

- 186 -

3.3. DuyÖt c©y con ph¶i (rçng)

Khi tÊt c¶ c¸c c©y con rçng th× thuËt to¸n sÏ dõng. Nh vËy, toµn bé thuËt to¸n duyÖt c©y nhÞ ph©n trªn h×nh 4-4 sÏ diÔn ra nh sau:

1. Th¨m gèc (+)\

2. DuyÖt c©y con tr¸i (* a b)

2.1. Th¨m gèc (*)

2.2. DuyÖt c©y con tr¸i (a)

2.2.1. Th¨m gèc (a)

2.2.2. DuyÖt c©y con tr¸i (rçng)

2.2.3. DuyÖt c©y con ph¶i rçng

2.3. DuyÖt c©y con ph¶i (b)

2.3.1. Th¨m gèc (b)

2.3.2. DuyÖt c©y con tr¸i (rçng)

2.3.3. DuyÖt c©y con ph¶i (rçng)

3. DuyÖt c©y con ph¶i (c)

3.1. Th¨m gèc (c)

3.2. DuyÖt c©y con tr¸i (rçng)

3.3. DuyÖt c©y con ph¶i (rçng)

- 187 -

+

* c

a b

H×nh 4-4: C©y nhÞ ph©n

Thñ tôc nµy cã vÎ kh¸ phøc t¹p, nhng thùc tÕ nã lµ mét gi¶i thuËt ®Ö quy. NÕu R lµ mét c©y nhÞ ph©n, th× thuËt to¸n duyÖt c©y nhÞ ph©n theo thøc tù tríc ®îc cµi ®Æt nh h×nh 4-5. §iÒu kiÖn dõng khi c©y nhÞ ph©n rçng. §iÒu kiÖn ®Ö quy lµ th¨m gèc, duyÖt c©y con tr¸i, duyÖt c©y con ph¶i.

Cã mét sè c¸ch kh¸c ®Ó duyÖt c©y. DuyÖt theo thø tù sau:

1. DuyÖt c©y con tr¸i

2. DuyÖt c©y con ph¶i

3. Th¨m gèc

DuyÖt theo thø tù gi÷a:

1. DuyÖt c©y con tr¸i

2. Th¨m gèc

3. DuyÖt c©y con ph¶i

- 188 -

Procedure PreOrderTraversal(R)Begin

If R rçng ThenReturnElseTh¨m gèc RPreOrderTraversal(C©y con tr¸i cña R)PreOrderTraversal(C©y con ph¶i cña R)End

End PreOrderTraversalH×nh 4-5: Gi¶i thuËt ®Ö quy duyÖt c©y nhÞ

ph©n theo thø tù tr íc

DuyÖt c©y theo thø tù tríc, sau vµ gi÷a t¬ng tù nh c¸c d¹ng cña biÓu thøc to¸n häc :tiÒn tè, hËu tè vµ trung tè. VÝ dô, h×nh 4-4, gi¶ sö th¨m gèc cã nghÜa lµ lÊy néi dung trêng d÷ liÖu chøa trong nót ®ã, ta sÏ cã kÕt qu¶ sau:

BiÓu thøc tiÒn tè cña (a * b + c) lµ: +*abc (To¸n tö tríc to¸n h¹ng)

DuyÖt c©y theo thø tù tríc: +*abc

BiÓu thøc hËu tè cña (a * b + c) lµ: ab*c+ (To¸n tö sau to¸n h¹ng)

DuyÖt c©y theo thø tù sau: ab*c+

BiÓu thøc trung tè cña (a * b + c) lµ: a*b+c (To¸n tö ë gi÷a to¸n h¹ng)

DuyÖt c©y theo thø tù gi÷a: a*b+c

H×nh 4-6 m« t¶ gi¶i thuËt ®Ö quy duyÖt c©y theo thø tù sau vµ thø tù gi÷a.

Chó ý r»ng trong c¶ ba ph¬ng ph¸p duyÖt c©y trªn th× c©y con tr¸i lu«n ®îc duyÖt tríc c©y con ph¶i.

Ngoµi thao t¸c duyÖt c©y, chóng ta cßn rÊt nhiÒu c¸c thao t¸c kh¸c trªn c©y. Tuy nhiªn, chóng ta cÇn ph¶i biÕt package Binary Tree sÏ ®îc sö dông nh thÕ nµo ®Ó bæ sung c¸c thao t¸c cho hîp lý. PhÇn cßn l¹i, chóng ta sÏ m« t¶ mét sè thao t¸c thêng ®îc sö dông trªn c©y nhÞ ph©n.

- 189 -

Procedure PostOrderTraversal(R)Begin

If R rçng ThenReturnElsePostOrderTraversal(C©y con tr¸i cña R)PostOrderTraversal(C©y con ph¶i cña R)Th¨m gèc REnd

End PostOrderTraversal

Procedure InOrderTraversal(R)Begin

If R rçng ThenReturnElseInOrderTraversal(C©y con tr¸i cña R)Th¨m gèc RInOrderTraversal(C©y con ph¶i cña R)End

End InOrderTraversalH×nh 4-5: Gi¶i thuËt ®Ö quy duyÖt c©y nhÞ ph©n theo

thø tù sau vµ gi÷a

Tríc tiªn, chóng ta cÇn cã thao t¸c t¹o ra mét c©y nhÞ ph©n rçng, gäi lµ CreateBinaryTree.

Sau ®ã lµ 2 thao t¸c lµm biÕn ®æi c©y nhÞ ph©n Insert vµ Delete. Thao t¸c Insert sÏ t¹o ra mét nót míi, g¸n gi¸ trÞ vµo trêng d÷ liÖu vµ chÌn nót míi nµy vµo mét vÞ trÝ x¸c ®Þnh trªn c©y. §Ó thùc hiÖn ®iÒu nµy, Insert cÇn 3 tham sè:

1. Mét con trá trá ®Õn nót lµ cha cña nót míi sÏ ®îc chÌn vµo.

2. Mét gi¸ trÞ ®Ó x¸c ®Þnh nót míi sÏ ®îc chÌn vµo bªn tr¸i hay bªn ph¶i.

3. D÷ liÖu mµ nót míi sÏ chøa.

§iÒu kiÖn tríc cña thao t¸c Insert lµ vÞ trÝ mµ nót míi ®îc chÌn vµo cha bÞ chiÕm chç. VÝ dô, cho mét c©y nhÞ ph©n nh sau:

- 190 -

T

a

cb

T

P

Sau lêi gäi thñ tôc Insert(P, Left, ‘d’), sÏ t¹o ra mét c©y míi nh sau:

Nh vËy, ta ®· t¹o ra mét nót míi d vµ ®îc chÌn vµo vÞ trÝ con tr¸i cña nót trá bëi P. C©y con tr¸i vµ c©y con ph¶i cña nót míi ®Òu lµ rçng. Thao t¸c Insert g¸n l¹i gi¸ trÞ cña con trá hiÖn thêi, trá ®Õn nót míi chÌn vµo c©y.

Thao t¸c Insert thêng ®îc sö dông ®Ó x©y dùng c©y. Chóng ta b¾t ®Çu víi mét c©y rçng, vµ sau ®ã bæ sung tõng nót míi vµo c¸c vÞ trÝ thÝch hîp trªn c©y. Ta còng cã thÓ chÌn c¶ c©y vµo mét vÞ trÝ nµo ®ã trªn c©y kh¸c – InsertSubTree. §éc gi¶ sÏ tù nghiªn cøu thao t¸c nµy.

Thao t¸c Delete xo¸ mét nót ra khái c©y. Tuy nhiªn, ta kh«ng thÓ xo¸ mét nót bÊt kú ra khái c©y, trõ khi ®ã lµ nót l¸. Ta ph¶i xo¸ toµn

- 191 -

a

cb

T

d

bé c©y con mµ nót cÇn xo¸ lµ gèc cña c©y ®ã. VÝ dô, ta cã c©y sau:

NÕu ta xo¸ nót d, th× ta ph¶i xo¸ toµn bé c©y con mµ d lµ gèc {d, e, f}. Khi xo¸ xong, thao t¸c Delete sÏ g¸n l¹i con trá hiÖn thêi, trá ®Õn cha cña nót võa bÞ xo¸.

Cuèi cïng lµ 3 thao t¸c kiÓm tra c©y nhÞ ph©n. Thao t¸c Compare so s¸nh hai c©y nhÞ ph©n xem chóng cã gièng nhau hay kh«ng. Hai c©y nhÞ ph©n gièng nhau khi cÊu tróc cña chóng gièng nhau vµ d÷ liÖu trªn c¸c nót ë vÞ trÝ t¬ng øng ph¶i nh nhau. Thao t¸c nµy tr¶ vÒ gi¸ trÞ true nÕu hai c©y nhÞ ph©n gièng nhau vµ tr¶ vÒ gi¸ trÞ false nÕu ngîc l¹i.

Thao t¸c Find kiÓm tra c©y ®îc x¸c ®Þnh bëi con trá trá ®Õn nót gèc cã nót nµo cã trêng gi¸ trÞ b»ng víi gi¸ trÞ truyÒn vµo. NÕu cã Find sÏ tr¶ vÒ con trá trá vµo nót cã gi¸ trÞ b»ng gi¸ trÞ truyÒn vµo vµ g¸n Found b»ng true, ngîc l¹i tr¶ vÒ Nil vµ g¸n Found b»ng false.

Thao t¸c Move cho phÐp b¹n di chuyÓn tõ mét nót nµo ®ã ®Õn nót con tr¸i, con ph¶i hoÆc cha cña nã. Move nhËn 3 tham sè truyÒn

- 192 -

b

dc

a

fe

vµo: C©y cÇn di chuyÓn, con trá trá ®Õn mét nót trªn c©y vµ mét trong ba gi¸ trÞ Left, Right vµ Up. Sau khi gäi Move, sÏ tr¶ vÒ con trá trá ®Õn nót con tr¸i, con ph¶i hoÆc cha cña nót ®ang xÐt vµ g¸n Success b»ng true. NÕu kh«ng di chuyÓn ®îc ®Õn nót con tr¸i, con ph¶i hoÆc cha cña nót ®ang xÐt, th× tr¶ vÒ Nil vµ g¸n Success b»ng false.

H×nh 4-7 m« t¶ external module cña kiÓu d÷ liÖu trõu tîng c©y nhÞ ph©n, gåm 9 thao t¸c. Cßn mét sè thao t¸c kh¸c còng kh¸ quan träng, ®éc gi¶ sÏ tù cµi ®Æt.

- 193 -

External Module BinaryTreePackage;From UserModule Import

DataElementType, (*KiÓu d÷ liÖu ® îc l u tr÷ trªn c¸c nót*)

Equal; (*Hµm kiÓm tra 2 biÕn cã kiÓu DataElementType cã b»ng nhau

hay kh«ng?*)Type

DirectionType = (Left, Right, Up); (*c¸c h íng cã thÓ di chuyÓn*)

TreeType;Procedure Compare(Tree1: TreeType, Tree2: TreeType): Boolean;

§iÒu kiÖn tr íc: None§iÒu kiÖn sau: Tr¶ vÒ true nÕu Tree1 vµ Tree 2 cã cïng

cÊu tróc vµ d÷ liÖu trªn c¸c nót t ¬ng øng lµ nh nhau. Ng îc l¹i, tr¶ vÒ false.Procedure CreateBinaryTree(): TreeType;

§iÒu kiÖn tr íc: None§iÒu kiÖn sau: Tr¶ vÒ mét c©y nhÞ ph©n míi, rçng.

Procedure Delete(Var Tree: TreeType, CurrentNode: TreeType);

§iÒu kiÖn tr íc: CurrentNode lµ mét nót trªn c©y§iÒu kiÖn sau: NÕu tho¶ m·n ®iÒu kiÖn ®Çu th× toµn

bé c©y con víi gèc lµ CurrentNode sÏ bÞ xo¸ khái Tree. Ng îc l¹i, Tree kh«ng thay ®æi.

- 194 -

Procedure Inorder(Tree: TreeType);§iÒu kiÖn tr íc: None§iÒu kiÖn sau: TÊt c¶ c¸c nót trªn c©y ®Òu ® îc th¨m theo

thø tù gi÷a.Procedure Preorder(Tree: TreeType);

§iÒu kiÖn tr íc: None§iÒu kiÖn sau: TÊt c¶ c¸c nót trªn c©y ®Òu ® îc th¨m theo

thø tù tr íc.Procedure Postorder(Tree: TreeType);

§iÒu kiÖn tr íc: None§iÒu kiÖn sau: TÊt c¶ c¸c nót trªn c©y ®Òu ® îc th¨m theo

thø tù sau.Procedure Insert(Var CurrentNode: TreeType, Direction: DirectionType, NewNode: DataElementType);

§iÒu kiÖn tr íc: CurrentNode lµ rçng. HoÆc CurrentNode lµ mét nót trªn c©y, Direction

lµ Right hoÆc Left vµ vÞ trÝ chÌn nót míi vµo ch a bÞ chiÕm chç.

§iÒu kiÖn sau: NÕu CurrentNode rçng th× mét nót míi ® îc t¹o ra vµ CurrentNode trá vµo nót míi.

NÕu CurrentNode trá vµo mét nót trªn c©y th× mét nót míi sÏ ® îc t¹o ra vµ trë thµnh con tr¸i hoÆc con ph¶i cña nót hiÖn thêi t ¬ng øng víi gi¸ trÞ cña Direction.

G¸n Currentnode trá vµo nót võa chÌn.NÕu ®iÒu kiÖn tr íc kh«ng ® îc tho¶ m·n th×

Insert sÏ thùc hiÖn kh«ng chÝnh x¸c.Procedure Find(Tree: TreeType, Key: DataElementType, Var Found: Boolean): TreeType

§iÒu kiÖn tr íc: None§iÒu kiÖn sau: NÕu Key trïng víi tr êng d÷ liÖu cña mét nót

nµo ®ã th× Found ® îc g¸n b»ng true vµ tr¶ vÒ nót cã d÷ liÖu b»ng Key. Chó ý, cã thÓ cã nhiÒu nót cã tr êng d÷ liÖu b»ng Key, nh ng ë ®©y ta tr¶ vÒ nót ®Çu tiªn t×m thÊy.

NÕu kh«ng t×m thÊy, Found g¸n b»ng false vµ tr¶ vÒ gi¸ trÞ Nil.Procedure Move(Tree: TreeType, CurrentNode: TreeType, Direction: DirectionType, Var Success: Boolean): TreeType;

§iÒu kiÖn tr íc: CurrentNode lµ mét nót trªn c©y vµ ph¶i cã mét nót ë vÞ trÝ t ¬ng øng víi Direction cña CurrentNode.

§iÒu kiÖn sau: NÕu ®iÒu kiÖn tr íc ® îc tho¶ m·n th× g¸n Success b»ng true vµ tr¶ vÒ nót ë vÞ trÝ t ¬ng øng víi Direction cña CurrentNode.

Ng îc l¹i, Success g¸n b»ng false vµ Move tr¶ vÒ mét gi¸ trÞ kh«ng x¸c ®Þnh

H×nh 4-7: External Module cña kiÓu d÷ liÖu trõu t îng c©y nhÞ ph©n

4.3.3. BiÓu diÔn c©y tæng qu¸t b»ng c©y nhÞ ph©n

Chóng ta tËp trung nghiªn cøu c©y nhÞ ph©n kü h¬n lµ do ta cã thÓ biÓu diÔn c©y tæng qu¸t b»ng c©y nhÞ ph©n. Chóng ta cÇn ph¶i nhí r»ng: mçi nót trªn c©y nhÞ ph©n cã nhiÒu nhÊt lµ 2 trêng trá ®Õn c©y con tr¸i vµ c©y con ph¶i. Chóng ta cã thÓ sö dông hai tr-êng nµy theo c¸ch sau ®Ó chuyÓn c©y tæng qu¸t sang c©y nhÞ ph©n:

a. Dïng con trá tr¸i cña mét nót trªn c©y nhÞ ph©n trá ®Õn nót con tr¸i nhÊt cña mét nót trªn c©y tæng qu¸t. Con trá tr¸i cña mét nót sÏ cã gi¸ trÞ Null nÕu nót ®ã kh«ng cã nót con.

b. Dïng con trá ph¶i cña mét nót trªn c©y nhÞ ph©n trá ®Õn nót anh em kÒ ph¶i gÇn nhÊt cña mét nót trªn c©y tæng qu¸t. Con trá ph¶i cña mét nót sÏ cã gi¸ trÞ Null nÕu nót ®ã kh«ng cã anh em.

VÝ dô, ta sÏ chuyÓn c©y tæng qu¸t sau thµnh c©y nhÞ ph©n:

- 195 -

b

fe

a

hg

dc

Con tr¸i nhÊt cña nót a lµ nót b, nªn con trá tr¸i cña a sÏ trá vµo nót b. Nót a kh«ng cã anh em nªn con trá ph¶i cña a sÏ cã gi¸ trÞ Null. T¬ng tù, con trá tr¸i cña b trá vµo nót e, con trá ph¶i cña b trá vµo nót c. Ta cø tiÕp tôc thùc hiÖn nh vËy ®èi víi c¸c nót c, d, e, f, g, h. Cuèi cïng ta ®îc c©y nhÞ ph©n nh sau:

ThuËt to¸n ®æi tõ c©y tæng qu¸t sang c©y nhÞ ph©n trªn cßn ®îc gäi lµ phÐp biÓu diÔn con tr¸i vµ anh em kÒ ph¶i, cho phÐp ta biÓu diÔn mét c©y cã cÊp tuú ý mµ chØ sö dông 2 liªn kÕt trªn mçi nót. Do ®ã, bÊt kú c©y tæng qu¸t nµo còng cã thÓ ®îc chuyÓn sang c©y nhÞ ph©n, vµ sau ®ã sö dông c¸c thao t¸c trong h×nh 4-7. Víi

- 196 -

b

ce

a

d

g

f

h

kh¶ n¨ng chuyÓn ®æi nµy, ta thÊy ®îc tÇm quan träng cña kiÓu d÷ liÖu trõu tîng c©y nhÞ ph©n vµ gi¶i thÝch ®îc t¹i sao c©y nhÞ ph©n l¹i ®îc sö dông réng r·i.

4.3.4. Cµi ®Æt c©y nhÞ ph©n b»ng danh s¸ch liªn kÕt

§Ó x©y dùng internal module cña BinaryTree package cña h×nh 4-7, chóng ta ph¶i lùa chän c¸ch biÓu diÔn c¸c nót trªn c©y nhÞ ph©n. Ta cã thÓ biÓu diÔn mét nót trªn c©y nhÞ ph©n b»ng c¸ch sö dông c¸c biÕn trá trá ®Õn c©y con tr¸i vµ c©y con ph¶i.

VÝ dô, víi c©y nhÞ ph©n sau:

- 197 -

+

* c

a b

TypeTreeType = Pointer To TreeNode; (*KiÓu d÷ liÖu

cña nót*)TreeNode = RecordData : DataElementType; (*Tr êng d÷ liÖu*)Left: TreeType; (*Con tr¸i cña nót*)Right: TreeType; (*Con ph¶i cña nót*)End;

VarRoot : TreeType; (*Khai b¸o mét c©y nhÞ

ph©n*) H×nh 4-8: Mét c¸ch cµi ®Æt c©y nhÞ

ta cã thÓ biÓu diÔn b»ng:

- 198 -

Cµi ®Æt c©y nhÞ ph©n b»ng c¸ch sö dông con trá kh«ng yªu cÇu chóng ta ph¶i biÕt tríc sè lîng nót cña c©y. Mçi khi ta muèn bæ sung thªm mét nót míi, ta chØ cÇn gäi hµm New (nh ®· m« t¶ trong ch-¬ng 3) ®Ó cÊp ph¸t bé nhí cho nót ®ã.

Type

TreeType = Pointer To TreeNode;

Var

T : TreeType;

.

.

New(T); (*CÊp ph¸t bé nhí cho mét nót míi*)

- 199 -

+

b

a

c

*

Root Data

Left Right

Víi khai b¸o nh h×nh 4-8, th× thñ tôc duyÖt c©y nhÞ ph©n theo thø tù sau vµ thø tù gi÷a sÏ nh h×nh 4-9. Thñ tôc duyÖt c©y nhÞ ph©n theo thø tù tríc coi nh bµi tËp ®Ó ®éc gi¶ tù thùc hiÖn.

Víi thao t¸c Insert, tríc tiªn ta ph¶i t¹o ra mét nót míi vµ sau ®ã chÌn nót nµy vµo mét vÞ trÝ x¸c ®Þnh trªn c©y. Ta ph¶i kiÓm tra con trá trá vµo vÞ trÝ cÇn chÌn cã b»ng Nil kh«ng. NÕu con trá hiÖn thêi b»ng Nil th× g¸n con trá hiÖn thêi trá vµo nót võa t¹o. Ngîc l¹i, kiÓm tra Direction (Direction chØ nhËn 2 gi¸ trÞ Left vµ Right), vµ chÌn nót míi vµo lµm con tr¸i hoÆc con ph¶i cña nót trá bëi con trá hiÖn thêi. Thñ tôc Insert ®îc m« t¶ trong h×nh 4-10.

C¸c thao t¸c kh¸c trªn c©y nhÞ ph©n sÏ lµ c¸c bµi tËp mµ ®éc gi¶ tù nghiªn cøu.

Cµi ®Æt c©y nhÞ ph©n b»ng c¸ch sö dông con trá lµ mét kü thuËt phæ biÕn nhÊt. C¸c thao t¸c di chuyÓn tõ nót gèc ®Õn nót con ®îc thùc hiÖn kh¸ dÔ dµng, nhng c¸c thao t¸c di chuyÓn tõ nót con ®Õn nót cha l¹i kh¸ phøc t¹p v× kh«ng cã con trá trá tõ con vÒ cha. §Ó x¸c ®Þnh cha cña mét nót nµo ®ã, ta ph¶i duyÖt c©y nhÞ ph©n tõ ®Ønh tíi nót ®ã. NÕu trong øng dông cña b¹n thao t¸c ®i tõ nót l¸ tíi nót gèc thêng xuyªn x¶y ra, b¹n cã thÓ bæ sung thªm mét con trá Up cho mçi nót ®Ó trá ®Õn nót cha cña tõng nót ®ã. Nh vËy, con trá Up cña nót gèc sÏ cã gi¸ trÞ Nil.

Víi c¸ch biÓu diÔn nµy, sÏ lµm cho mét sè thao t¸c trë lªn ®¬n gi¶n h¬n. VÝ dô, thao t¸c di chuyÓn con trá hiÖn thêi tõ nót hiÖn t¹i ®Õn

- 200 -

+

* c

a b

nót cha cña nã. Nhng bï l¹i, b¹n ph¶i tèn thªm kh«ng gian nhí ®Ó lu thªm mét con trá Up.

- 201 -

Procedure PostOrderTraversal(Root:TreeType)Begin

If (Root<>Nil) ThenPostOrderTraversal(Root^.Left);PostOrderTraversal(Root^.Right);Visit(Root);EndIf

End PostOrderTraversal

Procedure InOrderTraversal(R)Begin

If (Root<>Nil) ThenInOrderTraversal(Root^.Left);Visit(Root);InOrderTraversal(Root^.Right);EndIf

End InOrderTraversalH×nh 4-9: Thñ tôc duyÖt c©y nhÞ ph©n theo thø tù

sau vµ gi÷a

4.3.5. Cµi ®Æt c©y nhÞ ph©n b»ng m¶ng

MÆc dï, cµi ®Æt c©y nhÞ ph©n b»ng con trá nh h×nh 4-8 lµ mét c¸ch cµi ®Æt hÕt søc hiÖu qu¶, nhng víi nh÷ng ng«n ng÷ kh«ng hç trî biÕn ®éng nh Basic, Cobol …, th× chóng ta vÉn cã thÓ cµi ®Æt c©y nhÞ ph©n b»ng c¸ch sö dông m¶ng hai chiÒu. Chóng ta sÏ x©y

- 202 -

Procedure Insert(Var CurrentNode:TreeType, Direction: DirectionType, NewNode:

DataElementType);Var

Node : TreeNode;Begin

New(Node); (*T¹o nót míi*)Node^.Data := NewNode;Node^.Left := Nil;Node^.Right := Nil; If (CurrentNode = Nil) Then (*T¹o ra nót gèc

cña c©y*)CurrentNode := Node;ElseIf (Direction = Left) Then(*ChÌn nót míi vµo lµm con tr¸i*)

CurrentNode^.Left := Node;Elseif (Direction = Right) Then(*ChÌn nót míi vµo lµm con tr¸i*)

Currentnode^.Right := Node;Else(*Direction = Up lµ kh«ng hîp lÖ*)

Dispose(Node);EndifEndIf

End InsertH×nh 4-10: Thñ tôc Insert

dùng mét m¶ng hai chiÒu k x 3, trong ®ã mçi hµng t¬ng øng víi mét nót trªn c©y nhÞ ph©n. Cét ®Çu tiªn chøa trêng d÷ liÖu cña c¸c nót, cét thø hai chøa con trá trá tíi c©y con tr¸i, cét thø ba chøa con trá trá ®Õn c©y con ph¶i. Do ®ã, c©y nhÞ ph©n

sÏ ®îc biÓu diÔn nh h×nh 4-11, trong ®ã gi¸ trÞ 0 biÓu diÔn con trá Null vµ hµng cã dÊu “-” lµ hµng kh«ng sö dông. Nót gèc cña c©y ë hµng 2, con trá tr¸i trá ®Õn hµng 4, con trá ph¶i trá ®Õn hµng 6. C¸c nót cßn l¹i còng ®îc lu tr÷ t¬ng tù.

- 203 -

4 0 0

1 4 6

5 0 0

2 1 3

- -

3 0 0

. . .. . .. . .

- - -

- - -

123456

99100

Root = 2

Data

Left

Right

1

2 3

4 5

§Ó chØ ra mét hµng trong m¶ng cha ®îc sö dông, ta cã thÓ sö dông biÕn Available ë ®Çu danh s¸ch c¸c hµng cha ®îc sö dông. H×nh 4-12 khai b¸o c¸c kiÓu d÷ liÖu cÇn thiÕt ®Ó cµi ®Æt c©y nhÞ ph©n b»ng m¶ng, sö dông danh s¸ch kh«ng gian nhí cha sö dông, gi¶ sö trêng d÷ liÖu cña c¸c nót cã kiÓu Integer.

Tuy nhiªn, cµi ®Æt c©y nhÞ ph©n b»ng m¶ng vÉn cã nh÷ng nhîc ®iÓm vèn cã do ta ph¶i khai b¸o tríc kÝch thíc cña m¶ng. C©y nhÞ ph©n cña ta kh«ng thÓ cã sè lîng nót lín h¬n kÝch thíc cña m¶ng ®· khai b¸o. Ngîc l¹i, nÕu kÝch thíc cña m¶ng lín mµ c©y nhÞ ph©n cña ta qu¸ nhá th× sÏ g©y l·ng phÝ bé nhí.

H×nh 4-13 biÓu diÔn thao t¸c t×m kiÕm trªn c©y nhÞ ph©n. Thñ tôc Find kh«ng sö dông ®Ö quy mµ sö dông Stack.

- 204 -

H×nh 4-11: M¶ng biÓu diÔn c©y nhÞ ph©n

- 205 -

ConstMaxSize = …;

TypeTreeType = RecordTree : Array[1..MaxSize] of Node;Root : [0…MaxSize]; (*ChØ sè cña nót gèc*)Available : [..MaxSize]; (*ChØ sè cña phÇn tö

®Çu tiªn cña danh s¸ch chøa c¸c hµng rçi trong m¶ng *)

End;Node = RecordData : Integer;Left : [0..MaxSize];Right : [0..MaxSize];End;

VarBinarryTree: TreeeType;H×nh 4-12: Khai b¸o c©y nhÞ ph©n cµi ®Æt b»ng

m¶ng

Internal Module BinaryTreePackage;From StackPackage Import

StackType,Create,Empty,Push,Pop,Top;

(*§iÒu kiÖn tr íc: None§iÒu kiÖn sau:NÕu trªn c©y cã nót chøa gi¸ trÞ b»ng Key th×

Found = true vµ tr¶ vÒ vÞ trÝ cña nót ®ã. Chó ý nÕu c©y cã nhiÒu nót cã gi¸ trÞ b»ng Key th× sÏ tr¶ vÒ nót ®Çu tiªn t×m thÊy.

NÕu trªn c©y kh«ng cã nót cã gi¸ trÞ b»ng Key th× Found = false vµ tr¶ vÒ Nil*)Procedure Find(Tree:TreeType, Key:DataElementType, Var Found:Boolean): TreeType; Var

Stack : Stacktype;Done : Boolean;CurIndex : Integer;

BeginFound := false;Done := false;Stack := Create();CurTree := Tree.Root; (*B¾t ®Çu t×m kiÕm tõ nót gèc cña

c©y*)

- 206 -

- 207 -

If (CurIndex = 0) then (*NÕu c©y rçng th× kÕt thóc*)

Done := true;Endif;

(*DuyÖt c©y cho ®Õn khi gÆp nót cã gi¸ trÞ b»ng Key hoÆc ®· duyÖt hÕt c©y*)

While (Not Done) doIf (Tree.Node[CurIndex].Data = Key) then

Found = true; (*T×m thÊy*)Done := true; (*Dõng l¹i*)

ElseIf(Tree.Node[CurIndex].Right <> 0) then

(*NÕu cã con ph¶i th× ®Èy vµo Stack*)Push(Tree.Node[CurIndex].Right, Stack);

Endif;If(Tree.Node[CurIndex].Left <> 0) then

(*NÕu cã con tr¸i th× ®Èy vµo Stack*)Push(Tree.Node[CurIndex].Left, Stack);

Else(*NÕu Stack kh«ng rçng th× lÊy tiÕp c¸c c©y con ra ®Ó

duyÖt tiÕp*)If (Empty(Stack)) then

Done := true;Else

CurIndex := Top(Stack);Pop(Stack);

Endif;Endif;

Endif;Endwhile;Return CurIndex;

End Find;End BinaryTreePackage.

H×nh 4-13: Cµi ®Æt thñ tôc Find kh«ng ®Ö quy

4.4. MéT Sè C¢Y NHÞ PH¢N §ÆC BIÖT

4.4.1. C©y t×m kiÕm nhÞ ph©n

C©y t×m kiÕm nhÞ ph©n lµ mét d¹ng c©y nhÞ ph©n ®Æc biÖt, rÊt h÷u Ých trong viÖc t×m kiÕm.

§Þnh nghÜa: C©y t×m kiÕm nhÞ ph©n lµ mét c©y nhÞ ph©n trong ®ã trªn mçi nót cña c©y cã mét trêng d÷ liÖu ®Æc biÖt gäi lµ kho¸ cña nót ®ã(key). Mäi gi¸ trÞ kho¸ cña c¸c nót thuéc c©y con tr¸i lu«n nhá h¬n kho¸ cña nót gèc vµ mäi gi¸ trÞ kho¸ cña c¸c nót thuéc c©y con ph¶i lu«n lín h¬n kho¸ cña nót gèc.

H×nh 4-14 lµ mét vÝ dô minh ho¹ cho c©y t×m kiÕm nhÞ ph©n.

Nãi chung, c¸c thao t¸c trªn c©y t×m kiÕm nhÞ ph©n còng t¬ng tù nh c¸c thao t¸c trªn c©y nhÞ ph©n. Tuy nhiªn, cã 2 thao t¸c lµ kh¸c nhau: thao t¸c Insert vµ thao t¸c Find.

Trong c©y t×m kiÕm nhÞ ph©n, khi chÌn mét nót míi vµo c©y, ta kh«ng cÇn ph¶i chØ râ vÞ trÝ chÌn mµ ta chØ cÇn dùa vµo gi¸ trÞ kho¸ cña nót cÇn chÌn ®Ó x¸c ®Þnh vÞ trÝ chÝnh x¸c cña nót ®ã. Gi¶ sö nót cÇn chÌn cã gi¸ trÞ kho¸ lµ V, nót gèc cña c©y cã gi¸ trÞ

- 208 -

10

8 13

4 9

H×nh 7-14: C©y t×m kiÕm nhÞ ph©n

kho¸ lµ N. NÕu V > N th× ta ®i theo nh¸nh ph¶i vµ tiÕp tôc qu¸ tr×nh so s¸nh. NÕu V < N th× ta ®i theo nh¸nh tr¸i vµ tiÕp tôc qu¸ tr×nh so s¸nh. Qu¸ tr×nh nµy sÏ dõng l¹i khi x¶y ra mét trong hai tr-êng hîp sau:

V = N. Trong trêng hîp nµy, d÷ liÖu cÇn chÌn ®· cã trong c©y. V× vËy, ta kh«ng cÇn chÌn thªm nót míi.

Con trá con trá ®Õn Nil. Tøc lµ ta ®· t×m ®Õn vÞ trÝ chÝnh x¸c cho nót míi.

H×nh 4-15 m« t¶ vÝ dô chÌn mét nót míi cã kho¸ lµ 4 vµo c©y nhÞ ph©n t×m kiÕm ë h×nh 4-14.

- 209 -

H×nh 7-15: Thao t¸c Insert trªn c©y t×m kiÕm nhÞ ph©n

Nót míi:

710

8 13

4 9

7 <10

7 < 8

7 > 4

Con ph¶i b»ng Nil

Thao t¸c Find còng ®îc thùc hiÖn t¬ng tù. Gi¶ sö, b¹n muèn biÕt liÖu trªn c©y t×m kiÕm nhÞ ph©n cã nót nµo chøa kho¸ K hay kh«ng. B¹n sÏ b¾t ®Çu duyÖt tõ nót gèc cña c©y (Nót gèc cã kho¸ N). NÕu K > N, th× chuyÓn sang nh¸nh ph¶i vµ tiÕp tôc qu¸ tr×nh so s¸nh. NÕu K < N, th× chuyÓn sang nh¸nh tr¸i vµ tiÕp tôc qu¸ tr×nh so s¸nh. Qu¸ tr×nh t×m kiÕm sÏ dõng l¹i, khi x¶y ra mét trong hai trêng hîp sau:

K = N. Tøc lµ t×m thÊy nót cã gi¸ trÞ kho¸ b»ng K.

Con trá con trá ®Õn Nil. Tøc lµ, trªn c©y t×m kiÕm nhÞ ph©n kh«ng cã nót nµo cã gi¸ trÞ kho¸ b»ng K.

H×nh 8-6 cµi ®Æt thao t¸c Find.

- 210 -

Procedure Insert (Var Tree: TreeType, NewNode: BSTElementType);Begin

If (Tree = Nil) Then(*NÕu c©y rçng th× nót míi chÌn sÏ trë thµnh nót gèc*)New(Tree);Tree^.Data := NewNode;Tree^.Left := Nil;Tree^.Right := Nil;ElseIf (NewNode < Tree^.Data) then

Insert(Tree^.Left,NewNode);Elseif (NewNode > Tree^.Data) then

Insert(Tree^.Right,NewNode);Endif;Endif;

End Insert;H×nh 7-16: Thñ tôc Insert trªn c©y t×m kiÕm nhÞ ph©n

Procedure Find (Tree: TreeType, Key: BSTElementType, Var Found:Boolean) : TreeType;

BeginIf (Tree = Nil) ThenFound := false;Return;Elseif (Key = Tree^.Data) thenFound := true;Return Tree;Elseif (Key < Tree^.Data) thenReturn Find(Tree^.Left,Key);ElseReturn Find(Tree^.Right,Key);Endif;

End Find;H×nh 7-16: Thñ tôc Insert trªn c©y t×m kiÕm nhÞ

ph©n

- 211 -

4.4.2. §èng

§èng lµ mét c©y nhÞ ph©n tho¶ m·n 2 tÝnh chÊt sau:

Gi¸ trÞ kho¸ cña nót cha lu«n lu«n lín h¬n kho¸ cña nót con.

§èng ph¶i lµ mét c©y nhÞ ph©n hoµn chØnh. C©y nhÞ ph©n hoµn chØnh lµ c©y nhÞ ph©n cã i møc vµ tÊt c¶ c¸c nót l¸ chØ cã thÓ n»m ë møc i vµ møc i-1.

§èng ®îc sö dông trong gi¶i thuËt t×m kiÕm “Heap Sort”. Vµ c¸c thao t¸c trªn ®èng, sÏ ®îc tr×nh bµy chi tiÕt ë ch¬ng tiÕp theo.

4.5. KÕT LUËNTrong ch¬ng nµy, chóng ta ®· nghiªn cøu vÒ cÊu tróc vµ mét sè thao t¸c c¬ b¶n trªn c©y tæng qu¸t, c©y nhÞ ph©n, c©y nhÞ ph©n t×m kiÕm, ®èng. Nh ®· tr×nh bµy, c©y tæng qu¸t cã thÓ ®îc biÓu diÔn díi d¹ng c©y nhÞ ph©n; cho nªn, chóng ta ®· tËp trung nghiªn cøu c©y nhÞ ph©n kü h¬n.

Ngoµi c¸c thao t¸c ®· tr×nh bµy, b¹n cã thÓ bæ sung thªm mét sè c¸c thao t¸c kh¸c thÝch hîp víi øng dông cña b¹n vµo Tree package.

- 212 -

15

10

13

4 9

H×nh 7-17 : §èng

BµI TËP1. Cho c©y sau:

a. Nót nµo lµ nót l¸ ?

b. Nót nµo lµ nót trung gian ?

c. Nót nµo lµ nót gèc?

d. X¸c ®Þnh cÊp cña nót a, b, c.

e. X¸c ®Þnh anh em cña nót c, i.

f. X¸c ®Þnh tæ tiªn cña nót h, l.

g. X¸c ®Þnh con ch¸u cña nót f.

h. Møc cña nót c?

i. ChiÒu cao cña c©y?

2. VÏ c©y biÓu thøc:

a + (b + c * d)

3. CÊu tróc nµo sau ®©y lµ c©y

a.

- 213 -

a

fb

c ed g

h

i

j lk

a

b c e

d

b.

c.

d. “empty”

4. C©y nhÞ ph©n ®Çy ®ñ lµ c©y nhÞ ph©n mµ tÊt c¶ c¸c nót l¸ ®Òu cã cïng møc vµ nh÷ng nót kh«ng ph¶i lµ nót l¸ ®Òu cã hai con. VÝ dô, h×nh sau lµ mét c©y nhÞ ph©n ®Çy ®ñ:

Cho mét con trá trá ®Õn c©y nhÞ, viÕt gi¶i thuËt kiÓm tra xem c©y ®ã cã ph¶i lµ c©y nhÞ ph©n ®Çy ®ñ hay kh«ng?

5. ChuyÓn c©y tæng qu¸t sau thµnh c©y nhÞ ph©n. Cho biÕt chiÒu cao cña c©y nhÞ ph©n t¬ng øng?

- 214 -

a

a

b

c

d

e

f

b

d e f

c

a

6. ViÕt thñ tôc x¸c ®Þnh chiÒu cao cña mét c©y nhÞ ph©n.

7. X¸c ®Þnh ng÷ nghÜa vµ có ph¸p cña c¸c thao t¸c sau trªn c©y nhÞ ph©n.

a. Thñ tôc Destroy ®Ó kÕt thóc sù tån t¹i cña mét c©y T vµ tr¶ l¹i hÖ thèng toµn bé kh«ng gian nhí ®· cÊp ph¸t cho T

b. Thñ tôc Copy, t¹o ra mét b¶n sao cña c©y T vµ tr¶ vÒ con trá trá tíi nót gèc cña b¶n sao.

c. Thñ tôc Update, thay ®æi gi¸ trÞ d÷ liÖu cña mét nót cho tríc trªn c©y T.

d. Hµm Empty tr¶ vÒ true nÕu c©y rçng. Ngîc l¹i, tr¶ vÒ false.

e. Thñ tôc InsertSubTree(P, Direction, S). P lµ con trá trá ®Õn mét nót nµo ®ã trªn c©y, Direction lµ (Up, Right, Left), S lµ con trá trá ®Õn nót gèc cña c©y sÏ ®îc chÌn

- 215 -

a

fb

c edg

h ji

vµo. Thñ tôc nµy sÏ chÌn c¶ c©y trá bëi S vµo nót trá bëi P theo híng Direction.

f. Delete(P), xo¸ toµn bé c©y con cã nót gèc lµ P.

8. ViÕt thñ tôc cµi ®Æt c¸c thao t¸c trong bµi 7. Sö dông khai b¸o trong h×nh 4-8.

9. Lµm thÕ nµo ®Ó in ra gi¸ trÞ kho¸ cña c¸c nót trªn c©y nhÞ ph©n t×m kiÕm theo thø tù t¨ng dÇn hoÆc gi¶m dÇn?

10. ViÕt thñ tôc kiÓm tra mét c©y nhÞ ph©n cã ph¶i lµ ®èng hay kh«ng?

- 216 -

CH¦¥NG 5: §å THÞ5.1. GIíI THIÖU Chóng ta ®· nghiªn cøu vÒ c¸c lo¹i cÊu tróc d÷ liÖu nh: danh s¸ch tuyÕn tÝnh, c©y, tËp hîp. Trong ch¬ng nµy, chóng ta sÏ xem xÐt mét lo¹i cÊu tróc d÷ liÖu kh¸c n÷a, ®ã lµ ®å thÞ.

Trong thùc tÕ, chóng ta còng b¾t gÆp rÊt nhiÒu cÊu tróc ®å thÞ. VÝ dô, b¶n ®å ®êng ®i gi÷a c¸c thµnh phè, quy tr×nh s¶n xuÊt ra mét s¶n phÈm ph¶i thùc hiÖn th«ng qua c¸c bíc nh thÕ nµo, m¹ng m¸y tÝnh…

Mét c¸ch h×nh thøc, ta cã thÓ ®Þnh nghÜa: ®å thÞ lµ mét cÊu tróc d÷ liÖu, mµ trong ®ã mét phÇn tö cã quan hÖ víi nhiÒu phÇn tö kh¸c. Tøc lµ, mçi phÇn tö trong ®å thÞ cã sè lîng phÇn tö kÒ tuú ý.

§å thÞ lµ c¸ch biÓu diÔn d÷ liÖu chung nhÊt. Danh s¸ch tuyÕn tÝnh, c©y ®Òu cã thÓ coi lµ ®å thÞ, cïng víi c¸c ®iÒu kiÖn rµng buéc kh¸c vÒ quan hÖ gi÷a c¸c phÇn tö.

- 217 -

§å thÞ gåm mét tËp c¸c ®Ønh (node) hay cßn gäi lµ ®Ønh (vertice). Trong h×nh 5-1a, c¸c ®Ønh cña ®å thÞ lµ V = {A, B, C, D, E, F}. KiÓu th«ng tin ®îc lu tr÷ trªn mçi ®Ønh lµ bÊt kú, cã thÓ lµ kiÓu integer, char, record, … C¸c ®Ønh kÕt nèi víi nhau th«ng qua mét tËp c¸c cung (arc) hoÆc cßn gäi lµ c¹nh (edge). Cung kÕt nèi gi÷a ni vµ nj ®îc ký hiÖu lµ <ni, nj>, nh vËy tËp hîp c¸c cung lµ E = {<ni, nj>, <nl, nk>, …}. Cung mµ cã híng th× ®å thÞ chøa c¸c cung ®ã gäi lµ ®å thÞ cã híng (digraph), h×nh 5-1a lµ ®å thÞ cã híng. NÕu <ni, nj> lµ mét cung cña ®å thÞ cã híng th× ni gäi lµ ®Ønh ®Çu vµ nj gäi lµ ®Ønh cuèi cña cung ®ã. Hay cßn gäi ni lµ ®Ønh kÒ víi ®Ønh nj.

NÕu ®å thÞ chøa c¸c cung v« híng th× goi lµ ®å thÞ v« híng (h×nh 5-1b). Hai ®å thÞ sau lµ t¬ng ®¬ng vµ biÓu diÔn tËp cung E ={<A, B>, <B, A>}.

- 218 -

F

A B

C D

E

F

A B

C D

E

a. §å thÞ cã h íng b. §å thÞ v« h íng

5-1: Hai cÊu tróc ®å thÞ c¬ b¶n

A B A B

Nhng hai ®å thÞ sau l¹i kh«ng t¬ng ®¬ng. V× ®å thÞ ë bªn tr¸i lµ ®å thÞ v« híng, cã cung ®i tõ A ®Õn B hoÆc tõ B ®Õn A. Nhng ®å thÞ ë bªn ph¶i lµ ®å thÞ cã híng, cã cung ®i tõ A ®Õn B nhng kh«ng cã cung ®i tõ B ®Õn A.

§å thÞ mµ chØ cã mét cung nèi gi÷a hai ®Ønh gäi lµ ®¬n ®å thÞ. Ngîc l¹i, nÕu ®å thÞ cã chøa nhiÒu cung nèi gi÷a hai ®Ønh th× gäi lµ ®a ®å thÞ (multigraph).

Tuy nhiªn, trong ph¹m vi gi¸o tr×nh nµy, chóng ta kh«ng chØ nghiªn cøu vÒ ®¬n ®å thÞ.

C¸c cung cã thÓ cã träng sè (weighted) hoÆc kh«ng cã träng sè (unweighted). Cung cã träng sè ®îc ký hiÖu lµ <ni, nj, W>: träng sè W lµ chi phÝ ph¶i bá ra khi ®i tõ ®Ønh ni ®Õn ®Ønh nj theo cung ®ã. VÝ dô:

- 219 -

A B A B

A B A B

A B8 §å thÞ v« h íng, cã träng

A B8 §å thÞ cã h íng, cã träng

<A, B, 8>: tøc lµ ®i tõ A ®Õn B ph¶i bá ra chi phÝ lµ 8. Trong ®å thÞ v« híng th× ®ã cßn lµ chi phÝ ®i tõ B ®Õn A. Träng sè cña mét cung cã thÓ lµ chi phÝ vÒ tiÒn b¹c, thêi gian, hiÖu qu¶, …NÕu ®å thÞ kh«ng cã träng sè th× ta cã thÓ hiÓu lµ träng sè trªn c¸c cung lµ nh nhau.

§êng ®i ®¬n lµ mét chuçi c¸c ®Ønh n1n2n3…nk , trong ®ã c¸c ®Ønh lµ ph©n biÖt nhau (trõ ®Ønh ®Çu vµ ®Ønh cuèi), gi÷a hai ®Ønh ni vµ ni+1 ph¶i cã mét cung víi i = 1, …, k-1. VÝ dô, h×nh 5-1a, ABED lµ mét ®êng ®i ®¬n. ABC kh«ng ph¶i lµ mét ®êng ®i ®¬n v× kh«ng cã ®êng ®i tõ B ®Õn C. ACDEDE kh«ng ph¶i lµ ®êng ®i ®¬n v× ph¶i ®i qua D, E hai lÇn.

Chu tr×nh lµ ®êng ®i ®¬n nhng ®iÓm ®Çu vµ ®iÓm cuèi trïng nhau. VÝ dô, h×nh 5-1a, ACA lµ mét chu tr×nh. Chu tr×nh ®i qua tÊt c¶ c¸c ®Ønh cña ®å thÞ, mçi ®Ønh mét lÇn gäi lµ chu tr×nh Hamiltonian.

Mét ®å thÞ cã híng gäi lµ liªn th«ng m¹nh nÕu víi mçi cÆp ®Ønh ni vµ nj tån t¹i ®êng ®i tõ ni ®Õn nj.

§å thÞ G’(V’, E’) lµ ®å thÞ con cña G(V, E) nÕu V’ V vµ E’ E.

5.2. C¸C THAO T¸C TR£N §å THÞ

5.2.1. C¸c thao t¸c c¬ b¶n

Trong ®å thÞ cã 5 thao t¸c c¬ b¶n: t¹o ®å thÞ míi, chÌn mét ®Ønh vµo ®å thÞ, xo¸ mét ®Ønh khái ®å thÞ, thªm mét cung vµo ®å thÞ vµ xo¸ mét cung khái ®å thÞ. Tuy nhiªn, b¹n cã thÓ bæ sung thªm c¸c thao t¸c kh¸c nÕu øng dông cña b¹n cÇn. H×nh 5-2 m« t¶ cÊu tróc có ph¸p cña 5 thao t¸c nµy. V lµ tËp c¸c ®Ønh vµ E lµ tËp c¸c cung. Trong h×nh 5-2, ta chØ xÐt ®å thÞ cã híng, cã träng sè.

- 220 -

CreateGraph() : GT¹o ra mét ®å thÞ míi G, rçng. Tøc lµ V = {} vµ E = {}

InsertNode(G, ni) : G\Bæ sung thªm mét ®Ønh míi ni vµo ®å thÞ G. TËp E kh«ng bÞ thay ®æi. TËp V = V {ni}.InsertEdge(G, ni, nj, W) : GBæ sung thªm mét cung míi cã träng sè W, kÕt nèi ni vµ nj vµo ®å thÞ G. TËp V kh«ng bÞ thay ®æi. TËp E = E {<ni, nj, W>}.DeleteNode(G, ni) : GXo¸ ®Ønh ni vµ c¸c cung cã liªn quan tíi ®Ønh ni ra khái ®å thÞ.V = V – {ni}E = E – {<ni, x, W> vµ <x, ni, W>} víi DeleteEdge(G, ni, nj) : GXo¸ cung <ni, nj, W> ra khái ®å thÞ G. V kh«ng bÞ thay ®æi.E = E – {<ni, nj, W>}

H×nh 5-2: 5 thao t¸c c¬ b¶n trªn ®ß thÞ

Víi 5 thao t¸c c¬ b¶n trªn, ta cã thÓ x©y dùng mét ®å thÞ cã h-íng, cã träng sè bÊt kú. VÝ dô, víi 11 thao t¸c sau, ta sÏ t¹o ra mét ®å thÞ t¬ng øng:

- 221 -

1. G := CreateGraph(); empty

2. InsertNode(G,A)

3. InsertNode(G,B)

4. InsertNode(G,C)

5. InsertEdge(G, B, C, 5)

6. InsertEdge(G, A, B, 6)

7. InsertNode(G,D)

- 222 -

A

A B

A B

C

A B

C

5

A B

C

5

6

A B

C

5

6

D

- 223 -

8. InsertEdge(G, A, D, 3)

9. InsertEdge(G, B, D, 7)

10. DeleteNode(G, C)

11. DeleteEdge(G, A, B)

- 224 -

A B

C

5

6

D

3

A B

C

5

6

D

3 7

A B6

D

3 7

D

A B

3 7

§©y chØ lµ 5 thao t¸c c¬ b¶n trªn ®å thÞ, cßn nhiÒu thao t¸c quan träng, phøc t¹p h¬n n÷a ta sÏ nghiªn cøu ë nh÷ng phÇn tiÕp theo.

5.2.2. DuyÖt ®å thÞ

DuyÖt ®å thÞ lµ thao t¸c th¨m tÊt c¶ c¸c ®Ønh trªn ®å thÞ, mçi ®Ønh mét lÇn. DuyÖt ®å thÞ cã thÓ gióp ta thùc hiÖn c¸c thao t¸c kh¸c nh: t×m kiÕm, hoÆc kiÓm tra tÝnh liªn th«ng cña ®å thÞ.

Cã hai thao t¸c duyÖt ®å thÞ c¬ b¶n lµ thao t¸c duyÖt theo chiÒu réng (breath -first) vµ thao t¸c duyÖt theo chiÒu s©u (depth - first). DuyÖt theo chiÒu réng cã nghÜa lµ sau khi th¨m ®Ønh N, th× sÏ th¨m c¸c ®Ønh kÒ víi N. Thø tù duyÖt lµ mét tËp c¸c vßng trßn ®ång t©m, trong ®ã ta sÏ th¨m c¸c ®Ønh ë vßng trßn thø i tríc khi chuyÓn sang th¨m c¸c ®Ønh ë vßng trßn thø i+1.

DuyÖt theo chiÒu s©u th× l¹i kh¸c. Chóng ta sÏ th¨m tÊt c¶ c¸c ®Ønh trªn mét ®êng ®i nµo ®ã cña ®å thÞ cho ®Õn khi ®êng ®i ®ã kÕt thóc. Råi ta l¹i chuyÓn sang mét ®êng ®i kh¸c. Cø nh vËy, cho ®Õn khi ta th¨m hÕt tÊt c¶ c¸c ®Ønh trong ®å thÞ.

- 225 -

H×nh 5-3 m« t¶ 2 ph¬ng ph¸p duyÖt ®å thÞ, ta b¾t ®Çu duyÖt tõ ®Ønh N. Thao t¸c duyÖt theo chiÒu réng, sÏ th¨m ®Ønh N tríc tiªn, råi th¨m c¸c phÇn tö kÒ víi N lµ A, B, C, tiÕp theo lµ E, I, J, G, H vµ cuèi cïng lµ D, F. Thao t¸c duyÖt theo chiÒu s©u, b¾t ®Çu tõ ®Ønh N, ®i theo ®êng ACDF, sau ®ã lµ c¸c ®êng ®i kh¸c…

Trong c¸c thao t¸c duyÖt ®å thÞ, chóng ta cÇn ph¶i xem xÐt hai vÊn ®Ò sau. Tríc tiªn, nÕu N cã nhiÒu ®Ønh kÒ. VÝ dô:

N ®îc th¨m v× N lµ ®Ønh kÒ víi A. Sau ®ã, ta th¨m B vµ ta kh«ng muèn th¨m l¹i c¸c phÇn tö kÒ cña B ®· ®îc th¨m råi (vÝ dô N). Ta cã thÓ gi¶i quyÕt vÊn ®Ò nµy b»ng c¸ch ®¸nh dÊu c¸c ®Ønh. Mçi

- 226 -

N

AB

C

D

E

FG H

J

I

a. DuyÖt theo chiÒu réng b. DuyÖt theo chiÒu s©u

5-3: C¸c thao t¸c duyÖt ®å thÞ

N B

E

I

Þ

A

C

F

D

H

G

A N B

®Ønh N sÏ cã mét biÕn tr¹ng th¸i, mçi tr¹ng th¸i cã thÓ lµ mét trong ba gi¸ trÞ:

Visited §Ønh N ®· ®îc th¨m

Waiting Cã mét ®Ønh kÒ víi N ®· ®îc th¨m vµ ®Ønh N ®ang ë trong hµng ®îi

Not Visited§Ønh N vµ tÊt c¶ c¸c ®Ønh kÒ ®Òu cha ®îc th¨m.

Ban ®Çu, tÊt c¶ c¸c ®Ønh trong ®å thÞ ®Òu cã tr¹ng th¸i lµ Not Visited. Khi mét ®Ønh kÒ cña nã ®· ®îc th¨m, ®Ønh ®ã sÏ chuyÓn sang tr¹ng th¸i Waiting vµ ®i vµo hµng ®îi. KiÓm tra tr¹ng th¸i cña mét ®Ønh sÏ gióp ta kh«ng ph¶i th¨m ®Ønh ®ã nhiÒu lÇn.

VÊn ®Ò thø hai lµ viÖc lùa chän cÊu tróc d÷ liÖu thÝch hîp ®îc sö dông ®Ó cµi ®Æt hµng ®îi. Chóng ta cã thÓ sö dông Queue ®Ó lu tr÷ hµng ®îi. Khi duyÖt ®å thÞ trong h×nh 5-3a, ta sÏ th¨m c¸c ®Ønh kÒ víi N. Nh vËy, ®Ønh A, B vµ C sÏ chuyÓn sang tr¹ng th¸i Waiting vµ ®îc ®Èy vµo hµng ®îi.

Sau khi N ®îc ®¸nh dÊu lµ Visited, th× ta sÏ lÊy A ra khái hµng ®îi ®Ó xö lý vµ ®Èy c¸c ®Ønh kÒ víi A vµo hµng ®îi, chuyÓn tr¹ng th¸i cña c¸c ®Ønh kÒ víi A thµnh Waiting.

Sau khi th¨m A vµ tr¹ng th¸i cña A chuyÓn sang Visited. Qu¸ tr×nh cø tiÕp tôc ®îc thùc hiÖn cho ®Õn khi ta th¨m hÕt c¸c ®Ønh trong ®å thÞ.

Chó ý r»ng, mçi lÇn ta th¨m mét ®Ønh, ta chØ ®Èy c¸c ®Ønh cã tr¹ng th¸i lµ Not Visited kÒ víi ®Ønh ®ã vµo hµng ®îi. NÕu c¸c

- 227 -

A B CRearFron

t

B C D ERearFron

t

®Ønh kÒ cã tr¹ng th¸i lµ Visited th× nã ®· ®îc th¨m, nÕu ®Ønh kÒ cã tr¹ng th¸i lµ Waiting th× ®Ønh ®ã ®· cã trong hµng ®îi.

- 228 -

VÝ dô, ¸p dông gi¶i thuËt ë h×nh 5-4 ®Ó duyÖt ®å thÞ sau theo chiÒu réng, b¾t ®Çu tõ ®Ønh A:

sÏ cho th tù duyÖt nh sau: A B C E D F H G

- 229 -

(*Thñ tôc duyÖt ®å thÞ theo chiÒu réng b¾t ®Çu tõ ®Ønh X*)BreadthFirstTraversal(G)

Q := CreateQueue(); (*Khëi t¹o hµng ®îi*)Enqueue(Q,X);Status(X) := Waiting;Repeat until Empty(Q)Dequeue(Q,Y);Visit(Y);Status(Y) := Visited;(*§Èy tÊt c¶ c¸c ®Ønh kÒ víi Y cã tr¹ng th¸i lµ Not_Visited

vµo Q*)For Z lµ ®Ønh kÒ cña Y do

If Status(Z) = Not_Visited thenEnqueue(Q,Z);Status(Z) := Waiting;

EndifEndforEndrepeat

End BreadthFirstTraversal H×nh 5-4: ThuËt to¸n duyÖt ®å thÞ theo chiÒu réng

F

A B

C D

E

G

H

Mét øng dông quan träng cña thao t¸c duyÖt ®å thÞ theo chiÒu réng lµ x¸c ®Þnh xem ®å thÞ cã liªn th«ng kh«ng. Tøc lµ x¸c ®Þnh liÖu cã tån t¹i ®êng ®i tõ ®Ønh i tíi ®Ønh j bÊt kú trªn ®å thÞ G kh«ng. NÕu sau khi ¸p dông gi¶i thuËt duyÖt ®å th× theo chiÒu réng trªn ®å thÞ G, mµ tÊt c¶ c¸c ®Ønh trong G ®Òu cã tr¹ng th¸i lµ Visited th× G lµ ®å thÞ liªn th«ng. NÕu vÉn cßn c¸c ®Ønh cã tr¹ng th¸i Not Visited, ta cã thÓ duyÖt mét lÇn n÷a trªn c¸c ®Ønh nµy ®Ó t×m ra c¸c ®å thÞ con liªn th«ng cña G. VÝ dô, víi ®å thÞ sau:

Ta sÏ ®¸nh dÊu c¸c ®Ønh A, B, C, D, E lµ Vistied sau lÇn duyÖt thø nhÊt. Cßn c¸c ®Ønh F vµ G vÉn ë tr¹ng th¸i Not Visited, ta sÏ duyÖt c¸c ®Ønh nµy ë lÇn duyÖt thø hai. Sau hai lÇn duyÖt tÊt c¶ c¸c ®Ønh trªn ®ç thÞ ®· ®îc th¨m. Nh vËy, ®å thÞ trªn sÏ cã hai thµnh phÇn liªn th«ng lµ {A, B, C, D, E} vµ {F, G}.

DuyÖt theo chiÒu s©u còng t¬ng tù nh vËy, chØ kh¸c ë chç lµ ta ph¶i sö dông Stack ®Ó lu c¸c ®Ønh trong hµng ®îi. Ta h·y ¸p dông thao t¸c duyÖt theo chiÒu s©u trªn h×nh 5-3b, b¾t ®Çu tõ ®Ønh N. Sau khi th¨m N, Stack sÏ cã 2 phÇn tö:

- 230 -

A B

C D

EF

G

BA Top

TiÕp tôc, ta l¹i lÊy ®Ønh A khái Stack ®Ó th¨m vµ sau ®ã l¹i ®Èy c¸c ®Ønh kÒ víi A vµo Stack.

Do sö dông Stack, nªn ta sÏ th¨m ®Ønh ®Èy vµo Stack muén nhÊt tr-íc. V× vËy, ta cã thÓ ®i hÕt mét ®êng ®i nµo ®ã trong ®å thÞ, råi míi tiÕp tô ë c¸c ®êng ®i kh¸c.

- 231 -

BC Top

Víi cÊu tróc sau:

ta sÏ ®i theo ®êng ABCD. Khi ®Õn D, ta quay trë l¹i ®êng ®i tõ C. Khi ®i hÕt ®êng nµy ta l¹i quay l¹i ®ßng ®i tõ B.

5.2.3. C©y khung tèi thiÓu

Mäi ®å thÞ liªn th«ng G ®Òu chøa mét tËp c¸c cung ®Ó nèi tÊt c¶ c¸c ®Ønh cña ®å thÞ vµ t¹o nªn mét c©y - gäi lµ c©y khung cña G (spanning tree). C©y khung chøa sè lîng cung nhá nhÊt (n-1) cña ®å thÞ G cã n ®Ønh. Qu¸ tr×nh x©y dùng c©y khung chÝnh lµ qu¸ tr×nh lo¹i bá c¸c cung thõa (tøc lµ lo¹i bá c¸c cung mµ ®· cã ®êng ®i gi÷a hai ®Ønh cña cung ®ã) cña ®å thÞ.

- 232 -

FE

A B C D

A B

C D

E

F

A B

C D

E

F

a. §å thÞ G b. C©y khung cña G

H×nh 5-5: VÝ dô vÒ c©y khung cña ®å thÞ

NÕu ®å thÞ kh«ng cã träng sè th× viÖc x©y dùng c©y khung kh¸ ®¬n gi¶n. ThuËt to¸n duyÖt ®å thÞ sÏ th¨m tÊt c¶ c¸c ®Ønh trong ®å thÞ, mçi ®Ønh mét lÇn. Khi duyÖt ®Õn mét ®Ønh nµo ®ã mµ t¹o thµnh mét chu tr×nh, th× ta sÏ th¨m ®Ønh ®ã b»ng mét cung kh¸c trong lÇn duyÖt sau vµ bá cung võa sö dông ra khái ®å thÞ. Do ®ã, nÕu ta gi÷ l¹i c¸c cung mµ ta ®· duyÖt trong ®å thÞ (theo chiÒu s©u hoÆc theo chiÒu réng), th× tËp c¸c cung ®ã sÏ t¹o thµnh mét c©y khung cña ®å thÞ G. VÝ dô, cho ®å thÞ sau:

- 233 -

¸p dông gi¶i thuËt duyÖt ®å thÞ theo chiÒu réng b¾t ®Çu tõ ®Ønh A, ta cã ®îc thø tù duyÖt: ABCEDGF vµ c¸c cung lµ <A,B>, <A,C>, <B, E>, <C, D>, <E, F>, <E, G>. Ta cã c©y khung sau (gäi lµ breadth-first spanning tree):

C©y khung ®îc x©y dùng th«ng qua viÖc ¸p dông gi¶i thuËt duyÖt theo chiÒu s©u gäi lµ depth-first spanning tree. XÐt ®å thÞ trªn, ¸p dông gi¶i thuËt duyÖt theo chiÒu s©u, b¾t ®Çu tõ ®Ønh A, ta cã thø tù duyÖt: ABEFGDC vµ c¸c cung lµ <A,B>, <B, E>, <E, F>, <F, G>, <E, D>, <D, C>. Ta cã c©y khung sau:

- 234 -

A B

C D

EF

G

A B

C D

EF

G

A B

C D

EF

G

H×nh 5-6 m« t¶ gi¶i thuËt x©y dùng c©y khung b»ng c¸ch ¸p dông gi¶i thuËt duyÖt ®å thÞ theo chiÒu réng.

- 235 -

Trong phÇn tríc, chóng ta chñ yÕu xem xÐt viÖc x©y dùng c©y khung cña ®¬n ®å thÞ, kh«ng cã träng sè. Víi ®å thÞ kh«ng cã träng sè, chóng ta cã thÓ t¹o ra nhiÒu c©y khung kh¸c nhau tõ mét ®å thÞ, ta coi träng sè cña mçi cung lµ nh nhau. Tuy nhiªn, víi ®å thÞ cã träng sè, chóng ta muèn x©y dùng mét c©y khung cã gi¸ tèi thiÓu (tøc lµ tæng chi phÝ trªn mçi cung cña c©y khung lµ nhá nhÊt). H×nh 5-7 biÓu diÔn mét ®å thÞ cã híng, mét c©y khung bÊt kú vµ c©y khung tèi thiÓu.

- 236 -

BreadthFirstSpanningTree(G)Q := CreateQueue();NG := CreateGraph(); (*NG lµ ®å thÞ chøa c©y khung

cña G*)For NV do Status(N) := Not_Visited; (*V lµ tËp ®Ønh

cña G*)Enqueue(Q,X);InsertNode(NG,X); (*tËp ®Ønh cña NG trïng víi tËp

®Ønh cña G*)Status(X) := Waiting;Repeat Until Empty(Q)Dequeue(Q,Y);Status(Y) := Visited;For Z lµ ®Ønh kÒ cña Y trong G do

If Status(Z) = Not_Visited thenEnqueue(Q,Z);

(*<Y,Z> lµ cung cña NG, ®Ó t¹o nªn c©y khung*)InsertNode(NG, Z);InsertEdge(NG, Y, Z);

Status(Z) := Waiting;Endif

EndforEndrepeat

End BreadthFirstSpanningTree

H×nh 5-6: X©y dùng c©y khung ¸p dông gi¶i thuËt duyÖt theo chiÒu réng

Mét kü thuËt næi tiÕng x©y dùng c©y khung nhá nhÊt lµ gi¶i thuËt Kruskal. §©y lµ mét g¶i thuËt tham lam, trong ®ã t¹i mçi bíc chóng ta lu«n lùa chän nh÷ng kh¶ n¨ng tèi u nhÊt, mÆc dï kh¶ n¨ng ®ã cã thÓ kh«ng ph¶i lµ tèi u khi xem xÐt toµn bé.

Víi gi¶i thuËt Kruskal, ta lu«n bæ sung mét cung vµo c©y khung ®Ó chi phÝ cña nã lµ Ýt nhÊt. Tõ tËp cung E cña ®å thÞ G, ta lùa chän cung cã chi phÝ thÊp nhÊt. Ta sÏ nhËn cung nµy nÕu nã kh«ng t¹o thµnh mét chu tr×nh víi c¸c cung kh¸c ®· ®îc lùa chän, nÕu ngîc l¹i ta sÏ bá qua cung ®ã. Qu¸ tr×nh lùa chän cung sÏ ®îc lÆp l¹i cho ®Õn khi cã (n-1) cung ®îc lùa chän, víi ®å thÞ G cã n ®Ønh. NÕu (n-1) cung ®ã kh«ng t¹o thµnh mét chu tr×nh th× ta ®· x©y dùng xong mét c©y khung víi gi¸ tèi thiÓu.

H×nh 5-8 m« t¶ c¸c bíc ®Ó t¹o ra c©y khung trong h×nh 5-7c. T¹i mçi bíc ta lu«n lùa chän cung cã chi phÝ nhá nhÊt, do ®ã c©y khung mµ ta thu ®îc sÏ cã chi phÝ nhá nhÊt. Gi¶i thuËt Kruskal ®îc minh ho¹ trong h×nh 5-9.

- 237 -

A B

C D

FE

49

7 8

2

10

5

14

13

A B

C D

FE

4

2

5

14

13

A B

C D

FE

4

7

2

10

5

a. §å thÞ G b. C©y khung cã chi phÝ C= 38

c. C©y khung nhá nhÊt cã chi phÝ C= 28

H×nh 5-7: C©y khung nhá nhÊt cña ®å thÞ cã träng sè

1. Bæ sung cung EF 2. Bæ sung cung BD

3. Bæ sung cung AB 4. Bæ sung cung DE

- 238 -

A B

C D

FE2

A

C

B

D

4

FE2

A

C

B

D

4

FE2

5A

C

B

D

4

FE2

5

7

5. Bá qua cung DF v× nã t¹o thµnh mét chu tr×nh DEFD.

6. Bá qua AD v× nã t¹o thµnh chu tr×nh ABDA

7. Bæ sung cung AC

- 239 -

Kruskal’s AlgorithmT := CreateGraph();EdgeCount := 0;MSTCost := 0;Repeat Until EdgeCount = (n-1)Lùa chän cung cã chi phÝ thÊp nhÊt e = <ni, nj, W> trong

G;DeleteEdge(G, ni, nj);If bæ sung e kh«ng t¹o nªn chu tr×nh trong T then

InsertEdge(T, ni, nj, W);EdgeCount := EdgeCount + 1;MSTCost : =MSTCost + W;

EndifEndrepeat

End Kruskal’s AlgorithmH×nh 5-9: Gi¶i thuËt Kruskal

A B

C D

FE

4

7

2

10

5

H×nh 5-8: Sö dông gi¶i thuËt Kruskal ®Ó t×m c©y khung nhá nhÊt

VÊn ®Ò ë ®©y lµ lµm c¸ch nµo ®Ó x¸c ®Þnh ®îc viÖc bæ sung thªm mét cung vµo c©y khung cã t¹o nªn mét chu tr×nh víi c¸c cung kh¸c ®· chän. Ta cã thÓ gi¶i quyÕt vÊn ®Ò nµy b»ng c¸ch sö dông cÊu tróc d÷ liÖu tËp hîp. Chóng ta chØ cÇn lu c¸c ®å thÞ con liªn th«ng.

VÝ dô, cho hai tËp A ={n1, n2, …}vµ B ={m1, m2, …} cã nghÜa lµ cã ®êng ®i gi÷a hai ®Ønh bÊt kú trong tËp A , nhng kh«ng cã ®-êng ®i gi÷a mét ®Ønh thuéc tËp A vµ mét ®Ønh thuéc tËp B. VËy khi bæ sung mét cung vµo c©y khung, ta chØ cÇn kiÓm tra ®Ønh ®Çu vµ ®Ønh cuèi cña cung ®ã cã thuéc vµo hai tËp ®Ønh cña ®å thÞ con liªn th«ng kh¸c nhau hay kh«ng.

5.2.4. §êng ®i ng¾n nhÊt

VÊn ®Ò cuèi cïng mµ chóng ta sÏ nghiªn cøu trªn ®å thÞ lµ t×m ®-êng ®i ng¾n nhÊt. Gi¶ sö, trong ®å thÞ G cã híng, cã träng sè, ta sÏ t×m ®êng ®i ng¾n nhÊt gi÷a hai ®Ønh bÊt kú ni vµ nj trªn ®å thÞ G (ni gäi lµ ®Ønh nguån, nj gäi lµ ®Ønh ®Ých). §êng ®i ng¾n nhÊt gi÷a hai ®Ønh trong ®å thÞ lµ ®êng ®i cã tæng chi phÝ nhá nhÊt. NÕu ®êng ®i P: nini+1…nj-1nj lµ ng¾n nhÊt th× nã ph¶i tho¶ m·n:

min .

NhiÖm vô cña chóng ta lµ ph¶i ®i t×m ®êng ®i ng¾n nhÊt gi÷a hai ®Ønh trªn ®å thÞ. Chóng ta sÏ sö dông gi¶i thuËt Dijkstra ®Ó x¸c ®Þnh ®êng ®i ng¾n nhÊt tõ mét ®Ønh ni tíi tÊt c¶ c¸c ®Ønh cßn l¹i trong ®å thÞ.

Gi¶i thuËt nµy chia c¸c ®Ønh trong ®å thÞ G thµnh hai tËp ph©n biÖt, tËp S chøa c¸c ®Ønh mµ ta ®· x¸c ®Þnh ®îc ®êng ®i ng¾n nhÊt tõ ni ®Õn c¸c c¸c ®Ønh ®ã vµ tËp U chøa c¸c ®Ønh mµ ta vÉn cha x¸c ®Þnh ®îc ®êng ®i ng¾n nhÊt tõ ni ®Õn c¸c ®Ønh nµy. Ban ®Çu S = {ni} – chøa ®iÓm xuÊt ph¸t vµ U = {TÊt c¶ c¸c ®Ønh

- 240 -

trong G trõ ni}. Chóng ta còng ph¶i cã mét cÊu tróc d÷ liÖu gäi lµ danh s¸ch chi phÝ, C[j] biÓu diÔn tæng chi phÝ cña ®êng ®i tõ ni ®Õn ®Ønh j (cã thÓ ®i qua c¸c ®Ønh thuéc tËp S), j U.

ý tëng c¬ b¶n cña gi¶i thuËt Dijkstra lµ sö dông kü thuËt “tham lam” t¬ng tù nh gi¶i thuËt Kruskal. T¹i mçi bíc cña thuËt to¸n, chóng ta sÏ kiÓm tra mét ®Ønh thuéc tËp U, tÝnh ®êng ®i ng¾n nhÊt tõ ®Ønh ni tíi ®Ønh ®ã vµ ®a vµo S. Chóng ta sÏ lÆp l¹i c¸c bíc nµy cho ®Õn khi tÊt c¶ c¸c ®Ønh trong ®å thÞ G ®Òu thuéc tËp S vµ tËp U rçng.

§Ønh mµ chóng ta sÏ chän t¹i mçi bíc lµ ®Ønh ®Õn ®îc tõ c¸c ®Ønh thuéc tËp S cã chi phÝ nhá nhÊt. Tøc lµ, ta sÏ lùa chän mét ®Ønh j trong U, sao cho C[j] lµ nhá nhÊt.

Bíc 1: X¸c ®Þnh gi¸ trÞ C[k] nhá nhÊt k U

Lo¹i ®Ønh k khái tËp U.

§Æt k vµo tËp S

Sau khi thùc hiÖn xong bíc 1, chóng ta ph¶i cËp nhËt l¹i danh s¸ch chi phÝ C. Lóc tríc, chi phÝ ®Ó ®i tíi ®Ønh j tõ ni (cã thÓ qua mét sè c¸c ®Ønh trong S) lµ C[j]. Nhng b©y giê, khi ta ®· bæ sung j vµo S, th× ®êng ®i tõ ®Ønh ni S tíi ®Ønh k U cã thÓ ®i qua j. Chi phÝ cña ®êng ®i míi nµy lµ C[k] + EdgeCost(k,j), EdgeCost(k,j) lµ träng sè cña cung tõ k ®Õn j.

Bíc 2: T×m C[j] = Min(C[j],C[k] + EdgeCost(k,j)) j U

H×nh 5-10 biÓu diÔn qu¸ tr×nh cËp nhËt l¹i danh s¸ch chi phÝ. T¹i thao t¸c cuèi cïng, chóng ta sÏ x¸c ®Þnh ®îc ®êng ®i ng¾n nhÊt lµ ®Ønh 1 ®Õn tÊt c¶ c¸c ®Ønh cßn l¹i trong ®å thÞ.

H×nh 5-11 m« t¶ gi¶i thuËt ®Ó cµi ®Æt ®êng ®i ng¾n nhÊt. Tuy nhiªn, gi¶i thuËt nµy chØ x¸c ®Þnh chi phÝ ng¾n nhÊt tõ mét dØnh

- 241 -

2

1

3

4 5

5 10

8

13

9

tíi tÊt c¶ c¸c ®Ønh cßn l¹i trong ®å thÞ, mµ kh«ng x¸c ®Þnh râ ®-êng ®i ®ã ®i qua nh÷ng ®Ønh trung gian nµo.

Khëi t¹o: S = {1} U = {2,3,4,5}

C2 = 5 C3 = 8 C4 = C5 =

Pha 1:

1. Chän gi¸ trÞ nhá nhÊt trong danh s¸ch chi phÝ C

C2 = 5

§a ®Ønh 2 vµo S

S ={1, 2} U={3, 4, 5}

2. TÝnh to¸n l¹i C

C3 = min(C3, C2 + EdgeCost(2,3))

= min(8, 5+1)

= 6

C4 = min(C4, C2 + EdgeCost(2,4))

= min( , 5+10)

= 15

C5 = min(C5, C2 + EdgeCost(2,5))

= min( , 5+ )

=

- 242 -

Pha 2:

1 Chän gi¸ trÞ nhá nhÊt trong danh s¸ch chi phÝ C

C3 = 6

§a ®Ønh 3 vµo S

S ={1, 2, 3} U={ 4, 5}

2 TÝnh to¸n l¹i C

C4 = min(C4, C3 + EdgeCost(3,4))

= min(15, 6+3)

= 9

C5 = min(C5, C3 + EdgeCost(3,5))

= min( , 6+ )

=

Pha 3:

1 Chän gi¸ trÞ nhá nhÊt trong danh s¸ch chi phÝ C

C4 = 9

§a ®Ønh 4 vµo S

S ={1, 2, 3, 4} U={ 5}

2 TÝnh to¸n l¹i C

C5 = min(C5, C4 + EdgeCost(4,5))

= min( , 9+9)

= 18

Pha 4:

1 Chän gi¸ trÞ nhá nhÊt trong danh s¸ch chi phÝ C

C5 = 18

- 243 -

§a ®Ønh 5 vµo S

S ={1, 2, 3, 4, 5} U = {}

2 U rçng nªn qu¸ tr×nh t×m ®êng ®i ng¾n nhÊt ®· ho¸n thµnh.

- 244 -

H×nh 5-10: Mét vÝ dô ¸p dông thuËt to¸n Dijkstra

Ngoµi c¸c thao t¸c ®· nghiªn cøu nh: duyÖt ®å thÞ, c©y khung, ®êng ®i ng¾n nhÊt, trong ®å thÞ cßn mét sè c¸c thao t¸c kh¸c rÊt quan träng.

a. Thao t¸c t×m ®êng ®i ng¾n nhÊt gi÷a mçi cÆp ®Ønh trong ®å thÞ.

b. T×m ®iÓm nèi. §iÓm nèi lµ ®iÓm nÕu lo¹i nã vµ c¸c cung liªn quan ra khái ®å thÞ th× ®å thÞ sÏ bÞ ph©n thµnh hai ®å thÞ con ®éc lËp.

- 245 -

A B

C D

EF

GH

Dijkstra AlgorithmS := CreateSet(); (*S chøa c¸c ®Ønh cã ® êng ®i

ng¾n nhÊt ®· biÕt*)U := CreateSet(); (*U chøa c¸c ®Ønh cã ® êng ®i ng¾n

nhÊt ch a biÕt*)Insert(S,X); (*X lµ ®Ønh nguån*)For YG and Y<>X doInsert(U,Y);C[Y] := EdgeCost(X,Y);EndforRepeat until Empty(U)Chän ZU cã gi¸ trÞ C[Z] minInsert(S,Z);Remove(U,Z);For WU do

C[W] := Min(C[W], C[Z] + EdgeCost(Z,W));End forEndrepeat

End Dijkstra AlgorithmH×nh 5-11: ThuËt to¸n Dijkstra t×m ® êng

®i ng¾n nhÊt

Víi ®å thÞ trªn th× ®iÓm E sÏ lµ ®iÓm nèi. Khi lo¹i E vµ c¸c cung liªn quan ta sÏ thu ®îc hai ®å thÞ con: {A,B,C,D} vµ {F,G,H}

c. T×m chu tr×nh Hamiltonian. Chu tr×nh Hamiltonian lµ chu tr×nh ®i qua tÊt c¶ c¸c ®Ønh trong ®å thÞ, mçi ®Ønh mét lÇn.

- 246 -

5.3. CµI §ÆT

5.3.1. BiÓu diÔn ®å thÞ b»ng ma trËn kÒ

Cã 2 ph¬ng ph¸p biÓu diÔn ®å thÞ c¬ b¶n lµ: biÓu diÔn b»ng ma trËn kÒ vµ danh s¸ch kÒ. Tríc tiªn, chóng ta sÏ xem xÐt ph¬ng ph¸p thø nhÊt.

Gi¶ sö ta cã ®å thÞ G gåm N ®Ønh ®îc ®¸nh sè tõ 1 ®Õn N, ta sÏ sö dông m¶ng 2 chiÒu NxN ®Ó biÓu diÔn ®å thÞ nµy.

Const

Max = … ;

Type

Graph = Array [1..Max, 1..Max] of Boolean;

Var

M: Graph;

N: 1..Max;

NÕu M(x,y) = true, th× tån t¹i mét cung cã híng tõ x ®Õn y trong ®å thÞ G (1 x,y N). NÕu M(x,y) = false th× kh«ng cã cung nµo. Kh«ng gian nhí cÇn thiÕt ®Ó biÓu diÔn ®å thÞ G lµ O(N2).

NÕu lµ ®å thÞ v« híng th× M(x,y) = M(y,x) x,y th× chóng ta chØ cÇn lu tr÷ nöa díi hoÆc nöa trªn cña ma trËn kÒ. Do ®ã, kh«ng gian nhí sÏ gi¶m ®i cßn O(N2/2).

NÕu lµ ®å thÞ cã träng sè th× gi¸ trÞ c¸c phÇn tö trong ma trËn kÒ chÝnh lµ gi¸ trÞ cña träng sè. H×nh 5-12 biÓu diÔn ®å thÞ v« h-íng, cã träng sè b»ng ma trËn kÒ. DÊu cã nghÜa lµ gi÷a hai ®Ønh kh«ng cã ®êng ®i trùc tiÕp.

BiÓu diÔn ®å thÞ b»ng ma trËn kÒ chØ thÝch hîp khi ®å thÞ cã nhiÒu cung, víi nh÷ng ®å thÞ tha tøc lµ cã Ýt cung th× c¸ch biÓu

- 247 -

diÔn nµy rÊt l·ng phÝ. Nhng c¸c thao t¸c chÌn hoÆc lo¹i bá cung ra khái ®å thÞ kh¸ ®¬n gi¶n. NÕu ta muèn bæ sung mét cung <i,j> vµo ®å thÞ, ta chØ cÇn g¸n: M[i,j] := true _ ®é phøc t¹p lµ O(1). Ngîc l¹i, nÕu muèn lo¹i bá cung <i,j> ra khái ®å thÞ, ta chØ cÇn g¸n: M[i,j] = false.

Khi bæ sung thªm mét ®Ønh vµo ®å thÞ l¹i x¶y ra vÊn ®Ò lµ nÕu sè lîng ®Ønh N mµ lín h¬n Max th× thao t¸c nµy sÏ kh«ng ®îc thùc hiÖn chÝnh x¸c. Do ®ã, khi bæ sung mét ®Ønh ta cÇn ph¶i kiÓm tra ®iÒu kiÖn sè lîng c¸c ®Ønh trong ®å thÞ cã nhá h¬n Max kh«ng. NÕu cã th× míi bæ sung.

Cuèi cïng lµ thao t¸c lo¹i bá ®Ønh ra khái ®å thÞ, ®ång thêi ph¶i lo¹i bá tÊt c¶ c¸c cung cã liªn quan ®Õn ®Ønh ®ã.

5.3.2. BiÓu diÔn ®å thÞ b»ng danh s¸ch kÒ

Danh s¸ch kÒ lµ ph¬ng ph¸p biÓu diÔn ®å thÞ hiÖu qu¶ h¬n. Víi kü thuËt nµy, tríc tiªn ta ph¶i t¹o ra danh s¸ch c¸c ®Ønh [1..N] trong ®å thÞ G. Mçi phÇn tö trong danh s¸ch lµ phÇn tö Header cña danh s¸ch liªn kÕt c¸c ®Ønh kÒ víi ®Ønh ®ã.

- 248 -

1

4

8 5

10

14

3

1

2

3

4

51 2 3 4 5

1 2

3 4

5

1

4

5

8

10

143

H×nh 5-12: BiÓu diÔn ®å thÞ v« h íng, cã träng sè b»ng ma trËn kÒ

Cµi ®Æt danh s¸ch kÒ b»ng mét m¶ng c¸c b¶n ghi, mçi b¶n ghi chøa ®Þnh danh cña ®Ønh vµ con trá trá ®Õn ®Ønh kÒ kÕ tiÕp.

Const

Max = ...;

Type

Graph = Array[1..Max] of NodeRecord;

NodeRecord = Record

NodeName : [1..Max];

Next : Pointer To NodeRecord;

End;

- 249 -

Var

M : Graph;

NÕu ®å thÞ cã N ®Ønh vµ E cung, th× víi mçi ®Ønh chØ cÇn mét trêng chøa d÷ liÖu vµ mét trêng con trá trá ®Õn ®Ønh kÒ kÕ tiÕp. NÕu trêng d÷ liÖu chiÕm 1 tõ nhí vµ con trá chiÕm p tõ nhí th× tæng kh«ng gian nhí cÇn thiÕt ®Ó biÓu diÔn ®å thÞ b»ng danh kÒ lµ:

N(1+p) + E(1+p)

= (N+E) +p(N+E)

= O(N+E)

Nh vËy, râ rµng kh«ng gian nhí cña ph¬ng ph¸p danh s¸ch kÒ O(N+E) nhá h¬n so víi ma trËn kÒ O(N2). Tuy nhiªn, víi c¸c thao t¸c bæ sung vµ lo¹i bá cung ra khái ®å thÞ, sÏ phøc t¹p h¬n. NÕu trung b×nh, mçi danh s¸ch kÒ cã E/N phÇn tö th× ®é phøc t¹p cña thao t¸c bæ sung vµ lo¹i bá lµ O(E/N).

Víi c¸c thao t¸c phøc t¹p h¬n nh duyÖt ®å thÞ, t×m ®êng ®i ng¾n nhÊt… th× ®é phøc t¹p tÝnh to¸n l¹i phô thuéc rÊt nhiÒu vµo c¸ch biÓu diÔn ®å thÞ. VÝ dô, gi¶i thuËt duyÖt ®å thÞ theo chiÒu réng. NÕu biÓu diÔn ®å thÞ b»ng ma trËn kÒ th× ®é phøc t¹p sÏ lµ

- 250 -

1

2

3

4

5

3 2

5 1 4

4 1

5 2 3

5 2 4

H×nh 5-13: BiÓu diÔn ®å thÞ b»ng danh s¸ch kÒ

O(N2). Nhng nÕu sö dông danh s¸ch kÒ, gi¶ sö mçi danh kÒ cã E/N phÇn tö th× ®å phøc t¹p tÝnh to¸n lµ N*(E/N) = O(E). NÕu ®å thÞ dµy ®Æc, E N2 th× ®é phøc t¹p tÝnh to¸n cña 2 ph¬ng ph¸p biÓu diÔn lµ nh nhau O(N2). NÕu ®å thÞ tha E N th× ®é phøc t¹p cña ph-¬ng ph¸p biÓu diÔn ®å thÞ b»ng danh s¸ch kÒ chØ cßn O(N).

5.4.KÕT LUËNNh vËy, chóng ta ®· nghiªn cøu ®ñ bèn lo¹i cÊu tróc d÷ liÖu c¬ b¶n: danh s¸ch, c©y, tËp hîp vµ ®å thÞ.

§å thÞ lµ cÊu tróc d÷ liÖu tæng qu¸t nhÊt. TÊt c¶ c¸c cÊu tróc d÷ liÖu kh¸c ®Òu cã thÓ ®îc coi lµ ®å thÞ nÕu nh cã thªm mét sè rµng buéc vÒ mèi quan hÖ gi÷a c¸c ®Ønh.

BµI TËP

1. Cho ®å thÞ cã híng sau:

LiÖt kª c¸c ®Ønh, cung vµ chu tr×nh

2. Cho ®å thÞ v« híng, cã träng sè sau:

- 251 -

A DCB

A EDB

C

125

963

TÝnh chi phÝ cña tÊt c¶ c¸c ®êng ®i tõ A ®Õn E. Chi phÝ nµo lµ nhá nhÊt?

3. §å thÞ sau lµ liªn th«ng hay kh«ng liªn th«ng? Gi¶i thÝch

4. NÕu coi tËp hîp vµ cÊu tróc tuyÕn tÝnh lµ ®å thÞ th× cÇn ph¶i bæ sung thªm nh÷ng giíi h¹n g×?

5. T¹i sao ®å thÞ cã híng, cã träng sè lµ lo¹i ®å thÞ tæng qu¸t nhÊt?

6. LÊy mét sè vÝ dô sö dông cÊu tróc ®å thÞ trong thùc tÕ.

7. H·y söa ng÷ nghÜa vµ có ph¸p trong h×nh 5-2 ®Ó m« t¶ cho ®å thÞ:

a. V« híng

b. Kh«ng cã träng sè

8. M« t¶ mét c¸ch têng minh ®iÒu kiÖn tríc cña 5 thao t¸c c¬ b¶n ®· tr×nh bµy trong H×nh 5-2.

9. Sö dông c¸c thao t¸c sau sÏ t¹o ra mét ®å thÞ nh thÕ nµo?

G := CreateGraph()

InsertNode(G,A)

InsertNode(G,B)

InsertNode(G,C)

InsertNode(G,D)

InsertEdge(G,A,B,1)

- 252 -

A B

C D

InsertEdge(G,B,C,1)

InsertEdge(G,C,D,2)

DeleteNode(G,B)

10. Hai thao t¸c sau sai ë ®©u? NÕu kh«ng th× biÓu diÔn cÊu tróc ®ã

InsertEdge(G,A,B,1)

InsertEdge(G,A,B,2)

11. §a ra 2 thø tù c¸c ®Ønh khi duyÖt ®å thÞ theo chiÒu réng, b¾t ®Çu tõ ®Ønh C vµ b¾t ®Çu tõ ®Ønh I

12. ViÕt thñ tôc x¸c ®Þnh sè lîng c¸c ®å thÞ con liªn th«ng cña ®å thÞ G. Gîi ý: víi 3 ®å thÞ sau:

a.

b.

c.

- 253 -

AB

EC

D

F G

H

I

A CB

A CB

th× kÕt qu¶ cña b¹n ph¶i lµ 1, 2, 3 t¬ng øng víi 3 ®å thÞ. Cã thÓ sö dông gi¶i thuËt duyÖt ®å thÞ theo chiÒu réng.

13. Sö dông ®å thÞ trong bµi 11, ®a ra 2 thø tù c¸c ®Ønh khi duyÖt ®å thÞ theo chiÒu s©u b¾t ®Çu tõ ®Ønh A vµ tõ ®Ønh E.

14. ViÕt gi¶i thuËt duyÖt ®å thÞ theo chiÒu s©u

15. Sö dông ®å thÞ ë bµi 11, x¸c ®Þnh:

a. C©y khung theo chiÒu réng cã gèc ë B

b. C©y khung theo chiÒu s©u cã gèc ë ®Ønh C

16. Cho ®å thÞ v« híng, cã träng sè sau:

T×m c©y khung nhá nhÊt sö dông thñ tôc Kruskal.

17. ViÕt thñ tôc cµi ®Æt g¶i thuËt Kruskal. Gîi ý: sö dông tËp hîp ®Ó ph¸t hiÖn chu tr×nh.

- 254 -

A CB

10

A B C

D E

F G

46

127

13 119

10

7

2

18. TÝnh ®é phøc t¹p tÝnh to¸n cña gi¶i thuËt Kruskal dùa trªn sè ®Ønh N vµ sè cung E.

19. Sö dông ®å thÞ trong bµi 16, x¸c ®Þnh ®êng ®i ng¾n nhÊt tö A ®Õn E, tõ B ®Õn G. Sö dông gi¶i thuËt Dijkstra ®Ó tÝnh chi phÝ nhá nhÊt tõ ®Ønh A ®Õn c¸c ®Ønh cßn l¹i trong ®å thÞ.

20. Söa gi¶i thuËt Dijkstra trong h×nh 5-11 ®Ó in ra ®êng ®i ng¾n nhÊt tõ mét ®Ønh tíi c¸c ®Ønh cßn l¹i cña ®å thÞ.

21. ViÕt thñ tóc ®Ó kiÓm tra ®å thÞ cã ph¶i lµ ®å thÞ cã h-íng, kh«ng chøa chu tr×nh.

22. BiÓu diÔn ®å thÞ cã híng trong bµi 21 b»ng

a. Ma trËn kÒ

b. Danh s¸ch kÒ

X¸c ®Þnh kh«ng gian nhí cÇn thiÕt cho tõng ph¬ng ph¸p biÓu diÔn vµ cho biÕt ph¬ng ph¸p nµo th× hiÖu qu¶ h¬n.

23. ViÕt thñ tôc DeleteNode(G,i) ®Ó xo¸ ®Ønh i khái ®å thÞ G. Gi¶ sö G ®îc biÓu diÔn bëi

a. Ma trËn kÒ

b. Danh s¸ch kÒ

24. ViÕt thñ tôc InsertEdge(G, i, j, W) ®Ó chÌn them cung <i,j> cã träng sè W vµo G. Gi¶ sö G ®îc biÓu diÔn bëi danh s¸ch kÒ.

25. X¸c ®Þnh ®é phøc t¹p tÝnh to¸n cña c¸c thao t¸c bæ sung ®Ønh vµ cung, xo¸ ®Ønh vµ cung. Gi¶ sö ®å thÞ ®îc biÓu diÔn b»ng danh s¸ch kÒ, danh s¸ch c¸c ®Ønh vµ danh s¸ch ®Ønh kÒ ®îc biÓu diÔn nh sau:

- 255 -

a. Danh s¸ch c¸c ®Ønh lµ mét m¶ng ®· ®îc s¾p xÕp, danh s¸ch c¸c ®Ønh kÒ lµ mét danh s¸ch liªn kÕt

b. Danh s¸ch c¸c ®Ønh lµ mét b¶ng b¨m, danh s¸ch c¸c ®Ønh kÒ còng lµ mét b¶ng b¨m

c. Danh s¸ch c¸c ®Ønh lµ mét danh s¸ch liªn kÕt, danh s¸ch c¸c ®Ønh kÒ lµ mét danh s¸ch liªn kÕt

26. TÝnh ®é phøc t¹p tÝnh to¸n cña gi¶i thuËt Dijkstra nÕu ®å thÞ ®îc cµi ®Æt b»ng ma trËn kÒ.

- 256 -

Ch¬ng 6: TËp hîp vµ b¶ng t×m kiÕm

6.1 TËp hîp 6.1.1. §Þnh nghÜa vµ c¸c thao t¸c

Chóng ta võa nghiªn cøu mét sè cÊu tróc d÷ liÖu tuyÕn tÝnh vµ mét sè cÊu tróc d÷ liÖu ph©n cÊp. Trong ch¬ng nµy vµ ch¬ng tiÕp theo ta sÏ nghiªn cøa mét sè cÊu tróc d÷ liÖu kh¸c, ®ã lµ tËp hîp vµ ®å thÞ.

Ta ®· biÕt trong to¸n häc vÒ kh¸i niÖm tËp hîp. TËp hîp ®îc hiÓu lµ mét hä c¸c phÇn tö cã nh÷ng tÝnh chÊt chung nµo ®ã. Ta ®· biÕt c¸c tËp hîp quen thuéc nh tËp hîp sè tù nhiªn N, tËp hîp sè nguyªn Z, tËp hîp sè thùc R... Mét c¸ch tæng qu¸t, ta kh«ng cã qui íc g× rµng buéc lµ c¸c phÇn tö cña mét tËp hîp. Ch¼ng h¹n, ta cã thÓ cã tËp hîp nh sau:

S = { 1, {2,3}, ‘a’}vµ mét tËp hîp còng cã thÓ gåm v« h¹n phÇn tö.

Tuy nhiªn, trong m¸y tÝnh, nÕu ta ph¶i cµi ®Æt nh÷ng tËp hîp theo nghÜa tæng qu¸t nh thÕ th× c«ng viÖc sÏ rÊt khã kh¨n. ChÝnh v× vËy, trong c¸c ng«n ng÷ lËp tr×nh, ngêi ta thêng cã nh÷ng qui íc nhÊt ®Þnh vÒ c¸c phÇn tö cña mét tËp hîp ®Ó thuËn tiÖn cho viÖc cµi ®Æt tËp hîp. Nh÷ng qui íc ®ã nh sau:

1. C¸c phÇn tö cña mét tËp hîp ph¶i thuéc cïng mét kiÓu vµ ®îc gäi lµ kiÓu c¬ së.2. KiÓu c¬ së ph¶i lµ kiÓu cã thø tù. KiÓu c¬ së thêng gÆp nhÊt lµ kiÓu sè nguyªn, kiÓu kÝ tù, hay mét kiÓu cã thø tù do ngêi sö dông ®Þnh nghÜa. Kh«ng cã kh¸i niÖm tËp hîp nh÷ng m¶ng hay tËp hîp b¶n ghi.

- 257 -

3. Sè c¸c phÇn tö cña mét tËp hîp bÞ h¹n chÕ víi kiÕn tróc bé nhí cña m¸y tÝnh.

Nh vËy, kh¸i niÖm tËp hîp trong ph¹m vi cña chóng ta t¬ng ®èi kh¸c so víi kh¸i niÖm tËp hîp nãi chung trong to¸n häc. Víi qui íc cña chóng ta th× tËp hîp ®a ra trong vÝ dô ë phÇn trªn lµ kh«ng tháa m·n v× c¸c phÇn tö cña nã kh«ng thuéc cïng mét kiÓu. TËp hîp U = {1, 3, 7, 9} lµ hoµn toµn tháa m·n c¸c qui íc trªn. Thø tù cña c¸c phÇn tö trong mét tËp hîp lµ kh«ng quan träng. TËp hîp U cã thÓ viÕt lµ U = {3, 7, 1, 9}. TÝnh kh«ng cã thø tù cña c¸c phÇn tö trong mét tËp hîp lµ tÝnh chÊt ®Æc trng lµm cho nã kh¸c h¼n víi c¸c cÊu tróc d÷ liÖu tuyÕn tÝnh vµ ph©n cÊp. Víi cÊu tróc d÷ liÖu tuyÕn tÝnh chóng ta thêng cã kh¸i niÖm phÇn tö ®Çu tiªn, phÇn tö cuèi cïng, phÇn tö liÒn tríc, phÇn tö liÒn sau. Nh÷ng kh¸i niÖm Êy hoµn toµn kh«ng cã trong tËp hîp. Trong cÊu tróc d÷ liÖu ph©n cÊp, ta còng cã kh¸i niÖm cha, con, gèc, l¸...Nh÷ng kh¸i niÖm nµy còng kh«ng hÒ cã trong tËp hîp. C¸c phÇn tö trong mét tËp hîp kh«ng cã quan hÖ g× víi nhau trõ viÖc chóng ®Òu lµ thµnh viªn cña tËp hîp ®ã. Nh÷ng thao t¸c trªn tËp hîp lµ nh÷ng thao t¸c quen thuéc vµ chóng ta còng kh«ng khã kh¨n l¾m ®Ó ®Æc t¶ m« ®un ngoµi cho kiÓu d÷ liÖu trõu tîng tËp hîp.

Thao t¸c t¹o tËp hîp ®îc gäi lµ CreateSets:

CreateSet() : Setnã t¹o ra mét tËp hîp kh«ng chøa phÇn tö nµo vµ ®îc gäi lµ tËp hîp rçng.

Trong líp thao t¸c biÕn ®æi sÏ cã n¨m thao t¸c chÝnh. Thao t¸c thø nhÊt lµ thao t¸c chÌn mét phÇn tö E vµo tËp hîp S ®Ó cã mét tËp hîp míi . NÕu phÇn tö E ®· thuéc S th× S kh«ng cã g× thay ®æi sau

- 258 -

thao t¸c chÌn v× trong mét tËp hîp kh«ng cho phÐp cã hai phÇn tö trïng nhau. Thao t¸c thø hai lµ thao t¸c xãa mét phÇn tö E khái tËp hîp S. NÕu E kh«ng ph¶i lµ mét phÇn tö cña S th× tËp S sÏ kh«ng thay ®æi. Thao t¸c nµy còng ®ù¬c xem nh lµ mét lçi vÒ có ph¸p.

Insert(Set, Element) : Set (* ChÌn mét phÇn tö vµo mét tËp hîp*)

Delete(Set, Element) : Set (* Xo¸ mét phÇn tö khái mét tËp hîp *)

Ba thao t¸c biÕn ®æi cßn l¹i liªn quan ®Õn viÖc t¹o ra tËp hîp míi tõ hai tËp hîp ban ®Çu. Thao t¸c thø nhÊt lµ phÐp lÊy hîp cña hai tËp hîp S1 vµ S2 ®Ó cã tËp hîp S3 = S1 S2 mµ c¸c phÇn tö cña nã bao hµm c¶ nh÷ng phÇn tö cña S1 vµ cña S2(®¬ng nhiªn lµ kh«ng cã phÇn tö trïng nhau). Thao t¸c lÊy giao cña hai tËp hîp S1 vµ S2 ®Ó cã tËp hîp S3 = S1 S2 gåm nh÷ng phÇn tö thuéc c¶ hai tËp hîp S1 vµ S2. Cuèi cïng lµ thao t¸c lÊy hiÖu Difference cña hai tËp hîp S1 vµ S2 ®Ó cã tËp hîp S3= S1 – S2 gåm nh÷ng phÇn tö thuéc S1 nhng kh«ng thuéc S2. Ta sÏ minh häa nh÷ng thao t¸c nµy b»ng phÐp sö dông biÓu ®å Venn díi ®©y. PhÇn t« ®Ëm cña c¸c h×nh trßn biÓu diÔn c¸c phÇn tö ®ùoc chøa trong tËp hîp míi S3. Có ph¸p cña c¸c thao t¸c nµy lµ:

Union(Set, Set) : SetIntersection(Set,Set) : SetDifference(Set,Set) : Set

H×nh 6.1: BiÓu ®å Venn vÒ ba thao t¸c c¬ b¶n trªn tËp hîp

- 259 -

Cã ba thao t¸c cã tÝnh chÊt quan s¸t, ®ã lµ thao t¸c Empty kiÓm tra xem mét tËp hîp cã ph¶i lµ rçng kh«ng, thao t¸c Member kiÓm tra xem mét phÇn tö cã thuéc mét tËp hîp kh«ng vµ thao t¸c Subset kiÓm tra xem mét tËp hîp cã ph¶i lµ tËp hîp con cña mét tËp hîp kh¸c kh«ng. Có ph¸p cña chóng lÇn lît nh sau:

Empty (Set) : BooleanMember(Set, Element) : BooleanSubset(Set, Set) : Boolean

Thao t¸c Empty cho kÕt qu¶ lµ true nÕu tËp hîp kh«ng chøa phÇn tö nµo, cho gi¸ trÞ lµ False trong trêng hîp ngîc l¹i. Thao t¸c Member cho gi¸ trÞ lµ True nÕu phÇn tö ®ã thuéc tËp hîp vµ False trong tr-êng hîp ngîc l¹i. Thao t¸c Subset sÏ cho kÕt qu¶ lµ True nÕu mäi phÇn tö cña tËp hîp thø nhÊt ®Òu lµ phÇn tö cña tËp hîp thø hai, ng-îc l¹i nã cho kÕt qu¶ lµ False.

VÝ dô: Gi¶ sö S = {1, 3, 5, 7}; T = {3, 4, 5} ; U= {3, 4}; V =

(tËp rçng)

Insert (S, 4) = {1, 3, 5, 7, 4}Insert (S, 3) = {1, 3, 5, 7}Delete (T, 4) = {3, 5}Delete (T, 6) = {3, 4, 5}Union (S,T) = {1, 3, 4, 5, 7}Intersection (S, T) = {3, 5}Difference (S, U) = {1, 5, 7}Difference (U, T) = Empty (V) = TrueMember (S, 2) = False

- 260 -

Member (T, 3) = TrueSubset (U,T) = TrueSubset (T, S) = False

§Æc t¶ hoµn chØnh có ph¸p vµ ng÷ nghÜa cña c¸c thao t¸c trªn tËp hîp ®îc cho trong h×nh sau:

Cµi ®ÆtCã rÊt nhiÒu c¸ch cµi ®Æt tËp hîp trong c¸c ng«n ng÷ lËp tr×nh bËc cao. VÝ dô chóng ta cã thÓ lu tr÷ c¸c phÇn tö cña tËp hîp trong mét m¶ng:

ConstMax = ...; (* Sè phÇn tö trong tËp hîp *)

Type SetType = Pointer To Record

Size : 0..Max;Data : Array [1..Max] Of BaseType;

End;Var

S : SetType;

-------------------------------------------------------------------------------------------

Syntax:

Define Set[Element]a. CreateSet() : Setb. Insert(Set, Element) : Set

- 261 -

c. Delete(Set, Element) : Setd. Union(Set, Set) : Sete. Intersection(Set, Set) : Setf. Difference(Set, Set) : Setg. Empty(Set) : Booleanh. Member(Set, Element) : Booleani. Subset(Set, Set): Boolean

Semantics:

a. Empty (Ctreate()) = Trueb. Member (Insert(S,E), E) = Truec. Empty (Insert (S,E)) = Falsed. Member (Delete(S,E), E) = Falsee. Empty (Delete(Insert (Createset(), E), E) = Truef. If Member (S1, E) or Member (S2, E) Then

Member (Union(S1, S2), E) = True Else

Member (Union(S1, S2), E) = Falseg. If Member (S1, E) And (Member (S2, E)) Then

Member (Intersection(S1, S2), E) = True Else

Member (Intersection(S1, S2), E) = Falseh. If Member (S1, E) And (not(Member (S2, E)) Then

Member (Difference(S1,S2), E) = True Else

Member (Difference(S1,S2), E) = Falsei. If (Empty(Difference(S1, S2))) Then

Subset (S1, S2) = True Else

Subset (S1, S2) = False

- 262 -

H×nh 6.2 : Có ph¸p vµ ng÷ nghÜa h×nh thøc cña kiÓu tËp hîp-----------------------------------------------------------------------------

Trong ®ã Max ®îc gi¶ ®Þnh lµ sè phÇn tö tèi ®a cho phÐp trong mét tËp hîp cßn kiÓu c¬ së (BaseType chÝnh lµ kiÓu cña c¸c phÇn tö trong tËp hîp. Víi nh÷ng khai b¸o nh thÕ th× tËp hîp S = { 25, 13, 10, -4, 22} cã thÓ ®îc lu tr÷ nh sau:

S^.Data[1] 10S^.Data[2] 13S^.Data[3] 25 S^.Size = 5S^.Data[4] -4S^.Data[5] 22

Ta ®Ó ý r»ng thø tù ®îc lu tr÷ trong m¸y kh«ng nhÊt thiÕt trïng víi thø tù ta liÖt kª c¸c phÇn tö trong mét tËp hîp.

Sau ®©y ta khai b¸o m« ®un ngoµi vµ m« ®un trong cña kiÓu d÷ liÖu trõu tîng tËp hîp.

(* M« ®un sau ®©y chøa ®Æc t¶ bªn ngoµi cña kiÓu d÷ liÖu trõu t-îng tËp hîp nh ta ®· m« t¶ trong h×nh 5.1. Có ph¸p vµ ng÷ nghÜa cña kiÓu nµy ®· ®îc m« t¶ trong h×nh 5.2*).

External Module SetPackage;From UserModule Import

DataElementType;

- 263 -

TypeSetType;

(* Precondition: Kh«ng Postcondition: Mét tËp hîp míi, kh«ng chøa phÇn tö nµo ®ùoc t¹o ra, Empty(CreateSet()) = True *)Procedure CreateSet() : SetType;

(* Precondition: Kh«ng Postcondition: Sau khi gäi thñ tôc Insert, ch¾c ch¾n tËp hîp sÏ chøa phÇn tö võa chÌn. Member(Insert(S, E),E) = TrueEmpty(Insert(S, E), E) = False *)Procedure Insert (Var Set : SetType; Element : DataElementType );

(* Precondition: Kh«ng Postcondition: Sau khi gäi thñ tôc Delete, ch¾c ch¾n tËp hîp kh«ng cßn chøa phÇn tö ®ã n÷a. Member(Delete(S, E),E) = FalseEmpty(Delete(Insert(Create(), E), E)) = True*)Procedure Delete (Var Set : SetType; Element : DataElementType );

(* Precondition: Kh«ng Postcondition: Hµm hay thñ tôc Union tr¶ ra mét tËp hîp gåm nh÷ng phÇn tö hoÆc thuéc S1 hoÆc thuéc S2 hoÆc thuéc c¶ hai tËp hîp.If Member(S1, E) Or Member(S2, E) Then

Member(Union(S1, S2), E) = TrueElse

Member(Union(S1, S2), E) = False *)

- 264 -

Procedure Union (set1: SetType; set2: SetType ): SetType;

(* Precondition: Kh«ng

Postcondition: Hµm hay thñ tôc Intersection tr¶ ra mét tËp hîp gåm nh÷ng phÇn tö thuéc c¶ hai tËp hîp S1 vµ S2.If Member(S1, E) And Member(S2, E) Then

Member(Intersection(S1, S2), E) = TrueElse

Member(Intersection(S1, S2), E) = False *)Procedure Intersection (set1: SetType; set2: SetType ): SetType;

(* Precondition: Kh«ng Postcondition: Hµm hay thñ tôc Difference tr¶ ra mét tËp hîp gåm nh÷ng phÇn tö thuéc tËp hîp S1 nhng kh«ng thuéc S2.If Member(S1, E) And (not(Member(S2, E)) Then

Member(Difference(S1, S2), E) = TrueElse

Member(Difference(S1, S2), E) = False*)Procedure Difference( Set1 : SetType; Set2: setType): SetType;

(* Precondition: Kh«ng

Postcondition: Thñ tôc Empty tr¶ ra gi¸ trÞ True nÕu tËp hîp kh«ng chøa phÇn tö nµo, tr¶ ra gi¸ trÞ False nÕu ngîc l¹i *)

Procedure Empty( Set: SetType ): Boolean;

(* Precondition: Kh«ng

- 265 -

Postcondition: Thñ tôc Member tr¶ ra gi¸ trÞ True nÕu phÇn tö ®ã thuéc tËp hîp, tr¶ ra gi¸ trÞ False nÕu ngîc l¹i

*)Procedure Member( Set: SetType; Element: DataElementType ): Boolean;

(* Precondition: Kh«ng

Postcondition: Thñ tôc Subset tr¶ ra gi¸ trÞ True nÕu mäi phÇn tö cña tËp hîp S1 ®Òu lµ phÇn tö cña tËp hîp S2, tr¶ ra gi¸ trÞ False nÕu ngîc l¹i *)

Procedure Subset( Set1: SetType; Set2: SetType ): Boolean;

End SetPackage.

H×nh 6.3: §Þnh nghÜa m« ®un ngoµi cña kiÓu d÷ liÖu trõu tîng tËp hîp-------------------------------------------------------------------------------------------

Khi sö dông nh÷ng khai b¸o ë trªn, nh÷ng thao t¸c mµ chóng ta giíi thiÖu trong môc tríc sÏ chuyÓn thµnh nh÷ng trªn m¶ng. Ch¼ng h¹n, ta cã thÓ t×m kiÕm tuÇn tù trªn m¶ng xem mét phÇn tö ®· cho cã thuéc tËp hîp hay kh«ng. H×nh 5.4 cho ta thÊy khi dïng m¶ng cµi ®Æt tËp hîp, thao t¸c lÊy giao S3 cña hai tËp hîp S1 vµ S2 ®îc thùc hiÖn nh thÕ nµo. Víi mçi phÇn tö cña tËp hîp S1 ta lÇn lît duyÖt S2 xem nã cã thuéc S2 kh«ng. NÕu nã còng thuéc S2 ta sÏ ®Æt nã vµo tËp hîp giao S3. NÕu nã kh«ng thuéc S2 th× ta bá qua nã. NÕu hai m¶ng S1 vµ S2 cha ®îc s¾p xÕp vµ mçi m¶ng ®Òu cã n phÇn tö th× ®ä phøc t¹p vÒ thêi gian cña thao t¸c nµy sÏ lµ O(n2). §é phøc t¹p vÒ thêi gian sÏ tèt h¬n nÕu S1 vµ S2 ®· ®îc s¾p xÕp. Sau ®©y

- 266 -

lµ thao t¸c lÊy giao cña hai tËp hîp nÕu ta dïng m¶ng ®Ó cµi ®Æt tËp hîp.

(* Precondition: Kh«ng

Postcondition: Intersection tr¶ ra tËp hîp gåm nh÷ng phÇn tö thuéc c¶ hai tËp hîp Set1 vµ Set2*)Procedure Intersection( Set1 : SetType; Set2: setType): SetType;Var

i : Integer;NewSet : SetType;

BeginNewSet := CreateSet();For i := 1 To Set1^.Size Do

If (Member(Set2, Set1^.Data[i]) ThenNewSet^.Size := NewSet^.Size + 1;NewSet^.Data[NewSet^.Size] := Set1^.Data[i];

Endif;Return NewSet;

End Intersection;

H×nh 6.4: Dïng m¶ng cµi ®Æt thao t¸c giao cña hai tËp hîp m¶ng--------------------------------------------------------------------------------------------

NÕu chóng ta dïng danh s¸ch mãc nèi ®Ó cµi ®Æt tËp hîp ta còng cã kÕt qu¶ t¬ng tù nh dïng m¶ng.

Trong môc tríc, chóng ta ®· qui íc 3 ®iÒu vÒ kiÓu c¬ së cña tËp hîp. Cô thÓ lµ ta qui íc tÊt c¶ c¸c phÇn tö cña tËp hîp ph¶i thuéc cïng mét kiÓu, vµ ®ã ph¶i lµ kiÓu ®¬n chø kh«ng ph¶i kiÓi phøc

- 267 -

hîp. H¬n thÕ n÷a, sè phÇn tö cña tËp hîp kh«ng ph¶i lµ tïy ý mµ ph¶i t¬ng ®èi nhá. NÕu chóng ta cã thªm mét qui íc n÷a cho kiÓu c¬ së ta sÏ cã mét c¸ch cµi ®Æt tËp hîp rÊt hiÖu qu¶ vµ ®îc gäi lµ biÓu diÔn b»ng vec t¬ bÝt.

§iÒu mµ chóng ta cÇn gi¶ sö thªm lµ tån t¹i f lµ mét ¸nh x¹ 1-1 tõ tËp hîp tÊt c¶ c¸c phÇn tö cña kiÓu c¬ së ®Õn tËp hîp c¸c sè nguyªn tõ 0 ®Õn N-1 mµ ta kÝ hiÖu lµ [0..N-1], trong ®ã, N lµ sè c¸c phÇn tö cña kiÓu c¬ së cña tËp hîp.

f: E ITrong ®ã, E lµ kiÓu cë së cña tËp hîp cßn I lµ tËp nh÷ng sè nguyªn tõ 0 ®Õn N-1.V× f lµ ¸nh x¹ 1-1 nªn f(e1)≠ f(e2) khi e1≠ e2, víi e1 vµ e2 thuéc E.TÊt c¶ c¸c kiÓu cã thø tù cña Pascal nh kiÓu Integer, kiÓu Charcter, Boolean hay kiÓu liÖt kª ®Òu cã tÝnh chÊt trªn. Trong nh÷ng trêng hîp nµy, hµm f mµ ta nãi ®Õn ë trªn cã thÓ chän chÝnh lµ hµm chuÈn Ord(x).

Trong trêng hîp hµm f nh trªn tån t¹i th× ®Ó biÓu diÔn mét tËp hîp S cã kh«ng qu¸ N phÇn tö ta chØ ®¬n gi¶n t¹o mét m¶ng víi N phÇn tö, mçi phÇn tö cña m¶ng nhËn mét trong hai gi¸ trÞ lµ Cã vµ Kh«ng hay Yes vµ No. Yes t¬ng øng víi viÖc phÇn tö cã xuÊt hiÖn trong tËp hîp S, No sÏ t¬ng øng víi viÖc phÇn tö ®ã kh«ng cã trong tËp hîp S. Nãi cô thÓ h¬n, mçi tËp hîp S b©y giê t¬ng øng víi mét m¶ng N phÇn tö, mçi phÇn tö cã mét trong hai tr¹ng th¸i lµ Yes hoÆc No. ViÖc khai b¸o thiÕt lËp vect¬ bÝt ®¬n gi¶n chØ lµ: Type

SetType = Array [0..N-1] of (Yes, No);

- 268 -

VarS: SetType;

Dïng c¸ch biÓu diÔn nµy th× viÖc cµi ®Æt c¸c thao t¸c trªn tËp hîp rÊt ®¬n gi¶n. VÝ dô, ®Ó thªm mét phÇn tö e nµo ®ã vµo mét tËp hîp S, ta chØ viÖc g¸n gi¸ trÞ Yes cho S[f(e)], tøc lµ lµm cho tr¹ng th¸i cña phÇn tö ®ã trë thµnh Yes. §Ó xo¸ phÇn tö e khái tËp hîp S ta chØ cÇn g¸n gi¸ trÞ No cho S[f(e)], tøc lµ lµm cho tr¹ng th¸i cña phÇn tö ®ã trë thµnh No. §Ó kiÓm tra xem e cã ph¶i lµ phÇn tö cña S hay kh«ng chØ ®¬n gi¶n lµ kiÓm tra vÞ trÝ S[f(e)] xem gi¸ trÞ t¹i ®ã lµ Yes hay No. Ta thÊy ngay víi c¸ch biÓu diÔn nh vËy, nhiÒu thao t¸c cã ®é phøc t¹p lµ O(1).

§Ó lµm vÝ dô, gi¶ sö b©y giê chóng ta ph¶i t¹o ra mét tËp hîp biÓu diÔn c¸c ngµy trong mét tuÇn: Thø hai (Monday), Thø ba (Tuesday), Thø t (Wednesday), Thø n¨m(Thursday), Thø s¸u (Friday), Thø b¶y(Saturday) vµ Chñ nhËt (Sunday). Hµm thø tù Ord sÏ ¸nh x¹ nh sau:Ord(Monday) = 0Ord(Tuesday) = 1

.

.

.Ord(Sunday) = 6

vµ biÓu diÔn vÐc t¬ bÝt cña tËp hîp S = {Monday, Wednesday, Friday} nh sau:

Yes No Yes No Yes No NoS[0] S[1] S[2] S[3] S[4] S[5] S[6]

- 269 -

Monday

Tuesday

Wednesday

Thursday

Friday Saturday

Sunday

§Ó x¸c ®Þnh xem phÇn tö Tuesday cã thuéc tËp hîp kh«ng ta chØ viÖc kiÓm tra gi¸ trÞ cña S[Ord(Tuesday)] = S[1]. Ta thÊy nã cã gi¸ trÞ lµ No. §iÒu ®ã chøng tá r»ng Tuesday kh«ng thuéc tËp S.

§Ó xãa phÇn tö Friday khái tËp hîp ta chØ viÖc g¸n gi¸ trÞ cña S[Ord(Friday)] = S[4] b»ng No.

Ta xÐt vÝ dô thø hai. Gi¶ sö tËp hîp c¬ së lµ tËp c¸c ch÷ c¸i thêng trong b¶ng ch÷ c¸i [‘a’..’z’], nã cã thø tù lÇn lît tõ 97 tíi 122. Hµm f mµ ta chän b©y giê lµ:

f(e) = Ord(e) – 97

§Ó xem ch÷ ‘c’ cã ph¶i lµ mét phÇn tö thuéc tËp hîp S kh«ng, tríc hÕt ta ta t¸c ®éng hµm f vµo phÇn tö ‘c’ vµ ta cã:

f(‘c’) = Ord(‘c’) – 97= 99 – 97= 2

Nh vËy, ®Ó xem ‘c’ cã ph¶i lµ phÇn tö cña S kh«ng ta chØ cÇn kiÓm tra S[2] xem nã mang gi¸ trÞ Yes hay No.

C¸c phÐp to¸n lÊy hîp, giao vµ lÊy hiÖu hai tËp hîp cã thÓ ®îc thùc hiÖn mét c¸ch rÊt ®¬n gi¶n lµ dïng vßng lÆp For, víi ®é phøc t¹p lµ O(N). Ch¼ng h¹n, phÐp lÊy giao cã thÓ thùc hiÖn nh sau:

For i:= 0 To N-1 DoIf (S1[i] = Yes) And (S2[i]) = Yes) Then

- 270 -

S3[i] := YesElse

S3[i] := No

C¸ch cµi ®Æt tËp hîp nµy gióp cho phÐp lÊy giao hai tËp hîp hiÖu qu¶ h¬n nhiÒu so víi viÖc ta dïng m¶ng hay danh s¸ch mãc nèi ®Ó cµi ®Æt. V× nÕu dïng m¶ng hay danh s¸ch mãc nèi, ta sÏ cÇn tíi O(N2) phÐp so s¸nh. Còng t¬ng tù nh vËy cho phÐp lÊy hîp hay hiÖu cña hai tËp hîp.

Sau ®©y ta tr×nh bµy m« ®un cµi ®Æt kiÓu d÷ liÖu trõu tîng tËp hîp khi dïng vec t¬ bit

(* m« ®un sau ®©y lµ phÇn chi tiÕt bªn trong cña kiÓu d÷ liÖu trõu tîng TËp hîp Set sö dông vec t¬ bit. M« ®un ngoµi ta ®· viÕt ë h×nh 5.3*)

Internal Module SetPackage;

From UserModule Import(* kiÓu d÷ liÖu cña c¸c phÇn tö cña tËp hîp *)DataElementType,(* Sè phÇn tö cña tËp hîp DataElementType *)MaxElement,(* Hµm tõ DataElementType [0..MaxElement – 1] *)Ord;

Type(* KiÓu d÷ liÖu trõu tîng *)SetType = Pointer To Array [0..MaxElement – 1] of (Yes, No);

- 271 -

(* Precondition: Kh«ng

Postcondition: Mét tËp hîp rçng ®îc t¹o ra, Empty(CreateSet()) = True *)Procedure CreateSet(): SetType;Var

NewSet : SetType;i : Integer;

BeginNew(NewSet);For i:= 0 to (MaxElement – 1) Do

NewSet^[i] := No; (* Cha cã phÇn tö nµo thuéc tËp hîp*)Return NewSet;

End CreateSet;

(* Precondition: Kh«ng

Postcondition: Sau khi gäi Insert, TËp hîp ch¾c ch¾n sÏ chøa phÇn tö E.Member(Insert(S,E), E) = TrueEmpty(Insert(S,E)) = False *)

Procedure Insert( Var Set : SetType; E: DataElementType);Begin

Set^[Ord(E)] := Yes;End Insert;

(* Precondition: Kh«ngPostcondition: Sau khi gäi Delete, tËp hîp kh«ng cßn chøa E n÷a*)Procedure Delete( Var Set : SetType; E: DataElementType);

- 272 -

BeginSet^[Ord(E)] := No;

End Delete;

(* Precondition: Kh«ngPostcondition: Union tr¶ ra tËp hîp gåm nh÷ng phÇn tö hoÆc thuéc Set1 hoÆc thuéc Set2 hoÆc thuéc c¶ hai*)Procedure Union( Set1 : SetType; Set2: setType): SetType;Var

i : Integer;NewSet : SetType;

BeginNew(NewSet);For i := 0 To (Maxsize – 1) Do

If ((Set1^[i] = Yes) Or (Set2^[i] = Yes)) ThenNewSet^[i] := Yes;

Return NewSet;End Union;

(* Precondition: Kh«ng

Postcondition: Intersection tr¶ ra tËp hîp gåm nh÷ng phÇn tö thuéc c¶ hai tËp hîp Set1 vµ Set2*)Procedure Intersection( Set1 : SetType; Set2: setType): SetType;Var

i : Integer;NewSet : SetType;

BeginNew(NewSet);For i := 0 To (Maxsize – 1) Do

If ((Set1^[i] = Yes) And (Set2^[i] = Yes)) Then

- 273 -

NewSet^[i] := Yes;Return NewSet;

End Intersection;

(* Precondition: Kh«ngPostcondition: Difference tr¶ ra tËp hîp gåm nh÷ng phÇn tö

thuéc tËp Set1 nhng kh«ng thuéc thËp Set2 *)Procedure Difference( Set1 : SetType; Set2: setType): SetType;Var

i : Integer;NewSet : SetType;

BeginNew(NewSet);For i := 0 To (Maxsize – 1) Do

If ((Set1^[i] = Yes) And (Set2^[i] = No)) ThenNewSet^[i] := Yes;

Return NewSet;End Difference;

(* Precondition: Kh«ngPostcondition: Empty tr¶ ra gi¸ trÞ True nÕu Set kh«ng chøa

phÇn tö nµo, ngîc l¹i, nã tr¶ ra gi¸ trÞ False*)Procedure Empty( Set : SetType): Boolean;Var

i : Integer;Begin

i:= 0;While (i < MaxElement) Do (*duyÖt mçi phÇn tö thuéc kiÓu c¬

së*)

- 274 -

If (Set^[i] = Yes) Then (*®Õn khi t×m ®îc mét phÇn tö thuéc Set *)

Return False; (* tËp hîp Set sÏ kh¸c rçng *)i := i + 1;

Endwhile;Return True;

End Empty;

(* Precondition: Kh«ng

Postcondition: Member tr¶ ra gi¸ trÞ True nÕu Element

lµ mét phÇn tö thuéc Set, ngîc l¹i, nã tr¶ ra gi¸ trÞ False*)

Procedure Member( Set : SetType; Element : DataElementType): Boolean;Begin

Return Set^[Ord(Element)];

End Member;

(* Precondition: kh«ng

Postcondition: Subset tr¶ ra gi¸ trÞ True nÕu tËp hîp thø nhÊt Set1 lµ tËp hîp con cña tËp hîp thø hai Set2, ngîc l¹i nã tr¶ ra gi¸ trÞ False *)Procedure Subset( Set1 : SetType; Set2: setType): Boolean;Begin

Return Empty(Difference(Set1, Set2));

- 275 -

End Subset;End SetPackage.

H×nh 6.5: Dïng vec t¬ bit ®Þnh nghÜa m« ®un ngoµi cña kiÓu d÷ liÖu trõu tîng tËp hîp-------------------------------------------------------------------------------------------

ë møc trõu tîng cao nhÊt, ta ®îc phÐp xem tËp hîp lµ mét kiÓu d÷ liÖu trõu tîng mµ kh«ng cÇn ph¶i ®Ó ý ®Õn viÖc kiÓu d÷ liÖu trõu tîng ®îc cµi ®Æt thÕ nµo trong ng«n ng÷ lËp tr×nh. Ta cã thÓ xem nã nh mét phÇn cña ng«n ng÷ lËp tr×nh, ch¼ng h¹n ta cã thÓ viÕt:

VarS : Set; (* KiÓu d÷ liÖu Set vµ Element ®îc nhËp tõ m« ®un

*) E: Element; (* ngoµi cña ch¬ng tr×nh *)

Chóng ta sö dông nh÷ng ®èi tîng cña kiÓu d÷ liÖu trõu tîng tËp hîp nµy qua c¸c thao t¸c ®îc x©y dùng trong m« ®un ngoµi (h×nh 9.3) mµ ch¼ng cÇn quan t©m ®Õn viÖc c¸c thao t¸c nµy ®îc cµi ®Æt nh thÕ nµo. Ch¼ng h¹n, ta cã thÓ viÕt:

From SetModule ImportMember,Insert;..

- 276 -

.If Member (S,E) Then

WriteString (‘ phÇn tö E thuéc tËp S’)Else

Insert (S,E)

Theo quan ®iÓm cña ngêi sö dông, hä chØ cÇn biÕt lµ hä cã thÓ dïng ®îc nh÷ng g×, dïng chóng ra sao (có ph¸p) vµ hiÖu øng (ng÷ nghÜa) cña chóng nh thÕ nµo.

ë møc tiÕp theo, sö dông c¸c cÊu tróc d÷ liÖu cho bëi mét ng«n ng÷ lËp tr×nh, chóng ta cÇn ph¶i quan t©m ®Õn kiÓu d÷ liÖu trõu tîng dîc cµi ®Æt ra sao. Ch¼ng h¹n nh viÖc cµi ®Æt tËp hîp, ta cã thÓ dïng m¶ng, danh s¸ch mãc nèi hay vÐc t¬ bÝt. Do khu«n khæ cña gi¸o tr×nh ta ®· thùc hiÖn chi tiÕt viÖc cµi ®Æt b»ng vÐc t¬ bÝt. B©y giê gi¶ sö trong mét ch¬ng tr×nh, b¹n cµi ®Æt tËp hîp nh lµ m¶ng N phÇn tö vµ sö dông nã ngay trong ch¬ng tr×nh ®ã. Ch¾c ch¾n c¸c c«ng viÖc ®¬n gi¶n nh kiÓm tra xem mét phÇn tö cã thuéc mét tËp hîp hay kh«ng còng cã nhiÒu viÖc h¬n rÊt nhiÒu so víi viÖc b¹n sö dông kiÓu d÷ liÖu trõu tîng tËp hîp ®· x©y dùng ë møc trªn.

Type Set = Array [0..25] of (Yes, No);Element = [‘A’..’Z’];

Chóng ta sö dông nh÷ng cÊu tróc d÷ liÖu vµ tµi nguyªn cña ng«n ng÷ lËp tr×nh, chóng ta cã thÓ viÕt:

VarS: SetE: Element;

- 277 -

.

.

.i := Ord(E) – 65If S[i] = Yes Then

WriteString (‘ phÇn tö E thuéc tËp S’)Else

S[i] := Yes

Thùc ra phÇn nµy t¬ng tù nh phÇn chóng ta ®· viÕt ë m« ®un trong cña kiÓu d÷ liÖu trõu tîng.

ë møc thÊp nhÊt (hardware level), chóng ta cßn ph¶i ®Ó ý ®Õn t-¬ng øng gi÷a c¸c cÊu tróc trong ng«n ng÷ lËp tr×nh nh m¶ng, chØ sè víi bé nhí vµ bé vi xö lý cña m¸y tÝnh. Ch¬ng tr×nh dÞch sÏ ph¶i chuyÓn nh÷ng thao t¸c ë møc cao thµnh nh÷ng chØ thÞ cña bé vi xö lý. §ã lµ nh÷ng vÊn ®Ò phøc t¹p h¬n, ®îc thùc hiÖn bëi c¸c nhµ viÕt ch¬ng tr×nh dÞch hay kiÕn tróc m¸y tÝnh.

Tãm l¹i, viÖc b¹n quan niÖm tËp hîp nh trong to¸n häc hay lµ mét m¶ng, mét danh s¸ch, mét vÐc t¬ bÝt lµ tïy theo nhu cÇu cña b¹n vµ tïy theo b¹n lµ lµ mét ngêi nghiªn cøu vÒ tËp hîp, ngêi sö dông, ngêi lËp tr×nh hay ngêi viÕt ch¬ng tr×nh dÞch. Tuy nhiªn, nÕu b¹n lµ ngêi sö dông hay ngêi lËp tr×nh th× kh«ng nªn bËn t©m nhiÒu ®Õn nh÷ng chi tiÕt ë møc díi hoÆc ®Ó chóng lµm c¶n trë ®Õn c«ng viÖc cña b¹n.

6.2 B¶ng t×m kiÕm

6.2.1 §Þnh nghÜa vµ c¸c thao t¸c

- 278 -

TËp hîp lµ mét kh¸i niÖm quan träng trong to¸n häc vµ nã ®îc nghiªn cøu rÊt nhiÒu trong mét ngµnh hÑp gäi lµ lý thuyÕt tËp hîp. Tuy nhiªn, cÊu tróc tËp hîp mµ ta võa nghiªn cøu ë môc tríc kh«ng ®îc ®¸nh gi¸ quan träng l¾m vµ còng kh«ng ®îc dïng nhiÒu trong khoa häc m¸y tÝnh. Nh÷ng h¹n chÕ ®ã cã thÓ lµ do ta ®· giíi h¹n kiÓu c¬ së cña tËp hîp lµ nh÷ng kiÓu cã thø tù vµ giíi h¹n vÒ sè phÇn tö cña tËp hîp.

Tuy nhiªn, ®iÒu ®ã kh«ng cã nghÜa lµ tËp hîp kh«ng ®ãng vai trß quan träng trong viÖc x©y dùng phÇn mÒm. Víi mét sè thay ®æi trong ®Þnh nghÜa tËp hîp ë môc 9.1 ta cã thÓ x©y dùng ®îc mét kh¸i niÖm hÕt søc quan träng trong khoa häc m¸y tÝnh, ®ã lµ kh¸i niÖm b¶ng t×m kiÕm.Sau ®©y lµ mét sè nh÷ng thay ®æi trong ®Þnh nghÜa tËp hîp:

1. Thay v× giíi h¹n c¸c phÇn tö cña tËp hîp lµ kiÓu cã thø tù, ta gi¶ sö r»ng chóng bao gåm nh÷ng bé hai phÇn tö d¹ng (ki, vi) trong ®ã, thµnh phÇn thø nhÊt ®îc gäi lµ trêng khãa cßn thµnh phÇn thø hai ®îc gäi lµ trêng gi¸ trÞ. Chóng ta kh«ng cã h¹n chÕ g× n÷a trªn sè l-îng c¸c bé trªn nhng ®¬ng nhiªn lµ chóng ph¶i h÷u h¹n.

S = {(k0,v0), (k1,v1),....(kn,vn)}c¸c phÇn tö ki thuéc kiÓu d÷ liÖu KeyType cßn nh÷ng phÇn tö vi thuéc kiÓu d÷ liÖu ValueType. Nh÷ng kiÓu nµy kh«ng nhÊt thiÕt ph¶i lµ nh÷ng kiÓu ®¬n. PhÇn tö ki lµ duy nhÊt x¸c ®Þnh trong tËp hîp nhng vi th× cã thÓ kh«ng cÇn thiÕt ph¶i duy nhÊt.2. Chóng ta còng kh«ng cÇn quan t©m ®Õn c¸c thao t¸c lÊy hîp Union, giao Intersection hay hiÖu Difference cña hai tËp hîp n÷a. B©y giê ta quan t©m ®Õn c¸c thao t¸c t¹o lËp, chÌn, xo¸ vµ xem mét phÇn tö nµo ®ã cã thuéc tËp hîp kh«ng, ®ã lµ nh÷ng thao t¸c mµ trong tiÕng Anh chóg lÇn lît ®îc gäi lµ: Create, Insert, Delete vµ

- 279 -

Member. Nh÷ng c«ng viÖc mµ ta sÏ thùc hiÖn ®èi víi b¶ng t×m kiÕm lµ ®Æt nh÷ng bé phÇn tö vµo trong b¶ng (Insert), xo¸ nh÷ng bé khái b¶ng t×m kiÕm (Delete) vµ x¸c ®Þnh xem mét bé cã thuéc b¶ng kh«ng (Member).3. Có ph¸p cña c¸c thao t¸c trªn mét b¶ng t×m kiÕm sÏ bÞ thay ®æi chót Ýt ph¶n ¸nh sù kh¸c nhau vÒ cÊu tróc cña c¸c phÇn tö cña b¶ng. Có ph¸p nµy ®îc cho ë h×nh sau ®©y.Syntax

Define SearchTable[K,Value]1. Create() : TThao t¸c nµy t¹o ra mét b¶ng t×m kiÕm T, cßn rçng, T = {}, tøc lµ T kh«ng chøa mét bé phÇn tö nµo.2. Insert (T1, K, V) : T2Thao t¸c nµy t¹o ra mét b¶ng t×m kiÕm míi T2 chøa tÊt c¶ c¸c cña T1 vµ cßn chøa c¶ bé (K,V) nÕu nh (K,V) kh«ng thuéc T1. NÕu nh T1 chøa mét bé phÇn tö d¹ng (K,X), trong ®ã X lµ gi¸ trÞ bÊt k× th× thay v× thªm gi¸ trÞ (K,V) vµo T2, ta thay gi¸ trÞ X trong bé ®· tån t¹i ®ã b»ng gi¸ trÞ V.3. Delete(T1,K) : T2Thao t¸c nµy t×m trong T1 bé phÇn tö d¹ng (K,X), trong ®ã X lµ gi¸ trÞ bÊt k×, vµ nÕu t×m ®ùoc th× chuyÓn phÇn tö ®ã khái T1 ®Ó cã b¶ng míi T2. NÕu kh«ng t×m thÊy bé phÇn tö nh thÕ th× nã tr¶ ra b¶ng cò mµ kh«ng hÒ thay ®æi g×.4. Member(T,K) : VThao t¸c nµy t×m trong T bé phÇn tö d¹ng (K,V), vµ nÕu t×m ®ùoc th× tr¶ ra gi¸ trÞ V liªn kÕt víi khãa K. NÕu kh«ng t×m thÊy K, nã tr¶ ra mét gi¸ trÞ ®Æc biÖt trong V, gäi lµ Null.Semantics1. Member(Create(), K) = Null2. Member(Delete(T,K),K) = Null

- 280 -

3. Member(Insert(T,K,V), K) = V4. Delete(Insert(T,K,V),K) = T5. Member(Insert(Insert(T,K,V1), K, V2), K) = V26. Delete(Create(), K) = Create()7. Delete(Insert(Create(), K1,V), K2) = Insert(Create(), K1,V)H×nh 6.6: Có ph¸p vµ ng÷ nghÜa cña cÊu tróc b¶ng t×m

kiÕm------------------------------------------------------------------------------------------

Néi dung mµ chóng ta võa m« t¶ trong h×nh 4.6 lµ mét vÝ dô vÒ mét cÊu tróc d÷ liÖu truy cËp trùc tiÕp. Trong cÊu tróc nµy, tÊt c¶ mäi gi¸ trÞ d÷ liÖu (data value) trong cÊu tróc t¹i thêi ®iÓm chÌn ®Òu liªn kÕt víi mét gi¸ trÞ duy nhÊt ®îc gäi lµ khãa (K) vµ ®îc lu tr÷ díi d¹ng bé (K, data value). Mäi sù truy cËp sau ®ã tíi gi¸ trÞ d÷ liÖu nµy ®Òu th«ng qua khãa cña nã, chø kh«ng ph¶i bëi vÞ trÝ cña nã trong b¶ng nh chóng ta ®· biÕt trong m¶ng. Do gi¸ trÞ khãa ®îc lu tr÷ trùc tiÕp trong bé nªn thø tù cña c¸c bé trong b¶ng lµ kh«ng quan träng theo nghÜa x¸c ®Þnh thuéc tÝnh thµnh viªn (membership). H¬n thÕ n÷a, do tÝnh duy nhÊt cña gi¸ trÞ khãa, nªn mçi bé còng ®îc x¸c ®Þnh duy nhÊt trong b¶ng, tøc lµ kh«ng cã hai bé trïng nhau trong mét b¶ng. Hai ®Æc tÝnh nµy cïng lµm cho cÊu tróc b¶ng t×m kiÕm mµ ta võa m« t¶ táa m·n ®Þnh nghÜa cña tËp hîp.B¶ng t×m kiÕm lµ mét cÊu tróc d÷ liÖu quan träng vµ ®ùoc sö dông rÊt réng r·i. ViÖc truy cËp th«ng qua khãa cho ta mét m« h×nh gÆp ë rÊt nhiÒu t×nh huèng trong thùc tÕ. Sau ®©y lµ mét sè vÝ dô:

Trêng khãa Trêng gi¸ trÞSè thÎ sinh viªn (Tªn, Chuyªn ngµnh häc, N¨m

- 281 -

nhËp häc)Sè thÎ b¶o hiÓm (Tªn, §Þa chØ, Lo¹i b¶o hiÓm)Sè biÓn kiÓm so¸t (Lo¹i xe, N¬i ®¨ng kÝ, Mµu)

Trong tÊt c¶ c¸c vÝ dô trªn, ta thêng muèn biÕt gi¸ trÞ d÷ liÖu khi biÕt gi¸ trÞ khãa (hay ta cÇn biÕt kh«ng tån t¹i bé cã khãa ®ã). Thao t¸c nµy chÝnh lµ thao t¸c x¸c ®Þnh thµnh viªn Member trong h×nh 5.6.M« ®un ngoµi cña kiÓu d÷ liÖu b¶ng t×m kiÕm ®îc m« t¶ trong h×nh 5.7 sau ®©y. Thao t¸c x¸c ®Þnh thµnh viªn Member ®îc ®æi tªn thµnh thao t¸c lÊy th«ng tin Retrieve cho râ nghÜa h¬n. Trong môc sau ta sÏ nghiªn cøu xem lµm thÕ nµo ®Ó cµi ®Æt cÊu tróc nµy cho hiÖu qu¶ vµ chóng ta sÏ ®a ra mét sè vÝ dô vÒ sö dông chóng.

6.2.2 Cµi ®Æt b¶ng t×m kiÕm dïng m¶ng vµ danh s¸ch mãc nèiCòng nh cÊu tróc tËp hîp trong phÇn 5.1, cã nhiÒu c¸ch ®¬n gi¶n ®Ó cµi ®Æt b¶ng t×m kiÕm. Tuy nhiªn, ta sÏ thÊy nãi chung chóng kh«ng hiÖu qu¶ vµ nhiÒu khi khã cã thÓ chÊp nhËn ®îc.

(* m« ®un sau ®©y chøa ®Æc t¶ ngoµi cho kiÓu d÷ liÖu trõu tîng b¶ng t×m kiÕm nh ®· m« t¶ trong h×nh 5.6 *).

External Module SearchTablePackage;From UserModule Import

KType,ValueType;

TypeSearchTableType; (* KiÓu d÷ liÖu trõu tîng *)

(* Precondition: Kh«ng

- 282 -

Postcondition: Create tr¶ ra mét b¶ng t×m kiÕm míi, cha cã phÇn tö *)Procedure Create() : SearchTableType;(*Precondition: Kh«ngPostcondition: Insert thªm bé (K, Value) vµo b¶ng Table, sao cho bÊt k× bé nµo ®· cã trong Table d¹ng (K, Val) ®Òu ®îc thay thÕ *)Procedure Insert( Var Table : SearchTableType;

K : KType; Value : ValueType);(*Precondition: kh«ngPostcondition: Delete chuyÓn bé cã d¹ng (K, Value) khái b¶ng Table, nÕu kh«ng cã bé nh thÕ th× b¶ng kh«ngthay ®æi *)Procedure Delete(Var Table: SearchTableType; K : KType);(*Precondition: Kh«ngPostcondition: Retrieve duyÖt b¶ng Table ®Ó t×m bé (K, Value) vµ tr¶ ra gi¸ trÞ value. NÕu kh«ng cã bé ®ã trong b¶ng Table, kÕt qu¶ sÏ kh«ng x¸c ®Þnh *)Procedure Retrieve( Table : SearchtableType; K : KType);End SearchTablePackage.

H×nh 6.7: M« ®un ngoµi cña b¶ng t×m kiÕm

-----------------------------------------------------------------------------------------

Ph¬ng ph¸p dÔ dµng nhÊt ®Ó cµi ®Æt mét b¶ng t×m kiÕm lµ dïng m¶ng c¸c b¶n ghi, mçi b¶n ghi lu tr÷ mét bé (K, value). Nh÷ng khai b¸o cÇn thiÕt ®Ó t¹o ra m¶ng ®Ó cµi ®Æt b¶ng t×m kiÕm nh sau:Const

Max = ... (**)Type

DataRecord = RecordK : KType;

- 283 -

Value : ValueTypeEnd;

SearchTableType = Array [0..Max] of DataRecord;

VarSearchTable : SearchTableType;

Víi c¸ch cµi ®Æt nµy, chóng ta sÏ cã hai c¸ch ®Ó lu tr÷ th«ng tin trong mçi b¶ng. Chóng ta cã thÓ lu gi÷ c¸c b¶n ghi trong m¶ng theo thø tù cña gi¸ trÞ khãa. Khi ®ã, ®Ó chÌn mét phÇn tö vµo m¶ng, ta cÇn ph¶i t×m ®óng vÞ trÝ cña nã trong m¶ng. Thao t¸c nµy cã ®é phøc t¹p lµ O(N). Tuy nhiªn, dïng c¸ch lu tr÷ nµy, viÖc t×m mét phÇn tö l¹i dÔ dµng vµ hiÖu qu¶. §é phøc t¹p cña nã chØ lµ O(log2N) v× ta cã thÓ dung phÐp t×m kiÕm nhÞ ph©n nhÞ ph©n. NÕu chóng ta lu gi÷ c¸c phÇn tö trong m¶ng kh«ng theo thø tù th× khi chÌn mét phÇn tö vµo m¶ng, ta cã thÓ chÌn ngay vµo cuèi m¶ng, vµ khi ®ã ®é phøc t¹p sÏ lµ O(1). Tuy nhiªn, nÕu ta muèn t×m kiÕm mét phÇn tö, ta ph¶i duyÖt m¶ng tuÇn tù vµ do ®ã ®é phøc t¹p l¹i lµ O(N).ViÖc cµi ®Æt b¶ng t×m kiÕm b»ng danh s¸ch mãc nèi thËt ra còng kh«ng hÒ tèt h¬n xÐt vÒ mÆt thêi gian. Khi chÌn mét phÇn tö vµo danh s¸ch, ta cã thÓ t¹o ra mét nót míi vµ chÌn ngay vµo ®Çu danh s¸ch. Do ®ã ®é phøc t¹p cña thao t¸c nµychØ lµ O(1). Tuy nhiªn, khi t×m kiÕm mét phÇn tö hay xãa mét phÇn tö khái danh s¸ch ta còng ph¶i duyÖt tuÇn tù nªn ®é phøc t¹p còng lµ O(N).NÕu ta dïng c©y t×m kiÕm nhÞ ph©n ®Ó cµi ®Æt b¶ng t×m kiÕm vµ gi¶ sö r»ng c©y cña chóng ta t¬ng ®èi c©n b»ng th× viÖc chÌn thªm mét phÇn tö, xãa mét phÇn tö hay t×m kiÕm mét phÇn tö ®Òu hiÖu qu¶ vµ cã ®é phøc t¹p lµ O(log2N).B¶ng sau ®©y sÏ cho ta th«ng tin vÒ ®é phøc t¹p vÒ thêi gian cña c¸c c¸ch cµi ®Æt võa nªu trªn.

- 284 -

C¸ch cµi ®Æt

Thao t¸c

Dïng m¶ng hay danh s¸ch mãc nèi (kh«ng theo thø tù)

Dïng m¶ng nh-ng theo thø tù.

Dïng c©y t×m kiÕm nhÞ ph©n.

ChÌn O(1) O(N) O(log2N)Xãa O(N) O(N) O(log2N)T×m kiÕm O(N) O(log2N) O(log2N)

Thùc ra chóng ta còng gÆp ph¶i vÊn ®Ò t¬ng tù nh khi ta nghiªn cøu vÒ c©y t×m kiÕm nhÞ ph©n. Ta cã thÓ nãi râ h¬n vÒ b¶ng trªn nh sau: HoÆc lµ chóng ta bá nhiÒu thêi gian cho viÖc chÌn thªm mét phÇn tö ®Ó s¾p xÕp c¸c phÇn tö trong c©y t×m kiÕm theo mét thø tù th× ta sÏ mÊt Ýt thêi gian h¬n khi ta t×m kiÕm. HoÆc ta mÊt Ýt thêi gian khi thªm phÇn tö vµo b¶ng vµ khi ®ã viÖc t×m kiÕm mét phÇn tö sÏ mÊt nhiÒu thêi gian h¬n. HoÆc ta cã thÓ cã ®é phøc t¹p vÒ thêi gian bËc l« ga cho c¶ ba thao t¸c trªn. VËy ta nªn chän c¸ch nµo hay c¸ch nµo lµ c¸ch tèt nhÊt trong c¸c c¸ch ®· nªu?Thùc ra c¶ ba c¸ch trªn ®Òu cha h¼n tèt. Cßn cã mét c¸ch thø t n÷a mµ ta cha nghiªn cøu. Theo c¸ch nµy, ta cã thÓ ®¹t ®îc ®é phøc t¹p vÒ thêi gian cho mçi thao t¸c trªn chØ lµ O(1). C¸ch nµy ®-îc gäi lµ b¨m vµ ®ã lµ ph¬ng ph¸p ®îc dïng th«ng dông nhÊt khi chóng ta muèn x©y dùng mét b¶ng t×m kiÕm. Trong môc sau ta sÏ giíi thiÖu vÒ ph¬ng ph¸p nµy.

6.2.3 B¶ng b¨m§Ó sö dông ph¬ng ph¸p b¨m, tríc hÕt ta lu tr÷ c¸c bé (khãa, d÷ liÖu) vµo mét m¶ng A[1..N]. Chóng ta ®Æt t¬ng øng khãa mµ ta cÇn t×m víi mét sè nµo ®ã mµ ta gäi lµ gi¸ trÞ b¨m, sau ®ã ta dïng gi¸

- 285 -

trÞ nµy nh chØ sè cña m¶ng ®Ó truy cËp trùc tiÕp vµo b¶ng t×m kiÕm. Nh vËy, ta cÇn cã mét hµm h, gäi lµ hµm b¨m ®Ó biÕn mçi gi¸ trÞ khãa ®· cho thµnh mét chØ sè x trong ®o¹n [1..N].x = h(K) 1£ x £ NSau ®ã ta dïng chØ sè x chø kh«ng ph¶i khãa (K) ®Ó t×m kiÕm bé (khãa, d÷ liÖu) hay (key, value) trong m¶ng. Khi ®ã, viÖc t×m kiÕm sÏ chØ cã ®é phøc t¹p lµ O(1).Ta cã thÓ gäi b¶ng b¨m T (trong tiÕng Anh b¶ng b¨m ®îc gäi lµ hash table) lµ mét cÊu tróc d÷ liÖu truy cËp trùc tiÕp T[1..N] mµ mçi phÇn tö cña b¶ng lµ mét bé (khãa, d÷ liÖu) trong ®ã trêng d÷ liÖu cã thÓ ®îc truy cËp bëi chØ sè i. ChØ sè i ®îc x¸c ®Þnh khi t¸c ®éng mét hµm b¨m h vµo khãa K khi cÇn t×m kiÕm hay chÌn mét phÇn tö vµo b¶ng.

T (k1,v1) (k2,v2) (k3,v3)

... (kn,vn)

B¶ng b¨m

1 2 3

h(k1) h(k2) h(k3) ... Hµm b¨m

Hµm b¨m h : khãa chØ sèH×nh 6.8: cÊu tróc l«gic cña b¶ng b¨m

§Ó lÊy vÝ dô vÒ mét hµm b¨m, gi¶ sö khi lµm viÖc víi mét c¬ së d÷ liÖu nµo ®ã, ta dïng tªn cña mçi bé d÷ liÖu lµm gi¸ trÞ khãa. Chóng ta sÏ x©y dùng mét hµm b¨m h. Gi¶ sö ta cã hµm tªn lµ pos, biÕn mçi ch÷ trong b¶ng c¸i a, b, c,... thµnh mét sè. VÝ dô: pos(a) = 1, pos(b) = 2, pos(c) = 3...

- 286 -

Gi¶ sö c¸c ch÷ c¸i trong mét tªn n nµo ®ã lµ: n1, n2, n3,..., nk, khi ®ã, ta cã thÓ ®Æt:h(n) = pos(n1) + pos(n2) + pos(n3) + ...+pos(nk).

B©y giê ta h·y xem hµm nµy ho¹t ®éng nh thÕ nµo. Gi¶ sö ta cã mét b¶ng gåm 40 bé nh ®· nªu trªn lu tr÷ th«ng tin vÒ c¸c häc sinh trong mét líp häc. Ta chän tªn häc sinh lµm khãa. Víi mçi tªn häc sinh ta muèn cho t¬ng øng víi mét gi¸ trÞ trong kho¶ng tõ 1 ®Õn 40, øng víi vÞ trÝ cña tªn häc sinh ®ã trong b¶ng. Muèn vËy, ta cã thÓ lÊy ngay h(n) theo m« ®un 40. Qu¸ tr×nh nµy sÏ cho ta nh÷ng sè n»m trong kho¶ng 0 vµ 39, sau ®ã ta cã thÓ céng thªm 1 vµo mçi gi¸ trÞ ®Ó ®¹t ®îc tËp gi¸ trÞ lµ nh÷ng sè nguyªn n»m trong kho¶ng 1..40 nh ta mong muèn. H×nh 4.9 sau ®©y sÏ cho ta thÊy c¸ch t×m gi¸ trÞ b¨m cña gi¸ trÞ khãa lµ Doanh.

Ch÷ c¸i Gi¸ trÞd 4o 15a 1n 14h 8Tæng sè 42

Gi¸ trÞ b¨m = ( 42 mod 40) + 1 = 3

H×nh 6.9: c¸ch tÝnh gi¸ trÞ b¨m cña khãa tªn “doanh”.-------------------------------------------------------------------------------------------

- 287 -

NÕu ph¬ng ph¸p b¨m lu«n lu«n thùc hiÖn ®îc ®iÒu nh ta võa m« t¶ th× cßn g× tuyÖt vêi h¬n n÷a? Ta thÊy viÖc chÌn mét phÇn tö vµo b¶ng chØ cã ®é phøc t¹p lµ O(1) v× nã chØ bao hµm cã mÊy thao t¸c sau ®©y:

Insert (T, k, v): x:= h(k)T[x]. Key := kT[x]. Value := vReturn TViÖc t×m kiÕm mét phÇn tö trong b¶ng T khi biÕt khãa k còng chØ cã ®é phøc t¹p lµ O(1):

Retrieve (T, k):x:= h(k)Return T[x].Value

Khi ta so s¸nh víi ®é phøc t¹p ®îc cho trong b¶ng 4.9 ta thÊy kÜ thuËt ta võa tr×nh bµy tuyÖt vêi rÊt niÒu so víi viÖc dïng m¶ng hay danh s¸ch mãc nèi hay c©y nhÞ ph©n. Tuy nhiªn, ta còng ®õng véi vµng mõng qu¸ mµ tin tëng hå ®å. ThËt lµ kh«ng may m¾n cho chóng ta lµ x©y dùng mét hµm b¨m lý tëng lµ hoµn toµn kh«ng dÔ. VËy thÕ nµo lµ mét hµm b¨m lý tëng?Mét hµm b¨m lý tëng lµ mét hµm cã tÝnh chÊt ®¬n ¸nh. Tøc lµ nÕu x1 kh¸c x2 th× h(x1) còng ph¶i kh¸c x2. Nh÷ng hµm b¨m mµ ngêi ta thêng dïng trong nh÷ng ch¬ng tr×nh th«ng thêng thêng cã tÝnh chÊt kh«ng ®¬n ¸nh. §«i khi x y nhng h(x) l¹i b»ng h(y). Nh÷ng tr-êng hîp khi mµ hai khãa kh¸c nhau b¨m vµo cïng mét vÞ trÝ nh thÕ ®îc gäi lµ mét sù va ch¹m. VÝ dô, khi dïng hµm b¨m nãi ®Õn ë trªn, khãa tªn “Chinh”:

- 288 -

Ch÷ c¸i Gi¸ trÞc 3h 8i 9n 14h 8Tæng sè 42

Ta thÊy: Gi¸ trÞ b¨m = ( 42 mod 40) + 1 = 3vµ nh vËy, sù va ch¹m ®· xuÊt hiÖn. Hai khãa kh¸c nhau lµ Doanh vµ Chinh ®· b¨m vµo cïng vÞ trÝ 3 trong b¶ng!Thùc ra nh÷ng va ch¹m nh thÕ lµ rÊt khã tr¸nh. Bëi v× tËp miÒn gi¸ trÞ cã thÓ cña c¸c khãa cã thÓ lµ rÊt lín vµ thêng lµ lín rÊt nhiÒu so víi kÝch cì cña b¶ng. Ch¼ng h¹n, nÕu nh vÝ dô trªn, ta chän trêng tªn lµm khãa vµ ta gi¶ sö r»ng mçi tªn cã ®é dµi tèi ®a lµ 10 kÝ tù. B¶ng ch÷ c¸i cña chóng ta cã 24 kÝ tù. Nh vËy, tæng sè gi¸ trÞ cã thÓ cña khãa lµ 2410, ®ã lµ mét sè cùc k× lín. Ta kh«ng thÓ nµo cã thÓ t¹o ra mét b¶ng ®ñ lín ®Ó ®¶m b¶o r»ng kh«ng cã va ch¹m. Cho dï ta cã thÓ t¹o ra ®îc th× còng ch¼ng nªn bëi v× lµm nh vËy lµ qu¸ l·ng phÝ, bëi ®a sè c¸c vÞ trÝ sÏ bÞ bá trèng! Mét tæ hîp 10 ch÷ c¸i kh«ng ph¶i bao giê còng lµm thµnh mét tõ, vµ khi nã lµm thµnh mét tõ th× kh«ng ph¶i cã thÓ ®Ó ®Æt tªn!VËy lµm thÕ nµo ®Ó gi¶i quyÕt vÊn ®Ò nµy? Ta cã thÓ cã hai c¸ch gi¶i quyÕt: mét lµ, cè g¾ng gi¶m thiÓu sè va ch¹m, hai lµ ta ph¶i t×m ra mét ph¬ng ph¸p nµo ®ã ®Ó cã thÓ ®¬ng ®Çu ®îc víi va ch¹m khi nã x¶y ra.§Ó gi¶m thiÓu sè c¸c va ch¹m, ta cÇn ph¶i t×m ®îc nh÷ng hµm b¨m tèt nhÊ cã thÓ, tháa m·n ai ®iÒu kiÖn sau:

- 289 -

1. ViÖc tÝnh to¸n gi¸ trÞ b¨m kh«ng chiÕm mÊt nhiÒu th× giê. TÝnh chÊt nµy rÊt quan träng v× mçi lÇn chÌn hay t×m kiÕm, ta ®Òu ph¶i tÝnh gi¸ trÞ b¨m. NÕu c¸c thao t¸c tÝnh to¸n gi¸ trÞ b¨m phøc t¹p, mÊt nhiÒu th× giê th× sÏ ¶nh hëng lín ®Õn thêi gian thùc hiÖn ch-¬ng tr×nh cña ta.2. Hµm b¨m r¶i c¸c gi¸ trÞ øng víi khãa ra t¬ng ®èi ®ång ®Òu trªn tËp chØ sè tõ 1 ®Õn N. Tøc lµ, víi bÊt k× mét gi¸ trÞ khãa nµo, ta muèn x¸c suÊt cña gi¸ trÞ ®ã b¨m vµo vÞ trÝ i cña b¶ng lµ ®ång ®Òu víi mçi i:Pro (h(K) = i) = 1/N víi mçi i, 1 £ i £ NViÖc ph©n phèi ®Òu sÏ gi¶m thiÓu sè khãa bÞ b¨m vµo cïng mét vÞ trÝ i vµ nh vËy sÏ gi¶m thiÓu sè va ch¹m.Sau ®©y lµ mét vÝ dô vÒ mét hµm b¨m kh«ng tèt. Gi¶ sö ta chän hµm h nh sau:h(K) = (2 * K) Mod NGi¶ sö n = 40 nh trªn, ta thÊy hµm nµy ¸nh x¹ tÊt c¶ c¸c gi¸ trÞ cña khãa vµo c¸c vÞ trÝ ch½n 0, 2, 4, 6, . . .vµ bá trèng hoµn toµn c¸c vÞ trÝ lÎ. Nh vËy h¼n nã sÏ lµm t¨ng sè va ch¹m lªn gÊp ®«i.ViÖc nghiªn cøu tÝnh chÊt to¸n häc cña c¸c hµm b¨m còng lµ mét lÜnh vùc chuyªn s©u cña to¸n häc vµ n»m ngoµi ph¹m vi cña gi¸o tr×nh nµy. §éc gi¶ muèn t×m hiÓu thªm cã thÓ ®äc trong c¸c gi¸o tr×nh cña lý thuyÕt hµm hay gi¶i tÝch sè. Ta chØ nãi ë ®©y lµ ph-¬ng ph¸p nh©n ®ång d lµ mét trong nh÷ng ph¬ng ph¸p ®Ó x©y dùng ra mét líp hµm b¨m t¬ng ®èi tèt víi mét sè ®iÒu kiÖn cña kÝch cì b¶ng vµ tËp khãa. Víi ph¬ng ph¸p nµy, ta xem tËp khãa lµ tËp hîp nh÷ng sè nguyªn kh«ng dÊu vµ tÝnh gi¸ trÞ b¨m bëi c«ng thøc:h(K) = (( a * K) Mod N) + 1, trong ®ã N lµ mét sè nguyªn tè, a lµ mét sè d¬ng, lÎ vµ còng nguyªn tè.Víi phÐp chän lùa N vµ a thÝch hîp, hµm nµy sÏ cho ta mét tËp c¸c gi¸ trÞ nguyªn ph©n phèi t¬ng ®èi ®ång ®Òu trªn tËp chØ sè tõ 1

- 290 -

®Õn N. Thùc ra, ngay c¶ khi ta x©y dùng ®îc nh÷ng hµm b¨m t¬ng ®èi tèt ta vÉn ph¶i ®¬ng ®Çu víi viÖc hai khãa ph©n biÖt b¨m vµo cïng mét vÞ trÝ trong b¶ng. Sau ®©y ta sÏ nãi ®Õn hai ph¬ng ph¸p c¬ b¶n ®Ó gi¶i quyÕt vÊn ®Ò va ch¹m, ®ã lµ ph¬ng ph¸p ®Þa chØ më vµ ph¬ng ph¸p d©y chuyÒn.

Ph¬ng ph¸p ®Þa chØ mëTrong phong ph¸p ®Þa chØ më, trêng khãa vµ trêng gi¸ trÞ cïng ®îc lu tr÷ trong cÊu tróc m¶ng.

Trêng khãa Trêng gi¸ trÞA[1]

A[2]

A[3]

... ... ...

A[N]

B¶ng b¨m T

Khi thùc hiÖn thao t¸c chÌn, nÕu vÞ trÝ ta b¨m khãa ®· cho vµo mét vÞ trÝ ®· bÞ chiÕm th× ta b¾t ®Çu duyÖt tuÇn tù b¶ng tõ vÞ trÝ ®ã cho ®Õn khi ta t×m thÊy mét vÞ trÝ trèng. Tøc lµ, nÕu x = h(K) vµ vÞ trÝ x ®· bÞ chiÕm th× ta tiÕp tôc t×m vÞ trÝ x + 1, x+ 2, x+ 3,... PhÐp t×m kiÕm ®îc thùc hiÖn theo m« ®un N (kÝch cì cña b¶ng), tøc lµ nÕu ta ®· t×m ®Õn vÞ trÝ cuèi cïng b¶ng mµ vÉn cha t×m ®-îc vÞ trÝ trèng th× ta quay vÒ vÞ trÝ ®Çu tiªn cña b¶ng. Khi t×m kiÕm ta còng thùc hiÖn t¬ng tù. Gi¶ sö víi khãa k ®· cho, nÕu ta cã x= h(k) vµ T[x].K k th× ta l¹i tiÕp tôc t×m tuÇn tù b¶ng cho ®Õn khi hoÆc ta t×m thÊy hoÆc ta gÆp ph¶i vÞ trÝ cßn trèng. Khi chóng

- 291 -

ta gÆp vÞ trÝ trèng, ta biÕt ngay lµ phÇn tö ta ®ang t×m kiÕm kh«ng n»m trong b¶ng.C¸c thuËt to¸n chÌn vµ t×m kiÕm trong b¶ng dïng ph¬ng ph¸p b¨m víi ®Þa chØ më ®îc cho trong h×nh 4.10. ë ®©y ta kh«ng m· hãa hoµn toµn mµ chØ viÕt thuËt to¸n. M· hãa chi tiÕt dµnh cho ®éc gi¶ coi nh bµi tËp.

(* ThuËt to¸n ®Ó chÌn vµ t×m kiÕm trong b¶ng b¨m, dïng ph¬ng ph¸p ®Þa chØ më, T lµ b¶ng b¨m, K lµ khãa cña phÇn tö cÇn chÌn hay cÇn t×m, cßn V lµ gi¸ trÞ cña phÇn tö cÇn chÌn hay cÇn t×m, N lµ kÝch cì cña b¶ng*).

Insert (T, K, V)x := h(K) (*b¨m vµo chØ sè cña b¶ng*)If (T[x] is empty ) Then (*nÕu vÞ trÝ ®ã cßn trèng th× chÌn

vµo*)T[x]. Key := KT[x]. Value := V

Else (* nÕu vÞ trÝ ®ã ®· bÞ chiÕm th× tiÕp tôc ®i t×m chç trèng*)

Repeat x:= ((x + 1) Mod N) + 1If (T[x] is empty ) Then (*NÕu l¹i t×m ®îc chç

trèng*)T[x]. KField := KT[x]. valueField := V

Until (T×m ®îc chç trèng trong b¶ng) Or (®· t×m hÕt b¶ng)

Return TEnd of Insert-----------------

- 292 -

Retrieve (T, K) (* cho khãa K, h·y t×m phÇn tö trong b¶ng cã khãa ®ã vµ tr¶ ra gi¸ trÞ cña phÇn tö ®ã*)

x := h(K) (* Dïng khãa ®· cho b¨m vµo chØ sè cña b¶ng *)If T[x]. Key = K Then (* NÕu t×m thÊy th× tr¶ ra gi¸ trÞ cÇn

t×m*)Return T[x]. Value

ElseRepeat

x := ((x + 1) Mod N ) + 1If T[x]. Key = K Then

Return T[x]. Value

Until (T[x] is trèng) Or (®· t×m hÕt toµn bé b¶ng)Return “Not found” (* khi kh«ng t×m thÊy khãa ®ã trong

b¶ng*)End of Retrieve

H×nh 6.10: ThuËt to¸n chÌn vµ t×m kiÕm dïng ph¬ng ph¸p ®Þa chØ më

--------------------------------------------------------------------------------------------

Cã mét vÊn ®Ò nhá n¶y sinh víi b¶ng t×m kiÕm khi ta dïng ph¬ng ph¸p ®Þa chØ më lµ chóng ta thêng hay gÆp mét d·y nh÷ng vÞ trÝ ®· chøa phÇn tö theo sau ®ã lµ mét d·y nh÷ng vÞ trÝ trèng. Së dÜ nh vËy lµ v× khi chÌn phÇn tö vµo b¶ng ta ®· t×m kiÕm tuÇn tù cho ®Õn khi ta gÆp mét vÞ trÝ trèng. NÕu vÞ trÝ x ®· bÞ chiÕm ch¼ng h¹n, ta cã thÓ chÌn phÇn tö míi vµo vÞ trÝ x +1. NÕu vÞ trÝ x vµ x +1 ®Òu bÞ chiÕm, phÇn tö míi cã thÓ ®îc ®Æt vµo vÞ trÝ x+2...vµ ta thÊy x¸c suÊt ®Ó phÇn tö ®îc lu tr÷ vµo vÞ trÝ x + 2 cao h¬n so víi c¸c vÞ trÝ sau ®ã. Vµ cø nh thÕ ta l¹i tiÕp tôc t¹o nªn d·y nh÷ng

- 293 -

vÞ trÝ bÞ chiÕm ®ãng. Do ®ã viÖc t×m kiÕm cña ta còng kh«ng thËt hiÖu qu¶. Gi¸ nh nh÷ng vÞ trÝ cha bÞ chiÕm ®ãng ®îc ph©n bè t¬ng ®èi ®Òu trªn b¶ng th× viÖc t×m kiÕm vÞ trÝ trèng cña ta sÏ hiÖu qu¶ h¬n.§Ó gi¶i quyÕt vÊn ®Ò trªn nhiÒu khi ngêi ta chØnh söa ph¬ng ph¸p ®Þa chØ më b»ng c¸ch kh«ng ®i bíc mét khi t×m kiÕm mµ ®i bíc c víi c lµ mét sè nguyªn d¬g lín h¬n 1 vµ nguyªn tè cïng nhau víi kÝch cì N cña b¶ng. §Ó thùc hiÖn ý tëng nµy, trong thuËt to¸n ë h×nh 4.10, ta chØ viÖc söa lÖnh t¨ng bíc thµnh lÖnh sau:

x := [(x + k * c) Mod N] + 1, k = 0, 1, 2, 3,..., N – 1

Ch¼ng h¹n, gi¶ sö kÝch cì b¶ng cña ta lµ 10 vµ c = 3. NÕu gi¸ trÞ khãa cña ta ®Çu tiªn b¨m vµo vÞ trÝ thø 5 trong b¶ng vµ thÊy r»ng vÞ trÝ nµy ®· bÞ chiÕm, thÕ th× nh÷ng vÞ trÝ tiÕp theo mµ nã cã thÓ t×m kiÕm lÇn lît lµ:8, 1, 4, 7, 10, 3, 6, 9, 2chø kh«ng ph¶i lµ 6, 7, 8, 9, 10, 1,... nh khi ta nh¶y bíc 1.KÜ thuËt nµy tèt h¬n tríc theo nghÜa nã ph©n bè nh÷ng vÞ trÝ cßn trèng ®Òu trªn toµn b¶ng. Ph¬ng ph¸p ®Þa chØ më víi bíc nh¶y c > 1 ®îc ¸p dông t¬ng ®èi phæ biÕn trong kÜ thuËt b¨m.Khi nh×n l¹i thuËt to¸n ë h×nh 4.10 ë trªn, ta thÊy trong trêng hîp tèt nhÊt, viÖc t×m kiÕm dïng ph¬ng ph¸p ®Þa chØ më chØ cÇn duy nhÊt mét phÐp so s¸nh ®Ó t×m vÞ trÝ cã khãa ®· cho, vµ nh vËy, ®é phøc t¹p cña nã lµ O(1). Trong trêng hîp xÊu nhÊt, cã thÓ lµ ta ph¶i t×m kiÕm toµn bé b¶ng xem cã vÞ trÝ chøa khãa kh«ng. Khi ®ã ®é phøc t¹p sÏ lµ O(N) y nh t×m kiÕm tuÇn tù. Trong trêng hîp trung b×nh, sè c¸c phÐp so s¸nh cßn phô thuéc vµo viÖc toµn bé b¶ng cã bao nhiªu phÇn tö ®îc lu tr÷. NÕu chóng ta kÝ hiÖu tØ lÖ nh÷ng vÞ trÝ ®· ®îc dïng trong b¶ng so víi kÝch cì cña toµn b¶ng lµ p (p cßn gäi lµ hÖ sè t¶i) th× kh¶ n¨ng x¶y ra mét va ch¹m lµ p vµ kh¶ n¨ng t×m ®îc mét vÞ trÝ trèng lµ 1- p. X¸c suÊt x¶y ra ®óng m

- 294 -

va ch¹m trong mét lÇn t×m kiÕm cña b¶ng b¨m sÏ ®îc cho bëi nh÷ng c«ng thøc sau ®©y.X¸c suÊt ®Ó kh«ng cã va ch¹m nµo lµ 1- p.X¸c suÊt ®Ó cã ®óng mét va ch¹m lµ p (1 – p).X¸c suÊt ®Ó cã ®óng hai va ch¹m lµ p2(1- p)....X¸c suÊt ®Ó cã ®óng i va ch¹m lµ pi(1 – p).Trong ®ã p = k/N, k lµ sè vÞ trÝ bÞ chiÕm ®ãng trong b¶ng, N lµ kÝch cì cña b¶ng vµ 0 £ p £ 1.Sè c¸c va ch¹m C mµ chóng ta sÏ gÆp khi t×m mét khãa trong b¶ng b¨m víi hÖ sè t¶i p ®îc cho bëi tæng cña c¸c tÝch cña sè nh÷ng va ch¹m i nh©n víi x¸c suÊt cã ®óng i va ch¹m, tæng ®îc lÊy víi mäi gi¸ trÞ cña i:

C = )1(

1

pipn

i

i = p /(1- p).

Tæng sè phÐp so s¸nh mµ ta thùc hiÖn khi t×m mét khãa trong b¶ng b¨m lµ C + 1 ( C lÇn va ch¹m vµ sau ®ã lµ mét lÇn t×m thµnh c«ng):C + 1 = p/(1 – p) + 1 = 1/ (1 – p)vµ nh vËy ®é phøc t¹p vÒ thêi gian cña tao t¸c t×m kiÕm trªn b¶ng b¨m dïng ph¬ng ph¸p ®Þa chØ më lµ O(1/(1-p)).§Ó lµm vÝ dô, ta gi¶ sö r»ng b¶ng b¨m cña ta bÞ chiÕm mét nöa sè vÞ trÝ (p = 0,5). Nh vËy, chóng ta cÇn trung b×nh 1/(1- 1/2) = 2 phÐp so s¸nh ®Ó t×m ®îc mét khãa. Chóng ta h·y so s¸nh hiÖu qu¶ cña ph¬ng ph¸p nµy víi ph¬ng ph¸p t×m kiÕm tuÇn tù vµ t×m kiÕm nhÞ ph©n khi kÝch cì cña b¶ng lµ 100 000 phÇn tö. Víi t×m kiÕm tuÇn tù, ta cÇn 50 000 phÐp so s¸nh, víi t×m kiÕm nhÞ ph©n ta cÇn kho¶ng 17 phÐp so s¸nh. NÕu b¶ng cña ta ®Çy kho¶ng 80% (p = 0,8) viÖc b¨m chØ cÇn cã 1/(1 – 0,8) hay 5 lÇn so s¸nh mµ th«i. Nh vËy, ta thÊy hiÖu qu¶ cña viÖc b¨m t¨ng lªn ®¸ng kÓ.

- 295 -

Tuy nhiªn, chóng ta còng cÇn nhËn biÕt r»ng nÕu chóng ta lîi vÒ thêi gian th× chóng ta l¹i bÞ thiÖt vÒ kh«ng gian. Trong vÝ dô ë trªn, khi b¶ng t×m kiÕm cã kÝch cì lµ 100 000 vµ p = 1/2, nh vËy ta ®· bá phÝ mÊt mét nöa b¶ng, tøc lµ 50 000 vÞ trÝ. NÕu p = 0,8 th× ta còng bá phÝ mÊt 20 000 vÞ trÝ. Thùc ra khi b¶ng cµng trèng th× sè lÇn so s¸nh cµng Ýt vµ ph¬ng ph¸p b¨m còng chØ hiÖu qu¶ khi ta cã Ýt nhÊt tõ 5 ®Õn 10% vÞ trÝ trèng trong b¶ng. Ch¼ng h¹n khi ta chän N = 100 th× víi p = 0,1 sã phÐp so s¸nh chØ lµ 1 vµ chiÕm O(1). Tuy nhiªn, nÕu p = 0,8 th× sè phÐp so s¸nh kho¶ng 5, chiÕm O(log2N) vµ nÕu p =0,99 th× sè c¸c phÐp so s¸nh lªn tíi kho¶ng 100 vµ lµ O(N). Ph¬ng ph¸p b¨m víi ®Þa chØ më sÏ cho hiÖu qu¶ tèt nÕu hÖ sè t¶i nhá h¬n 0,8.Sau ®©y ta sÏ xÐt thªm mét ph¬ng ph¸p b¨m n÷a, ph¬ng ph¸p d©y chuyÒn.Ph¬ng ph¸p d©y chuyÒn§©y lµ ph¬ng ph¸p thø hai ®Ó gi¶i quyÕt c¸c va ch¹m. Mçi vÞ trÝ trong b¶ng b¨m b©y giê kh«ng chØ dµnh ®Ó lu tr÷ kho¸ vµ gi¸ trÞ cña phÇn tö trong b¶ng. Mçi vÞ trÝ cña b¶ng sÏ lu con trá, trá ®Õn mét d·y c¸c kho¸ cïng b¨m vµo vÞ trÝ ®ã. NghÜa lµ phÇn tö T[i] sÏ lµ con trá trá vµo ®Çu mét danh s¸ch mãc nèi gåm tÊt c¶ c¸c gi¸ trÞ kho¸ k sao cho i = h(k). Ch¼ng h¹n, nÕu b¶ng b¨m cña chóng ta cã ®é dµi lµ 5 vµ c¸c kho¸ a vµ b ®Òu b¨m cïng vµo vÞ trÝ sè 2, kho¸ c, d vµ e b¨m vµo vÞ trÝ sè 4, kho¸ f b¨m cïng vµo vÞ trÝ sè 5, ta sÏ cã thÓ minh ho¹ b¶ng b¨m ®ã nh sau.

1 Nil2

3 Nil4

- 296 -

a b Nil

c d e Nil

f Nil

5

Ta ph¶i khai b¸o cÊu tróc cña b¶ng nµy nh sau:Const

Max = ... (* kÝch cì lín nhÊt cña b¶ng*)Type

HashTableType = Array [1..Max] of NodePointers;NodePointers = Pointer To NodeRecords;NodeRecorde = Record

KeyField : KeyType;ValueField : ValueType;NextField : NodePointers

End;Var

T : HashTableType;

Nh vËy, ta thÊy râ ph¬ng ph¸p d©y chuyÒn hç trî rÊt tèt cho viÖc gi¶i quyÕt c¸c va ch¹m khi chÌn nh÷ng phÇn tö míi vµo trong b¶ng. Chóng ta kh«ng cÇn ®Ó ý ®Õn viÖc bao nhiªu kho¸ cïng b¨m vµo mét vÞ trÝ. Víi mçi kho¸ cïng b¨m vµo mét vÞ trÝ ta chØ viÖc lµm thao t¸c lµ thªm nã vµo ®Çu danh s¸ch mãc nèi ®îc trá ®Õn b»ng con trá ë vÞ trÝ ®îc b¨m tíi trong b¶ng b¨m. Víi thao t¸c t×m kiÕm ta chØ viÖc t×m kiÕm tuÇn tù theo danh s¸ch mãc nèi b¾t ®Çu tõ vÞ trÝ ®îc trá tíi bëi T[i] nÕu ta cã i = h(key).Mét u ®iÓm cña ph¬ng ph¸p d©y chuyÒn lµ ta cã thÓ lu tr÷ nhiÒu h¬n N phÇn tö vµo trong b¶ng b¨m cì N. Ta h·y xem nh vÝ dô minh ho¹ ë trªn, mÆc dï b¶ng chØ cã cì lµ 5 nhng ta cã thÓ lu 6 phÇn tö. Nãi chung, mçi danh s¸ch mãc nèi trong b¶ng b¨m sÏ cã ®é dµi lµ k/N, víi k lµ sè gi¸ trÞ kho¸ ta ph¶i lu tr÷ trong b¶ng vµ N lµ kÝch cì cña b¶ng. Sau ®©y lµ thuËt to¸n b¨m dïng ph¬ng ph¸p d©y

- 297 -

chuyÒn. ViÖc cµi ®Æt chi tiÕt thuËt to¸n nµy ®îc coi nh bµi tËp cho sinh viªn.

(* ThuËt to¸n chÌn vµ t×m kiÕm trong b¶ng b¨m dïng ph¬ng ph¸p d©y chuyÒn*)Insert (T, Key, Value)

x := h(key)

DuyÖt danh s¸ch b¾t ®Çu tõ T[x]

If Key is not there ThenNew(Node)Node^.KeyField := KeyNode^.ValueField := ValueNode^NextField := T[x]

T[x] := Node

Return TEnd of Insert

Retrieve (T, Key)x:= h(Key)p :=T[x]While p<> Nil Do

If p^.KeyField = Key Then

Return p^.ValueField

Elsep := p^.NextField

Endif

Endwhile

Return p (* Trong trêng hîp nµy ta kh«ng t×m thÊy phÇn tö cÇn t×m*)

- 298 -

End of Retrieve

H×nh 6.11: B¶ng b¨m theo ph¬ng ph¸p d©y chuyÒn--------------------------------------------------------------------------------------------

Nh×n vµo thuËt to¸n trªn ta thÊy thêi gian cÇn thiÕt cho viÖc chÌn mét gi¸ trÞ vµo b¶ng b¨m khi dïng ph¬ng ph¸p d©y chuyÒn lµ tæng thêi gian cña ba bíc sau ®©y:

Truy cËp vµo con trá ®Çu danh s¸ch, ë vÞ trÝ T[i].DuyÖt toµn bé danh s¸ch ®îc trá ®Õn bëi con trá nµy ®Ó ®¶m b¶o r»ng gi¸ trÞ cÇn chÌn hiÖn t¹i kh«ng n»m trong danh s¸ch.NÕu ®óng gi¸ trÞ cÇn chÌn kh«ng thuéc danh s¸ch th× chÌn gi¸ trÞ ®ã vµo ®Çu cña danh s¸ch.

Bíc 1 vµ bíc 3 cÇn chØ mét thao t¸c, trong khi ®ã bíc 2 cÇn sè thao t¸c b»ng chiÒu dµi danh s¸ch, trung b×nh lµ k/N. Nh vËy ®é phøc t¹p vÒ thêi gian cña thuËt to¸n chÌng chÝnh lµ O(k/N).

T¬ng tù nh vËy ®èi víi viÖc t×m kiÕm, ta cÇn mét thao t¸c ®Ó truy cËp vµo con trá ë ®Çu danh s¸ch mãc nèi, theo sau lµ duyÖt danh s¸ch ®Ó t×m ra vÞ trÝ chøa kho¸. Trung b×nh lµ ta ph¶i duyÖt tíi mét nöa danh s¸ch, tøc lµ k/2N, ®Ó tmf ra vÞ trÝ ®ã. Nh vËy, víi thuËt to¸n t×m kiÕm trªn b¶ng b¨m theo ph¬ng ph¸p d©y chuyÒn, ®é phøc t¹p còng lµ O(k/N).

Trong ph¬ng ph¸p d©y chuyÒn nµy, nÕu chóng ta biÕt t¬ng ®èi chÝnh x¸c sè phÇn tö k ta sÏ lu tr÷ trong b¶ng th× ta sÏ ®iÒu chØnh kÝch cì cña b¶ng ®Ó cã thÓ h¹n chÕ ®îc sù l·ng phÝ vÒ kh«ng gian. Ch¼ng h¹n, nÕu chóng ta muèn lu tr÷ k = 1000 phÇn tö th× ta cã thÓ dïng b¶ng víi kÝch cì lµ 10 vµ nh vËy, mçi danh s¸ch mãc nèi sÏ

- 299 -

cã ®é dµi trung b×nh lµ O(k/N). Nh vËy, trung b×nh sÏ ph¶i cã kho¶ng 50 phÐp so s¸nh cho mçi lÇn t×m kiÕm, mét con sè khã cã thÓ chÊp nhËn. NÕu kÝch cì b¶ng lµ 50 ch¼ng h¹n th× khi t×m kiÕm sÏ chØ dõng l¹i ë con sè trung b×nh lµ duyÖt danh s¸ch cã ®é dµi kho¶ng b¨ng 10, t¬ng ®¬ng víi viÖc t×m kiÕm nhÞ ph©n v× log21000 xÊp xØ b»ng 10.

Ta l¹i thÊy qui luËt bï trõ ë ®©y gi÷a lîi vµ thiÖt trong ph¬ng ph¸p b¨m d©y chuyÒn: NÕu chóng ta ®îc lîi vÒ thêi gian th× chóng ta ph¶i chÞu sù l·ng phÝ vÒ kh«ng gian. §Ó t¨ng ®îc tèc ®é t×m kiÕm vµ lu tr÷, ta thÊy ta ph¶i mÊt kh«ng gian ®Ó lu tr÷ c¸c con trá c¶ ë b¶ng b¨m lÉn gi÷a c¸c phÇn tö trong c¸c danh s¸ch. NÕu ch¼ng h¹n, k = 1000 vµ kÝch cì b¶ng lµ 250 vµ gi¶ sö r»ng mçi sè nguyªn vµ mçi con trá chiÕm mét vÞ trÝ th× ph¬ng ph¸p d©y chuyÒn sÏ ph¶i dïng (250 + 2* 1000) = 2250 vÞ trÝ ®Ó lu tr÷. Khi so s¸nh víi ph¬ng ph¸p b¨m ®Þa chØ më, víi p =0,5, ta chØ mÊt 2000 vÞ trÝ, Ýt h¬n kho¶ng 12% so víi ph¬ng ph¸p b¨m d©y chuyÒn. Tuy nhiªn, c¶ hai ph¬ng ph¸p b¨m ta ®Ò cËp ®Õn ë ®©y ®Òu dïng Ýt nhÊt lµ hai lÇn khong gian so víi viÖc t×m kiÕm tuÇn tù hay t×m kiÕm nhÞ ph©n, khi chóng ta chØ cÇn dïng 1000 vÞ trÝ.

Cuèi cïng, ta xÐt mét vÝ dô thùc tÕ ®Ó thÊy râ h¬n vÒ tÝnh u viÖt cña hai ph¬ng ph¸p b¨m. Gi¶ sö ta dïng ph¬ng ph¸p b¨m ®Ó lu tr÷ mét tõ ®iÓn gåm kho¶ng 50 000 tõ ®Ó dïng trong mét ch¬ng tr×nh kiÓm tra lçi chÝnh t¶ vÒ tõ vùng. Tríc hÕt, ta dïng ph¬ng ph¸p ®Þa chØ më ®Ó gi¶i quyÕt c¸c va ch¹m. Ta ®· biÕt r»ng sù hiÖu qu¶ cña ph¬ng ph¸p nµy phô thuéc rÊt nhiÒu vµo hÖ sè t¶i trong b¶ng b¨m. NÕu hÖ sè t¶i p > 0,8 th× ®é hiÖu qu¶ sÏ gi¶m xuèng tíi bËc l« ga. NÕu hÖ sè t¶i p > 0,98 th× ®é hiÖu qu¶ sÏ gi¶m xuèng tíi møc tuyÕn tÝnh vµ ta khã cã thÓ chÊp nhËn. Tuy nhiªn, trong vÝ dô nµy ta cã h¹n ®Þnh vÒ giíi h¹n cho phÐp cña kh«ng gian. Giíi h¹n cña

- 300 -

b¶ng lµ 714K. NÕu ta muèn cã 20% kh«ng gian nhí cña b¶ng kh«ng ®îc sö dông, tøc lµ b¶ng ph¶i lµ 714/0,8 = 890K, ®iÒu nµy sÏ vît qu¸ giíi h¹n cho phÐp. NÕu chóng ta muèn cã 10% kh«ng gian nhí kh«ng ®ùoc sö dông th× ta còng ph¶i cã thªm 71K n÷a.

NÕu chóng ta dïng ph¬ng ph¸p d©y chuyÒn víi mét m¶ng gåm M con trá vµ kho¶ng 50000/M tõ cña tõ ®iÓn trong mçi danh s¸ch mãc nèi. Thêi gian truy cËp cña ta sÏ bao gåm mét phÐp truy cËp vµo mét vÞ trÝ cña b¶ng b¨m sau ®ã lµ phÐp t×m kiÕm kho¶ng mét nöa cña chiÒu dµi danh s¸ch víi 50000/M phÇn tö vµ cuèi cïng lµ t×m kiÕm trung b×nh kho¶ng vµi ba kÝ trong mét tõ ®Ó biÕt r»ng chóng ta kh«ng cã kho¸ mong muèn. Ta gi¶ sö r»ng víi mçi phÐp so s¸nh kÝ tù mÊt mét kho¶ng thêi gian chõng 3 micr« gi©y vµ chóng ta cã kho¶ng 300 tõ trong mét trang giÊy. Nh vËy víi mét trang giÊy cÇn kiÓm tra lçi chÝnh t¶, ph¬ng ph¸p nµy dïng mÊt mét lîng thêi gian lµ:

(1 + (50000/2M) * 2,5) * 3 * 10_6 * 300 (gi©y)Víi M = 100 th× nã vµo kho¶ng 0,6 gi©y trªn mét trang vµ hoµn toµn cã thÓ chÊp nhËn ®îc. Tuy nhiªn, ph¬ng ph¸p d©y chuyÒn th-êng cã vÊn ®Ò vÒ kh«ng gian h¬n lµ vÊn ®Ò thêi gian. Ta thêng ph¶i dïng rÊt nhiÒu con trá. Ngay b¶ng b¨m còng ®· cÇn M con trá, råi ®Õn mçi nót trong danh s¸ch cÇn mét con trá cho mét kÝ tù. Víi M = 100, tÝnh ra cã ®Õn 350100 con trá nÕu ta coi mçi tõ trung b×nh cã 5 kÝ tù: M + 2*50000 + 50000 * 5. Gi¶ sö mÊt 3 byte cho mét con trá th× nh vËy còng cÇn ®Õn 1,05 Mbyte, vît qu¸ kh¶ n¨ng bé nhí cña ta. Còng cã c¸ch ®Ó lµm gi¶m ®i con sè l·ng phÝ nµy ®ã lµ lu tr÷ nhiÒu h¬n mét kÝ tù trong mét nót. Nh vËy trong vÝ dô nµy, ph¬ng ph¸p b¨m còng kh«ng cã g× thËt lµ chiÕm u thÕ h¬n c¸c kÜ thuËt t×m kiÕm kh¸c. Tuy nhiªn, trong nhiÒu trêng hîp, ph-¬ng ph¸p b¨m tá ra rÊt hiÖu qu¶. ViÖc giíi thiÖu nh÷ng vÝ dô phøc t¹p n»m ngoµi khu«n khæ cña gi¸o tr×nh nµy.

- 301 -

KÕt luËnCòng nh s¾p xÕp, t×m kiÕm lµ mét trong nh÷ng thao t¸c th«ng dông nhÊt trong khoa häc m¸y tÝnh. Trong ch¬ng võa råi ta ®· nghiªn cøu b¶ng b¨m, mét cÊu tróc d÷ liÖu dùa trªn tËp hîp vµ nã ®· cho ta mét ph¬ng ph¸p t×m kiÕm kh¸ hiÖu qu¶ trªn mét tËp d÷ liÖu. Trong ®iÒu kiÖn tèt nhÊt, viÖc t×m kiÕm tõ b¶ng b¨m cho ®é phøc t¹p chØ lµ O(1). ViÖc biÓu diÔn b¶ng b¨m ë môc nµy vµ nh÷ng vÝ dô ®· minh ho¹ mét nguyªn lý quan träng trong khoa häc m¸y tÝnh: Kh«ng cã c¸ch biÓu diÔn d÷ liÖu nµo lµ tuyÖt h¶o trong mäi t×nh huèng. Cã khi dïng b¶ng b¨m lµ rÊt hiÖu qu¶, cã khi dïng b¶ng b¨m l¹i rÊt tåi. ChÝnh ®iÒu ®ã còng nãi lªn r»ng, chóng ta, nh÷ng ngêi lµm khoa hoc m¸y tÝnh, rÊt cÇn biÕt nhiÒu c¸c cÊu tróc d÷ liÖu vµ thuËt to¸n kh¸c nhau vµ linh ho¹t trong khi lùa chän chóng ®Ó sö dông vµo nh÷ng t×nh huèng cô thÓ.

Bµi tËp1. Cho c¸c tËp hîp sau ®©y:A = {2, 4, 6, 8,10}B = {1, 2,3, 4, 5, 6}C = {4, 5, 6}D = {0}

H·y cho biÕt gi¸ trÞ cña c¸c biÓu thøc sau:a. A B g. A – Bb. A C h. B -- Ac. A D i. Empty (D)d. A B j. Member (C,5)e. A D k. Member (D,1)f. B C l. Subset (B,A)

- 302 -

2. H·y ®Þnh nghÜa có ph¸p vµ ng÷ nghÜa cña thao t¸c sau: Tõ hai tËp hîp S1 vµ S2 ta cã tËp hîp S3 bao gåm nh÷ng phÇn tö hoÆc thuéc S1 hoÆc thuéc S2 nhng kh«ng thuéc ph¶i thuéc c¶ hai tËp hîp ®ã.

3. H·y m« t¶ b»ng lêi ý nghÜa cña mçi tiªn ®Ò nªu trong h×nh 4.2 vÒ cÊu tróc tËp hîp.

4. H·y viÕt l¹i thñ tôc lÊy giao cña hai tËp hîp S1 vµ S2 nÕu c¸c phÇn tö cña chóng ®Òu lµ nh÷ng sè nguyªn vµ s¾p xÕp theo thø tù t¨ng dÇn. H·y tÝnh ®é phøc t¹p vÒ thêi gian cña thñ tôc nµy.

5. Gi¶ sö r»ng mçi tËp hîp ®îc lu tr÷ lµ mét danh s¸ch mãc nèi víi khai b¸o nh sau:

TypeSetNode = Record

Data : SetElement;Next : SetPointerEnd;

SetPointer = PointÎ To SetNode;Var

S1, S2, S3 : SetPointer;H·y cµi ®Æt thao t¸c lÊy hîp cña c¶ ba tËp hîp.

6. Gi¶ sö ta dïng vÐc t¬ bÝt ®Ó cµi ®Æt tËp hîp c¸c phÇn tö nguyªn trong kho¶ng tõ 0 ®Õn 10. H·y cho biÕt biÓu diÔn bªn trong cña mçi mét trong c¸c tËp hîp sau ®©y:

a. {2, 4, 6, 8, 10}b. {0,2,3,4,6,7,8,9,10}

- 303 -

c. {}

7. Cho biÕt hµm f nÕu nh ta muèn dïng bit vÐc t¬ ®Ó lu tr÷ tËp hîp c¸c ch÷ c¸i hoa tõ A ®Õn Z .

8. H·y dïng c¸c cµi ®Æt tËp hîp trong bµi tËp 7 ®Ó thùc hiÖn thao t¸c Equal (S1,S2) so s¸nh hai tËp hîp S1 vµ S2. NÕu hai tËp hîp ®ã b»ng nhau th× hµm cho gi¸ trÞ True, ngîc l¹i nã cho gi¸ trÞ False.

9. H·y diÔn ®¹t b»ng lêi ý nghÜa cña mçi tiªn ®Ò trong h×nh 4.610. H·y viÕt m« ®un trong (Internal module) cña b¶ng t×m

kiÕm ®îc m« t¶ trong h×nh 9.7. H·y dïng m¶ng ®Ó cµi ®Æt vµ gi¶ thiÕt r»ng c¸c phÇn tö trong m¶ng cha ®îc s¾p xÕp.

11. H·y viÕt m· ho¸ hoµn chØnh cho thuËt to¸n b¨m dïng ®Þa chØ mëë h×nh 9.10.

12. a. Cho mét b¶ng b¨m gåm 8 phÇn tö, víi c¸c chØ sè ch¹y tõ 0 ®Õn 7. H·y cho biÕt c¸c kho¸ sau ®©y sÏ ®îc lu tr÷ nh thÕ nµo khi dïg ph¬ng ph¸p b¨m ®Þa chØ më víi bíc c = 1. Tøc lµ nÕu cã 1 va ch¹m th× ta duyÖt tuÇn tù vÞ trÝ kÕ tiÕp ®Ó t×m vÞ trÝ trèng. Gi¶ sö hµm b¨m cña ta lµ thø tù cña kÝ tù ë trong b¶ng ch÷ c¸i lÊy m« ®un 8 (tøc lµ h(a) = 0, h(b) = 1, h(c) =2...h(h) = 7, h(i) = 0...).b. H·y thù hiÖn l¹i ®óng bµi to¸n trªn nhng víi c = 3.

13. T¹i sao bíc c l¹i ph¶i nguyªn tè cïng nhau víi kÝch cì N cña b¶ng b¨m. H·y thö xem ®iÒu g× sÏ x¶y ra nÕu kÝch cì cña b¶ng b»ng 10 vµ c=4 ho¨c c=5.

14. NÕu kÝch cì cña b¶ng b¨m N = 50000, hái sau bao nhiªu thao t¸c chÌn ph¬ng ph¸p b¨m víi ®Þa chØ më sÏ thùc hiÖn t-¬ng ®¬ng víi viÖc t×m kiÕm nhÞ ph©n? víi viÖc t×m kiÕm tuÇn tù.

- 304 -

15. Cßn mét vÊn ®Ò mµ ph¬ng ph¸p ®Þa chØ më cha ®Ò cËp ®Õn ®ã lµ viÖc xo¸ mét phÇn tö khái b¶ng. Chóng ta cha ®Ò cËp ®Õn viÖc xo¸ mét phÇn tö khi dïng ®Þa chØ më ®Ó gi¶i quyÕt viÖc va ch¹m. NÕu chóng ta cã mét b¶ng b¨m kÝch cì 10 vµ ®Ó lu tr÷ c¸c gi¸ trÞ nguyªn trong kho¶ng tõ 1 ®Õn 100 dïng ph¬ng ph¸p ®¹i chØ më vµ hµm b¨m nh sau:

h(key) = (key mod 10) + 1H·y chøng tá ®iÒu g× sÏ x¶y ra nÕu chóng ta thùc hiÖn d·y

nh÷ng thao t¸c sau:a. Insert (T, 10)b. Insert (T, 20)c. Insert (T, 30)d. Delete (T, 20)e. Retrieve (T, 30)§iÒu g× sÏ x¶y ra? Cã c¸ch nµo ®Ó gi¶i quyÕt vÊn ®Ò nµy kh«ng? NÕu cã, h·y m« ta c¸ch ®ã vµ h·y cµi ®Æt thao t¸c Delete.

16. Dïng d÷ liÖu vµ hµm b¨m ë bµi tËp 12a vµ kÝch cì b¶ng b¨m b»ng N=8 h·y cho biÕt h×nh d¹ng cña b¶ng b¨m khi ta chÌn 7 phÇn tö ®ã vµo nÕu dïng ph¬ng ph¸p d©y chuyÒn chø kh«ng ph¶i lµ ph¬ng ph¸p ®Þa chØ më.

17. H·y cµi ®Æt c¸c thuËt to¸n cho trong s¬ ®å ë h×nh 4.11.

18. Gi¶ sö chóng ta ®ang dïng ph¬ng ph¸p d©y chuyÒn vµ chóng ta muèn lu tr÷ kho¶ng 100 kho¸ vµo b¶ng. B¶ng cÇn ph¶i cã kÝch cì lín nh thÕ nµo ®Ó chóng ta cã thÓ gi¶m ®îc sè lîng trung b×nh c¸c phÐp so s¸nh cÇn thiÕt trong mét thao t¸c t×m kiÕm tíi kho¶ng 4 hay Ýt h¬n n÷a. Khi dïng ph¬ng ph¸p nµy, ph¶i cÇn thªm bao nhiªu kh«ng gian nhí n÷a cho c¶ b¶ng

- 305 -

vµ 100 kho¸, so s¸nh víi viÖc dïng m¶ng ®Ó lu tr÷ 100 kho¸ ®ã.

- 306 -

Ch¬ng 7S¾p xÕp vµ t×m kiÕm

S¾p xÕp vµ t×m kiÕm lµ c¸c c«ng viÖc rÊt phæ biÕn thêng ph¶i lµm khi gi¶i c¸c bµi to¸n ®Æc biÖt khi xö lý c¸c c¬ së d÷ liÖu. Do ®ã cã rÊt nhiÒu thuËt to¸n kh¸c nhau gi¶i c¸c bµi to¸n thuéc lÜnh vùc nµy. Tuy theo ®Æc ®iÓm cña bµi to¸n mµ ta cã thÓ lùa chän thuËt to¸n thÝch hîp.

7.1. Bµi to¸n s¾p xÕpGi¶ sö ta cã mét tËp hîp B mµ gi÷a mét sè phÇn tö cña B cã mét quan hÖ tho¶ m·n c¸c ®iÒu kiÖn

1. Víi hai phÇn tö a, b bÊt kú thuéc B, hoÆc ab hoÆc ba;2. Víi hai phÇn tö a, b bÊt kú thuéc B, nÕu ab th× kh«ng x¶y ra

ba;3. Víi ba phÇn tö a, b, c bÊt kú thuéc B, nÕu ab vµ bc th× ac;

Mét tËp B víi quan hÖ nh vËy ®îc gäi lµ mét tËp cã thø tù tuyÕn tÝnh, ®îc gäi lµ mét quan hÖ thø tù trªn tËp B.VÝ dô

1. Mçi tËp sè bÊt kú víi quan hÖ lµ quan hÖ nhá h¬n thêng dïng gi÷a c¸c sè lµ mét tËp cã thø tù tuyÕn tÝnh.

2. Mçi tËp sè bÊt kú víi quan hÖ lµ lín h¬n thêng dïng gi÷a c¸c sè lµ mét tËp cã thø tù tuyÕn tÝnh.

3. TËp c¸c ký tù thuéc b¶ng m· ASCII víi quan hÖ gi÷a c¸c ký tù: c1 c2 nÕu c1 ®øng tríc c2 lµ mét tËp cã thø tù tuyÕn tÝnh.

Mét tËp víi quan hÖ tho¶ m·n c¸c ®iÒu kiÖn 2 vµ 3 ®îc gäi lµ tËp cã thø tù bé phËn.VÝ dô

1. TËp 2C gåm mäi tËp con cña mét tËp C cã h¬n mét phÇn tö. Quan hÖ bao hµm thùc sù gi÷a c¸c tËp con tho¶ m·n c¸c

- 307 -

®iÒu kiÖn 2 vµ 3 nhng kh«ng tho¶ m·n ®iÒu kiÖn 1. TËp 2C lµ mét tËp cã thø tù bé phËn.

2. XÐt tËp S gåm mäi x©u trªn b¶ng m· ASCII. Quan hÖ thø tù gi÷a c¸c ký tù c¶m sinh thø tù tõ ®iÓn gi÷a c¸c x©u, quan hÖ nµy tho¶ m·n c¸c ®iÒu kiÖn 2 vµ 3 nhng kh«ng tho¶ m·n ®iÒu kiÖn 1. TËp S còng lµ mét tËp cã thø tù bé phËn.

Trong ®Þnh nghÜa trªn, hai phÇn tö a vµ b cña B ®îc gäi lµ so s¸nh ®îc víi nhau nÕu hoÆc a = b hoÆc a b hoÆc b a. Ta sÏ gäi chung c¸c tËp hîp cã thø tù tuyÕn tÝnh hoÆc cã thø tù bé phËn lµ tËp cã thø tù.Bµi to¸n s¾p xÕp cã thÓ ®îc ph¸t biÓu nh sau:

Input. Mét d·y c¸c phÇn tö thuéc mét tËp cã thø tù B víi quan hÖ thø tù sao cho hai sè h¹ng bÊt kú so s¸nh ®îc víi nhau:

a1, a2, . . ., aN (*) Output. Mét c¸ch s¾p xÕp l¹i c¸c phÇn tö cña d·y (*) thµnh d·y

c1, c2, . . ., cN

sao cho víi mäi I<N, hoÆc CI = CI+1 hoÆc CI CI+1.§Ó ®¬n gi¶n vµ kh«ng mÊt tæng qu¸t, trong toµn bé c¸c phÇn tiÕp theo, ta sÏ gi¶ thiÕt (*) lµ mét d·y sè vµ quan hÖ lµ quan hÖ nhá h¬n gi÷a c¸c sè. B¹n ®äc cã thÓ söa c¸c chi tiÕt thÝch hîp trong c¸c thuËt to¸n ®Ó nhËn ®îc c¸c kÕt qu¶ ®èi víi quan hÖ lµ quan hÖ lín h¬n gi÷a c¸c sè hoÆc c¸c quan hÖ thø tù kh¸c.Khi ®ã, bµi to¸n mµ ta quan t©m sÏ cã d¹ng

Input. Mét d·y sè:a1, a2, . . ., aN (*)

Output. Mét c¸ch s¾p xÕp l¹i c¸c sè h¹ng cña d·y (*) thµnh d·yc1, c2, . . ., cN

sao cho víi mäi I<N, hoÆc CI £ CI+1.Khi thÓ hiÖn thuËt to¸n s¾p xÕp, ta thêng dïng m¶ng mét chiÒu A[1..N] ®Ó thÓ hiÖn d·y (*) ®ång thêi còng thÓ hiÖn d·y ®· ®îc s¾p xÕp, do ®ã, ®Ó ghi nhËn sè h¹ng thø I cña d·y ®· ®îc s¾p xÕp l¹i lµ

- 308 -

sè h¹ng nµo cña d·y (*) ban ®Çu, ta dïng mét m¶ng CS[1..N] (chØ sè) mµ sau khi s¾p xÕp xong, CS[I] sÏ lµ chØ sè cña sè h¹ng A[I] trong d·y ban ®Çu. VÝ dô, nÕu d·y cã bèn sè h¹ng

A[1] = 2, A[2] = 1, A[3] = 4, A[4] = 3sau c¸c thuËt to¸n s¾p xÕp, ta sÏ cã

A[1] = 1, A[2] = 2, A[3] = 3, A[4] = 4vµ

CS[1] = 2, CS[2] = 1, CS[3] = 4, CS[4] = 3Khi ph©n tÝch c¸c thuËt to¸n s¾p xÕp, ta thêng ®¸nh gi¸ ®é phøc t¹p th«ng qua sè c¸c thao t¸c so s¸nh cÇn dïng.Cã hai lo¹i thuËt to¸n s¾p xÕp: s¾p xÕp trong vµ s¾p xÕp ngoµi. Sù kh¸c nhau gi÷a hai lo¹i thuËt to¸n thÓ hiÖn ë lîng bé nhí cÇn dïng ®Ó lu gi÷ c¸c d÷ liÖu vµ tuú thuéc mét phÇn vµo sù cho phÐp thÓ hiÖn d÷ liÖu cña ng«n ng÷ lËp tr×nh. Nãi mét c¸ch ®¬n gi¶n, ta quan niÖm mét thuËt to¸n thuéc lo¹i s¾p xÕp trong nÕu khi thùc hiÖn ch¬ng tr×nh, ta kh«ng cÇn dïng bé nhí phô, mét thuËt to¸n thuéc lo¹i s¾p xÕp ngoµi nÕu khi thùc hiÖn ch¬ng tr×nh, ta cÇn dïng bé nhí phô.Trong ch¬ng nµy ta sÏ chØ giíi h¹n trong ph¹m vi c¸c thuËt to¸n s¾p xÕp trong.

7.1.1. C¸c thuËt to¸n s¾p xÕp ®¬n gi¶nC¸c thuËt to¸n thuéc lo¹i s¾p xÕp ®¬n gi¶n lµ c¸c thuËt to¸n dÔ cµi ®Æt nhng cã ®é phøc t¹p cao, víi mçi d·y cã N sè h¹ng, c¸c thuËt to¸n nµy cã ®é phøc t¹p cì N2. Ta nªn dïng c¸c thuËt to¸n nµy khi cÇn s¾p xÕp c¸c d·y víi cã Ýt sè h¹ng.

- 309 -

7.1.1.1. S¾p xÕp chänThuËt to¸n s¾p xÕp chän (Selection Sort) tiÕn hµnh qua N bíc 1..N, trong bíc thø I, t×m sè h¹ng cã gi¸ trÞ lín thø I trong d·y (*) vµ tr¸o ®æi vÞ trÝ víi phÇn tö thø I. Sau ®©y lµ mét ch¬ng tr×nh con lo¹i thñ tôc thÓ hiÖn thuËt to¸n. Trong ch¬ng tr×nh, t¹i bíc thø I, ký hiÖu X lµ gi¸ trÞ nhá nhÊt thø I (khi tiÕn hµnh bíc thø I, c¸c sè h¹ng tõ A[1] ®Õn A[I-1] ®· lµ I-1 sè h¹ng nhá nhÊt cña d·y, vµ d·y tõ A[1] ®Õn A[I-1] lµ d·y ®· s¾p xÕp), K1 lµ chØ sè cña sè h¹ng cã gi¸ trÞ X; ®Çu tiªn ta khëi t¹o X = A[I] vµ K1 = I; sau vßng lÆp For J:= I+1 to N..., ta t×m ®îc X vµ K1; sau ®ã ta ®æi chç hai sè h¹ng A[I], A[K1] vµ ghi nhËn l¹i chØ sè trong d·y ban ®Çu.Procedure SelectSort;var

I,J,K1,K2:chØ sè;X,Y:Sè;BeginFor I:=1 to N Do CS[I]:=I;{ChØ sè ban ®Çu cña sè h¹ng thø I b»ng I}For I:=1 To N-1 Do

BeginX:=A[I];K1:=I;For j:=I+1 To N Do If A[J]<X Then Begin X:=A[J];K1:=J;End;K2:=[CS[I]];CS[I]:=CS[K1];CS[K1]:=K2;Y:=A[I];A[I]:=A[K1];A[K1]:=Y;End;

End;Sau khi thùc hiÖn thñ tôc nµy, ta cã d·y A kh«ng gi¶m

A[1] £ A[2] £ . . . £ A[N]vµ sè h¹ng aI lµ sè h¹ng thø CS[I] trong d·y ban ®Çu.ThuËt to¸n nµy cÇn cì N2 thao t¸c c¬ b¶n (so s¸nh, g¸n), nãi c¸ch kh¸c cã ®é phøc t¹p cì N2. ThËt vËy trong trêng hîp xÊu nhÊt, víi mçi

- 310 -

gi¸ trÞ I tõ 1 ®Õn N-1, vßng lÆp thø hai sÏ thùc hiÖn N-I lÇn nh vËy sè lîng thao t¸c sÏ lµ

(N-1) + (N-2) + . . . + 2 + 1 = N(N-1)/2tøc lµ cì N2.VÝ dô 1. XÐt d·y gåm c¸c sè h¹ng

44 55 12 42 94 18 06 67Sau bíc I =1, d·y cã d¹ng (c¸c sè h¹ng g¹ch ch©n ®æi chç cho nhau)

06 55 12 42 94 18 44 67Sau bíc I =2, d·y cã d¹ng (c¸c sè h¹ng g¹ch ch©n ®æi chç cho nhau)

06 12 55 42 94 18 44 67Sau bíc I =3, d·y cã d¹ng (c¸c sè h¹ng g¹ch ch©n ®æi chç cho nhau)

06 12 18 42 94 55 44 67Sau bíc I =4, d·y cã d¹ng (V× 42 lµ sè h¹ng nhá nhÊt thø 4 nªn gi÷ nguyªn vÞ trÝ)

06 12 18 42 94 55 44 67Sau bíc I =5, d·y cã d¹ng (c¸c sè h¹ng g¹ch ch©n ®æi chç cho nhau)

06 12 18 42 44 55 94 67Sau bíc I =6, d·y cã d¹ng (V× 55 lµ sè h¹ng nhá nhÊt thø 6 nªn gi÷ nguyªn vÞ trÝ)

06 12 18 42 44 55 94 67Sau bíc I =7, d·y cã d¹ng (c¸c sè h¹ng g¹ch ch©n ®æi chç cho nhau)

06 12 18 42 44 55 67 94

7.1.1.2. S¾p xÕp chÌnThuËt to¸n s¾p xÕp chÌn (Insertion Sort) dùa trªn ý tëng sau: gi¶ sö víi c¸c sè h¹ng tõ thø nhÊt ®Õn thø I-1, ta ®· s¾p xÕp theo tr×nh tù kh«ng gi¶m, tøc lµ ta ®ang cã d·y

a1 £ a2 £ . . . £ aI-1 (**) ta sÏ xÕp sè h¹ng thø I b»ng c¸ch chÌn sè h¹ng ®ã vµo vÞ trÝ thÝch hîp cña d·y (**) ®Ó nhËn ®îc d·y gåm I sè h¹ng ®Çu tiªn (cña d·y ban ®Çu) ®· ®îc s¾p xÕp

- 311 -

a1 £ a2 £ . . . £ aI

VÒ mÆt kü thuËt, ®Ó cµi ®Æt thuËt to¸n nµy, ta thªm vµo d·y ban ®Çu sè h¹ng A0 cã gi¸ trÞ - (ë ®©y ®îc hiÓu lµ mét gi¸ trÞ nguyªn d¬ng lín h¬n mäi trÞ tuyÖt ®èi cña c¸c sè h¹ng cña d·y A).Sau ®©y lµ mét ch¬ng tr×nh con lo¹i thñ tôc thÓ hiÖn thuËt to¸n.Procedure InsertSort;var I,J,K:ChØ_sè;BeginFor I:=1 To N Do CS[I]:=I;For I:=1 to N Do Begin J:=I; While (J>0) And (A[J-1]>A[I]) Do

{§Èy sè h¹ng A[I] lªn tríc c¸c sè h¹ng lín h¬n nã} Begin A[J]:=A[J-1];K:= CS[J];CS[J]:=CS[J-1];

CS[J-1]:=K;Dec(J); End; A[J]:=A[I];CS[J]:=CS[I]; End;End;VÝ dô 2. XÐt d·y gåm c¸c sè h¹ng

44 55 12 42 94 18 06 67Trong bíc I, c¸c sè h¹ng g¹ch ch©n lµ phÇn d·y gåm I sè h¹ng ®Çu tiªn ®· ®îc s¾p xÕp.Sau bíc I =1, d·y cã d¹ng

44 55 12 42 94 18 06 67Sau bíc I =2, d·y cã d¹ng

44 55 12 42 94 18 06 67Sau bíc I =3, d·y cã d¹ng

12 44 55 42 94 18 06 67Sau bíc I =4, d·y cã d¹ng

- 312 -

12 42 44 55 94 18 06 67Sau bíc I =5, d·y cã d¹ng

12 42 44 55 94 18 06 67Sau bíc I =6, d·y cã d¹ng

12 18 42 44 55 94 06 67Sau bíc I =7, d·y cã d¹ng

06 12 18 42 44 55 94 67Sau bíc I =8, d·y cã d¹ng

06 12 18 42 44 55 67 94

7.1.1.3. S¾p xÕp næi bätTa cã thÓ h×nh dung mét d·y sè víi c¸c sè h¹ng cã gi¸ trÞ lín nhá kh¸c nhau nh ®èng c¸c vËt nÆng nhÑ kh¸c nhau, thuËt to¸n s¾p xÕp næi bät s¾p xÕp l¹i d·y sè ®ã vÝ nh viÖc sãc cho vËt nhÑ h¬n (bät) næi lªn trªn vËt nÆng h¬n. §Ó lµm viÖc ®ã, trong bíc I víi I tõ 2 ®Õn N, xÐt c¸c sè h¹ng thø J víi J tõ N gi¶m dÇn xuèng I, ta cho sè h¹ng thø J "næi" lªn trªn c¸c sè h¹ng trªn nã. Sau ®©y lµ mét ch¬ng tr×nh con lo¹i thñ tôc thÓ hiÖn thuËt to¸n.Procedure BubbleSort;Var I,J,K:ChiSo;X:SoHang;BeginFor I:=2 To N Do Begin For J:=N DownTo I Do If A[J-1]>A[J] Then Begin X:=A[J-1];A[J-1]:=A[J];A[J]:=X; K:=CS[J-1];CS[J-1]:=CS[J];CS[J]:=K; End; End;End;

VÝ dô 3. XÐt d·y gåm c¸c sè h¹ng44 55 12 42 94 18 06 67

- 313 -

B¶ng sau cho ta diÔn biÕn cña thuËt to¸n qua c¸c bíc, d·y nhËn ®îc sau bíc I viÕt ë cét I, sè h¹ng g¹ch ch©n lµ sè h¹ng "næi lªn" sau bíc ®ã.

Ban §Çu I = 2 I = 3

I = 4 I = 5 I = 6

I = 7

I = 8

44 06 06 06 06 06 06 0655 44 12 12 12 12 12 1212 55 44 18 18 18 18 1842 12 55 44 42 42 42 4294 42 18 55 44 44 44 4418 94 42 42 55 55 55 5506 18 94 67 67 67 67 6767 67 67 94 94 94 94 94

Ngoµi c¸c thuËt to¸n ®îc giíi thiÖu trªn, ngêi ta cßn ®Ò xuÊt mét sè c¶i tiÕn c¸c thuËt to¸n nµy ®Ó tiÕt kiÖm thêi gian thùc hiÖn thuËt to¸n. Tuy nhiªn, c¸c thuËt to¸n c¶i tiÕn vÉn cã ®é phøc t¹p cì N2.

7.1.2. Mét sè thuËt to¸n s¾p xÕp kh¸cTrong Môc nµy, ta sÏ giíi thiÖu mét sè thuËt to¸n s¾p xÕp nhanh h¬n so víi c¸c thuËt to¸n s¾p xÕp ®¬n gi¶n. Cô thÓ ta sÏ giíi thiÖu ba thuËt to¸n: S¾p xÕp trén (MergeSort), S¾p xÕp nhanh (QuickSort), S¾p xÕp vun ®èng (HeapSort). C¸c thuËt to¸n nµy ®Òu cã ®é phøc t¹p trung b×nh cì NlgN vµ thêng ®îc dïng ®Ó s¾p xÕp c¸c d·y cã nhiÒu sè h¹ng. Tuy nhiªn, trªn thùc tÕ hai thuËt to¸n s¾p xÕp ®îc dïng nhiÒu h¬n lµ QuickSort vµ HeapSort. Mét ®iÒu thó vÞ lµ nÕu ph©n tÝch theo t×nh huèng xÊu nhÊt (Xem kh¸i niÖm ph©n tÝch thuËt to¸n trong Ch¬ng 4), QuickSort cã ®é phøc t¹p cì N2 cßn HeapSort chØ cã ®é phøc t¹p cì NlgN, nhng trªn thùc tÕ, nãi chung

- 314 -

ch¬ng tr×nh viÕt b»ng QuickSort vÉn ch¹y nhanh h¬n viÕt b»ng HeapSort. Tuy nhiªn HeapSort rÊt thuËn lîi khi viÖc s¾p xÕp nh»m môc ®Ých phôc vô viÖc gi¶i mét sè lo¹i bµi to¸n.7.1.2.1.Trén hai d·y ®· ®îc s¾p xÕpGi¶ sö ta cã hai d·y A vµ B ®Òu ®· ®îc s¾p xÕp, ta cã thÓ "trén" hai d·y nµy thµnh mét d·y C còng ®îc s¾p xÕp b»ng thuËt to¸n cã tªn lµ trén (Merge).Gi¶ sö A lµ d·y

a1£ a2 £ . . . . £ aM

vµ B lµ d·yb1£ b2 £ . . . . £ bN

Ta sÏ x©y dùng d·y C gåm M+N sè h¹ngc1£ c2 £ . . . . £ cM+N

sao cho mçi sè h¹ng cña d·y C lµ mét sè h¹ng cña hoÆc d·y A hoÆc d·y B nhng chØ mét d·y vµ mçi sè h¹ng cña d·y A (t¬ng øng B) lµ mét sè h¹ng cña C.D·y C ®îc gäi lµ trén cña hai d·y A vµ B. ViÖc x©y dùng d·y C tõ hai d·y A vµ B ®îc gäi lµ trén hai d·y A vµ B.§Ó trén hai d·y A vµ B, ta h×nh dung cã hai ngêi, mét ngêi b¾t ®Çu ®øng t¹i sè h¹ng thø nhÊt cña d·y A, mét ngêi b¾t ®Çu ®øng t¹i sè h¹ng thø nhÊt cña d·y B. Hai ngêi hîp t¸c x©y dùng d·y C nh sau: nÕu sè h¹ng t¹i chç ngêi nµo ®ang ®øng nhá h¬n hay b»ng sè h¹ng t¹i chç ngêi kia ®ang ®øng, ngêi ®ã chuyÓn sè h¹ng ®ã sang d·y C vµ dÞch sang sè h¹ng tiÕp theo; sau khi c¶ hai ®· ®i hÕt d·y cña m×nh, ta sÏ nhËn ®îc d·y C.VÝ dô nÕu A lµ d·y

1 3 5 6B lµ d·y

2 3 6 8th× c¸c sè h¹ng cña C lÇn lît lµ

A1 B2 A2 B2 A3 A4 B3 B4

- 315 -

VÒ mÆt kü thuËt, khi cµi ®Æt thuËt to¸n nµy, ®Ó biÕt ®îc khi nµo mét ngêi ®· ®i hÕt d·y cña m×nh, nÕu d·y A cã M sè h¹ng vµ d·y B cã N sè h¹ng, ta thªm vµo d·y A sè h¹ng thø M+1 cã gi¸ trÞ vµ thªm vµo d·y B sè h¹ng thø N+1 cã gi¸ trÞ víi ý nghÜa lµ gi¸ trÞ lín h¬n mäi gi¸ trÞ cña mäi sè h¹ng cña c¶ hai d·y. NÕu trªn d·y A ta ®i ®Õn sè h¹ng thø M+1, cã nghÜa lµ mäi phÇn tö cña d·y A ®· ®îc chän xong vµ nÕu trªn d·y B ta ®i ®Õn sè h¹ng thø N+1, cã nghÜa lµ mäi phÇn tö cña d·y B ®· ®îc chän xong.ThuËt to¸n nµy cã thÓ ®îc thÓ hiÖn b»ng thñ tôc sau.Const VoCung=...;{V« cïng lµ mét h»ng sè, gi¸ trÞ cô thÓ chän tuú theo gi¸ trÞ cña c¸c sè h¹ng cña hai d·y A vµ B, sao cho ®¶m b¶o lµ lín h¬n tÊt c¶ c¸c phÇn tö trong d·y A vµ B}

Max=...;{Max lµ mét h»ng sè, gi¸ trÞ cô thÓ chän tuú theo tæng c¸c sè lîng c¸c sè h¹ng cña hai d·y A vµ B, cô thÓ, nÕu d·y A cã kh«ng qu¸ MaxM sè h¹ng, d·y B cã kh«ng qu¸ MaxN sè h¹ng, th× Max = MaxM+MaxN}Type day=Array[1..Max] of So;Var a,b,c:day; csa,csb:Array[1..Max] of ChiSo; m,n:ChiSo; .............Procedure Merge(b,c:day);var i,j,k:ChiSo;Begina[m+1]:=VoCung;b[n+1]:=VoCung;i:=1;j:=1;For k:=1 To m+n Do If a[i]<=b[j] then {lÊy tõ d·y A} Begin csa[i]:=k;c[k]:=a[i];Inc(i); End

- 316 -

Else {lÊy tõ d·y B} Begin csb[j]:=k;c[k]:=b[j];Inc(j); End;End;Sau khi thùc hiÖn thñ tôc nµy, ta nhËn ®îc d·y C vµ phÇn tö thø I cña d·y A lµ sè h¹ng thø CSA[I] trong d·y C, phÇn tö thø J cña d·y B lµ sè h¹ng thø CSB[J] trong d·y C.VÝ dô 4. Trë l¹i vÝ dô trªn, nÕu A lµ d·y gåm 4 sè h¹ng

1 3 5 6B lµ d·y gåm 4 sè h¹ng

2 3 6 8sau khi thùc hiÖn thuËt to¸n trén, ta nhËn ®îc d·y C gåm 8 sè h¹ng

1 2 3 3 5 6 6 8C¸c phÇn tö cña m¶ng CSA lÇn lît lµ

1 4 5 7cã nghÜa lµ c¸c sè h¹ng tõ 1 ®Õn 4 cña d·y A t¬ng øng lµ c¸c sè h¹ng 1 4 5 7 cña d·y C.C¸c phÇn tö cña m¶ng CSB lÇn lît lµ

2 3 6 8cã nghÜa lµ c¸c sè h¹ng tõ 1 ®Õn 4 cña d·y B t¬ng øng lµ c¸c sè h¹ng 2 3 6 8 cña d·y C.

7.1.2.2. S¾p xÕp trénThuËt to¸n s¾p xÕp trén (MergeSort) thuéc lo¹i thuËt to¸n chia ®Ó trÞ (Xem Ch¬ng 4). ý tëng cña thuËt to¸n nµy lµ ®Ó s¾p xÕp mét d·y N sè h¹ng, nÕu N=1, ta kh«ng ph¶i lµm g×, nÕu N>1, ta chia d·y nµy thµnh hai d·y con, mét d·y lµ nöa tríc vµ mét d·y lµ nöa sau, sau khi s¾p xÕp trén hai d·y con nµy ta sÏ trén l¹i thµnh mét d·y b»ng thuËt to¸n trén trong Môc tríc. Khi s¾p xÕp hai d·y con, ta l¹i lµm t-¬ng tù nh ®èi víi d·y ban ®Çu. Nh vËy nÕu thÓ hiÖn viÖc s¾p xÕp

- 317 -

d·y lín A b»ng mét ch¬ng tr×nh con kiÓu thñ tôc MergeSort(A) th× sau khi chia A thµnh hai d·y con B vµ C, MergeSort(A) sÏ lµm c¸c viÖc sau:NÕu N = 1 th× kÕt thóc;NÕu N>1 th× gäi (®Ö quy) hai ch¬ng tr×nh con MergeSort(B), MergeSort(C) vµ sau ®ã gäi ch¬ng tr×nh con Merge(B,C) ®Ó trén hai d·y B vµ C ®· ®îc s¾p xÕp.ThuËt to¸n nµy cã thÓ thÓ hiÖn b»ng thñ tôc sau:Type day=Array[1..Max] of So;Var a:day; ...........Procedure MergeSort(n:ChiSo;a:day);BeginIf n=1 Then Exit;b:=a[1..n div 2]; {nöa ®Çu cña d·y a}c:=a[(n div 2)+1..n]; {nöa sau cña d·y a}MergeSort(n div 2,b); {s¾p xÕp d·y b víi n div 2 phÇn tö}MergeSort(n - n div 2,c); {s¾p xÕp d·y c víi n – n div 2 phÇn tö}Merge(b,c); {trén hai d·y b vµ c thµnh mét d·y}End;

VÝ dô 5. XÐt d·y A gåm c¸c sè h¹ng44 55 12 42 94 18 06 67

DiÔn biÕn khi thùc hiÖn MergeSort ®èi víi d·y nµy nh sauThùc hiÖn MergeSort(A):Chia A thµnh hai d·y con A1 vµ A2:A1: 44 55 12 42A2: 94 18 06 67Thùc hiÖn MergeSort(A1); MergeSort(A2);Merge(A1,A2);Khi thùc hiÖn MergeSort(A1), Chia A1 thµnh hai d·y con A11 vµ A12:A11: 44 55A12: 12 42Thùc hiÖn MergeSort(A11); MergeSort(A12);Merge(A11,A12);Khi thùc hiÖn MergeSort(A2), Chia A2 thµnh hai d·y con A21 vµ A22:

- 318 -

A21: 94 18A22: 06 67Thùc hiÖn MergeSort(A21); MergeSort(A22);Merge(A21,A22);Khi thùc hiÖn MergeSort(A11), Chia A11 thµnh hai d·y con A111 vµ A112:A111: 44A112: 55Thùc hiÖn MergeSort(A111); MergeSort(A112);Merge(A111,A112);V× d·y A111 chØ cã mét sè h¹ng, MergeSort(A111) cho d·y chØ gåm sè h¹ng 44, d·y A112 chØ cã mét sè h¹ng, MergeSort(A112) cho d·y chØ gåm sè h¹ng 55, Merge(A111,A112) cho d·y A11 gåm hai sè h¹ng 44, 55.Khi thùc hiÖn MergeSort(A12), Chia A12 thµnh hai d·y con A121 vµ A122:A121: 12A122: 42Thùc hiÖn MergeSort(A121); MergeSort(A122);Merge(A121,A122);V× d·y A121 chØ cã mét sè h¹ng, MergeSort(A121) cho d·y chØ gåm sè h¹ng 12, d·y A122 chØ cã mét sè h¹ng, MergeSort(A122) cho d·y chØ gåm sè h¹ng 42, Merge(A121,A122) cho d·y A12 gåm hai sè h¹ng 12, 42.Thùc hiÖn Merge(A11,A12) ta cã d·y A1 gåm c¸c sè h¹ng 12 42 44

55.Khi thùc hiÖn MergeSort(A21), Chia A11 thµnh hai d·y con A211 vµ A212:A211: 94A212: 18Thùc hiÖn MergeSort(A211); MergeSort(A212);Merge(A211,A212);V× d·y A211 chØ cã mét sè h¹ng, MergeSort(A211) cho d·y chØ gåm sè h¹ng 94, d·y A212 chØ cã mét sè h¹ng, MergeSort(A212) cho d·y chØ gåm sè h¹ng 18, Merge(A211,A212) cho d·y A21 gåm hai sè h¹ng 18, 94.Khi thùc hiÖn MergeSort(A22), Chia A22 thµnh hai d·y con A221 vµ A222:A221: 06A222: 67Thùc hiÖn MergeSort(A221); MergeSort(A222);Merge(A221,A222);

- 319 -

V× d·y A221 chØ cã mét sè h¹ng, MergeSort(A221) cho d·y chØ gåm sè h¹ng 06, d·y A222 chØ cã mét sè h¹ng, MergeSort(A222) cho d·y chØ gåm sè h¹ng 67, Merge(A221,A122) cho d·y A22 gåm hai sè h¹ng 06, 67.Thùc hiÖn Merge(A21,A22) ta cã d·y A2 gåm c¸c sè h¹ng 06 18 67

94.Cuèi cïng thùc hiÖn Merge(A1, A2) ta sÏ ®îc d·y A ®îc s¾p xÕp lµ

06 12 18 42 44 55 67 94

7.1.2.3. ThuËt to¸n s¾p xÕp kiÓu vun ®èng (Heap sort)

ThuËt to¸n s¾p xÕp nhanh (quick sort) víi ®é phøc t¹p (thêi gian) trung b×nh O(nlogn), ®îc ®¸nh gi¸ lµ tèt h¬n c¸c ph¬ng ph¸p s¾p xÕp ®¬n gi¶n (selection sort, insertion sort vµ buble sort). Tuy nhiªn trong t×nh huèng xÊu nhÊt chi phÝ thêi gian cña quick sort vÉn lµ O(n2). Cã mét c¸ch tiÕp cËn kh¸c cho bµi to¸n s¾p xÕp sÏ dÉn ®Õn thuËt to¸n s¾p xÕp vun ®èng (Heap sort) cã ®é phøc t¹p trung b×nh t¬ng ®¬ng víi quick sort nhng ®é phøc t¹p trong t×nh huèng xÊu nhÊt cña nã chØ lµ O(nlogn).

Chóng ta ®· tõng xem xÐt mét sè c¸ch sö dông m¶ng ®Ó thÓ hiÖn cÊu tróc mét c©y nhÞ ph©n (ch¬ng ???). H·y h×nh dung m¶ng M gåm n phÇn tö mµ chóng ta cÇn s¾p xÕp lµ mét lu tr÷ kÕ tiÕp cña mét c©y nhÞ ph©n, nghÜa lµ phÇn tö ë ng¨n thø i cña m¶ng chÝnh lµ nh·n nót cha cña hai nót cã nh·n lu tr÷ ë ng¨n thø 2*i vµ 2*i+1 cña m¶ng. Víi c¸ch nh×n nh vËy th× M biÓu diÔn mét c©y nhÞ ph©n hoµn chØnh. NÕu ®©y lµ mét c©y thø tù bé phËn (mçi nót cha ®Òu lín h¬n hai nót con cña nã), ta cßn gäi lµ mét heap th× gèc cña c©y – phÇn tö M[1] lµ phÇn tö lín nhÊt trong m¶ng. Khi muèn s¾p xÕp m¶ng (t¨ng dÇn), vÞ trÝ hîp lý cho phÇn tö M[1] ph¶i

- 320 -

lµ ë cuèi m¶ng (ë ng¨n thø n), nªn chóng ta sÏ ®æi chç M[1] vµ M[n] cho nhau. Sau lÇn ®æi chç nµy tÝnh chÊt (víi 1≤ i ≤ n div 2: (M[i] ≤ M[2*i] vµ M[i] ≤ M[2*i+1])) cña c©y bÞ ph¸ vì t¹i hai nót: nót gèc vµ nót l¸ cuèi cïng trong c©y. Tuy nhiªn giê ®©y chóng ta kh«ng quan t©m ®Õn phÇn tö cuèi cña m¶ng n÷a, nã ®· ë vÞ trÝ hîp lý. PhÇn ®Çu cña m¶ng (gåm c¸c phÇn tö cña m¶ng ngo¹i trõ phÇn tö cuèi) biÓu diÔn mét c©y nhÞ ph©n hoµn chØnh mµ chØ cã nót gèc vi ph¹m tÝnh chÊt cña heap. NÕu chóng ta cã mét c¸ch ®iÒu chØnh ®Ó phÇn ®Çu cña m¶ng l¹i trë thµnh mét heap th× cã mét ý tëng tù nhiªn trong viÖc s¾p xÕp m¶ng nh sau:

- Ban ®Çu m¶ng M[1..n] lµ mét heap- Thùc hiÖn lÆp ®i lÆp l¹i c¸c viÖc sau: ®æi chç phÇn tö ë

nót gèc víi phÇn tö ë nót l¸ cuèi cïng cho nhau, lo¹i nót l¸ cuèi cïng khái c©y, ®iÒu chØnh sù bÊt hîp lý cña nót gèc ®Ó c©y l¹i trë thµnh mét heap; lÆp cho ®Õn khi c©y chØ cßn lµ mét nót.

Râ rµng ph¬ng ph¸p s¾p xÕp nh vËy sÏ ®a ®Õn kÕt qu¶ m¶ng ®îc xÕp t¨ng dÇn bëi lÇn ®æi chç ®Çu tiªn ®· ®Æt phÇn tö lín nhÊt trong m¶ng M[1..n] vµo vÞ trÝ thø n, lÇn ®æi chç thø hai sÏ ®Æt phÇn tö lín nhÊt trong ®o¹n tõ M[1..n-1] vµo vÞ trÝ thø n-1,..., cø nh vËy.

i 1 2 3 4 5 6 7 8M[i] 44 55 12 42 94 18 06 67

(a) Mét m¶ng sè nguyªn

- 321 -

(b) C©y t¬ng øng (cha lµ heap)H×nh ??? (a). Mét m¶ng sè nguyªn;(b)C©y t¬ng øng cha lµ heap

(a) Mét heap

(b) Tr¸o ®æi nh·n nót gèc vµ nh·n nót l¸ cuèi cho nhau lÇn vµ c©y míi sau khi lo¹i nót l¸ cuèi cïng

H×nh ???

- 322 -

10

55 12

42 94 18

6

67

94

67 18

42 55 12

6

1094 67 18 42 55 12 6 10

M¶ng M

10

67 18

42 55 12

6

94

VÊn ®Ò chÝnh lµ ë chç: ®èi víi c©y mµ chØ cã nót gèc vi ph¹m tÝnh chÊt heap th× chóng ta cÇn ®iÒu chØnh nót gèc nh thÕ nµo ®Ó c©y trë thµnh heap? Gi¶ sö phÇn tö ë nót gèc r lµ V. Muèn gi¶i quyÕt vi ph¹m nãi trªn cÇn ph¶i ®a phÇn tö lín h¬n trong hai phÇn tö ë hai nót con lªn vÞ trÝ gèc ®ång thêi t×m vÞ trÝ hîp lý cho phÇn tö V vèn ë nót gèc. Chóng ta kh«ng thÓ tïy tiÖn ®a ngay V vµo nót con (t¹m gäi lµ r’) mµ ta võa ®Èy phÇn tö ë ®ã lªn gèc bëi v× ch¾c g× V lín h¬n c¶ hai phÇn tö con cña r’. Do ®ã cÇn tiÕp tôc xÐt hai con cña r’, so s¸nh víi V ®Ó quyÕt ®Þnh ®a V vµo nót r’ ®îc cha hay cÇn ®Èy mét trong hai con cña r’ lªn nót r’ vµ tiÕp tôc t×m vÞ trÝ ®Æt V trong mét c©y con cña nót r’. Tãm l¹i, ®Ó t×m nót hîp lý chøa gi¸ trÞ V, tõ gèc r chóng ta ®i tíi nót con chøa gi¸ trÞ lín nhÊt trong hai nót con cho tíi khi gÆp ®îc mét nót k mµ mäi nót con cña nã ®Òu cã gi¸ trÞ ≤ V (nót l¸ còng lµ trêng hîp riªng cña ®iÒu kiÖn riªng nµy). Däc ®êng tõ r ®Õn k, chóng ta ®Èy gi¸ trÞ chøa ë nót con lªn nót cha vµ cuèi cïng ®Æt V vµo nót k.

(a) Gèc c©y vi ph¹m ®iÒu kiÖn heap, ®iÒu chØnh

- 323 -

10

67 18

42 55 12

6

Con lín h¬n

67

42 18

102

55 12

6

(b) C©y sau ®iÒu chØnhH×nh ??? ®iÒu chØnh ®Ó c©y ë h×nh ???(b) trë thµnh heap

Víi mét c©y nhÞ ph©n hoµn chØnh bÊt kú, cã thÓ dïng c¸ch ®iÒu chØnh nót gèc võa nãi ë trªn ®Ó lÇn lît lµm c¸c c©y con cña nã theo chiÒu díi – lªn (tõ l¸ lªn gèc) trë thµnh heap. Tríc hÕt ®iÒu chØnh cho nh÷ng c©y con víi gèc lµ nh÷ng nót ë møc thÊp nhÊt vµ cã con (nót nh¸nh xa gèc nhÊt), bëi nÕu chóng cha lµ heap th× chØ v× nót gèc cña chóng vi ph¹m. Sau ®ã chóng ta lÇn lît ®iÒu chØnh c¸c c©y cã nót nh¸nh ë møc ngay trªn, c¸c c©y nµy nÕu cha lµ heap còng chØ do nót gèc vi ph¹m,. . ., cø nh vËy cho ®Õn khi ®iÒu chØnh xong ®Ó nót gèc r kh«ng cßn vi ph¹m. Qu¸ tr×nh thùc hiÖn c¸c ®iÒu chØnh nh vËy ®· biÕn ®æi mét c©y nhÞ ph©n hoµn chØnh ban ®Çu trë thµnh mét c©y thø tù bé phËn (heap).

- 324 -

10

55 12

42 94 18

6

67

10

55 12

67 94 18

6

4210 55 12 42 94

18 6 6710 55 12 67 94

18 6 42

r = n div 2 = 4

H×nh ??? Minh häa giai ®o¹n ®a m¶ng ban ®Çu vÒ heap

ThuËt to¸n s¾p xÕp víi ý tëng sö dông c©y thø tù bé phËn nh trªn cÇn cã mét thñ tôc Adjust(nót gèc, nót l¸ cuèi). Thñ tôc nµy cã

nhiÖm vô ®iÒu chØnh cho c©y vèn ®îc biÓu diÔn b»ng mét phÇn m¶ng (A[nót gèc,…nót l¸ cuèi]) trë thµnh heap. Cã thÓ chia thuËt

to¸n HeapSort thµnh hai giai ®o¹n:Giai ®o¹n 1: Dïng Adjust ®a m¶ng ban ®Çu vÒ m¶ng biÓu diÔn mét heapGiai ®o¹n 2: Thùc hiÖn nhiÒu lît, mçi lît gåm hai viÖc sau:

- §æi chç phÇn tö ë gèc víi phÇn tö ë nót l¸ cuèi cïng trong heap, lo¹i bá nót l¸ cuèi cïng khái c©y

- 325 -

10

55 12

67 94 18

6

42

10

94 18

67 55 12

6

4210 55 12 67 94

18 6 4210 94 18 67 55

12 6 42

r = 3, r = 2

10

94 18

67 55 12

6

42

94

67 18

42 55 12

6

10

10 94 18 67 55 12 6 42

94 67 18 42 55 12 6 10

r = 1

- Dïng Adjust ®èi víi c©y cã ®îc sau bíc ®æi chç vµ lo¹i bá tr-íc ®ã.

Procedure HeapSort;Var r, i: Integer; {PhÇn tö M[i] thÓ hiÖn mét nót cña c©y,

ë ®©y gäi t¾t lµ nót i} Procedure Adjust(r, e: Integer); {§iÒu chØnh ®Ó c©y gèc r thµnh heap} Var c: Integer;

Key: KiÓu_phÇn_ tö; {BiÕn lu gi¸ trÞ ë nót r} Begin Key := M[r]; while r * 2 £ e do begin {Chõng nµo r cha ph¶i lµ l¸} c := r * 2; {XÐt nót con tr¸i cña r, so s¸nh víi gi¸ trÞ nót con

ph¶i, chän ra nót mang gi¸ trÞ lín h¬n} if (c < e) and (M[c] < M[c+1]) then c := c + 1;

if M[c]£ Key then Break;{C¶ hai nót con cña Root ®Òu mang gi¸ trÞ £ Key th× dõng ngay}

M[r] := M[c]; r := c; ChuyÓn gi¸ trÞ tõ nót con c lªn nót cha root vµ ®i xuèng xÐt nót con c}

end; M[r] := Key; {§Æt gi¸ trÞ Key vµo nót r} End; {KÕt thóc Adjust}

Begin {B¾t ®Çu thuËt to¸n Heap Sort} for r := n div 2 downto 1 do Adjust(r, n); {§iÒu chØnh c¸c c©y tõ

díi lªn t¹o thµnh heap} for i := n downto 2 do begin

- 326 -

<Tr¸o ®æi gi¸ trÞ M[1] vµ M[i]> {Kho¸ lín nhÊt ®îc chuyÓn ra cuèi d·y} Adjust(1, i - 1); {§iÒu chØnh c©y cßn l¹i thµnh heap} end;End;

§Ó ®¸nh gi¸ thêi gian thùc hiÖn HeapSort, tríc hÕt h·y ®¸nh gi¸ thêi gian thùc hiÖn Adjust. Th©n cña vßng lÆp (while .. do) lµ c¸c c©u lÖnh mµ mçi c©u lÖnh ®Òu cÇn thêi gian O(1), nªn vËy th©n vßng lÆp nµy ®ßi hái thêi gian O(1). Sau mçi bíc lÆp r sÏ ®îc t¨ng lªn Ýt nhÊt 2 lÇn vµ r kh«ng thÓ t¨ng vît qu¸ e. Do vËy nÕu gäi k lµ sè lÇn lÆp th× víi gi¸ trÞ ban ®Çu cña r, ta cã r*2k ≤ e, nghÜa lµ k ≤ log(e/r), hay thêi gian thùc hiÖn Adjust(r,e) lµ O(log(e/r)). B©y giê chóng ta ®¸nh gi¸ thêi gian thùc hiÖn HeapSort. Vßng lÆp ®Çu tiªn cã sè lÇn lÆp lµ n/2, víi mçi lÇn lÆp thùc hiÖn thñ tôc Adjust(r,n) ®ßi hái thêi gian nhiÒu nhÊt lµ O(logn). Vßng lÆp thø hai cã sè lÇn lÆp lµ n-1, mçi lÇn lÆp thùc hiÖn viÖc tr¸o ®æi hai gi¸ trÞ vµ thùc hiÖn Adjust, nªn nã cÇn thêi gian nhiÒu nhÊt lµ O(nlogn). Thêi gian thùc hiÖn HeapSort lµ thêi gian thùc hiÖn hai vßng lÆp ta chóng võa ®¸nh gi¸, do vËy lµ O(nlogn).Trong t×nh huèng xÊu nhÊt thñ tôc Adjust ph¶i t×m ®êng ®i tõ nót gèc ®Õn l¸ xa nhÊt th× ®êng ®i nµy còng kh«ng thÓ vît qu¸ chiÒu cao cña c©y, nghÜa lµ kh«ng thÓ vît qu¸ (log(n+1) +1). Khi ®ã ®é thêi gian cÇn thùc hiÖn Adjust lµ O(logn), suy ra ®é phøc t¹p cña HeapSort (trong t×nh huèng xÊu nhÊt) còng chØ lµ O(nlogn).NÕu nh Quicksort cÇn cã kh«ng gian nhí cho ng¨n xÕp (stack) khi gäi ®Ö qui, th× ngoµi mét nót nhí phô ®Ó thùc hiÖn viÖc ®æi chç HeapSort kh«ng cÇn dïng thªm g× kh¸c n÷a. §èi víi nh÷ng bµi to¸n cÇn chän ra k phÇn tö lín nhÊt trong mét d·y phÇn tö th× HeapSort thêng ®îc sö dông bëi sÏ kh«ng ph¶i s¾p xÕp l¹i toµn bé d·y.

- 327 -

ViÖc ®o thêi gian thùc thi cña tõng thuËt to¸n s¾p xÕp lµ cÇn thiÕt bëi c¸c tÝnh to¸n lý thuyÕt ®«i khi bÞ lÖch so víi thùc tÕ v× nhiÒu lý do kh¸c nhau. Trong Borland Pascal, cã lÏ nªn ®Æt t¾t tÊt c¶ chÕ ®é kiÓm tra trµn (ph¹m vi, sè häc) th× c«ng b»ng h¬n, víi lý lÏ r»ng nÕu ta lËp tr×nh kh«ng ph¶i víi Borland Pascal mµ víi Assembler ch¼ng h¹n, th× viÖc cã kiÓm tra trµn hay kh«ng lµ do ý muèn cña ta chø kh«ng ai cã thÓ b¾t Ðp ®îc. Nhng hiÕm ai cha tõng biÕt mµ l¹i cã thÓ cµi ®Æt tr¬n tru nh÷ng thuËt to¸n trªn, nªn ph¶i bËt tÊt c¶ c¸c chÕ ®é kiÓm tra ®Ó ®¹t tíi ®é an toµn cao nhÊt khi kiÓm thö.Mét vÊn ®Ò kh¸c x¶y ra lµ nÕu t¾t tÊt c¶ chÕ ®é biªn dÞch kiÓm tra trµn, th× ngoµi nh÷ng thuËt to¸n s¾p xÕp chän, næi bät, chÌn, rÊt khã cã thÓ ®o ®îc tèc ®é trung b×nh cña nh÷ng thuËt to¸n s¾p xÕp cßn l¹i khi mµ chóng ®Òu ch¹y kh«ng tíi mét nhÞp ®ång hå thêi gian thùc (kh«ng kÞp ®o thêi gian). Mét c¸ch gi¶i quyÕt lµ cho mçi thuËt to¸n Quick Sort, Radix Sort, ... thùc hiÖn kho¶ng 1000 lÇn trªn c¸c bé d÷ liÖu ngÉu nhiªn råi lÊy thêi gian tæng chia cho 1000. Hay mét c¸ch kh¸c lµ t¨ng kÝch thíc d÷ liÖu, ®iÒu nµy cã thÓ dÉn ®Õn viÖc ph¶i söa l¹i mét vµi chç trong ch¬ng tr×nh.Díi ®©y ta thùc hiÖn ®o tèc ®é víi d÷ liÖu ®Çu vµo lµ 15000 sè tù nhiªn lÊy ngÉu nhiªn trong ®o¹n [0, 15000]. Thêi gian vµ tèc ®é thùc thi cña c¸c thuËt to¸n ®o ®îc cô thÓ nh sau (ta gi¶ sö r»ng tèc ®é cña Bubble Sort lµ 1):

ë chÕ ®é {$R-,Q-,S-}:

STT ThuËt to¸n Thêi gian (gi©y) Tèc ®é1 Distribution Counting 0.0033 7000.002 Straight Radix Sort 0.0165 1400.003 Heap Sort 0.0280 823.534 Shell Sort 0.0308 750.005 Radix Sort 0.0341 677.426 Quick Sort 0.0352 656.25

- 328 -

7 Merge Sort 0.0483 477.278 Insertion Sort with binary searching 0.7690 30.009 Insertion Sort 2.2519 10.2410 Selection Sort 2.6364 8.7511 Bubble Sort 23.0687 1.00

ë chÕ ®é {$R+,Q+,S+}:

STT ThuËt to¸n Thêi gian (gi©y) Tèc ®é1 Distribution Counting 0.0319 2994.832 Straight Radix Sort 0.0643 1484.623 Quick Sort 0.1313 726.784 Radix Sort 0.1346 708.985 Merge Sort 0.2098 454.716 Heap Sort 0.2296 415.557 Shell Sort 0.2796 341.268 Insertion Sort with binary searching 0.8239 115.809 Insertion Sort 35.7016 2.6710 Selection Sort 52.7834 1.8111 Bubble Sort 95.4056 1.00

Nh÷ng con sè vÒ thêi gian vµ tèc ®é nµy ®îc ®o trªn mét bé d÷ liÖu cô thÓ, víi mét m¸y tÝnh cô thÓ vµ mét c«ng cô lËp tr×nh cô thÓ, víi bé d÷ liÖu kh¸c, m¸y tÝnh vµ c«ng cô lËp tr×nh kh¸c, kÕt qu¶ cã thÓ kh¸c. Ch¬ng tr×nh nµy ®· ®îc viÕt l¹i trªn Borland Delphi 6 vµ thö víi d÷ liÖu 2 000 000 kho¸ sè nguyªn sinh ngÉu nhiªn Î [0, 2 000 000] ®îc kÕt qu¶ nh sau:

- 329 -

H×nh 7.4. Cµi ®Æt c¸c thuËt to¸n s¾p xÕp víi d÷ liÖu lín

- 330 -

7.1.2.4. S¾p xÕp nhanhThuËt to¸n s¾p xÕp nhanh (QuickSort) còng thuéc lo¹i chia ®Ó trÞ vµ ®îc tr×nh bµy trong Ch¬ng 8.

7.2. Mét sè thuËt to¸n t×m kiÕm7.2.1. Bµi to¸n t×m kiÕmNÕu ph¸t biÓu mét c¸ch tæng qu¸t, Bµi to¸n t×m kiÕm cã thÓ ph¸t biÓu nh sau:

Input. Mét thùc thÓ A ®îc m« t¶ theo mét c¸ch nµo ®ã; Output. T×m mét thùc thÓ B nµo ®ã mµ ta cã thÓ m« t¶ qua

c¸c th«ng tin vÒ thùc thÓ A;VÝ dô 1. Gi¶ sö G lµ mét ®å thÞ vµ U, V lµ hai ®Ønh cña G. Ta cÇn tr¶ lêi c©u hái cã hay kh«ng ®êng ®i tõ U ®Õn V vµ nÕu cã, ®êng ®i ®ã lÇn lît qua nh÷ng ®Ønh nµo. §©y lµ bµi to¸n t×m ®êng ®i trªn ®å thÞ.VÝ dô 2. Cho N ®iÓm trªn mÆt ph¼ng to¹ ®é, h·y t×m mét ®a gi¸c låi P cã diÖn tÝch nhá nhÊt sao cho tÊt c¶ N ®iÓm ®Òu thuéc P. §©y lµ bµi to¸n t×m bao låi cña tËp hîp N ®iÓm.Víi ph¸t biÓu nh vËy, ph¹m vi cña c¸c bµi to¸n t×m kiÕm rÊt réng. Trong môc nµy ta sÏ giíi h¹n trong ph¹m vi bµi to¸n t×m kiÕm ®îc ph¸t biÓu nh sau:

Input. Mét d·y sè a1, a2, . . ., aN (*) vµ mét sè X; OutputÈnTr¶ lêi c©u hái X cã thuéc d·y (*) kh«ng vµ nÕu thuéc,

X lµ sè h¹ng thø bao nhiªu cña (*);7.2.2. T×m kiÕm ®¬n gi¶nThuËt to¸n t×m kiÕm ®¬n gi¶n dùa trªn viÖc duyÖt toµn bé mäi sè h¹ng Y duyÖt ®îc cña d·y A, víi mçi sè h¹ng, ta so s¸nh víi X, nÕu Y = X th× ta kÕt luËn X lµ sè h¹ng cña A vµ kÕt thóc, nÕu sau khi duyÖt hÕt mäi sè h¹ng cña A, mäi sè h¹ng ®Òu kh¸c X, ta kÕt luËn X kh«ng lµ sè h¹ng cña A.ThuËt to¸n nµy cã thÓ ®îc thÓ hiÖn bëi ch¬ng tr×nh con sau.

- 331 -

Procedure SimpleSearch;var I:ChiSo;BeginFound:=false;For I:=1 To N Do If A[I]=X then Begin Found:=True;CS:=I;Exit; {t×m ®îc th× dõng lu«n} EndEnd;Ta dïng hai biÕn toµn côc Found kiÓu Boolean vµ CS kiÓu ChØSè, sau khi thùc hiÖn ch¬ng tr×nh con SimpleSearch, nÕu Found = False th× X kh«ng lµ sèh¹ng cña d·y A; nÕu Found = True th× X lµ sè h¹ng thø CS cña d·y A.Chó ý. Khi cµi ®Æt thuËt to¸n trªn, ta cã thÓ kh«ng dïng biÕn Found mµ chØ cÇn dïng biÕn toµn côc CS. CS sÏ ®îc khëi t¹o b»ng 0 vµ nÕu X b»ng phÇn tö thø I cña d·y A, ta g¸n cho CS gi¸ trÞ I (kh¸c 0) do ®ã sau khi thùc hiÖn xong ch¬ng tr×nh con sau ®©y, tuú theo gi¸ trÞ cña CS b»ng 0 hay kh¸c 0 mµ ta cã thÓ kÕt luËn X kh«ng thuéc hay thuéc d·y A, trong trêng hîp thuéc, gi¸ trÞ cña CS chÝnh lµ chØ sè sè h¹ng trong d·y A b»ng X.Procedure ModiSimpleSearch;var I:ChiSo;BeginCS:=0;For I:=1 To N Do If A[I]=X then Begin CS:=I;Exit; EndEnd;

- 332 -

7.2.3. T×m kiÕm nhanhThuËt to¸n t×m kiÕm trªn cã ®é phøc t¹p cì N. Trong mét sè trêng hîp ch¼ng h¹n d·y A ®· ®îc s¾p xÕp kh«ng gi¶m, ta cã thuËt to¸n hiÖu qu¶ h¬n.ThuËt to¸n nµy cã tªn lµ t×m kiÕm nhÞ ph©n (Binary Search). ý cña thuËt to¸n nh sau. Gi¶ sö ta cã mét d·y sè A gåm N sè h¹ng ®· ®îc s¾p xÕp kh«ng gi¶m

a1 £ a2 £ . . . £ aN (*)vµ sè X. Râ rµng nÕu X < a1 hoÆc X > aN th× X kh«ng lµ sè h¹ng cña d·y A. Do ®ã, kh«ng mÊt tæng qu¸t, ta cã thÓ gi¶ sö

a1 £ X £ aN

§Ó xÐt X cã lµ sè h¹ng cña A kh«ng, ta chia A thµnh hai d·y con B vµ C:B: a1 £ a2 £ . . . £ aJ

C: aJ+1 £ a2 £ . . . £ aN

NÕu X £ aJ th× cã kh¶ n¨ng X thuéc B, ngîc l¹i, cã kh¶ n¨ng X thuéc C. Khi ®ã viÖc xem xÐt X cã lµ sè h¹ng cña d·y A ®a vÒ viÖc xÐt X cã lµ sè h¹ng cña mét d·y cã Ýt sè h¹ng h¬n. Víi d·y con nµy, ta l¹i xÐt t¬ng tù nh lµm víi d·y A. NÕu d·y con chØ cã mét hoÆc hai sè h¹ng, viÖc xem xÐt lµ tÇm thêng.Do ®ã, ta sÏ xÐt viÖc X cã thuéc ®o¹n tõ sè h¹ng thø I ®Õn sè h¹ng thø J cña d·y A kh«ng. Sau ®©y lµ mét ch¬ng tr×nh con ®Ö quy thÓ hiÖn thuËt to¸n nªu trªn.Procedure BinarySearch(I,J:ChiSo);var t:ChiSo;BeginIf I=J then begin If X=A[I] then CS:=I; Exit; end;

- 333 -

If J=I+1 then Begin If X=A[[I]] then CS:=I; If X=A[[J]] then CS:=J; Exit; End;T:=(I+J) Div 2;If X<=A[T] Then BinarySearch(I,T) Else BinarySearch(T,J);End;Trong ch¬ng tr×nh chÝnh, ta sÏ khëi t¹o gi¸ trÞ cña CS b»ng 0 vµ gäi ch¬ng tr×nh con BinarySearch(1,N).ThuËt to¸n t×m kiÕm nhÞ ph©n chØ cÇn thùc hiÖn sau lg2N bíc nªn cã ®é phøc t¹p cì lgN.VÝ dô. Gi¶ sö d·y A lµ d·y gåm 8 sè h¹ng

06 12 18 42 44 55 67 94vµ X = 13.Khi gäi BinarySearch(1,8) ta thÊy A[4] = 42 > X nªn X cã thÓ thuéc ®o¹n A[1..4], gäi BinarySearch(1,4) ta thÊy A[2] = 12 < X nªn X cã thÓ thuéc ®o¹n A[2..4], gäi BinarySearch(2,4) ta kÕt luËn X kh«ng lµ sè h¹ng cña d·y A.

- 334 -

Bµi tËp1. Cho mét d·y sè thùc A1, A2, . . . , AN, N £ 1000. H·y s¾p xÕp l¹i d·y A thµnh mét d·y kh«ng gi¶m. D÷ liÖu vµo ®îc cho bëi file v¨n b¶n DAY.INP trong ®ã dßng thø nhÊt ghi sè N, tiÕp theo lµ N dßng, dßng thø I ghi sè AI. KÕt qu¶ ghi ra file SX.OUT N dßng, dßng thø I ghi chØ sè trong d·y ban ®Çu cña sè h¹ng thø I cña d·y ®· ®îc s¾p xÕp kh«ng gi¶m.Yªu cÇu cÇn viÕt ba ch¬ng tr×nh, mét ch¬ng tr×nh dïng thuËt to¸n s¾p xÕp chän, mét ch¬ng tr×nh dïng thuËt to¸n s¾p xÕp chÌn, mét ch¬ng tr×nh dïng thuËt to¸n s¾p xÕp næi bät.2. Cho ba d·y sè nguyªn A1 < A2 < . . . < AN, B1 < B2 < . . . < BM, C1 < C2 < . . . < CP, N, M, P £ 1000, c¸c sè h¹ng cña ba d·y ®Òu cã trÞ tuyÖt ®èi kh«ng lín h¬n 10000. B»ng c¸ch dïng thuËt to¸n trén, x©y dùng d·y D gåm N+M+P sè h¹ng cña ba d·y A, B, C vµ d·y D ®îc s¾p xÕp theo thø tù kh«ng gi¶m.3. Cho mét d·y sè nguyªn A1, A2, . . . , AN, N £ 10000, c¸c sè h¹ng cña d·y cã trÞ tuyÖt ®èi kh«ng lín h¬n 10000. H·y s¾p xÕp l¹i d·y A thµnh mét d·y kh«ng gi¶m. D÷ liÖu vµo ®îc cho bëi file v¨n b¶n DAY.INP trong ®ã dßng thø nhÊt ghi sè N, tiÕp theo lµ N dßng, dßng thø I ghi sè AI. KÕt qu¶ ghi ra file SX.OUT N dßng, dßng thø I ghi chØ sè trong d·y ban ®Çu cña sè h¹ng thø I cña d·y ®· ®îc s¾p xÕp kh«ng gi¶m.Yªu cÇu cÇn viÕt hai ch¬ng tr×nh, mét ch¬ng tr×nh dïng thuËt to¸n s¾p xÕp nhanh, mét ch¬ng tr×nh dïng thuËt to¸n Heapsort.4. Mét ®a gi¸c låi lµ ®a gi¸c lu«n n»m vÒ mét phÝa ®èi víi ®êng th¼ng ®i qua mét c¹nh bÊt kú cña ®a gi¸c. VÒ mÆt to¸n häc, ngêi ta chøng minh ®îc r»ng víi mçi tËp h÷u h¹n ®iÓm bÊt kú A trªn mÆt ph¼ng to¹ ®é, lu«n cã thÓ chän mét tËp con B cña A sao cho ®a gi¸c P víi tËp ®Ønh B lµ låi vµ chøa mäi ®iÓm thuéc A. P ®îc gäi lµ bao låi cña tËp A. P cã tÝnh chÊt nÕu P' lµ mét ®a gi¸c låi bÊt kú chøa mäi ®iÓm thuéc A th× P P'.

- 335 -

XÐt bµi to¸n sau: Cho tËp A gåm N ®iÓm trªn mÆt ph¼ng to¹ ®é MI(XI,YI), 1 £ I £ N, trong N ®iÓm nµy cã Ýt nhÊt 3 ®iÓm kh«ng th¼ng hµng. ViÕt ch¬ng tr×nh t×m bao låi cña N ®iÓm ®· cho. D÷ liÖu vµo ®îc cho bëi file v¨n b¶n DG.INP trong ®ã dßng thø nhÊt ghi sè nguyªn d¬ng N, 3 £ N £ 100 , tiÕp theo lµ N dßng, dßng thø I ghi hai sè thùc XI, YI. KÕt qu¶ ghi ra file DG.OUT nh sau: dßng thø nhÊt ghi sè S lµ sè ®Ønh cña bao låi, tiÕp theo lµ S dßng, mçi dßng ghi sè hiÖu ®iÓm (trong sè N ®iÓm) theo chiÒu kim ®ång hå lÇn lît lµ c¸c ®Ønh cña bao låi.

- 336 -

ch¬ng 8:

Mét sè ph¬ng ph¸p thiÕt kÕ thuËt gi¶i

Néi dung cña ch¬ng nµy nh»m giíi thiÖu mét sè ph¬ng ph¸p thiÕt kÕ mét sè líp thuËt gi¶i c¬ b¶n: §Ö qui, quay lui, tham lam, qui ho¹ch ®éng,...

Theo quan ®iÓm cña t¸c gi¶, viÖc thiÕt kÕ thuËt gi¶i ph¶i ®îc kÕ tiÕp b»ng Ýt nhÊt mét c¸ch cµi ®Æt thuËt gi¶i, tøc lµ viÖc diÔn t¶ thuËt gi¶i díi d¹ng mét ch¬ng tr×nh viÕt b»ng mét ng«n ng÷ lËp tr×nh nµo ®ã. Do ®ã, cuèi ch¬ng cã mét phô lôc bao gåm mét sè ch¬ng tr×nh viÕt b»ng ng«n ng÷ Pascal cµi ®Æt mét sè thuËt gi¶i ®èi víi mét sè vÝ dô tiªu biÓu. ViÖc chuyÓn c¸c ch¬ng tr×nh nµy sang ng«n ng÷ C kh«ng mÊy khã kh¨n.

PhÇn cuèi mçi Môc ®Òu cã mét sè bµi tËp. Cuèi ch¬ng cã mét phÇn híng dÉn.

§Ó häc tèt ch¬ng nµy, häc sinh cÇn ®äc kÜ c¸c kh¸i niÖm trong ch-¬ng më ®Çu vµ n¨m ®îc kiÕn thøc c¬ b¶n trong c¸c ch¬ng tríc.

8.1. C¸c thuËt gi¶i lo¹i ®Ö quyGi¶ sö P lµ mét bµi to¸n, mét thuËt gi¶i A(K), K lµ mét biÕn, cho bµi to¸n P lµ ®Ö quy nÕu trong sè c¸c thao t¸c cña A(K) cã thao t¸c dïng thuËt gi¶i A ®èi víi mét biÕn K' nãi chung kh¸c víi K.Mét vÝ dô ®¬n gi¶n vµ quen thuéc cña thuËt gi¶i ®Ö quy lµ thuËt gi¶i tÝnh hµm GT(K) = K!. Bµi to¸n tÝnh giai thõa cã thÓ ®îc ph¸t biÓu nh sau:

I. Sè nguyªn kh«ng ©m K;O. TÝnh GT=K!;

ThuËt gi¶iNÕu K=0 th× GT = 0 vµ kÕt thóc

- 337 -

NÕu kh«ng th× GT = K*GT(K-1);ThuËt gi¶i ®Ö quy cã u ®iÓm lµ ch¬ng tr×nh thêng ng¾n gän vµ dÔ c¶m nhËn. Tuy nhiªn, khi thùc hiÖn ch¬ng tr×nh, ch¬ng tr×nh dÞch cÇn thu xÕp mét vïng nhí gäi lµ Stack ®Ó lu gi÷ c¸c gi¸ trÞ trung gian trong qu¸ tr×nh tÝnh to¸n, nÕu sè lîng c¸c gi¸ trÞ ®ã qu¸ nhiÒu, cã thÓ bÞ trµn Stack.Sau ®©y ta sÏ giíi thiÖu mét sè vÝ dô vÒ gi¶i thuËt ®Ö quy.VÝ dô 1. DuyÖt ®Ö quy mäi tæ hîp chËp K cña N sè nguyªn d¬ng ®Çu tiªnTa xÐt bµi to¸n sau:

I. Hai sè nguyªn d¬ng K, N, K £ N;O. LiÖt kª mäi tæ hîp chËp K cña N sè nguyªn d¬ng ®Çu tiªn, mçi tæ hîp ®óng mét lÇn.

Khi viÕt mét tæ hîp chËp K cña N sè nguyªn d¬ng ®Çu tiªn B1, B2, . . ., BK, cã tÊt c¶ K! c¸ch viÕt kh¸c nhau. §Ó b¶o ®¶m viÖc liÖt kª (hay nãi t¬ng ®¬ng, duyÖt) kh«ng thõa vµ kh«ng thiÕu (mçi tæ hîp ®óng mét lÇn), ta cÇn quy íc mét c¸ch viÕt c¸c tæ hîp sao cho víi quy íc ®ã, mçi tæ hîp cã ®óng mét c¸ch viÕt. Cô thÓ, khi viÕt mét tæ hîp, ta viÕt sè h¹ng bÐ tríc, sè h¹ng lín sau:

B1 < B2 < . . . < BK

Râ rµng víi c¸ch viÕt nµy, mçi tæ hîp cã ®óng mét c¸ch viÕt.§Ó duyÖt mäi tæ hîp, ta cÇn quy ®Þnh mét tr×nh tù duyÖt. VÝ dô víi N = 5 vµ K = 3, tr×nh tù duyÖt mäi tæ hîp chËp 3 cña5 sè nguyªn d-¬ng ®Çu tiªn nh sau:

- 338 -

1 - 1 2 32 - 1 2 43 - 1 2 54 - 1 3 45 - 1 3 56 - 1 4 57 - 2 3 48 - 2 3 59 - 2 4 510 - 3 4 5

- 339 -

Mét c¸ch tæng qu¸t, tr×nh tù duyÖt c¸c tæ hîp ta sÏ quy ®Þnh lµ tæ hîp bÐ duyÖt tríc, tæ hîp lín duyÖt sau; tr×nh tù duyÖt nµy cßn ®îc gäi lµ thø tù tõ ®iÓn; khi so s¸nh hai tæ hîp, ta so s¸nh c¸c sè h¹ng t-¬ng øng tõ tr¸i sang ph¶i, tæ hîp nµo cã sè h¹ng ®Çu tiªn bÐ h¬n ®îc xem lµ bÐ h¬n.Víi c¸ch quy ®Þnh tr×nh tù duyÖt nh vËy, víi N vµ K bÊt kú, ta lu«n cã tæ hîp ®Çu tiªn (bÐ nhÊt) lµ

1 2 . . . Kvµ tæ hîp cuèi cïng (lín nhÊt) lµ

N-K+1 N-K+2 . . . N§Ó duyÖt ®Ö quy mäi tæ hîp chËp K cña N sè nguyªn d¬ng, ta xem qu¸ tr×nh sinh ra mét tæ hîp lµ mét qu¸ tr×nh gåm K giai ®o¹n, giai ®o¹n 1: chän gi¸ trÞ B1, giai ®o¹n 2: chän gi¸ trÞ cho B2 sau khi ®· cã gi¸ trÞ B1, mét c¸ch tæng qu¸t, giai ®o¹n I: chän gi¸ trÞ cho BI sau khi ®· cã gi¸ trÞ B1, . . ., BI-1, chó ý r»ng c¸c gi¸ trÞ ®· chän B1, . . ., BI-

1 ph¶i tu©n theo quy íc viÕt tæ hîp cã nghÜa lµB1 < . . . < BI-1

Ta xÐt chi tiÕt h¬n c«ng viÖc cña giai ®o¹n I. Chó ý r»ng víi quy íc vÒ c¸ch viÕt mét tæ hîp, gi¸ trÞ cña BI sau khi ®· cã c¸c gi¸ trÞ B1, . . ., BI-1 chØ cã thÓ biÕn thiªn trong ph¹m vi tõ BI-1+1 ®Õn N-K+I.Giai ®o¹n I

Víi mçi gi¸ trÞ J ®i tõ Bi-1+1 ®Õn N-K+I ta lµm c¸c viÖc sau:1. Cho BI nhËn gi¸ trÞ J;2. NÕu I=K th× viÕt tæ hîp nhËn ®îc nÕu kh«ng, chuyÓn

sang giai ®o¹n I+1;NÕu thÓ hiÖn c«ng viÖc Giai ®o¹n I b»ng mét ch¬ng tr×nh con ch¼ng h¹n Sinh(I) th× ch¬ng tr×nh con ®ã sÏ gäi chÝnh nã víi biÕn I+1, Sinh(I+1). Ch¬ng tr×nh con nh vËy ®îc gäi lµ ch¬ng tr×nh con ®Ö quy.Sau ®©y lµ ch¬ng tr×nh cµi ®Æt thuËt gi¶i duyÖt ®Ö quy mäi tæ hîp chËp K cña N sè nguyªn d¬ng ®Çu tiªn. Trong ch¬ng tr×nh, c¸c

- 340 -

sè N vµ K ®îc nhËp tõ file v¨n b¶n TH.INP trong ®ã dßng thø nhÊt ghi hai sè N vµ K, K£N£30 vµ c¸c tæ hîp chËp K ®îc viÕt ra file v¨n b¶n TH.OUT, mçi tæ hîp mét dßng.{$M 65000,0,0}const fi='th.inp'; fo='th.out';var f:text; c:longint; b:array[0..30] of byte; n,k:byte;procedure nhap;beginassign(f,fi);reset(f);readln(f,n,k);close(f);end;procedure tinh;var i:byte;beginc:=n-k+1;if k<30 then for i:=2 to k do c:=(c*(n-k+i)) div i;end;procedure viet;var u:byte;beginfor u:=1 to k do write(f,b[u]:3);writeln(f);end;{sinh de quy cac to hop, bang cach xay dung tung thanh phan}

- 341 -

procedure sinh(i:byte);var j:byte;beginfor j:=b[i-1]+1 to n-k+i do begin b[i]:=j; if i=k then viet else sinh(i+1); end;end;procedure lam;beginassign(f,fo);rewrite(f);tinh;writeln(f,c);b[0]:=0;thdq(1);close(f);end;BEGINnhap;lam;END.VÝ dô 2. DuyÖt ®Ö quy mäi ho¸n vÞ cña N sè nguyªn d¬ng ®Çu tiªnTa xÐt bµi to¸n sau:

I. Sè nguyªn d¬ng N, N £ 12;O. LiÖt kª mäi ho¸n vÞ cña N sè nguyªn d¬ng ®Çu tiªn, mçi ho¸n vÞ ®óng mét lÇn.

Kh¸c víi viÖc mçi tæ hîp chËp K cña N sè nguyªn d¬ng ®Çu tiªn B1, B2, . . ., BK, cã tÊt c¶ K! c¸ch viÕt kh¸c nhau, mçi ho¸n vÞ P1, P2, . . ., PN cã ®óng mét c¸ch viÕt.

- 342 -

§Ó duyÖt mäi ho¸n vÞ, ta cÇn quy ®Þnh mét tr×nh tù duyÖt. VÝ dô víi N = 3, tr×nh tù duyÖt mäi ho¸n vÞ cña 3 sè nguyªn d¬ng ®Çu tiªn nh sau:

1 - 1 2 32 - 1 3 23 - 2 1 34 - 2 3 15 - 3 1 26 – 3 2 1

Mét c¸ch tæng qu¸t, khi duyÖt c¸c ho¸n vÞ ta sÏ quy ®Þnh tr×nh tù ho¸n vÞ bÐ duyÖt tríc, ho¸n vÞ lín duyÖt sau; khi so s¸nh hai ho¸n vÞ, ta so s¸nh c¸c sè h¹ng t¬ng øng tõ tr¸i sang ph¶i, ho¸n vÞ nµo cã sè h¹ng ®Çu tiªn bÐ h¬n sÏ ®îc xem lµ bÐ h¬n.Víi c¸ch quy ®Þnh tr×nh tù duyÖt nh vËy, víi N bÊt kú, ta lu«n cã ho¸n vÞ ®Çu tiªn (bÐ nhÊt) lµ

1 2 . . . N-1 Nvµ tæ hîp cuèi cïng (lín nhÊt) lµ

N N-1 . . . 2 1§Ó duyÖt ®Ö quy mäi ho¸n vÞ cña N sè nguyªn d¬ng, ta xem qu¸ tr×nh sinh ra mét ho¸n vÞ lµ mét qu¸ tr×nh gåm N giai ®o¹n, giai ®o¹n 1: chän gi¸ trÞ P1, giai ®o¹n 2: chän gi¸ trÞ cho P2 sau khi ®· cã gi¸ trÞ P1, mét c¸ch tæng qu¸t, giai ®o¹n I: chän gi¸ trÞ cho PI sau khi ®· cã gi¸ trÞ P1, . . ., PI-1,Ta xÐt chi tiÕt h¬n c«ng viÖc cña giai ®o¹n I. Chó ý r»ng sau khi ®· cã c¸c chän c¸c gi¸ trÞ cho B1, . . ., BI-1 , gi¸ trÞ cña PI chØ cã thÓ chän trong c¸c gi¸ trÞ cha ®îc chän, do ®ã, khi xÐt giai ®o¹n I, ta ph¶i ghi nhËn ®îc gi¸ trÞ nµo ®· ®îc chän ghi vµo ho¸n vÞ, gi¸ trÞ nµo cha ®îc chän.Giai ®o¹n I

- 343 -

Víi mçi gi¸ trÞ J cha ®îc chän ta lµm c¸c viÖc sau:Cho PI nhËn gi¸ trÞ J;Ghi nhËn ®· chän gi¸ trÞ J;NÕu I=N th× viÕt ho¸n vÞ nhËn ®îc nÕu kh«ng, chuyÓn sang giai ®o¹n I+1;Xo¸ viÖc ghi nhËn ®· chän gi¸ trÞ J;

Mét chi tiÕt tinh tÕ h¬n liªn quan ®Õn viÖc ghi nhËn/xo¸ viÖc ghi nhËn gi¸ trÞ ®· chän thÓ hiÖn trong dßng in nghiªng cuèi cïng. ViÖc chän gi¸ trÞ J sÏ ®îc thÓ hiÖn ch¼ng h¹n b»ng mét vßng lÆp For J:=. . . ., trong vßng lÆp nµy sau khi chän mét gi¸ trÞ J nµo ®ã vµ thùc hiÖn c¸c lÖnh tiÕp theo, khi quay l¹i vßng lÆp nµy, ta sÏ chän mét gi¸ trÞ J’ kh¸c víi J, nÕu kh«ng xo¸ viÖc ®· chän J (ë bíc lÆp tríc), ta sÏ kh«ng chän ®îc gi¸ trÞ J trong c¸c bíc sau khi ®· chän gi¸ trÞ cho PI lµ J’.NÕu thÓ hiÖn c«ng viÖc Giai ®o¹n I b»ng mét ch¬ng tr×nh con ch¼ng h¹n Sinh(I) th× ch¬ng tr×nh con ®ã sÏ gäi chÝnh nã víi biÕn I+1, Sinh(I+1). Ch¬ng tr×nh con nh vËy ®îc gäi lµ ch¬ng tr×nh con ®Ö quy.Sau ®©y lµ ch¬ng tr×nh cµi ®Æt thuËt gi¶i duyÖt ®Ö quy mäi ho¸n vÞ cña N sè nguyªn d¬ng ®Çu tiªn. Trong ch¬ng tr×nh, sè N ®îc nhËp tõ file v¨n b¶n HV.INP trong ®ã dßng thø nhÊt ghi sè N, N£12 vµ c¸c ho¸n vÞ ®îc viÕt ra file v¨n b¶n HV.OUT, mçi ho¸n vÞ mét dßng. Ta dïng m¶ng mét chiÒu CHUA ®Ó ghi nhËn viÖc chän/cha chän c¸c gi¸ trÞ, CHUA[J] = True khi vµ chØ khi gi¸ trÞ J ®· ®îc chän.{$M 65000,0,0}const fi='hv.inp'; fo='hv.out';var f:text;

- 344 -

p:array[1..12] of byte; chua:array[1..12] of boolean; n:byte;procedure nhap;var i,j,x,y:byte;beginassign(f,fi);reset(f);readln(f,n);close(f);end;procedure viet;var u:byte;beginfor u:=1 to n do write(f,p[u]:3);writeln(f);end;procedure sinh(i:byte);var j:byte;beginfor j:=1 to n do if chua[j] then begin p[i]:=j;chua[j]:=false; if i=n then viet else sinh(i+1); chua[j]:=true; end;end;procedure lam;beginfillchar(chua,sizeof(chua),true);assign(f,fo);rewrite(f);sinh(1);

- 345 -

close(f);end;BEGINnhap;lam;END.Trong hai vÝ dô trªn, thuËt gi¶i chia viÖc t×m lêi gi¶i thµnh nhiÒu giai ®o¹n vµ xem xÐt c¸c thao t¸c cÇn thùc hiÖn trong giai ®o¹n I.Sau ®©y lµ mét vÝ dô kh¸c vÒ thuËt gi¶i ®Ö quy mµ biÕn dïng ®Ó tiÕn hµnh ®Ö quy cã ý nghÜa kh¸c.VÝ dô 3. Bµi to¸n t×m ®êng ®iCho mét ®å thÞ cã híng G gåm N ®Ønh ®¸nh sè tõ 1 ®Õn N, N£100 vµ hai ®Ønh U, V. Mét ®êng ®i tõ U ®Õn V lµ mét d·y c¸c ®Ønh

U1=U, U2, . . ., UK-1, UK = VSao cho víi 1 £ I £ K-1, cã cung (UI,UI+1).Ph¸t biÓu bµi to¸n

I. §å thÞ cã híng G vµ hai ®Ønh U, VO. Tr¶ lêi c©u hái: Cã hay kh«ng ®êng ®i tõ U ®Õn V vµ nÕu cã, ®êng ®i ®ã lÇn lît qua nh÷ng ®Ønh nµo?

ThuËt gi¶iThuËt gi¶i dïng kü thuËt t×m kiÕm theo chiÒu s©u (DFS) b¾t ®Çu tõ ®Ønh U. Kü thuËt nµy cho phÐp ta ®i tõ U ®Õn mäi ®Ønh cã thÓ ®i ®Õn ®îc, mçi ®Ønh ®óng mét lÇn. Cã hai kh¶ n¨ng x¶y ra:

1. Trong qu¸ tr×nh ®i, ta ®Õn ®îc ®Ønh V, khi ®ã ta kÕt luËn cã ®êng ®i tõ U ®Õn V vµ t×m ®êng ®i nµy.

2. Sau khi ®i ®Õn mäi ®Ønh cã thÓ ®Õn ®îc, ta vÉn kh«ng b¾t gÆp V, khi ®ã ta kÕt luËn kh«ng cã ®êng ®i tõ U ®Õn V.

ViÖc ®i tõ ®Ønh I theo chiÒu s©u ®îc thÓ hiÖn nh sau:§i tõ ®Ønh IVíi mçi ®Ønh J tho¶ m·n hai ®iÒu kiÖn: Cha ®i qua J vµ cã cung (I,J), ta thùc hiÖn c¸c thao t¸c sau:

- 346 -

1. Ghi nhËn ®· qua ®Ønh J vµ ghi nhËn ®Ønh I lµ ®Ønh ngay tríc ®Ønh J trªn ®êng tõ U ®Õn;

2. NÕu J = V th× ghi nhËn cã ®êng tõ U ®Õn V vµ kÕt thóc, nÕu kh«ng, §i tõ ®Ønh J;

NÕu thÓ hiÖn viÖc §i tõ ®Ønh I b»ng mét ch¬ng tr×nh con víi tªn ch¼ng h¹n lµ DI(I) th× ch¬ng tr×nh con nµy gäi chÝnh nã (gäi DI(J)) tøc lµ mét ch¬ng tr×nh con ®Ö quy.Sau ®©y lµ mét ch¬ng tr×nh cµi ®Æt thuËt gi¶i nµy. Gi¶ sö ®å thÞ G ®îc cho bëi file v¨n b¶n DT.INP trong ®ã dßng thø nhÊt ghi ba sè nguyªn d¬ng N, U, V, tiÕp theo lµ mét sè dßng, mçi dßng ghi hai sè I, J cã nghÜa lµ cã cung (I,J). KÕt qu¶ ghi ra file DD.OUT nh sau: NÕu kh«ng cã ®êng ®i tõ U ®Õn V, dßng thø nhÊt ghi sè 0, nÕu cã ®êng ®i tõ U ®Õn V, dßng thø nhÊt ghi sè 1 vµ dßng thø 2 ghi c¸c ®Ønh trªn ®êng ®i tõ U ®Õn V theo thø tù lÇn lît tõ U vµ kÕt thóc t¹i V.§Ó cµi ®Æt thuËt gi¶i, víi gi¶ thiÕt N kh«ng lín h¬n 100, ta sÏ dïng c¸ch thÓ hiÖn ®å thÞ b»ng ma trËn kÒ, ®ã lµ mét m¶ng hai chiÒu A[1..100,1..100] mµ A[I,J] = 1 nÕu cã cung (I,J) vµ b»ng 0 nÕu kh«ng cã cung (I,J). §Ó ghi nhËn th«ng tin víi mçi ®Ønh J, ®Ønh ®ã ®· qua/cha qua vµ nÕu ®· qua, ®Ønh ngay tríc nã trªn ®êng tõ U ®Õn lµ ®Ønh nµo, ta chØ cÇn dïng mét m¶ng mét chiÒu T[1..100] mµ T[J] = 0 cã nghÜa lµ cha ®i qua ®Ønh J, nÕu T[J] kh¸c 0, gi¸ trÞ cña T[J] chÝnh lµ ®Ønh ngay tríc nã trªn ®êng tõ U ®Õn. §Ó ghi nhËn viÖc cã/kh«ng cã ®êng ®i tõ U ®Õn, ta dïng biÕn Found kiÓu Boolean, ban ®Çu ta khëi t¹o Found=False. NÕu cã ®êng ®i tõ U ®Õn V, ta cho gi¸ trÞ Found=True, khi ®ã, ®Ó t×m ®êng ®i tõ U ®Õn V ta ghi nhËn c¸c ®Ønh lÇn lît trªn ®êng ®i vµo m¶ng H vµ sè ®Ønh thuéc ®êng ®i vµo biÕn SD, ta b¾t ®Çu tõ V, t×m ®Ønh ngay tríc V trªn ®êng ®i tõ U ®Õn vµ ghi vµo m¶ng H, cho ®Ønh ®ã ®ãng vai trß V, ta l¹i t×m ®Ønh ngay tríc nã, cø nh vËy khi nµo ta dß ®îc vÒ U th× ghi nhËn ®îc c¸c ®Ønh trªn ®êng ®i tõ U theo

- 347 -

thø tù ngîc l¹i: tõ V vÒ U; ®Ó viÕt ®êng ®i, ta ph¶i viÕt c¸c ®Ønh cña m¶ng H theo thø tù tõ SD ®Õn 1.Sau ®©y lµ ch¬ng tr×nh.{$M 65000,0,0}const fi='dt.inp'; fo='dd.out';var f:text; n,u,v,sd:byte; a:array[1..100,1..100] of byte; h,t:array[1..100] of byte; found:boolean;procedure nhap;var i,j:byte;beginassign(f,fi);reset(f);readln(f,n,u,v);for i:=1 to n dofor j:=1 to n do a[i,j]:=0;while not(seekeof(f)) do begin readln(f,i,j);a[i,j]:=1; end;close(f);end;procedure di(i:byte);var j:byte;beginif found then exit;for j:=1 to n do if (t[j]=0)and(a[i,j]=1) then

- 348 -

begin t[j]:=i; if j=v then begin found:=true;exit;end; di(j); end;end;procedure timduong;beginsd:=1;h[sd]:=v;while v<>u do begin v:=t[v];inc(sd);h[sd]:=v; end;end;procedure lam;

beginfound:=false;t[u]:=u;di(u);assign(f,fo);rewrite(f);if found then begin writeln(f,1); timduong; for u:=sd downto 1 do write(f,h[u]:4);writeln(f); endelse writeln(f,0);close(f);end;BEGINnhap;lam;END.

- 349 -

8.2. Kü thuËt quay lui (Backtracking)

Trong Môc 4.3 ta ®· xÐt c¸c bµi to¸n duyÖt mäi tæ hîp vµ duyÖt mäi ho¸n vÞ, trong c¸c bµi to¸n ®ã, ta duyÖt mäi ®èi tîng cÇn duyÖt. C¸ch duyÖt nh vËy ®îc gäi lµ duyÖt toµn bé.

NhiÒu bµi to¸n lu«n cã thuËt gi¶i tÇm thêng lµ duyÖt toµn bé mäi kh¶ n¨ng. Tuy nhiªn nÕu tiÕn hµnh duyÖt toµn bé mäi kh¶ n¨ng, thêi gian ch¹y ch¬ng tr×nh rÊt lín. Mét c¸ch xö lý kh«n khÐo h¬n lµ t×m c¸ch h¹n chÕ viÖc duyÖt. Mét kü thuËt dïng ®Ó thiÕt kÕ c¸c thuËt gi¶i nh vËy ®îc gäi lµ kü thuËt quay lui.

ý tëng c¬ b¶n cña kü thuËt nµy lµ t×m mét ®iÒu kiÖn ®Ó tríc khi xem xÐt mét kh¶ n¨ng nµo ®ã, nÕu kh¶ n¨ng tho¶ m·n ®iÒu kiÖn, ta míi xem xÐt kh¶ n¨ng ®ã, nÕu kh«ng, ta sÏ quay l¹i t×m kiÕm kh¶ n¨ng kh¸c.

Ta cã thÓ b¾t ®Çu b»ng mét vÝ dô ®¬n gi¶n sau.

VÝ dô 1. Cã N ngêi ®¸nh sè tõ 1 ®Õn N, N£12 muèn dµn hµng ngang chôp ¶nh. Tuy nhiªn cã mét sè cÆp ngêi kh«ng muèn ®øng c¹nh nhau. H·y cho biÕt cã bao nhiªu c¸ch chôp ¶nh tho¶ m·n ®iÒu kiÖn nªu trªn.

D÷ liÖu vµo ®îc cho bëi file ANH.INP trong ®ã dßng thø nhÊt ghi sè N, tiÕp theo lµ mét sè dßng, mçi dßng ghi sè hiÖu hai ngêi kh«ng thÝch ®øng c¹nh nhau.

KÕt qu¶ ghi ra file ANH.OUT mét sè dßng, mçi dßng ghi tªn N ngêi ®øng trong mét kiÓu ¶nh theo thø tù tõ tr¸i sang ph¶i.

ThuËt gi¶i

Bµi to¸n nµy cã thÓ gi¶i b»ng c¸ch duyÖt toµn bé nh sau. Mçi kiÓu ¶nh chÝnh lµ mét ho¸n vÞ cña N sè hiÖu ngêi tøc lµ N sè nguyªn d-¬ng ®Çu tiªn. Do ®ã, ®Ó gi¶i bµi to¸n, ta cã thÓ lµm nh sau:

- 350 -

DuyÖt mäi ho¸n vÞ cña N sè nguyªn d¬ng ®Çu tiªn, víi mçi ho¸n vÞ

P1, P2, . . ., PN

ta kiÓm tra xem cã hai ngêi nµo c¹nh nhau kh«ng thÝch nhau kh«ng, nÕu cã, lo¹i bá.

Víi c¸ch lµm nh vËy, ta ph¶i duyÖt N! ho¸n vÞ vµ ta biÕt r»ng khi N t¨ng lªn, N! t¨ng lªn gÊp béi (chó ý r»ng 13! ®· lín h¬n MaxLongInt).

Ta nhí l¹i ®o¹n ch¬ng tr×nh ë Môc 4.3 khi duyÖt ®Ö quy mäi ho¸n vÞ

procedure sinh(i:byte);var j:byte;beginfor j:=1 to n do if chua[j] then begin p[i]:=j;chua[j]:=false; if i=n then viet else sinh(i+1); chua[j]:=true; end;end;

Trong ®o¹n ch¬ng tr×nh nµy, khi chän J lµm phÇn tö thø I cña ho¸n vÞ tøc lµ ngêi ®øng thø I trong kiÓu ¶nh, ta chØ chän theo ®iÒu kiÖn ngêi ®ã cha cã mÆt trong kiÓu ¶nh vµ khi ®ñ N ngêi, ta míi tiÕn hµnh kiÓm tra.

Mét c¸ch lµm kh«n ngoan h¬n lµ khi xÐt chän J lµm ngêi thø I trong kiÓu ¶nh, ngoµi ®iÒu kiÖn ngêi ®ã cha cã mÆt, ta kiÓm tra lu«n ®iÒu kiÖn ngêi ®ã cã kh«ng thÝch ®øng c¹nh ngêi thø I-1 (P[I-1]) kh«ng, nÕu kh«ng thÝch th× kh«ng chän, Nh vËy ta sÏ h¹n chÕ ®îc viÖc duyÖt nhiÒu kh¶ n¨ng kh«ng cÇn xÐt ®Õn.

- 351 -

Muèn vËy, ta ph¶i ghi nhËn ®îc th«ng tin trong N ngêi nh÷ng cÆp nµo kh«ng thÝch nhau, c¸ch ghi nhËn sao cho dÔ kiÓm tra. §Ó lµm ®iÒu ®ã, cã mét c¸ch ®¬n gi¶n lµ dïng mét m¶ng hai chiÒu A mµ A[I,J] =1 nÕu I vµ J kh«ng thÝch ®øng c¹nh nhau vµ b»ng 0 nÕu I vµ J cã thÓ ®øng c¹nh nhau. M¶ng nµy cã thÓ x©y dùng ®îc khi ®äc d÷ liÖu vµo (xem thñ tôc Nhap trong ch¬ng tr×nh díi ®©y). Chó ý r»ng m¶ng nµy cã kÝch thíc [0..12,0..12]. Ta ®a vµo ngêi sè hiÖu 0 víi ý nghÜa ngêi chän ®Çu tiªn cã thÓ tuú ý.

ViÖc chän ngêi thø I trong ¶nh cã thÓ diÔn t¶ nh sau:

Chän ngêi thø I {Sau khi ®· chän ®îc c¸c ngêi thø I-1 trong ¶nh}

Víi mçi ngêi J tho¶ m·n hai ®iÒu kiÖn cha cã mÆt trong ¶nh vµ cã thÓ ®øng c¹nh ngêi P[I-1] th×

1. XÕp ngêi ®ã vµo vÞ trÝ thø I trong ¶nh; ghi nhËn J ®· cã mÆt trong ¶nh;

2. NÕu I=N th× viÕt nÕu kh«ng chän ngêi thø I+1;

3. Xo¸ ghi nhËn J ®· cã mÆt trong ¶nh;

Sau ®©y lµ ch¬ng tr×nh cµi ®Æt thuËt gi¶i nµy.const fi='ANH.INP'; fo='ANH.OUT';var f:text; p:array[0..12] of byte; chua:array[1..12] of boolean; n:byte; a:array[0..12,0..12] of byte;

{Mang A ghi nhan cac cap khong thich nhau; A[I,J]=1 neu I khong thich J}

procedure nhap;

- 352 -

var i,j:byte;beginassign(f,fi);reset(f);readln(f,n);for i:=0 to n dofor j:=0 to n do a[i,j]:=0;while not(seekeof(f)) do begin

readln(f,i,j); a[i,j]:=1;a[j,i]:=1;

{i khong thich j thi i cung khong thich i} end;close(f);end;procedure viet;var u:byte;beginfor u:=1 to n do write(f,p[u]:3);writeln(f);end;

procedure chon(i:byte);var j:byte;beginfor j:=1 to n do if chua[j] and (a[p[i-1],j]=0) then begin p[i]:=j; {chon nguoi thu i la j} chua[j]:=false; if i=n then viet else chon(i+1); chua[j]:=true;{tra lai gia tri cho j,

coi nhu chua chon j} end;

- 353 -

end;procedure lam;beginfillchar(chua,sizeof(chua),true);{khoi tao}p[0]:=0;chon(1);end;BEGINnhap;assign(f,fo);rewrite(f);chon;close(f);END.

VÝ dô 2. Bµi to¸n chän c«ng viÖc

N viÖc víi c¸c sè hiÖu 1..N, viÖc I cÇn hoµn thµnh liªn tôc trong T I giê vµ khi ®ã sÏ thu ®îc gi¸ trÞ GI. Ta chØ cã A giê lµm viÖc, cÇn chän mét sè viÖc sao cho tæng gi¸ trÞ thu ®îc lín nhÊt.

Ta cã thÓ ph¸t biÓu bµi to¸n díi d¹ng Input-Output nh sau:

I. Sè nguyªn d¬ng N, N cÆp sè nguyªn d¬ng TI, GI, 1£I£N, sè nguyªn d¬ng A.

O. N sè X1, X2, . . ., XN, c¸c XI = 0/1 (t¬ng øng víi viÖc kh«ng chän/chän viÖc I ®Ó lµm) sao cho

X1T1 + X2T2 + . . . + XNTN £ A (*)

GT = X1G1 + X2G2 + . . . + XNGN

lín nhÊt.

Ta cã thÓ gi¶i bµi to¸n nµy b»ng c¸ch khëi t¹o GTMax (gi¸ trÞ lín nhÊt) b»ng 0 råi duyÖt toµn bé mäi d·y N bÝt nhÞ ph©n X1, X2, . . .,

- 354 -

XN, víi mçi d·y, ta kiÓm tra ®iÒu kiÖn (*), nÕu (*) tho¶ m·n th× tÝnh GT, nÕu GT>GTMax th× thay GTMax b»ng GT vµ ghi nhËn d·y X. Theo c¸ch nµy ®é phøc t¹p cña thuËt gi¶i b»ng 2N sÏ lµ rÊt lín khi N lín. C¸ch nµy cßn gäi lµ duyÖt nhÞ ph©n.

Mét c¸ch h¹n chÕ duyÖt cã thÓ lµ nh sau: khi ®· chän ®îc c¸c viÖc lµm tõ thø 1 ®Õn thø K-1, ®Ó chän viÖc lµm thø K, víi mçi viÖc I ch-a ®îc chän ®Ó lµm, nÕu cßn ®ñ thêi gian lµm viÖc I kh«ng, nÕu ®ñ, ta sÏ

1. Chän viÖc lµm thø K lµ I;

2. Ghi nhËn ®· chän viÖc I; ghi nhËn phÇn thêi gian cßn l¹i, ghi nhËn gi¸ trÞ thu ®îc;

3. Chän viÖc lµm thø K+1;

4. ViÖc quay lui thÓ hiÖn ë chç cã thÓ c¸ch lùa chän lµm viÖc I tríc ®ã kh«ng cã lîi vÒ tæng thÓ, khi cã ta xo¸ viÖc ghi nhËn ®· chän viÖc lµm thø K lµ I, t¨ng phÇn thêi gian cßn l¹i, gi¶m gi¸ trÞ thu ®îc;

Thêng khi dïng kü thuËt quay lui, ta sÏ tæ chøc mét ch¬ng tr×nh con ®Ö quy. Tuy nhiªn, trong mét sè bµi to¸n, khi cµi ®Æt ch¬ng tr×nh, ta vÉn cã thÓ dïng c¸c thÓ hiÖn kh«ng ®Ö quy. Sau ®©y lµ mét vÝ dô minh ho¹.

VÝ dô 3 - R« bèt

Trªn mÆt ph¼ng to¹ ®é cã N ®iÓm P1, . . ., PN víi c¸c to¹ ®é nguyªn víi trÞ tuyÖt ®èi kh«ng qu¸ 1000, N£20. Mét r« bèt b¾t ®Çu chuyÓn ®éng tõ P1 vµ muèn thùc hiÖn mét hµnh tr×nh ®i qua N ®iÓm, mçi ®iÓm ®óng mét lÇn vµ tõ ®iÓm cuèi cïng ®i vÒ P1. C¸ch ®i cña r« bèt nh sau: r« b«t muèn ®i tõ A ®Õn B lµ hai trong sè N ®iÓm th× trªn ®o¹n AB ph¶i kh«ng cã ®iÓm nµo kh¸c trong sè N ®iÓm vµ khi ®Õn B, r« bèt buéc ph¶i hoÆc quay tr¸i, hoÆc quay ph¶i mét goc 900 råi míi tiÕp tôc hµnh tr×nh.

- 355 -

LiÖu r« bèt cã thÓ hay kh«ng cã thÓ thùc hiÖn mét hµnh tr×nh nh vËy.

D÷ liÖu vµo ®îc cho bëi file RB.INP trong ®ã dßng thø nhÊt ghi sè N, trong N dßng tiÕp theo, dßng thø I ghi to¹ ®é cña ®iÓm thø I.

KÕt qu¶ ghi ra file RB.OUT nh sau: dßng thø nhÊt ghi sè 1/0 tuú theo cã hay kh«ng cã hµnh tr×nh; nÕu dßng thø nhÊt ghi sè 1, trong c¸c dßng tiÕp theo lÇn lît ghi hµnh tr×nh b»ng c¸c lÖnh sau:

H U V {híng ®Õn ®iÓm to¹ ®é (U,V), lÖnh nµy chØ xuÊt hiÖn mét lÇn duy nhÊt ban ®Çu ®Ó khëi t¹o hµnh tr×nh}

MOVETO U V {®i ®Õn ®iÓm to¹ ®é (U,V)}

LT {Quay tr¸i }

RT {Quay ph¶i}

STOP {LÖnh nµy chØ xuÊt hiÖn mét lÇn duy nhÊt ®Ó kÕt thóc hµnh tr×nh}

VÝ dô

RB.INP RB.OUT4 10 0 H 0 11 1 MOVETO 0 10 1 RT1 0 MOVETO 1 1

RTMOVETO 1 0RTMOVETO 0 0STOP

ThuËt gi¶i kh«ng ®Ö quy

Ta cã thÓ gi¶i bµi to¸n b»ng mét thuËt gi¶i ®Ö quy t¬ng tù nh bµi Chôp ¶nh. ThuËt gi¶i giíi thiÖu díi ®©y ®îc thÓ hiÖn bëi mét ch¬ng

- 356 -

tr×nh kh«ng ®Ö quy. ý c¬ b¶n lµ sau khi ®· chän ®îc I-1 ®iÓm trªn hµnh tr×nh, ®Ó chän ®iÓm thø I, nhiÒu nhÊt r« bèt cã hai lùa chän: ®ã lµ hai ®iÓm n»m ë hai phÝa kh¸c nhau ®èi víi ®iÓm thø I-1 trªn ®êng vu«ng gãc víi ®o¹n th¼ng nèi ®iÓm thø I-2 vµ ®iÓm thø I-1.

Ta dïng mét m¶ng hai chiÒu COTHE[1..2,1..N] ®Ó ghi nhËn c¸c ®iÓm nµy. Khi cÇn quay lui, cã hai kh¶ n¨ng:

Trong mét bíc tríc ®Êy, ta míi chØ xÐt mét trong hai kh¶ n¨ng rÏ, xÐt kh¶ n¨ng thø hai

C¶ hai kh¶ n¨ng ®Òu ®· xem xÐt hÕt, cÇn chän ®iÓm kh¸c chohµnh tr×nh.

Trong c¶ hai kh¶ n¨ng, ta chØ dïng m¶ng COTHE.

C¸c chi tiÕt cña thuËt gi¶i cã thÓ c¶m nhËn th«ng qua ch¬ng tr×nh víi c¸c gi¶i thÝch t¹i c¸c chç t¬ng øng.

Ch¬ng tr×nh

Const fi='rb.inp'; fo='rb.out'; mes1='H'; mes2='MOVETO'; mes3='LT'; mes4='RT'; mes5='STOP';type th=set of byte;var dd:Array[1..21] of longint; {Ghi nhan cac diem tren hanh trinh} fin,fout:text; sd:longint; {So diem tren hanh trinh} found:boolean; {bang True neu co hanh trinh}

- 357 -

a:array[1..20,1..2] of longint; {Toa do cac diem} qua:array[1..21] of byte; {QUA[I] = True khi va chi khi hanh trinh da qua diem I}{******************************}Procedure init;var ir:longint;beginfillchar(a,sizeof(a),0);fillchar(qua,sizeof(qua),0);assign(fin,fi);reset(fin);readln(fin,sd);for ir:=1 to sd do readln(fin,a[ir,1],a[ir,2]);Close(fin);end;{******************************}Procedure XULY;var i,j,nr:longint;s:th; cothe:array[1..2,1..16] of longint; chon:byte; {*************************} function kc(p1,p2:longint):real; {Tinh khoang cach giua hai diem} begin kc:=sqr(a[p1,2]-a[p2,2])+sqr(a[p1,1]-a[p2,1]) end;{kc} {*************************} function quay(p1,p2,p3:longint):boolean; {Bang TRUE <=> P1P2 vuong goc voi P2P3} var at,bt,ct:longint;

- 358 -

begin at:=sqr(a[p1,1]-a[p2,1])+sqr(a[p1,2]-a[p2,2]); bt:=sqr(a[p2,1]-a[p3,1])+sqr(a[p2,2]-a[p3,2]); ct:=sqr(a[p1,1]-a[p3,1])+sqr(a[p1,2]-a[p3,2]); quay:=(at+bt-ct=0); end;{QUAY} {*************************} function thang(c1,c2,c3:longint):boolean; {=TRUE neu cac diem thu C1,C2, C3 thang hang} begin thang:=(a[c1,1]-a[c2,1])*(a[c3,2]-a[c2,2])= (a[c1,2]-a[c2,2])*(a[c3,1]-a[c2,1]); end; {*************************} function ok(c1,c2,c3:longint):boolean; {Gia su C1, C2, C3 thang hang, OK bang TRUE <=> C2 nam giua C1 va C3} var o1,o2:boolean; begin o1:=(a[c1,1]-a[c2,1])*(a[c3,1]-a[c2,1])<0; o2:=(a[c1,2]-a[c2,2])*(a[c3,2]-a[c2,2])<0; ok:=o1 or o2; end;{OK} {*************************} Procedure TIM(p1,p2,m:longint); {Tim cac diem co the di chuyen den sau khi di tu P1 den P2 khi chon diem thu m cua hanh trinh} var id:longint; min,d:real; sd1:th; begin{TIM}

- 359 -

sd1:=[];min:=maxlongint; for id:=1 to sd do if (not(id in [p1,p2]))and(quay(p1,p2,id)) then begin sd1:=sd1+[id];d:=kc(p2,id); if d < min then begin min:=d;cothe[1,m]:=id end end; sd1:=sd1-[cothe[1,m]]; min:=maxlongint; While (sd1<>[]) do for id:=1 to sd do if id in sd1 then if (ok(cothe[1,n],p2,id))and(kc(p2,id)< min) then begin cothe[2,m]:=id;min:=kc(p2,id);sd1:=sd1-[id];end else sd1:=sd1-[id]; end;{TIM} {******************************} Procedure viet; var it,u,v,z,t:longint; begin dd[sd+1]:=1; writeLn(fout,1); Write(fout,mes1,' '); WriteLn(fout,a[dd[2],1]:4,' ' ,a[dd[2],2]:4); Write(fout,mes2); WriteLn(fout,a[dd[2],1]:4,' ' ,a[dd[2],2]:4); for it:=3 to sd + 1 do begin{FOR} u:=a[dd[it-1],1]-a[dd[it-2],1]; v:=a[dd[it-1],2]-a[dd[it-2],2]; z:=a[dd[it],1]-a[dd[it-1],1]; t:=a[dd[it],2]-a[dd[it-1],2];

- 360 -

if u*t>z*v then Writeln(fout,mes3) else Writeln(fout,mes4); write(fout,mes2); WriteLn(fout,a[dd[it],1]:4,' ' ,a[dd[it],2]:4); end; end;{VIET} {*************************}begin{XULY}s:=[];qua[1]:=1;dd[1]:=1;nr :=2;{NR la diem thu hai tren hanh trinh}while nr< sd do begin chon:=0; for i:=2 to sd do if (i<>nr)and thang(1,i,nr) and ok(1,i,nr) then begin chon:=1;break;end; if chon=1 then inc(nr) else begin{else}

dd[2]:=nr;qua[nr]:=1; fillchar(cothe,sizeof(cothe),0); i :=2; while i>1 do begin Tim(dd[i-1],dd[i],i); if (i=sd)and(1 in [cothe[1,i],cothe[2,i]]) then begin viet;found:=true;exit;end; if (cothe[1,i]<>0)and(qua[cothe[1,i]]=1) then cothe[1,i]:=0; if (cothe[2,i]<>0)and(qua[cothe[2,i]]=1) then cothe[2,i]:=0; {Quay lui} while (i>1)and(cothe[1,i]=0)and(cothe[2,i]=0) do begin qua[dd[i]]:=0;dd[i]:=0;i:=i-1;end; if i>1 then

- 361 -

begin inc(i); if cothe[1,i-1]=0 then begin dd[i]:=cothe[2,i-1];qua[cothe[2,i-1]]:=1;cothe[2,i-1]:=0; end else begin dd[i]:=cothe[1,i-1];qua[cothe[1,i-1]]:=1; cothe[1,i-1]:=0 end; end; end;{WHILE i>1} inc(nr); end;{else}end;{WHILE NR<SD}end;{************************}{MAIN}BEGINfound:=false;assign(fout,fo);rewrite(fout);init;xuly;if found then writeLn(fout,mes5) else writeln(fout,0);Close(fout)END.

8.3.C¸c thuËt gi¶i lo¹i chia ®Ó trÞ

ý tëng chia ®Ó trÞ (Divide - Conquer) lµ chuyÓn viÖc gi¶i mét bµi to¸n cã kÝch thíc lín vÒ viÖc gi¶i c¸c bµi to¸n cïng kiÓu nhng cã kÝch thíc nhá h¬n. Ta sÏ giíi thiÖu ý tëng nµy qua viÖc gi¶i mét sè bµi to¸n sau ®©y.

8.3. 1. Nh©n c¸c sè lín

- 362 -

Khi cÇn nh©n c¸c sè rÊt lín vît khái ph¹m vi khai b¸o sè cña c¸c ng«n ng÷ lËp tr×nh, cã rÊt nhiÒu c¸ch xö lý. Mét trong c¸c c¸ch ®ã lµ chuyÓn vÒ viÖc nh©n c¸c sè nhá h¬n.

Gi¶ sö A = 981 vµ B = 1234. Thay v× tÝnh trùc tiÕp 981x1234, ta tÝnh nh sau:

AxB = (09.102 + 81)(12. 102 + 34)

= (09.12) 104 + (09.34 + 81.12) 102 + 81.34

Nh vËy viÖc nh©n c¸c sè 4 ch÷ sè chuyÓn vÒ viÖc nh©n c¸c sè 2 ch÷ sè.

Mét c¸ch tæng qu¸t, nÕu A vµ B lµ hai sè nguyªn d¬ng ®Òu cã 2N ch÷ sè vµ ta cÇn nh©n A víi B. Ta biÓu diÔn A vµ B theo c¸c sè cã N ch÷ sè:

A.B = (w.10N + x)(y. 10N + z)

= w.y.102N + (x.y + w.z)10N + xz (*)

Nh vËy, viÖc nh©n c¸c sè 2N ch÷ sè ®a vÒ viÖc nh©n c¸c sè N ch÷ sè. NÕu N cßn lín, ta l¹i ®a viÖc nh©n c¸c sè N ch÷ sè ®a vÒ viÖc nh©n c¸c sè N div 2 ch÷ sè, . . . Qu¸ tr×nh ®ã tiÕp diÔn cho tíi khi ta chØ ph¶i nh©n c¸c sè nhá.

Chó ý r»ng víi c«ng thøc (*), ta ph¶i thùc hiÖn 4 phÐp nh©n c¸c sè nhá h¬n. B»ng c¸ch ®Æt

p = wy

q = xz

r = (w + x)(y + z)

ta cã

AxB = p102N + (r - p - q)10N + q

nh vËy, ®Ó tÝnh A.B, ta chØ cÇn thùc hiÖn 3 phÐp nh©n.

- 363 -

NÕu tiÕn hµnh nh©n hai sè 2N ch÷ sè b»ng c¸ch nh©n th«ng thêng, ta ph¶i thùc hiÖn 4N2 phÐp nh©n c¸c ch÷ sè th× theo c¸ch nµy, sè phÐp nh©n c¸c ch÷ sè chØ cßn cì 3N2.

8.3. 2. Luü thõa nhanh (Fast-Exp)

Trong nhiÒu t×nh huèng ta cÇn tÝnh AX víi X lµ mét sè nguyªn d¬ng lín. C¸ch lµm ®¬n gi¶n lµ dïng N-1 phÐp nh©n N thõa sè A víi nhau. Tuy nhiªn ta cã thÓ gi¶m bít sè phÐp nh©n xuèng chØ cßn cì logN b»ng c¸ch dïng c¸c c«ng thøc sau:

NÕu X = 2K th× AX = AK.AK;

NÕu X = 2K+1 th× AX = A.AK.AK;

Nh vËy ta ®a viÖc tÝnh luü thõa víi sè mò X vÒ viÖc tÝnh luü thõa víi sè mò X div 2. Khi ®ã sè phÐp nh©n cÇn tiÕn hµnh chØ cì logX.

8.3.3. T×m kiÕm nhÞ ph©n

XÐt bµi to¸n sau

I. Mét d·y sè ®¬n ®iÖu kh«ng gi¶m A1 £ A2 £ . . . £ AN vµ sè X

O. T×m chØ sè M sao cho X = AM nÕu cã, nÕu kh«ng th× t×m vÞ trÝ cã thÓ chÌn X vµo ®Ó d·y vÉn ®¬n ®iÖu kh«ng gi¶m.

C¸ch lµm ®¬n gi¶n thÓ hiÖn bëi ®o¹n ch¬ng tr×nh sau (Ta thªm vµo sè h¹ng A0 = -):

I:=0;

While (I<=N) And (A[I]<X) Do Inc(I);

If I<=N then

Begin

If A[[I]]=X then Writeln(X,’ la so hang thu ‘,I)

Else Writeln(‘Co the chen ‘,X,’ truoc so hang thu ‘,I);

End

- 364 -

Else Writeln(‘Co the chen ‘,X,’ vao cuoi day so ‘);

Theo c¸ch lµm nµy, trong trêng hîp xÊu nhÊt, ta cÇn N phÐp so s¸nh.

ThuËt gi¶i t×m kiÕm nhÞ ph©n tiÕn hµnh nh sau (Gi¶ sö cÇn t×m X trong ®o¹n chØ sè [I..J]):

Chia d·y sè lµm hai nöa ng¨n c¸ch bëi sè h¹ng AK;

NÕu X £ AK, t×m X trong ®o¹n c¸c sè h¹ng cã chØ sè [I..K], nÕu kh«ng, t×m X trong ®o¹n c¸c sè h¹ng cã chØ sè [K+1,J];

§èi víi hai ®o¹n nhá h¬n, ta l¹i lµm t¬ng tù.

Khi ®o¹n chØ sè thu vÒ mét chØ sè, ta biÖn luËn t¬ng tù nh trêng hîp t×m kiÕm ®¬n gi¶n. ThuËt gi¶i nµy chØ cÇn cì logN phÐp so s¸nh.

Ta xÐt diÔn biÕn cña thuËt gi¶i qua vÝ dô sau víi X = 12. Trong mçi bíc cña thuËt gi¶i, ta t×m ®o¹n chØ sè [I,J] sao cho X thuéc ®o¹n tõ AI ®Õn AJ. Ta b¾t ®Çu víi I = 1 vµ J = N.

I 1 2 3 4 5 6 7 8 9 10

11

AI -5 -2 0 3 8 8 9 12 12

26

31

X £ AK

I K J No

I K J Yes

I K J Yes

IK J No

IJ I = J KÕt thócKhi I = J = 8, ta cã X = A8.

Ta cã thÓ diÔn t¶ thuËt gi¶i b»ng thñ tôc sau:

Procedure BinarySearch(I,J:Chi So);

- 365 -

Var K:Chi So;

Begin

If I=J Then

Begin

If A[[I]]=X then Writeln(X,’ la so hang thu ‘,I)

Else Writeln(‘Co the chen ‘,X,’ truoc so hang thu ‘,I);

Exit;

End;

K:=(I+J) div 2;

If X<=A[K] then BinarySearch(I,K)

Else BinarySearch(K+1,J);

End;

8.3.4. S¾p xÕp nhanh (QuickSort)

Lẽ ra ta ®· tr×nh bµy bµi to¸n nµy trong ch¬ng tríc. Tuy nhiªn ta muèn tr×nh bµy ë ®©y ®Ó minh ho¹ cho môc ®Ých cña ch¬ng nµy, ®ã lµ ý tëng chia ®Ó trÞ trong thiÕt kÕ thuËt to¸n.

Ta cÇn s¾p xÕp d·y sè X1, . . ., XN thµnh mét d·y ®¬n ®iÖu kh«ng t¨ng. C¸ch s¾p xÕp ®¬n gi¶n nh trong VÝ dô 3 Môc 4.1 sÏ cÇn cì N2 thao t¸c so s¸nh. ThuËt gi¶i s¾p xÕp nhanh sÏ cho ®é phøc t¹p trung b×nh cì NlogN thao t¸c so s¸nh.

Gi¶ sö ta cÇn s¾p xÕp d·y con tõ sè h¹ng thø First ®Õn sè h¹ng thø Last XF, . . ., XL thµnh mét d·y ®¬n ®iÖu kh«ng t¨ng. Ta ph©n chia d·y ®ã thµnh hai d·y con, mét d·y con tríc gåm c¸c sè h¹ng lín h¬n hoÆc b»ng XF, mét d·y con sau gåm c¸c sè h¹ng nhá h¬n hoÆc b»ng XF. Sau ®ã ¸p dông c¸ch ®ã víi hai d·y con nhËn ®îc cho tíi khi d·y con chØ gåm mét sè h¹ng.

- 366 -

Mét ®iÒu thó vÞ lµ mÆc dï trong trêng hîp xÊu nhÊt, QuickSort cã ®é phøc t¹p cì N2 nhng trªn thùc tÕ, nãi chung QuickSort vÉn ch¹y nhanh h¬n so víi mét sè thuËt gi¶i s¾p xÕp víi ®é phøc t¹p thÊp h¬n trong trêng hîp xÊu nhÊt. Sau ®©y lµ ch¬ng tr×nh con thÓ hiÖn thuËt gi¶i. §Ó s¾p xÕp toµn bé d·y, ta gäi QuickSort(1,N).

Procedure QuickSort(f,l:so);vari,j:so;tg:so1;beginif f>=l then exit;i:=f+1;while (i<=l)and(x[i]>=x[f]) do inc(i);j:=l;while (j>f)and(x[j]<=x[f]) do dec(j);while i<j dobegintg:=x[i];x[i]:=x[j];x[j]:=tg;inc(i);while (i<=l)and(x[i]>=x[f]) do inc(i);dec(j);while (j>f)and(x[j]<=x[f]) do dec(j);end;tg:=x[f];x[f]:=x[j];x[j]:=tg;quicksort(f,j-1); quicksort(j+1,l);end;

Ta cã thÓ h×nh dung râ h¬n diÔn biÕn cña c¸c bíc trong thuËt gi¶i qua vÝ dô sau:

I 1 2 3 4 5 6 7 8 9 10 11 12AI 3 5 2 1 7 6 -2 4 8 1 6 -3

f i j l3 5 6 1 7 6 -2 4 8 1 2 -3

- 367 -

f i j l3 5 5 8 7 6 -2 4 1 1 2 -3f i j l3 5 5 8 7 6 4 -2 1 1 2 -3f j i l4 5 5 8 7 6 3 -2 1 1 2 -3

D·y A ®îc chia thµnh hai d·y ®o¹n con, ®o¹n ®Çu (6 sè h¹ng) gåm c¸c sè h¹ng lín h¬n 3 vµ ®o¹n sau (5 sè h¹ng) gåm c¸c sè h¹ng nhá h¬n 3.

8.4. C¸c thuËt gi¶i lo¹i tham lam

8.4.1. Mét sè thuËt gi¶i tham lam cho lêi gi¶i tèi u

C¸c thuËt gi¶i lo¹i tham lam (Greedy Algorithms) thêng ®îc dïng ®Ó gi¶i c¸c bµi to¸n tèi u.

Ta cã thÓ ph¸t biÓu bµi to¸n tèi u tæng qu¸t nh sau:

I. TËp h÷u h¹n B vµ mét hµm sè x¸c ®Þnh trªn tËp B.

O. T×m phÇn tö X0 thuéc B sao cho gi¸ trÞ f(X0) nhá nhÊt.

Râ rµng ta lu«n cã mét thuËt gi¶i tÇm thêng nh sau: Khëi t¹o gi¸ trÞ Min lín h¬n mäi gi¸ trÞ cã thÓ cã cña hµm f trªn tËp B; DuyÖt mäi phÇn tö cña tËp B, víi mçi phÇn tö X thuéc B, tÝnh gi¸ trÞ f(X); nÕu f(X)<Min th× thay Min b»ng f(X) vµ cho X0 = X.

Sau khi duyÖt hÕt mäi phÇn tö cña B, ta t×m ®îc X0. Tuy nhiªn, trong rÊt nhiÒu bµi to¸n, ta ph¶i ®èi diÖn víi tËp B cã sè lîng phÇn tö rÊt lín, khi ®ã, ®Ó duyÖt hÕt mäi phÇn tö cña B, ch¬ng tr×nh ch¹y rÊt l©u.

Ta nªn hiÓu ®óng ý nghÜa cña ch÷ tham lam, ®ã chØ lµ thuËt ng÷. Khi gi¶i mét bµi to¸n, ý tëng tham lam lµ ý tëng dùa trªn c¸c suy luËn hîp lý ®Ó x©y dùng lêi gi¶i; ch¼ng h¹n:

- 368 -

1. Cã N lo¹i tê tiÒn víi c¸c mÖnh gi¸ kh¸c nhau, cÇn tr¶ S ®ång víi mét sè Ýt nhÊt tê tiÒn; thuËt gi¶i lo¹i tham lam sÏ u tiªn chän c¸c lo¹i tiÒn cã mÖnh gi¸ lín víi hy väng sÏ dïng Ýt tê tiÒn.

2. CÇn ®i tõ nót giao th«ng U ®Õn nót giao th«ng V theo hµnh tr×nh ng¾n nhÊt; thuËt gi¶i lo¹i tham lam sÏ u tiªn chän c¸c ®o¹n ®êng cã ®é dµi nhá.

3. Cã N viÖc 1..N, viÖc I nÕu lµm kh«ng muén h¬n giê thø D I sÏ thu ®îc gi¸ trÞ GI, cÇn chän mét sè viÖc ®Ó lµm sao cho tæng gi¸ trÞ thu ®îc lµ lín nhÊt; thuËt gi¶i lo¹i tham lam sÏ u tiªn chän c¸c viÖc cã gi¸ trÞ lín h¬n.

C¸c ý tëng ®ã thêng cho ta mét thuËt gi¶i nhanh nhng kh«ng lu«n tèt nhÊt nÕu xem xÐt vÒ gi¸ trÞ cña lêi gi¶i so víi lêi gi¶i tèi u.

Trong môc nµy, ta sÏ giíi thiÖu mét sè bµi to¸n cã thuËt gi¶i lo¹i tham lam cho lêi gi¶i tèi u vµ sau ®ã sÏ giíi thiÖu kh¸i qu¸t vÒ lo¹i thuËt gi¶i nµy.

VÝ dô 1. Bµi to¸n ®æi tiÒn

Mét níc cã 5 lo¹i tiÒn lo¹i 1 cã mÖnh gi¸ 100 ®ång, lo¹i 2 cã mÖnh gi¸ 25 ®ång, lo¹i 3 cã mÖnh gi¸ 10 ®ång, lo¹i 4 cã mÖnh gi¸ 5 ®ång vµ lo¹i 5 cã mÖnh gi¸ 1 ®ång. CÇn tr¶ S ®ång, vÝ dô 289 ®ång.

ThuËt gi¶i tham lam dùa trªn ý tëng khi tr¶ mét kho¶n tiÒn nµo ®ã, u tiªn chän lo¹i tiÒn mÖnh gi¸ cao nhÊt cã thÓ ®îc:

Dïng 2 tê tiÒn lo¹i 1 (100), tr¶ ®îc 200 cßn l¹i 89 ®ång,

Dïng 3 tê tiÒn lo¹i 2 (25), tr¶ ®îc 75 cßn l¹i 14 ®ång,

Dïng 1 tê tiÒn lo¹i 3 (10), tr¶ ®îc 10 cßn l¹i 4 ®ång,

Dïng 4 tê tiÒn lo¹i 5 (1), tr¶ 4 ®ång,

B»ng to¸n häc, ta cã thÓ chøng minh ®îc r»ng víi bÊt kú lîng tiÒn S nµo, c¸ch tr¶ nh vËy ®Òu cho sè tê tiÒn Ýt nhÊt. Tuy nhiªn thuËt gi¶i nµy nÕu ¸p dông ®èi víi bµi to¸n tr¶ tiÒn bÊt kú ®îc ph¸t biÓu díi

- 369 -

®©y sÏ kh«ng lu«n cho lêi gi¶i tèi u. Ta sÏ trë l¹i bµi to¸n nµy trong ch¬ng Quy ho¹ch ®éng.

Bµi to¸n tr¶ tiÒn

I. N lo¹i tiÒn 1..N víi c¸c mÖnh gi¸ nguyªn d¬ng G1, . . ., GN ®ång vµ cÇn tr¶ S nguyªn d¬ng ®ång.

O. CÇn biÕt hoÆc kh«ng thÓ tr¶ ®îc hoÆc c¸ch tr¶ S ®ång víi sè tê tiÒn Ýt nhÊt.

VÝ dô 2. Bµi to¸n c©y khung nhá nhÊt

I. §å thÞ v« híng liªn th«ng cã träng sè G;

O. C©y khung cã tæng c¸c träng sè cña c¸c c¹nh (ta sÏ gäi ®¹i lîng nµy lµ ®é dµi c©y khung) nhá nhÊt.

Cã hai thuËt gi¶i ®Òu thuéc lo¹i tham lam thêng dïng ®èi víi bµi to¸n nµy, thuËt gi¶i Prim (Ngêi l¸ng giÒng gÇn nhÊt) vµ thuËt gi¶i Kruscal (Ngêi tham ¨n). Sau ®©y ta sÏ giíi thiÖu thuËt gi¶i Kruscal.

ý tëng tham lam cña thuËt gi¶i nµy lµ ®Ó x©y dùng mét c©y khung víi ®é dµi nhá nhÊt, c©y khung ph¶i gåm c¸c c¹nh cã träng sè cµng nhá cµng tèt nÕu cã thÓ ®îc.

Bíc 0. Khëi t¹o sè c¹nh S thuéc c©y khung b»ng 0;

Bíc 1. S¾p xÕp c¸c c¹nh cña ®å thÞ theo thø tù cã träng sè kh«ng gi¶m, cã nghÜa lµ nÕu ký hiÖu träng sè c¹nh e lµ C(e) th× s¾p xÕp c¸c c¹nh thµnh d·y

e1, e2, . . ., eM

sao cho

C(e1) £ C(e1) £ . . . . £.C(eM);

Bíc 2. Víi I ®i tõ 1 ®Õn M, xÐt c¹nh eI.

- 370 -

Bíc 2.1. NÕu c¹nh eI kh«ng lËp thµnh chu tr×nh víi mét sè trong c¸c c¹nh ®· chän vµo c©y khung th× kÕt n¹p c¹nh eI vµo c©y khung;

Bíc 2.1. NÕu sè c¹nh cña c©y khung b»ng N-1 th× kÕt thóc.

Ngêi ta chøng minh ®îc r»ng thuËt gi¶i nµy cho ta c©y khung nhá nhÊt.

VÝ dô 3. Bµi to¸n xÕp ba l« (Knapsack)

I. Sè nguyªn d¬ng N, N sè thùc d¬ng A1, A2, . . ., AN, N sè thùc d¬ng G1, G2, . . ., GN; sè thùc d¬ng M;

O. CÇn t×m N sè thùc d¬ng X1, X2, . . ., XN, sao cho c¸c ®iÒu kiÖn sau ®îc tho¶ m·n:

1. Víi 1£I£N, 0£ XI£1;

2. X1A1 £ M;

3. X1G1 ®¹t gi¸ trÞ lín nhÊt.

Bµi to¸n nµy cã tªn lµ xÕp ba l« do ta cã thÓ minh ho¹ nh sau. Cã N lo¹i hµng víi kÝch thíc A1, A2, . . ., AN, t¬ng øng cã gi¸ trÞ G1, G2, . . ., GN vµ mét ba l« cã kÝch thíc M. Do kÝch thíc ba l« cã h¹n, víi mçi lo¹i hµng I, ta chØ cã thÓ chän mét phÇn XI trong ph¹m vi tõ 0 ®Õn 1 (®iÒu kiÖn 1) ®Ó xÕp vµo ba l«, ®iÒu kiÖn 2 cã nghÜa lµ tæng kÝch thíc c¸c hµng xÕp vµo ba l« kh«ng vît qu¸ kÝch thíc ba l« vµ ®iÒu kiÖn 3 cã nghÜa lµ tæng gi¸ trÞ hµng xÕp vµo ba l« lµ lín nhÊt.

XÐt vÝ dô víi N = 5, M = 100 vµ c¸c AI, GI cho trong b¶ng sau:

I 1 2 3 4 5A 10 20 30 40 50G 20 30 66 40 60

G/A 2 1,5 2,2 1 1,2

- 371 -

Cã ba c¸ch tham lam:

C¸ch thø nhÊt: ¦u tiªn lo¹i hµng kÝch thíc nhá h¬n xÕp vµo ba l« víi hy väng cã nhiÒu lo¹i hµng th× gi¸ trÞ cµng lín. Víi c¸ch nµy, ta chän toµn bé c¸c lo¹i hµng1, 2, 3, 4 (X1 = 1, X2 = 1,X3 = 1, X4 = 1, X5 = 0) vµ thu ®îc tæng gi¸ trÞ 156.

C¸ch thø hai: ¦u tiªn lo¹i hµng cã gi¸ trÞ lín h¬n xÕp vµo ba l« víi hy väng cã nhiÒu lo¹i hµng gi¸ trÞ lín th× tæng gi¸ trÞ sÏ lín. Víi c¸ch nµy, ta chän toµn bé lo¹i hµng 3, 5, mét nöa lo¹i hµng 4 (X1 = 0, X2 = 0,X3 = 1, X4 = 1/2, X5 = 0) vµ thu ®îc tæng gi¸ trÞ 146.

C¸ch thø ba: ¦u tiªn lo¹i hµng cã mËt ®é gi¸ trÞ lín h¬n xÕp vµo ba l« víi hy väng khi ®ã víi cïng kÝch thíc ba l«, mËt ®é gi¸ trÞ cao th× tæng gi¸ trÞ cµng lín; mËt ®é gi¸ trÞ ®îc tÝnh b»ng tû sè gi÷a G vµ A. Víi c¸ch nµy, ta chän toµn bé lo¹i hµng 1, 2, 3, 4/5 lo¹i hµng 5 (X1 = 1, X2 = 2,X3 = 3, X4 = 0, X5 = 4/5) vµ thu ®îc tæng gi¸ trÞ 164.

C¸ch tham lam thø ba quan t©m ®Õn c¶ sè lîng vµ chÊt lîng nªn ®¹t ®îc tæng gi¸ trÞ lín nhÊt.

Trong trêng hîp tæng qu¸t, ta còng cã thÓ chøng tá ®îc r»ng thuËt gi¶i dùa trªn c¸ch tham lam thø ba cho lêi gi¶i tèi u.

Ta tr×nh bµy thuËt gi¶i nµy mét c¸ch tæng qu¸t nh sau.

Bíc 1. S¾p xÕp c¸c lo¹i hµng theo thø tù cã mËt ®é kh«ng t¨ng: tªn c¸c lo¹i hµng ®îc s¾p xÕp c¸c c¹nh thµnh d·y

I1, I2, . . ., INsao cho

G(I1)/A(I1) G(I2)/A(I2) . . . G(IN)/A(IN);

Khëi t¹o MM (phÇn kÝch thíc cßn l¹i cña ba l«) = M;

Bíc 2. Víi J ®i tõ 1 ®Õn N, xÐt vËt thø IJ,

- 372 -

NÕu MM (phÇn kÝch thíc ba l« cßn l¹i) A(IJ) th× cho X(IJ) = 1, thay MM b»ng MM - A(IJ) vµ nÕu MM = 0 th× kÕt thóc;

NÕu kh«ng th× cho cho X(IJ) = MM/A(IJ) vµ kÕt thóc;

Sau ®©y lµ mét ch¬ng tr×nh cµi ®Æt thuËt gi¶i nµy. Th«ng tin vµo ®îc cho bëi file v¨n b¶n víi tªn BALO.INP trong ®ã dßng thø nhÊt ghi hai sè N vµ M, trong N dßng tiÕp theo, dßng thø I ghi hai sè AI vµ GI.

{$M 65000,0,655360}{Xep N loai hang vao ba lo sao cho TGT dat max}const fi='balo.inp'; fo='balo.out';var cs,a,g:array[1..1000] of word; x:array[1..1000] of real; n:word;m:real; f:text; ts:real;procedure nhap;var i:word;beginassign(f,fi);reset(f);readln(f,n,m);for i:=1 to n do readln(f,a[i],g[i]);close(f);for i:=1 to n do cs[i]:=i;end;procedure quicksort(dau,cuoi:word);var t,i,j:word;

- 373 -

beginif dau>=cuoi then exit;i:=dau+1;while (i<=cuoi)and(g[i]/a[i]>=g[dau]/a[dau]) do inc(i);j:=cuoi;while (j>dau)and(g[j]/a[j]<=g[dau]/a[dau]) do dec(j);while i<j do begin t:=g[i];g[i]:=g[j];g[j]:=t; t:=a[i];a[i]:=a[j];a[j]:=t; t:=cs[i];cs[i]:=cs[j];cs[j]:=t; inc(i); while (i<=cuoi)and(g[i]/a[i]>=g[dau]/a[dau]) do inc(i); dec(j); while (j>dau)and(g[j]/a[j]<=g[dau]/a[dau]) do dec(j); end;t:=g[dau];g[dau]:=g[j];g[j]:=t;t:=a[dau];a[dau]:=a[j];a[j]:=t;t:=cs[dau];cs[dau]:=cs[j];cs[j]:=t;quicksort(dau,j-1); quicksort(j+1,cuoi);end;procedure xep;var k:word;begints:=0;for k:=1 to n do begin if a[k]<=m then begin x[cs[k]]:=1;ts:=ts+g[k];m:=m-a[k]; end else begin x[cs[k]]:=m/a[k];ts:=ts+x[cs[k]]*g[k];m:=0;end; end;

- 374 -

end;procedure viet;var i,m:word;beginassign(f,fo);rewrite(f);writeln(f,ts:0:2);for i:=1 to n do writeln(f,x[i]:0:2);close(f);end;BEGINnhap;quicksort(1,n);xep;viet;END.

VÝ dô 4. Chän c«ng viÖc

Cã N viÖc ®¸nh sè tõ 1 ®Õn N, mäi viÖc ®Òu ph¶i lµm viÖc liªn tôc trong mét giê. ViÖc I nÕu hoµn thµnh kh«ng muén h¬n giê DI sÏ thu ®îc gi¸ trÞ GI. CÇn chän mét sè viÖc lµm ®Ó tæng gi¸ trÞ thu ®îc nhiÒu nhÊt.

ThuËt gi¶i

Ta sÏ u tiªn chän lµm viÖc cã gi¸ trÞ nhiÒu h¬n. Tuy nhiªn, cã mét chi tiÕt quan träng. Tuy r»ng khi chän lµm viÖc U nµo ®ã, tuy r»ng chØ cÇn lµm kh«ng muén h¬n giê thø DU nhng cÇn “nghÜ ®Õn” c¸c viÖc chän tiÕp theo cã thÓ cã thêi h¹n sím h¬n. Do ®ã, diÔn biÕn cña thuËt gi¶i nh sau:

Bíc 1. S¾p xÕp tr×nh tù c¸c c«ng viÖc theo gi¸ trÞ kh«ng t¨ng

I1, I2, . . ., INsao cho

G(I1) G(I2) . . . G(IN);

- 375 -

Bíc 2. Víi mçi viÖc IJ víi J lÇn lît tõ 1 ®Õn N, nÕu trong c¸c giê tõ 1 ®Õn D(IJ) cßn giê cha lµm viÖc nµo, chän giê muén nhÊt vµ ghi nhËn giê ®ã ®· lµm viÖc, nÕu kh«ng, tõ chèi viÖc ®ã.

Ta còng cã thÓ chøng tá ®îc thuËt gi¶i cho lêi gi¶i tèi u.

{$M 65000,0,655360}const fi='job.inp'; fo='job.out';type ch=array[0..60000] of boolean; m=array[1..10000] of word;var cs:m; chon,d:^m;{dung mang dong de tang kich thuoc vung nho} g:array[1..10000] of longint; roi:^ch; n:word; f:text; t:longint;procedure nhap;var i:word;beginassign(f,fi);reset(f);readln(f,n);for i:=1 to n do readln(f,d^[i],g[i]);close(f);end;procedure quicksort(dau,cuoi:word);var t,i,j:word;begin

- 376 -

if dau>=cuoi then exit;i:=dau+1;while (i<=cuoi)and(g[i]>=g[dau]) do inc(i);j:=cuoi;while (j>dau)and(g[j]<=g[dau]) do dec(j);while i<j do begin t:=g[i];g[i]:=g[j];g[j]:=t; t:=d^[i];d^[i]:=d^[j];d^[j]:=t; t:=cs[i];cs[i]:=cs[j];cs[j]:=t; inc(i); while (i<=cuoi)and(g[i]>=g[dau]) do inc(i); dec(j); while (j>dau)and(g[j]<=g[dau]) do dec(j); end;t:=g[dau];g[dau]:=g[j];g[j]:=t;t:=d^[dau];d^[dau]:=d^[j];d^[j]:=t;t:=cs[dau];cs[dau]:=cs[j];cs[j]:=t;quicksort(dau,j-1); quicksort(j+1,cuoi);end;procedure tim;var i,j:word;beginfor i:=1 to n do cs[i]:=i;quicksort(1,n);fillchar(roi^,sizeof(roi^),false);fillchar(chon^,sizeof(chon^),0);for i:=1 to n do begin j:=d^[i]; while (j>0)and roi^[j] do dec(j); if j>0 then

- 377 -

begin roi^[j]:=true;inc(t,g[i]);chon^[cs[i]]:=j; end; end;end;procedure viet;var i:word;beginassign(f,fo);rewrite(f);writeln(f,t);for i:=1 to n do if chon^[i]>0 then writeln(f,i:6,chon^[i]:6);close(f);end;BEGINnew(chon);new(roi);new(d);nhap;tim;viet;dispose(chon);dispose(roi);dispose(d);END.

8.4.2. ThuËt gi¶i xÊp xØ

Khi gi¶i c¸c bµi to¸n, viÖc thiÕt kÕ thuËt gi¶i ph¶i b¶o ®¶m hai tiªu chÝ:

TÝnh ®óng ®¾n: cho lêi gi¶i ®óng.

TÝnh hiÖu qu¶: ch¬ng tr×nh diÔn t¶ thuËt gi¶i ph¶i ch¹y nhanh.

Hai tiªu chÝ nµy nhiÒu khi kh«ng lu«n ®îc tho¶ m·n ®èi víi nhiÒu líp bµi to¸n. §èi víi c¸c bµi to¸n nh vËy, mét gi¶i ph¸p lµ ta sÏ hy sinh phÇn nµo tÝnh ®óng ®¾n ®Ó ®æi lÊy viÖc cã thÓ thiÕt kÕ thuËt gi¶i hiÖu qu¶. §ã lµ c¸ch tiÕp cËn ®Ó x©y dùng c¸c thuËt to¸n xÊp xØ. ViÖc thiÕt kÕ c¸c thuËt gi¶i lo¹i nµy còng thêng dùa trªn ý tëng

- 378 -

tham lam. Tuy nhiªn, ý tëng tham lam kh«ng lu«n cho lêi gi¶i tèi u mµ chØ cho lêi gi¶i xÊp xØ víi lêi gi¶i tèi u.

Mét thuËt gi¶i xÊp xØ XX cho bµi to¸n tèi u cã hai ®Æc ®iÓm sau:

1. Ch¬ng tr×nh cµi ®Æt thuËt gi¶i ch¹y nhanh (ThuËt gi¶i cã ®é phøc t¹p tÝnh to¸n thÊp).

2. NÕu gi¸ trÞ ®óng cña lêi gi¶i ®èi víi Input I lµ OPT(I), gi¸ trÞ ®¹t ®îc cña thuËt gi¶i XX lµ A(I) th× XX(I) xÊp xØ gi¸ trÞ cña OPT(I).

ThuËt gi¶i xÊp xØ cµng tèt nÕu ®é sai kh¸c gi÷a lêi gi¶i chÝnh x¸c vµ lêi gi¶i xÊp xØ cµng nhá.

ViÖc ®¸nh gi¸ ®é sai kh¸c nµy kh«ng ®¬n gi¶n vµ thêng lµ c«ng viÖc tÝnh to¸n rÊt phøc t¹p. Khi cã mét thuËt gi¶i xÊp xØ XX, ta muèn cã mét ®¸nh gi¸ ®Òu ®é xÊp xØ theo mäi Input I cã nghÜa lµ ta muèn cã mét ®¸nh gi¸ cã d¹ng víi mäi I, XX(I) = a.OPT(I) + b trong ®ã a vµ b lµ hai h»ng sè kh«ng phô thuéc I. NÕu cã ®îc ®¸nh gi¸ nh vËy, khi dïng gi¶i thuËt xÊp xØ gi¶i c¸c bµi to¸n thùc tÕ, ta cã thÓ íc lîng ®îc ‘gi¸” ta ph¶i tr¶ ®Ó ®æi lÊy mét gi¶i ph¸p ®Ó gi¶i quyÕt c«ng viÖc kÞp thêi.

Sau ®©y ta sÏ giíi thiÖu hai thuËt to¸n xÊp xØ cho bµi to¸n Bin-Packing.

Bµi to¸n Bin-Packing (§ãng thïng)

I. Hai sè nguyªn d¬ng N, B vµ N sè nguyªn d¬ng A1, . . ., AN, c¸c AI£B.

O. T×m c¸ch ph©n chia tËp c¸c chØ sè {1..N} thµnh R tËp con kh«ng rçng rêi nhau tõng ®«i C1, . . ., CR, sao cho c¸c ®iÒu kiÖn sau ®îc tho¶ m·n

1. Víi 1£S£R, tæng c¸c AJ víi J thuéc CS kh«ng lín h¬n B.

2. Sè R nhá nhÊt cã thÓ ®îc.

- 379 -

Bµi to¸n nµy cã thÓ minh ho¹ nh sau. Cã N vËt 1..N, vËt I cã kÝch thíc AI vµ mét lo¹t thïng cã kÝch thíc B. H·y t×m c¸ch xÕp N vËt vµo mét sè thïng sao cho sè thïng cÇn dïng lµ Ýt nhÊt. Mçi tËp con CS thÓ hiÖn c¸c ®å vËt chän xÕp vµo thïng thø S, ®iÒu kiÖn 1 chÝnh lµ tæng c¸c kÝch thíc cña c¸c vËt nµy kh«ng qu¸ kÝch thíc thïng. ChÝnh do minh ho¹ nµy, bµi to¸n cã tªn lµ Bin-Packing.

TÊt nhiªn, mét lêi gi¶ tÇm thêng cña bµi to¸n lµ dïng N thïng, mçi thïng xÕp mét vËt.

Sau ®©y ta sÏ tr×nh bµy hai thuËt gi¶i xÊp xØ cho bµi to¸n nµy.

ThuËt gi¶i FF (First-Fit)

Khëi t¹o

LÊy N sè B1 = . . . = BN = B; N tËp C1, . . ., CN ®Òu lµ tËp trèng;

LÆp

Víi mçi I ®i tõ 1 ®Õn N {Vßng lÆp 1},

Víi J ®i tõ 1 ®Õn N {Vßng lÆp 2}, nÕu AI=BJ th×

Ghi nhËn I thuéc CJ;

Gi¶m BJ ®i AI ®¬n vÞ;

Ng¾t vßng lÆp 2;

Sè R cÇn t×m lµ sè mµ b¾t ®Çu tõ c¸c chØ sè I tõ R+1 ®Õn N, c¸c tËp CI vÉn lµ tËp trèng hay t¬ng ®¬ng c¸c sè BI vÉn b»ng B.

Theo minh ho¹ cña bµi to¸n, ta cã thÓ diÔn ®¹t thuËt gi¶i nh sau:

XÕp mét d·y thïng kh«ng {Khëi t¹o}

LÇn lît cÇm vËt I víi I tõ 1 ®Õn N {Vßng lÆp 1}

§i däc theo d·y thïng lÇn lît tõ thïng 1 {Vßng lÆp 2}

- 380 -

Chän thïng J ®Çu tiªn cã thÓ xÕp vËt I vµo;{Ch¾c ch¾n cã}

XÕp vËt I vµo thïng J;

Quay vÒ lÊy vËt I+1;{Ng¾t vßng lÆp 2}

ThuËt gi¶i nµy do Johnson thiÕt kÕ. §iÒu ®Æc biÖt lµ «ng ®· chøng minh ®îc r»ng víi mäi Input I, ta cã

FF(I)=17OPT(I)/10 + 2

Sau ®©y lµ ch¬ng tr×nh cµi ®Æt thuËt gi¶i nµy.

const fi='bin.inp'; fo='bin.out';var sv,a,c:array[1..100] of longint; x:array[1..100,1..100] of longint; b,n,s:longint; f:text;procedure nhap;var i:longint;beginassign(f,fi);reset(f);readln(f,n,b);for i:=1 to n do readln(f,a[i]);close(f);end;procedure xep;var i,j:longint;beginfor i:=1 to n do begin c[i]:=b;sv[i]:=0;end;for i:=1 to n do

- 381 -

begin j:=1; while a[i]>c[j] do inc(j); inc(sv[j]);x[j,sv[j]]:=i;dec(c[j],a[i]); end;s:=n;while c[s]=b do dec(s);end;procedure viet;var i,j:longint;beginassign(f,fo);rewrite(f);writeln(f,s);for i:=1 to s do begin for j:=1 to sv[i] do write(f,x[i,j]:4);writeln(f); end;close(f);end;BEGINnhap;xep;viet;END.

Johnson còng thiÕt kÕ mét thuËt gi¶i kh¸c cho bµi to¸n Bin-Packing. ThuËt gi¶i nµy cã tªn lµ FFD.

ThuËt gi¶i FFD (First-Fit Decreasing)

Bíc 1. S¾p xÕp d·y A1, . . ., AN, thµnh mét d·y kh«ng t¨ng

AI1 £ . . . £ AIN (*)

Bíc 2. Dïng thuËt gi¶i FF ®èi víi d·y (*).

Sau ®©y lµ ch¬ng tr×nh cµi ®Æt thuËt gi¶i nµy.

const fi='bin.inp';

- 382 -

fo='bin.out';var sv,a,c,cs:array[1..100] of longint; x:array[1..100,1..100] of longint; b,n,s:longint; f:text;procedure nhap;var i:longint;beginassign(f,fi);reset(f);readln(f,n,b);for i:=1 to n do readln(f,a[i]);close(f);end;procedure sapxep;var i,j,t:longint;beginfor i:=1 to n do cs[i]:=i;for i:=1 to n-1 dofor j:=i+1 to n do if a[i]<a[j] then begin t:=a[i];a[i]:=a[j];a[j]:=t; t:=cs[i];cs[i]:=cs[j];cs[j]:=t; end;end;procedure xep;var i,j:longint;beginfor i:=1 to n do begin c[i]:=b;sv[i]:=0;end;for i:=1 to n do

- 383 -

begin j:=1; while a[i]>c[j] do inc(j); inc(sv[j]);x[j,sv[j]]:=cs[i];dec(c[j],a[i]); end;s:=n;while c[s]=b do dec(s);end;procedure viet;var i,j:longint;beginassign(f,fo);rewrite(f);writeln(f,s);for i:=1 to s do begin for j:=1 to sv[i] do write(f,x[i,j]:4);writeln(f); end;close(f);end;BEGINnhap;sapxep;xep;viet;END.Johnson ®· chøng minh ®îc r»ng víi mäi Input I, ta cã

FF(I)=11OPT(I)/9 + 4

8.5. ThuËt gi¶i lo¹i quy ho¹ch ®éng

Quy ho¹ch ®éng lµ mét híng nghiªn cøu trong lÜnh vùc tèi u ho¸. Nh÷ng c«ng tr×nh nghiªn cøu c¬ b¶n ®Çu tiªn thuéc vÒ hai nhµ to¸n häc R. Bellman (Mü) vµ L. Pontriagin (Liªn X« cò). Trong ph¹m vi gi¸o tr×nh nµy, ta sÏ kh«ng tr×nh bµy mét c¸ch hoµn chØnh vÒ quy ho¹ch ®éng mµ chØ giíi thiÖu c¸ch dïng ph¬ng ph¸p quy ho¹ch ®éng ®Ó thiÕt kÕ mét sè thuËt gi¶i cho mét sè bµi to¸n.

- 384 -

Quy ho¹ch ®éng thêng dïng ®Ó gi¶i c¸c bµi to¸n trong ®ã ta cÇn t×m mét lêi gi¶i tèt nhÊt theo mét nghÜa nµo ®ã, mét lêi gi¶i nh vËy ®îc gäi lµ lêi gi¶i tèi u. ý tëng c¬ b¶n cña quy ho¹ch ®éng cã thÓ nãi v¾n t¾t nh sau. Khi t×m lêi gi¶i tèi u cho mét bµi to¸n cã kÝch thíc K, ta gi¶ sö ®· cã lêi gi¶i tèi u cho bµi to¸n cã kÝch thíc nhá h¬n K vµ lêi gi¶i tèi u cho bµi to¸n kÝch thíc K sÏ ®îc x©y dùng b»ng c¸ch tæng hîp mét c¸ch thÝch hîp c¸c lêi gi¶i ®èi víi c¸c bµi to¸n cã kÝch thíc nhá h¬n. §ã lµ sù vËn dông vÒ mÆt tÝnh to¸n cña nguyªn lý tèi u, mét nguyªn lý nÒn t¶ng cña quy ho¹ch ®éng.

Tuy cïng dùa vµo viÖc gi¶i c¸c bµi to¸n cã kÝch thíc nhá h¬n ®Ó gi¶i c¸c bµi to¸n kÝch thíc lín h¬n nhng ta cã thÓ ph©n biÖt c¸c thuËt gi¶i l¹i quy ho¹ch ®éng víi c¸c thuËt gi¶i lo¹i chia ®Ó trÞ nh sau: c¸c thuËt gi¶i thuéc lo¹i quy ho¹ch ®éng diÔn biÕn theo kiÓu Bottom-Up cßn c¸c thuËt gi¶i thuéc lo¹i chia ®Ó trÞ diÔn biÕn theo kiÓu Top-Down.

§Ó minh ho¹ cho ý tëng nµy, ta sÏ tr×nh bµy viÖc gi¶i mét sè bµi to¸n b»ng ph¬ng ph¸p quy ho¹ch ®éng vµ sau ®ã ta sÏ nh¾c l¹i mét sè nÐt chung khi sö dông ph¬ng ph¸p nµy.

8.5.1. D·y con ®¬n ®iÖu dµi nhÊt

Mét d·y sè ®îc gäi lµ ®¬n ®iÖu nÕu hoÆc ®¬n ®iÖu t¨ng (sã h¹ng tríc nhá h¬n sè h¹ng sau) hoÆc ®¬n ®iÖu gi¶m (sè h¹ng tríc lín h¬n sè h¹ng sau).

Cho mét d·y sè nguyªn gåm N sè h¹ng, N<=1000.

H·y t×m c¸ch xo¸ ®i mét sè Ýt nhÊt sè h¹ng ®Ó d·y cßn l¹i lµ mét d·y ®¬n ®iÖu. §Ó cho tiÖn, ta sÏ ký hiÖu d·y con nhËn ®îc lµ DC.

VÝ dô víi d·y gåm 7 sè h¹ng

1 2 3 2 3 4 6

- 385 -

sau khi xo¸ ®i c¸c sè h¹ng thø 4 vµ thø 5, ta nhËn ®îc d·y con ®¬n ®iÖu dµi nhÊt.

D÷ liÖu vµo ®îc cho bëi file DCDDDN.INP trong ®ã dßng thø nhÊt ghi sè N, tiÕp theo lµ N dßng, mçi dßng ghi mét sè h¹ng cña d·y lÇn lît tõ sè h¹ng thø nhÊt ®Õn sè h¹ng thø N.

KÕt qu¶ ghi ra file DCDDDN.OUT nh sau: dßng thø nhÊt ghi sè B lµ sè lîng sè h¹ng xo¸ ®i, dßng thø hai ghi sè 1/2 tuú theo d·y cßn l¹i lµ ®¬n ®iÖu t¨ng hay gi¶m; nÕu B>0, trong B dßng tiÕp theo, mçi dßng ghi chØ sè mét sè h¹ng bÞ xo¸ ®i.

Víi vÝ dô trªn, c¸c file IN/OUT t¬ng øng lµ:

DCDDDN.INP DCDDDN.INP7 21 12 43 52346

ThuËt gi¶i

Ta sÏ chØ tr×nh bµy viÖc t×m d·y con ®¬n ®iÖu t¨ng dµi nhÊt (viÕt t¾t lµ DCT). ViÖc t×m d·y con ®¬n ®iÖu gi¶m dµi nhÊt tiÕn hµnh t-¬ng tù. Sau ®ã ta sÏ chän d·y con dµi h¬n trong hai d·y con nhËn ®-îc lµm DC.

Chó ý r»ng víi d·y A[1..N] cho tríc, mét DCT cña A kh«ng nhÊt thiÕt kÕt thóc t¹i sè h¹ng thø N. Do ®ã víi mçi chØ sè I, 1 £ I £ N, ta ký hiÖu T[I] lµ ®é dµi d·y con ®¬n ®iÖu t¨ng cã sè h¹ng cuèi cïng lµ A[I] vµ víi d·y ®ã, TruocT[I] ký hiÖu chØ sè cña sè h¹ng ngay tríc sè h¹ng A[I] trong d·y con.

- 386 -

Víi mäi I, ta dÔ dµng khëi t¹o T[I] = 1 vµ TruocT[I] = 0.

Sau ®ã, víi mçi I>1, xÐt mäi J<I, nÕu (A[I]>A[J]) vµ (T[I] (®ang cã) < T[J] + 1) th× thay T[I] = T[J] + 1 vµ ghi nh©n TruocT[I] = J.

Cuèi cïng, so s¸nh mäi T[I] ta sÏ t×m ®îc ®é dµi DCT vµ DCT ®îc x¸c ®Þnh bëi m¶ng TruocT.

Sau ®©y lµ ch¬ng tr×nh cµi ®Æt thuËt gi¶i.

const fi='dcdddn.inp'; fo='dcdddn.out';var n,cstmax,csgmax,tmax,gmax:longint; {T: don dieu tang; G: don dieu giam} a:array[1..1000] of longint; truoct,truocg,t,g:array[0..1000] of longint; {T[i]/G[i]: do dai day con don dieu tang/giam dai nhat ket thuc tai a[i]} {Truoct[i]/Truocg[i]: chi so cua phan tu truoc a[i] trong day con don dieu tang/giam dai nhat ket thuc tai a[i]} f:text;procedure nhap;var i:longint;beginassign(f,fi);reset(f);readln(f,n);for i:=1 to n do readln(f,a[i]);close(f);end;procedure tinht;var i,j:longint;begin

- 387 -

for i:=1 to N do begin t[i]:=1;truoct[i]:=0;end;tmax:=1; cstmax:=1;for i:=2 to N dobeginfor j:=1 to i-1 do if (A[j]<A[i]) and (t[i]<t[j]+1) then begin truoct[i]:=j;t[i]:=t[j]+1;end;if t[i]>tmax then begin tmax:=t[i];cstmax:=i;end;end;end;procedure tinhg;var i,j:longint;beginfor i:=1 to N do begin g[i]:=1;truocg[i]:=0;end;gmax:=1; csgmax:=1;for i:=2 to N dobeginfor j:=1 to i-1 do if (A[j]>A[i]) and (g[i]<g[j]+1) then begin truocg[i]:=j;g[i]:=g[j]+1;end;if g[i]>gmax then begin gmax:=g[i];csgmax:=i;end;end;end;procedure viet;var i:longint; day:array[0..1000] of longint;beginfillchar(day,sizeof(day),0);assign(f,fo);rewrite(f);if tmax>=gmax then begin writeln(f,n-tmax); writeln(f,1);

- 388 -

if tmax<n then begin for i:=1 to tmax do begin day[cstmax]:=1;cstmax:=truoct[cstmax];end; for i:=1 to n do if day[i]=0 then writeln(f,i); end; endelse begin writeln(f,n-gmax); writeln(f,2); if gmax<n then begin for i:=1 to gmax do begin day[csgmax]:=1;csgmax:=truocg[csgmax];end; for i:=1 to n do if day[i]=0 then writeln(f,i); end; end;close(f);end;BEGINnhap;tinht;tinhg;viet;END.

8.5.2. X©u con chung dµi nhÊt

Cho 2 x©u ký tù S1, S2 ®Òu cã ®é dµi kh«ng qu¸ 100. T×m mét x©u S tho¶ m·n c¸c ®iÒu kiÖn:

1. Víi 1£i£2, S nhËn ®îc tõ SI b»ng c¸ch xo¸ ®i mét sè ký tù, chó ý r»ng víi c¸c gi¸ trÞ kh¸c nhau cña I, c¸c ký tù bÞ xo¸ ®i tõ c¸c SI kh¸c nhau nãi chung kh¸c nhau.

2. §é dµi cña S lín nhÊt cã thÓ ®îc.

- 389 -

X©u S ®îc gäi lµ x©u con chung dµi nhÊt (tõ ®©y sÏ viÕt t¾t lµ XCC) cña hai x©u S1 vµ S2. Chó ý r»ng víi hai x©u S1 vµ S2 cho tríc, nãi chung cã nhiÒu XCC kh¸c nhau. Ch¼ng h¹n, trong vÝ dô díi, mét XCC kh¸c lµ affccg.

D÷ liÖu vµo ®îc cho bëi file XAU.INP gåm hai dßng, víi 1£i£2, dßng thø i ghi tõ ®Çu dßng x©u SI.

KÕt qu¶ ghi ra file XAU.OUT tõ ®Çu dßng thø nhÊt mét XCC cña S1 vµ S2.

VÝ dô

XAU.INP XAU.OUT

affbbgccgc affccc

abbffcccgg

ThuËt gi¶i

Gi¶ sö x©u S1 cã ®é dµi M vµ x©u S2 cã ®é dµi N. Ta ký hiÖu D[M,N] lµ ®é dµi cña XCC cña S1 vµ S2. §Ó t×m ®¹i lîng nµy, c¸ch lµm lµ ta sÏ dùa vµo viÖc ®· tÝnh ®îc c¸c ®é dµi cña XCC cña c¸c ®o¹n ®Çu cña hai x©u ®Ó tÝnh D[M,N]. Víi x©u S1, c¸c ®o¹n ®Çu cã thÓ tõ 0 ®Õn M ký tù, víi x©u S2, c¸c ®o¹n ®Çu cã thÓ tõ 0 ®Õn N ký tù, Do ®ã, ta cÇn tÝnh mét m¶ng hai chiÒu D[0..M,0..N] trong ®ã D[I,J] lµ ®é dµi XCC cña ®o¹n I ký tù ®Çu cña S1 vµ J ký tù ®Çu cña S2.

Ta cã víi 0£I£M, D[I,0] = 0 vµ víi 0£J£N, D[0,j] = 0.

Sau ®ã víi 1£I£M, 1£J£N, ta tÝnh D[I,J]. Víi mçi cÆp I,J, khi tÝnh D[I,J], tríc ®ã ta ®· biÕt ®îc c¸c gi¸ trÞ cña D[I’,J’] víi (I’,J’)<(I,J). §Ó thùc hiÖn viÖc nµy, víi I lÇn lît nhËn c¸c gi¸ trÞ tõ 1 ®Õn M ta tÝnh c¸c D[I,J] víi J lÇn lît nhËn c¸c gi¸ trÞ tõ 1 ®Õn N.

TÝnh D[I,J]:

- 390 -

NÕu S1[I] = S2[J], ta cã D[I,J] = D[I-1,J-1] + 1 nÕu kh«ng D[I,J] = D[I-1,J-1]

NÕu D[I,J] < Max(D[I-1,J],D[I,J-1]) th× D[I,J] := Max(D[I-1,J],D[I,J-1]);

Víi vÝ dô cña ®Çu bµi, m¶ng D ®îc tÝnh nh sau: 0 1 2 3 4 5 6 7 8 9 10-----------------------------------0 0 0 0 0 0 0 0 0 0 0 01 0 1 1 1 1 1 1 1 1 1 12 0 1 1 1 2 2 2 2 2 2 23 0 1 1 1 2 3 3 3 3 3 34 0 1 2 2 2 3 3 3 3 3 35 0 1 2 3 3 3 3 3 3 3 36 0 1 2 3 3 3 3 3 3 4 47 0 1 2 3 3 3 4 4 4 4 48 0 1 2 3 3 3 4 5 5 5 59 0 1 2 3 3 3 4 5 5 6 610 0 1 2 3 3 3 4 5 6 6 6

Tõ m¶ng D, ta biÕt ®é dµi XCC b»ng 6. VÊn ®Ò cßn l¹i lµ lµm sao t×m ®îc XCC. Sau ®©y lµ c¸ch t×m XCC.

Khëi t¹o

XCC b»ng x©u rçng, I = 10, J = 10 (b¾t ®Çu xÐt tõ « [10,10]).

Vßng lÆp

Mçi bíc lÆp diÔn ra nh sau: chõng nµo gi¸ trÞ D t¹i « [I,J] b»ng gi¸ trÞ D t¹i « s¸t trªn, ta gi¶m I mét ®¬n vÞ; sau ®ã chõng nµo gi¸ trÞ D t¹i « [I,J] b»ng gi¸ trÞ D t¹i « s¸t tr¸i, ta gi¶m J mét ®¬n vÞ; ký tù thø I cña x©u S1 ( khi ®ã b»ng ký tù thø J cña x©u S2) sÏ ®îc ghÐp vµo tríc x©u XCC; gi¶m I mét ®¬n vÞ vµ gi¶m J mét ®¬n vÞ.

Vßng lÆp kÕt thóc khi I = J = 0.

¸p dông ®èi víi vÝ dô trªn, ta cã diÔn biÕn cña thuËt to¸n nh sau:

Khëi t¹o: I = 10;J = 10;XCC = ’’;

- 391 -

Bíc 1: ®Çu tiªn I = 9, J = 9, XCC = ’g’, sau ®ã I = 8, J = 8.

Bíc 2: ®Çu tiªn I = 8, J = 7, XCC = ’cg’, sau ®ã I = 7, J = 6.

Bíc 3: ®Çu tiªn I = 7, J = 6, XCC = ’ccg’, sau ®ã I = 6, J = 5.

Bíc 4: ®Çu tiªn I = 3, J = 5, XCC = ’fccg’, sau ®ã I = 2, J = 4.

Bíc 5: ®Çu tiªn I = 2, J = 4, XCC = ’ffccg’, sau ®ã I = 1, J = 3.

Bíc 6: ®Çu tiªn I = 1, J = 1, XCC = ’affccg’, sau ®ã I = 6, J = 5.

ThuËt gi¶i trªn cã thÓ ®îc diÔn t¶ thµnh ch¬ng tr×nh sau:

const fi='xau.inp'; fo='xau.out';var m,n,i,j:byte; x,y:string; a:array[0..100,0..100] of byte; f:text;procedure nhap;var i:byte;beginassign(f,fi);reset(f);readln(f,x);m:=length(x);readln(f,y);n:=length(y);close(f);end;function max(u,v:byte):byte;beginif u<=v then max:=v else max:=u;end;procedure tim;var i,j:byte;

- 392 -

begin{truong hop dac biet}for i:=0 to m do a[i,0]:=0;for j:=0 to n do a[0,j]:=0;{xay dung bang QHD}for i:=1 to m dofor j:=1 to n dobeginif x[i]=y[j] then a[i,j]:=a[i-1,j-1]+1 else a[i,j]:=a[i-1,j-1];if a[i,j]<max(a[i-1,j],a[i,j-1]) then a[i,j]:=max(a[i-1,j],a[i,j-1]);end;end;{truy vet de tim ket qua}procedure viet;var i,j,d:byte; tamx:array[1..100] of integer;beginassign(f,fo);rewrite(f);d:=a[m,n]; i:=m; j:=n;while (d<>0) dobegin while (j>0)and(a[i,j-1]=d) do j:=j-1; while (i>0)and(a[i-1,j]=d) do i:=i-1; tamx[d]:=i; i:=i-1; j:=j-1; d:=d-1;end;writeln(f,a[m,n]);for i:=1 to a[m,n] do write(f,x[tamx[i]]);close(f);end;BEGINnhap;tim;viet;

- 393 -

END.

8.5.3. C¾t Ýt h×nh vu«ng nhÊt

Cho mét h×nh ch÷ nhËt cã kÝch thíc M, N, M, N nguyªn d¬ng kh«ng lín h¬n 100. Cã mét m¸y c¾t mµ khi c¾t mét h×nh ch÷ nhËt bÊt kú, m¸y chØ c¾t ®îc mét nh¸t theo ph¬ng song song víi mét trong hai c¹nh h×nh ch÷ nhËt.

H·y t×m c¸ch c¾t h×nh ch÷ nhËt ®· cho thµnh mét sè Ýt nhÊt h×nh vu«ng cã c¹nh nguyªn d¬ng tõ ®©y ta sÏ gäi t¾t lµ c¾t tèi u hay CAT.

D÷ liÖu vµo ®îc cho bëi file CUT.INP gåm mét dßng ghi hai sè M vµ N. KÕt qu¶ ghi ra file CUT.OUT nh sau: dßng thø nhÊt ghi sè H lµ sè h×nh vu«ng c¾t ®îc, dßng thø hai ghi H ®é dµi c¹nh cña H h×nh vu«ng c¾t ®îc.

VÝ dô

CUT.INP CUT.OUT

5 6 5

3 3 2 2 2

ThuËt gi¶i

XÐt viÖc c¾t tèi u mét h×nh ch÷ nhËt kÝch thíc IxJ bÊt kú. Ta cÇn tiÕn hµnh mét sè nh¸t c¾t liªn tiÕp ®Ó cuèi cïng c¾t thµnh mét sè Ýt nhÊt h×nh vu«ng. Gi¶ sö nh¸t c¾t ®Çu tiªn cho ta hai h×nh ch÷ nhËt kÝch thíc I11, J11 vµ I12, J12. Nh¸t c¾t nµy ph¶i tèi u theo nghÜa sè h×nh vu«ng c¾t ®îc tõ hai h×nh ch÷ nhËt sÏ lµ nhá nhÊt trong mäi nh¸t c¾t h×nh ch÷ nhËt IxJ thµnh hai h×nh ch÷ nhËt vµ khi ®ã, viÖc c¾t c¸c h×nh ch÷ nhËt nhá h¬n còng ph¶i lµ tèi u. VÒ mÆt biÓu thøc, ta cã

C¾t tèi u h×nh ch÷ nhËt IxJ =

- 394 -

Min { C¾t tèi u h×nh ch÷ nhËt I11xJ11 + C¾t tèi u h×nh ch÷ nhËt I12xJ12}

Min lÊy ®èi víi mäi c¸ch c¾t h×nh ch÷ nhËt IxJ thµnh hai h×nh ch÷ nhËt kÝch thíc I11, J11 vµ I12, J12.

§èi víi c¸c h×nh ch÷ nhËt ®Æc biÖt sau ®©y, ta lu«n cã ngay c¸ch c¾t tèi u:

I =1: C¾t tèi u cho sè h×nh vu«ng b»ng J;

J =1: C¾t tèi u cho sè h×nh vu«ng b»ng I;

I = J: C¾t tèi u cho sè h×nh vu«ng b»ng 1;

Do ®ã, ®Ó t×m sè h×nh vu«ng Ýt nhÊt cã ®îc khi c¾t tèi u mét h×nh ch÷ nhËt kÝch thíc MxN, ta cÇn ghi nhËn ®îc sè h×nh vu«ng Ýt nhÊt cã ®îc khi c¾t tèi u c¸c h×nh ch÷ nhËt cã kÝch thíc nhá h¬n. NÕu ký hiÖu SHV[I,J] lµ sè h×nh vu«ng cã ®îc khi c¾t tèi u h×nh ch÷ nhËt kÝch thíc IxJ th× ta cÇn tÝnh m¶ng hai chiÒu SHV[1..M,1..N]. C¸c phÇn tö thuéc dßng thø nhÊt, cét thø nhÊt vµ ®-êng chÐo cña m¶ng chÝnh lµ øng víi c¸c trêng hîp ®Æc biÖt nªu trªn cña h×nh ch÷ nhËt do ®ã cã ngay gi¸ trÞ, do ®ã ta cã thÓ tÝnh ®îc m¶ng SHV b»ng c¸ch tÝnh c¸c phÇn tõ cña m¶ng víi c¸c gi¸ trÞ t¨ng dÇn cña chØ sè dßng vµ chØ sè cét.

§Ó ghi nhËn kÝch thíc c¸c h×nh vu«ng c¾t ®îc, trong c¸c trêng hîp h×nh ch÷ nhËt ®Æc biÖt nªu trªn, ta cã t¬ng øng B h×nh ch÷ nhËt c¹nh 1, A h×nh ch÷ nhËt c¹nh 1 vµ 1 h×nh ch÷ nhËt c¹nh A. Do ®ã, b»ng c¸ch truy håi, ta cã thÓ ghi nhËn kÝch thíc c¸c h×nh vu«ng c¾t ®îc trong trêng hîp h×nh ch÷ nhËt kÝch thíc IxJ bÊt kú.

ThuËt gi¶i nµy ®îc cµi ®Æt thµnh ch¬ng tr×nh sau:

{$M 65000,0,0}const fi='cut.inp'; fo='cut.out';

- 395 -

var m,n,m1,n1:byte; hv:array[1..100] of word; shv:array[1..100,1..100] of word; f:text;function uc(r,s:byte):byte;beginwhile r<>s do begin if r>s then r:=r-s; if r<s then s:=s-r; end;uc:=r;end;procedure nhap;beginassign(f,fi);reset(f);readln(f,m,n);close(f);m1:=m div uc(m,n);n1:=n div uc(m,n);end;procedure tinh;var i,j,u,v:byte;beginfillchar(shv,sizeof(shv),0);{giai bai toan trong truong hop dac biet}for i:=1 to m1 do shv[i,1]:=i;for i:=1 to n1 do shv[1,i]:=i;for i:=1 to m1 dofor j:=1 to n1 do if i=j then shv[i,i]:=1;{tinh bang phuong an QHD}

- 396 -

for i:=2 to m1 dofor j:=2 to n1 do if i<>j then begin shv[i,j]:=10000; for u:=1 to i div 2 do if shv[i,j]>shv[u,j]+shv[i-u,j] then shv[i,j]:=shv[u,j]+shv[i-u,j]; for u:=1 to j div 2 do if shv[i,j]>shv[i,u]+shv[i,j-u] then shv[i,j]:=shv[i,u]+shv[i,j-u]; end;end;procedure ghinhan(x,y:byte);var i:byte;beginif x=y then begin inc(hv[x]);exit;end;if x=1 then begin inc(hv[1],y);exit;end;if y=1 then begin inc(hv[1],x);exit;end;for i:=1 to x div 2 do if shv[x,y]=shv[i,y]+shv[x-i,y] then begin ghinhan(i,y);ghinhan(x-i,y);exit; end;for i:=1 to y div 2 do if shv[x,y]=shv[x,i]+shv[x,y-i] then begin ghinhan(x,i);ghinhan(x,y-i);exit; end;end;procedure viet;var r:word;t:byte;begin

- 397 -

assign(f,fo);rewrite(f);writeln(f,shv[m1,n1]);ghinhan(m1,n1);for t:=100 downto 1 do if hv[t]>0 then for r:=1 to hv[t] do write(f,t*uc(m,n):6);writeln(f);close(f);end;BEGINnhap;tinh;fillchar(hv,sizeof(hv),0);viet;END.

8.5.4. Nh©n ma trËn

Trong ba bµi to¸n trªn, viÖc gi¶i bµi to¸n dÉn ®Õn viÖc tÝnh mét m¶ng mét hoÆc hai chiÒu mµ ta dÔ dµng cã ngay ®îc gi¸ trÞ cña c¸c phÇn tö thuéc dßng vµ cét ®Çu tiªn. Bµi to¸n sau ®©y còng dÉn ®Õn viÖc tÝnh mét m¶ng hai chiÒu nhng ®èi víi m¶ng nµy, ta dÔ dµng tÝnh ®îc c¸c phÇn tö trªn ®êng chÐo (gåm c¸c phÇn tö cã chØ sè dßng b»ng chØ sè cét). Sau ®ã, ta sÏ lÇn lît tÝnh c¸c phÇn tö trªn c¸c vÖt song song víi ®êng chÐo.

Gi¶ sö A lµ mét ma trËn M dßng, N cét vµ B lµ mét ma trËn N dßng, P cét, khi ®ã ta cã thÓ nh©n A víi B vµ kÕt qu¶ cho ta ma trËn C gåm M dßng vµ P cét. Ta gäi C lµ tÝch cña hai ma trËn A, B vµ ký hiÖu

C = A.B

PhÇn tö dßng I cét J cña ma trËn C ®îc tÝnh b»ng c«ng thøc

PhÐp nh©n c¸c ma trËn nãi chung kh«ng giao ho¸n nhng kÕt hîp cã nghÜa lµ nãi chung

- 398 -

A.B B.A

nhng víi ba ma trËn A, B, C bÊt kú, nÕu cã tÝch A.B vµ cã tÝch (A.B).C th× còng cã c¸c tÝch B.C vµ A.(B.C), khi ®ã

(A.B).C = A.(B.C)

§Ó tÝnh tÝch mét ma trËn M dßng, N cét víi mét ma trËn N dßng, P cét, ta cÇn thùc hiÖn M.N.P phÐp nh©n. Khi tÝnh tÝch nhiÒu ma trËn, viÖc lùa chän tr×nh tù tiÕn hµnh phÐp to¸n cã ¶nh hëng ®Õn sè phÐp nh©n cÇn thùc hiÖn.

VÝ dô gi¶ sö ta cã bèn ma trËn A(13,5), B(5,89), C(89,3) vµ D(3,34).

1. NÕu tr×nh tù tÝnh to¸n tÝch ABCD lµ ((AB)C)D th× sè phÐp nh©n sÏ lµ 10592.

2. NÕu tr×nh tù tÝnh to¸n tÝch ABCD lµ (AB)(CD) th× sè phÐp nh©n sÏ lµ 54201.

3. NÕu tr×nh tù tÝnh to¸n tÝch ABCD lµ (A(BC))D th× sè phÐp nh©n sÏ lµ 2856.

4. NÕu tr×nh tù tÝnh to¸n tÝch ABCD lµ A((BC)D) th× sè phÐp nh©n sÏ lµ 4055.

5. NÕu tr×nh tù tÝnh to¸n tÝch ABCD lµ A(B(CD)) th× sè phÐp nh©n sÏ lµ 26418.

Khi ch¹y ch¬ng tr×nh, thêi gian thùc hiÖn phÐp nh©n nhiÒu h¬n thêi gian thùc hiÖn phÐp céng hay trõ, do ®ã ta cã bµi to¸n sau:

I. N ma trËn A1. . . ., AN, ma trËn AI cã DI-1 dßng vµ DI cét;

O. Mét tr×nh tù tÝnh tÝch N ma trËn sao cho tæng sè c¸c phÐp nh©n cÇn thùc hiÖn Ýt nhÊt.

Mét c¸ch gi¶i bµi to¸n nµy lµ xÐt mäi c¸ch ®Æt c¸c dÊu ngoÆc ®Ó tiÕn hµnh tÝnh tÝch N ma trËn. NÕu ký hiÖu T(N) lµ sè mäi c¸ch

- 399 -

®Æt dÊu ngoÆc ®Ó tÝnh tÝch N ma trËn th× ta dÔ dµng cã thÓ cã c«ng thøc tÝnh T(N) nh sau

T(N) ®îc gäi lµ sè Catalan bËc N.

Cã thÓ kiÓm tra ®îc c¸c kÕt qu¶ sau:

N 1 2 3 4 5 10 15

T(N) 1 1 2 5 14 4862 2674440

Ta cã thÓ thÊy r»ng nÕu theo c¸ch nµy, ta ph¶i gi¶i bµi to¸n víi sè l-îng thao t¸c cì 4N/n.

C¸ch gi¶i b»ng quy ho¹ch ®éng dùa trªn viÖc khi chän c¸ch ®Æt dÊu ngoÆc víi sè lîng lín, ta ®· biÕt c¸ch ®Æt dÊu ngoÆc víi sè lîng nhá h¬n. Cô thÓ, nÕu ký hiÖu S[I,J] lµ sè phÐp to¸n nh©n cÇn dïng ®Ó tÝnh tÝch MI. . . MJ ta cã c¸c c«ng thøc sau:

Víi mäi I, S[I,I] = 0 vµ S[I,I+1] = D[I-1].D[I].D[I+1];

S[I,I+K] = Min {M[I,J] + M[J+1,K] + D[I-1].D[J].D[K], I < J < K}

Ta cã ch¬ng tr×nh sau:

const fi='mt.inp'; fo='mt.out';var f:text; d:array[0..10] of longint; s:array[1..10,1..10] of longint; chon:array[1..10,1..10] of byte; tt:string; n:byte; code:integer;s1,s2:string;procedure nhap;

- 400 -

var i:byte;beginassign(f,fi);reset(f);readln(f,n);for i:=0 to n do read(f,d[i]);close(f);end;procedure tinh;var i,j,k:byte;beginfillchar(s,sizeof(s),0);for i:=1 to n do s[i,i]:=0;for i:=1 to n-1 do s[i,i+1]:=d[i-1]*d[i]*d[i+1];for k:=2 to n-1 do begin for i:=1 to n-k do begin s[i,i+k]:=2100000000; for j:=1 to k-1 do if s[i,i+k]>s[i,i+j]+s[i+j+1,i+k]+d[i+j-1]*d[i+j]*d[i+j+1] then begin s[i,i+k]:=s[i,i+j]+s[i+j+1,i+k]+d[i+j-1]*d[i+j]*d[i+j+1]; chon[i,i+k]:=j; end; end; end;end;Function ghinhan(i,j:byte):string;beginif i=j then begin ghinhan:='';exit;end;

- 401 -

if i+1=j then begin str(i,s1);str(j,s2); ghinhan:='(A['+s1+']*A['+s2+'])'; exit; end;ghinhan:='('+ghinhan(i,i+chon[i,j])+'*'+ghinhan(i+chon[i,j]+1,j)+')';end;procedure viet;beginassign(f,fo);rewrite(f);writeln(f,s[1,n]);writeln(f,ghinhan(1,n));close(f);end;BEGINnhap;tinh;viet;END.

8.5.5. ý tëng quy ho¹ch ®éng

Qua c¸c vÝ dô trªn, ta thÊy viÖc dïng quy ho¹ch ®éng ®Ó gi¶i mét bµi to¸n thêng diÔn ra nh sau:

§èi víi bµi to¸n kÝch thíc nhá hoÆc ®Æc biÖt, ta dÔ dµng cã ®îc lêi gi¶i.

T×m c¸ch dïng c¸c lêi gi¶ ®èi víi c¸c bµi to¸n kÝch thíc nhá h¬n ®Ó x©y dùng lêi gi¶i cho bµi to¸n kÝch thíc lín h¬n.

Qu¸ tr×nh gi¶i bµi to¸n thêng dÉn ®Õn viÖc tÝnh mét m¶ng mµ mét sè phÇn tö dÔ dµng tÝnh ®îc, viÖc tÝnh c¸c phÇn tö cßn l¹i chØ dùa trªn c¸c phÇn tö ®· biÕt.

Tuy nhiªn, lo¹i thuËt gi¶i nµy chØ cã thÓ dïng cho c¸c bµi to¸n cã kÝch thíc kh«ng qu¸ lín.

- 402 -

8.6. Mét sè thuËt gi¶i nÐn d÷ liÖu vµ m· ho¸

HiÖn nay, viÖc giao lu th«ng tin phÇn lín ®îc tiÕn hµnh trªn mét m¹ng m¸y tÝnh diÖn réng. Trong bèi c¶nh ®ã, hai yªu cÇu ®îc ®Æt ra:

1. ViÖc truyÒn th«ng tin ph¶i nhanh chãng,

2. Th«ng tin lu hµnh trªn m¹ng cÇn ®îc b¶o vÖ chèng l¹i c¸c truy nhËp bÊt hîp ph¸p. C¸c truy nhËp nµy thêng cã hai môc ®Ých: t×m hiÓu bÝ mËt cña th«ng tin vµ lµm sai lÖch néi dung th«ng tin.

§èi víi yªu cÇu thø nhÊt, ngoµi viÖc n©ng cao chÊt lîng c¸c thiÕt bÞ truyÒn th«ng, khi truyÒn mét lîng th«ng tin rÊt lín, ngêi ta t×m c¸ch thu gän kÝch thíc th«ng tin trªn ®êng truyÒn vµ chØ truyÒn ®i th«ng tin ®· ®îc thu gän l¹i. C¸ch lµm nh vËy ®îc gäi lµ nÐn d÷ liÖu. C¸c thuËt gi¶i nÐn d÷ liÖu nh»m phôc vô c¸c yªu cÇu nµy.

ViÖc b¶o vÖ th«ng tin cÇn ®¸p øng ®îc ba yªu cÇu:

B¶o ®¶m tÝnh bÝ mËt cña th«ng tin: chØ nh÷ng ngêi së h÷u hîp ph¸p th«ng tin míi cã quyÒn truy nh©p.

B¶o ®¶m tÝnh x¸c thùc (Authentication) cña th«ng tin: néi dung th«ng tin lu hµnh kh«ng bÞ thay ®æi.

B¶o ®¶m tÝnh x¸c thùc cña ngêi göi vµ ngêi nhËn th«ng tin: kh«ng cho phÐp hiÖn tîng m¹o danh cña ngêi kh¸c còng nh viÖc phñ nhËn th«ng tin do chÝnh m×nh truyÒn ®i.

§©y lµ mét lÜnh vùc thu hót nhiÒu sù quan t©m cña toµn x· héi nãi chung, ®Æc biÖt nhiÒu chuyªn gia vÒ c«ng nghÖ th«ng tin vµ truyÒn th«ng. Khi thiÕt kÕ c¸c hÖ thèng b¶o mËt, ngêi ta dïng c¸c thuËt gi¶i m· ho¸ vµ gi¶i m· th«ng tin. ViÖc m· ho¸ th«ng tin nh»m che dÊu nguyªn b¶n cña th«ng tin chèng l¹i nh÷ng truy nhËp bÊt hîp ph¸p, chØ nh÷ng ngêi së h÷u hîp ph¸p th«ng tin míi cã thÓ biÕt

- 403 -

c¸ch gi¶i m· th«ng tin (®· m· ho¸) ®Ó nhËn ®îc th«ng tin nguyªn b¶n. Ngoµi t¸c dông ®ã, c¸c thuËt gi¶i m· ho¸ vµ gi¶i m· còng hç trî viÖc thiÕt kÕ nhiÒu giao thøc b¶o ®¶m tÝnh x¸c thùc còng nh nhiÒu giao thøc kh¸c liªn quan ®Õn viÖc tæ chøc b¶o vÖ th«ng tin trªn m¹ng.

Néi dung cña môc nµy nh»m giíi thiÖu mét sè thuËt gi¶i nÐn d÷ liÖu vµ m· ho¸ th«ng tin.

8.6.1. Mét sè thuËt gi¶i nÐn d÷ liÖu

C¸c thuËt gi¶i nÐn d÷ liÖu kh«ng chØ cÇn khi truyÒn mét lîng th«ng tin lín trªn m¹ng mµ còng cÇn ®Ó lu tr÷ nh÷ng lîng th«ng tin lín trong mét kh«ng gian nhá h¬n.

Cã ba yªu cÇu ph¶i tho¶ m·n:

1. Cã thÓ nÐn nhanh vµ gi¶i nÐn nhanh d÷ liÖu.

2. ThuËt gi¶i nÐn ph¶i cã hiÖu qu¶ cao: b¶n nÐn ph¶i cã tû lÖ cµng nhá h¬n so víi nguyªn b¶n cµng tèt.

3. ViÖc gi¶i nÐn ph¶i cho ta ®óng nguyªn thÓ cña d÷ liÖu tríc khi nÐn.

Chó ý r»ng theo mét nghÜa nµo ®ã, chÝnh viÖc nÐn d÷ liÖu còng cã thÓ xem nh mét c¸ch m· ho¸ th«ng tin.

Khi truyÒn ®i hoÆc lu tr÷, th«ng tin ®îc tæ chøc díi d¹ng file. Mçi file cã thÓ xem nh mét d·y bÝt (nhÞ ph©n). C¸c file d÷ liÖu lín thêng lµ c¸c file v¨n b¶n hoÆc nh÷ng file ¶nh. ViÖc nÐn c¸c file nµy ®Òu dùa trªn ®Æc ®iÓm cã nh÷ng th«ng tin d thõa hoÆc lÆp l¹i nhiÒu. VÝ dô trong file v¨n b¶n cã rÊt nhiÒu ký tù trèng thõa hoÆc trong file ¶nh cã rÊt nhiÒu ®iÓm ¶nh (pixel) nh nhau trong mét miÒn rÊt lín.

Cã rÊt nhiÒu kü thuËt kh¸c nhau ®Ó gi¶i quyÕt viÖc thu gän d¹ng thÓ hiÖn th«ng tin. §Ó giíi thiÖu ®îc c¸c ý tëng c¬ b¶n, ta sÏ b¾t ®Çu víi mét sè ph©n tÝch cô thÓ.

- 404 -

VÝ dô 1. XÐt x©u ký tù

S = aaaaaaaaaabbbbbbbssssssssxxxxx

NÕu dïng m· ASCII ®Ó m· ho¸ x©u S, ta cÇn dïng 240 bÝt. NÕu nhËn xÐt trong x©u S ký tù a xuÊt hiÖn liªn tiÕp 10 lÇn, b - 7 lÇn, s - 8 lÇn vµ x - 5 lÇn, thay v× viÕt a liªn tiÕp 10 lÇn, ta viÕt 10a, t¬ng tù, 7b, 8s, 5x víi quy íc 10a cã nghÜa lµ 10 ký tù a liªn tiÕp th× x©u S cã thÓ viÕt thµnh (nÐn) x©u

S’ = 10a7b8s5x

S’ gåm 9 ký tù vµ nÕu dïng m· ASCII ®Ó m· ho¸ x©u S’, ta chØ cÇn dïng 72 bÝt.

VÝ dô 2. X©u S trong vÝ dô 1 chØ gåm c¸c ch÷ c¸i. §èi víi c¸c x©u nh vËy, c¸ch nÐn nh trªn b¶o ®¶m viÖc gi¶i nÐn ®óng ®øn tøc lµ sau khi gi¶i nÐn, ta nhËn ®îc nguyªn b¶n. Tuy nhiªn, nÕu trong x©u S cã c¶ c¸c ch÷ sè, kü thuËt nÐn dïng trong vÝ dô 1 nãi chung kh«ng ¸p dông ®îc. Ch¼ng h¹n S’ cã thÓ ®îc gi¶i nÐn thµnh S nhng còng cã thÓ ®îc hiÓu lµ nÐn cña x©u

S’’ = a7ba7ba7ba7ba7ba7ba7ba7ba7ba7bs5xs5xs5xs5xs5xs5xs5xs5x

§Ó gi¶i quyÕt vÊn ®Ò nµy, cã hai ý tëng:

Dïng dÊu trèng ng¨n c¸ch c¸c thµnh phÇn liªn tiÕp trong d¹ng nÐn.

VÝ dô ta cã thÓ viÕt S’ díi d¹ng

S’ = 10a 7b 8s 5x

Khi ®ã thay v× d¹ng nÐn 72 bÝt, ta ph¶i dïng d¹ng nÐn 96 bÝt. NÕu sè lîng lÆp Ýt, viÖc dïng nhiÒu dÊu trèng sÏ lµm cho kÝch thíc nÐn t¨ng lªn.

Chän c¸ch nÐn sao cho kh«ng cã h¬n mét c¸ch gi¶i nÐn kh¸c nhau.

VÝ dô, xÐt x©u

S = AB1ACADAB1A

- 405 -

NÕu ta thÓ hiÖn c¸c ký tù xuÊt hiÖn trong S b»ng c¸c d·y bÝt sauA - 11

B - 00

C - 010

D - 10

1 - 011

th× S cã thÓ ®îc viÕt (nÐn) thµnh d·y bÝt

1100011110101110001111

chØ gåm 22 bÝt.

Chó ý r»ng c¸ch chuyÓn ký tù thµnh d·y bÝt nh trªn cã ®Æc ®iÓm lµ kh«ng cã d·y bÝt nµo lµ ®o¹n ®Çu (Prefix) cña d·y kh¸c. ChÝnh b»ng c¸ch chän nh vËy, ta cã thÓ gi¶i nÐn duy nhÊt.

Kü thuËt nµy còng chØ lµ mét trong rÊt nhiÒu kü thuËt cã thÓ dïng ®Ó nÐn d÷ liÖu. Trªn thùc tÕ, c¸c thuËt gi¶i nÐn d÷ liÖu dïng liªn tiÕp hoÆc hçn hîp nhiÒu kü thuËt kh¸c nhau.

VÝ dô 3. C¸ch m· ho¸ Huffman

Gi¶ sö ta cã mét file chØ gåm c¸c ký tù S1, . . , SN xuÊt hiÖn víi c¸c tÇn sè xuÊt hiÖn ®îc biÕt t¬ng øng lµ F1£ . . £ FN. M· Huffman cã mét tham sè R lµ sè ký tù kh¸c nhau dïng ®Ó m· ho¸.

§Ó hiÓu ý tëng cña m· ho¸ Huffman tæng qu¸t, ta b¾t ®Çu b»ng mét trêng hîp cô thÓ víi m· Huffman tham sè R = 2. Gi¶ sö v¨n b¶n chØ gåm 4 ký tù A, B, C, D víi tÇn sè xuÊt hiÖn t¬ng øng lµ 5, 7, 8, 15, vµ ta sÏ dïng hai bÝt nhÞ ph©n 0, 1 ®Ó tiÕn hµnh m· ho¸

Bíc 0. Xem bèn ký tù nµy lµ 4 nhãm, mçi nhãm gåm 1 ký tù.

Bíc 1. XÐt hai nhãm cã tÇn sè xuÊt hiÖn thÊp nhÊt A vµ B, A sÏ ®îc g¸n bÝt 0, B ®îc g¸n bÝt 1;

- 406 -

Bíc 2. Gép hai nhãm võa xÐt trong bíc 1 A vµ B thµnh mét nhãm míi {A,B}, nhãm nµy cã tÇn sè b»ng tæng c¸c tÇn sè cña hai nhãm 5 + 7 = 12, d·y c¸c nhãm xÕp theo thø tù kh«ng gi¶m cña c¸c tÇn sè b©y giê sÏ lµ

C, {A,B}, D víi c¸c tÇn sè 8, 12, 15;

Bíc 3. L¹i xÐt hai nhãm ký tù cã tÇn sè xuÊt hiÖn thÊp nhÊt, khi ®ã C sÏ ®îc g¸n bÝt 0 vµ c¸c ký tù thuéc nhãm {A,B} sÏ ®îc g¸n thªm bÝt 1 (tríc bÝt d· cã trong Bíc 1);

Bíc 4. Gép hai nhãm võa xÐt trong bíc 3 C vµ {A,B} thµnh mét nhãm míi {A,B,C}, nhãm nµy cã tÇn sè b»ng tæng c¸c tÇn sè cña hai nhãm 12 + 8 = 20, d·y c¸c nhãm xÕp theo thø tù kh«ng gi¶m cña c¸c tÇn sè b©y giê sÏ lµ

D, {A,B,C} víi c¸c tÇn sè 15, 20;

Bíc 5. L¹i xÐt hai nhãm ký tù cã tÇn sè xuÊt hiÖn thÊp nhÊt, khi ®ã D sÏ ®îc g¸n bÝt 0 vµ c¸c ký tù thuéc nhãm {A,B,C} sÏ ®îc g¸n thªm bÝt 1 (tríc bÝt d· cã trong Bíc 1);

Bíc 6. Gép hai nhãm võa xÐt trong bíc 5 thµnh mét nhãm, ta chØ cßn mét nhãm duy nhÊt, viÖc m· ho¸ kÕt thóc vµ ta cã m· ho¸ cña c¸c ký tù sÏ lµ:

A 110

B 111

C 10

D 0

Víi c¸ch m· ho¸ nµy, ®é dµi bÝt trung b×nh cña c¸c m· ho¸ c¸c ký tù lµ 1.91.

Qua vÝ dô trªn, viÖc tiÕn hµnh m· ho¸ Huffman víi R = 2 diÔn ra nh sau:

- 407 -

Bíc khëi t¹o: Xem mçi ký tù nh mét nhãm ký tù, cã bao nhiªu ký tù th× cã bÊy nhiªu nhãm, m· mäi ký tù lµ x©u rçng;

Vßng lÆp. Chõng nµo sè nhãm cßn lín h¬n 1 th× lµm nh sau:

Bíc 1. XÐt hai nhãm cã tÇn sè thÊp nhÊt, m· cña ký tù tÇn sè thÊp h¬n sÏ ®îc ghÐp thªm 0 vµo tríc, m· cña ký tù tÇn sè cao h¬n sÏ ®îc ghÐp thªm 0 vµo tríc;

Bíc 2. Gép hai nhãm võa xÐt trong bíc 1 thµnh mét nhãm víi tÇn sè b»ng tæng tÇn sè cña hai nhãm ®ã vµ s¾p xÕp l¹i c¸c nhãm theo tÇn sè kh«ng gi¶m;

Víi R>2, c¸ch m· ho¸ Huffman còng t¬ng tù, b»ng c¸ch xÐt R nhãm ®Çu (Bíc 1 cña vßng lÆp) vµ gép R nhãm ®Çu (Bíc 2 cña vßng lÆp). Tuy nhiªn, mét vÊn ®Ò cã tÝnh chÊt kü thuËt ph¸t sinh khi ë bíc s¸t cuèi cïng, sè nhãm kh«ng lµ R mµ lµ nhá h¬n R. §Ó kh¾c phôc t×nh huèng nµy, khi ®ã, ta sÏ thªm vµo trong bíc khëi t¹o mét sè nhãm gi¶ gåm mét ký tù míi vÝ dô $ víi tÇn sè xuÊt hiÖn thÊp nhÊt b»ng 0. Sè lîng c¸c nhãm gi¶ chän sao cho ë bíc cuèi cïng, ta cßn ®óng R nhãm.

Ta cã thÓ h×nh dung c¸ch m· ho¸ nµy qua vÝ dô sau: Gi¶ sö cã v¨n b¶n chØ gåm 4 ký tù A, B, C, D víi tÇn sè xuÊt hiÖn t¬ng øng lµ 5, 7, 8, 15 vµ ta muèn chän c¸ch m· ho¸ Huffman víi R = 3.

Bíc khëi t¹o: XÐt 5 nhãm: {$}, {A}, {B}, {C}, {D} víi tÇn sè xuÊt hiÖn t¨ng dÇn 0, 5, 7, 8, 15, m· c¸c ký tù ®Òu b»ng ‘’;

Vßng lÆp

XÐt ba nhãm {$}, {A}, {B}, t¹m thêi m· ho¸ cña A lµ 1, cña B lµ 2;

Gép ba nhãm thµnh mét nhãm {$,A,B} víi tÇn sè xuÊt hiÖn b»ng 12, d·y c¸c nhãm b©y giê lµ {C], {$,A,B}, {D};

XÐt ba nhãm {C], {$,A,B}, {D}, t¹m thêi m· ho¸ cña C lµ 0, cña A lµ 12, cña B lµ 22 vµ cña D lµ 2;

- 408 -

Gép ba nhãm ta chØ cßn mét nhãm, kÕt thóc.

M· ho¸ cña c¸c ký tù sÏ lµ:

A 11

B 12

C 0

D 2

§é dµi trung b×nh cña c¸c m· ho¸ cña c¸c ký tù b©y giê lµ 1.34.

Tæng qu¸t, hÖ m· ho¸ Huffman víi tham sè R ho¹t ®éng nh sau:

Bíc khëi t¹o: Gi¶ sö ban ®Çu cã N ký tù cÇn m· ho¸, sau mçi vßng lÆp, tõ K nhãm, ta cßn K-(R-1) nhãm, do ®ã, sau U bíc lÆp, ta cßn N-U(R-1) nhãm, cho tíi khi sè nhãm lµ S víi 1 £ S £ R, nÕu S kh«ng b»ng R, ta ph¶i thªm vµo R-S ký tù gi¶ $1, . . . , $R-S víi tÇn sè xuÊt hiÖn ®Òu b»ng 0 vµ nh vËy, ta sÏ xÐt N nhãm víi N cã gi¸ trÞ b»ng N + R - S, m· ho¸ cña ký tù thø I (ban ®Çu) ®Òu b»ng MI = ‘’;

Vßng lÆp:

Chõng nµo sè nhãm cßn lín h¬n 1 th×:

1. XÐt R nhãm ®Çu, ®¸nh sè c¸c nhãm tõ 0 ®Õn R-1, m· ho¸ cña mçi ký tù thuéc nhãm thø V ®îc ghÐp thªm phÝa tríc ký tù V.

2. Gép R nhãm nµy thµnh mét nhãm víi tÇn sè b»ng tæng c¸c tÇn sè cña c¸c nhãm vµ s¾p xÕp l¹i c¸c nhãm theo tÇn sè kh«ng gi¶m.

Ngêi ta cã thÓ chøng minh ®îc r»ng c¸ch m· ho¸ nµy tèi u theo nghÜa ®é dµi trung b×nh c¸c m· ho¸ cña c¸c ký tù lµ nhá nhÊt.

Trªn c¬ së m· ho¸ Huffman cña tõng ký tù, ta sÏ thu ®îc m· ho¸ Huffman cña mét file bÊt kú. Chó ý r»ng m· ho¸ Huffman cho phÐp ta cã thÓ gi¶i m· duy nhÊt.

- 409 -

Nh vËy ta cã thÓ dïng m· ho¸ Huffman víi tham sè R = 2 ®Ó nÐn file thµnh mét d·y c¸c bit nhÞ ph©n.

§Ó nÐn mét file theo c¸ch nµy, ta cÇn ®äc mét lÇn ®Ó thèng kª tÇn sè xuÊt hiÖn cña c¸c ký tù, tiÕn hµnh m· ho¸ c¸c ký tù vµ sau ®ã m· ho¸ file.

8.6.2. Mét sè thuËt gi¶i m· ho¸

MËt m· häc (Cryptography) lµ ngµnh nghiªn cøu viÖc thiÕt kÕ c¸c hÖ m· mËt.

Gi¶ sö ta cÇn göi mét th«ng b¸o (Message) M trªn m¹ng, M ®îc gäi lµ b¶n râ (PlainText), th«ng b¸o nµy ®îc truyÒn qua nh÷ng kªnh nãi chung kh«ng an toµn do ®ã cã thÓ bÞ truy nhËp bÊt hîp ph¸p. §Ó chèng l¹i viÖc ®ã, ngêi ta biÕn ®æi M thµnh M’ theo c¸ch sao cho khi ngêi nhËn hîp ph¸p M’ cã c¸ch kh«i phôc l¹i b¶n râ M, M’ ®îc gäi lµ b¶n m· (CryptoText) cña M. C¸ch biÕn ®æi M thµnh M’ ®îc gäi lµ m· ho¸ (Encryption), c¸ch kh«i phôc M tõ M’ ®îc gäi lµ gi¶i m· (Decryption). C¸ch lµm nh vËy ®îc gäi lµ m· ho¸ M.

VÒ mÆt to¸n häc, mét hÖ m· mËt (CryptoSystem) lµ mét bé ba

(M, C, K)

trong ®ã M lµ mét tËp hîp ®îc gäi lµ kh«ng gian c¸c b¶n râ, c lµ mét tËp hîp ®îc gäi lµ kh«ng gian c¸c b¶n m· vµ k lµ mét tËp hîp ®îc gäi lµ kh«ng gian c¸c kho¸.

Mçi phÇn tö K thuéc k ®îc gäi lµ mét kho¸ (m·). Mçi kho¸ K cho hai ¸nh x¹: ¸nh x¹ m· ho¸ EK: m c vµ ¸nh x¹ gi¶i m· DK: c m. Hai ¸nh x¹ nµy ph¶i tho¶ m·n ®iÒu kiÖn DK.EK = im, im lµ ¸nh x¹ ®ång nhÊt cña m. §iÒu nµy cã nghÜa lµ víi mäi b¶n râ M khi nhËn ®îc b¶n m· EK(M), b»ng c¸ch ¸p dông ¸nh x¹ gi¶i m· (víi kho¸ K t¬ng øng) DK, ta ph¶i nh©n ®îc b¶n râ M.

- 410 -

Ngêi ta chia c¸c lo¹i hÖ m· mËt thµnh hai lo¹i: lo¹i c¸c hÖ m· mËt cæ ®iÓn vµ lo¹i c¸c hÖ m· mËt kho¸ c«ng khai.

8.6.2.1. C¸c hÖ m· mËt cæ ®iÓn

C¸c hÖ m· mËt cæ ®iÓn lµ c¸c hÖ m· mËt mµ ngêi sö dông ph¶i gi÷ bÝ mËt c¶ ¸nh x¹ m· ho¸ lÉn ¸nh x¹ gi¶i m·. Cã rÊt nhiÒu hÖ m· mËt cæ ®iÓn. Sau ®©y ta sÏ chØ giíi h¹n giíi thiÖu hai hÖ: hÖ Caesar vµ hÖ DES.

HÖ Caesar

Trong hÖ Caesar, kh«ng gian c¸c b¶n râ vµ kh«ng gian c¸c b¶n m· ®Òu lµ tËp mäi x©u ký tù trªn bé ch÷ c¸i hoa tiÕng Anh A..Z. C¸c ch÷ c¸i nµy ®îc ®¸nh sè tõ 0 ®Õn 25, kh«ng gian kho¸ k gåm 26 kho¸ ®¸nh sè tõ 0 ®Õn 25.

Víi mçi kho¸ K, ¸nh x¹ m· ho¸ EK biÕn mçi ch÷ c¸i thø U thµnh ch÷ c¸i thø (U+K) mod 26. VÝ dô nÕu K = 2, EK(A) = C, EK(Z) = B . . . NÕu

M = a1 . . . aN

lµ mét x©u ký tù bÊt kú trªn bé ch÷ c¸i tiÕng Anh th×

EK(M) = EK(a1) . . . EK(aN)

Khi ®ã ¸nh x¹ gi¶i m· DK sÏ lµ ¸nh x¹ EK’ víi K’ = (26-K) mod 26.

Mét ®Æc diÓm dÔ thÊy cña hÖ m· Caesar lµ kh«ng gian kho¸ cã rÊt Ýt phÇn tö (26 phÇn tö) do ®ã ®èi ph¬ng cã thÓ kh¸m ph¸ ra c¸ch m· ho¸ b»ng c¸ch duyÖt toµn bé.

§Ó chèng l¹i thñ ph¸p duyÖt toµn bé, ngêi ta thêng dïng c¸c hÖ m· mËt víi sè lîng kho¸ rÊt lín.

HÖ DES

DES lµ viÕt t¾t cña ba ch÷ tiÕng Anh Data Encryption Standard (ChuÈn m· ho¸ d÷ liÖu).

- 411 -

Trong hÖ DES, kh«ng gian c¸c b¶n râ vµ kh«ng gian c¸c b¶n m· ®Òu lµ tËp mäi d·y 64 bit (nhÞ ph©n), kh«ng gian kho¸ k lµ tËp mäi d·y 56 bit nhng lu«n ®îc lu gi÷ díi d¹ng 64 bit b»ng c¸ch thªm vµo c¸c bÝt kiÓm tra ch½n lÎ ë c¸c vÞ trÝ cã sè thø tù lµ béi cña 8, ®iÒu ®ã cã nghÜa lµ khi nãi vÒ mét kho¸ k1. . . .K64, c¸c bÝt thø K8, K16, K24, K32, K40, K48, K56, K64 lµ c¸c bÝt kiÓm tra, chØ cã c¸c bÝt thø 1, 2, . . ., 7, 9, . . ., 15, . . . , 57, . . ., 63 lµ c¸c bÝt kho¸.

Nh vËy, ®Ó m· ho¸ mét b¶n râ nµo ®ã, ta ph¶i quy íc mét c¸ch tiÒn xö lý ®Ó chuyÓn b¶n râ thµnh mét d·y bÝt vµ sau ®ã m· ho¸ tõng ®o¹n 64 bÝt.

¸nh x¹ m· ho¸ gåm 18 giai ®o¹n. Gi¶ sö ta cÇn m· ho¸ x©u 64 bÝt

M = m1 . . . m64,

§Çu tiªn, ta ho¸n vÞ d·y 64 bÝt nµy nhê m¶ng IP thµnh mét d·y 64 bÝt

58 50 42 34 26 18 10 2

60 52 44 36 28 20 12 4

62 54 46 38 30 22 14 6

64 56 48 40 32 24 16 8

57 49 41 33 25 17 9 1

59 51 43 35 27 19 11 3

61 53 45 37 29 21 13 5

63 55 47 39 31 23 15 7

Nh vËy d·y bÝt M = m1 . . . m64 ®ùoc ho¸n vÞ th¸nh d·y

M’ = m58m50, m42. . .m34. . . m39m31m23m15m7

TiÕp theo lµ 16 giai ®o¹n ®¸nh sè tõ 1 ®Õn 16, mçi giai ®o¹n U, 1 £ U £ 16, sÏ biÕn mét d·y 64 bÝt thµnh d·y 64 bÝt. D·y vµo ®îc chia lµm hai nöa, nöa thø nhÊt gåm 32 bÝt ®Çu ®îc ký hiÖu LU-1, nöa thø

- 412 -

hai gåm 32 bÝt cuèi ®îc ký hiÖu RU-1, d·y ra ®îc chia lµm hai nöa, nöa thø nhÊt gåm 32 bÝt ®Çu ®îc ký hiÖu LU, nöa thø hai gåm 32 bÝt cuèi ®îc ký hiÖu RU, d·y ra ®îc tÝnh nh sau:

LU = RU-1,

RU = LU-1 f(RU-1,KU).

trong ®ã ký hiÖu phÐp to¸n XOR thùc hiÖn víi hai d·y bÝt cã ®é dµi nh nhau ®îc ®Þnh nghÜa nh sau:

NÕu

A = a1 . . . aK, B = b1 . . . bK,

lµ hai d·y K bÝt th× A B = C còng lµ mét d·y K bit mµ bÝt thø I CI =0 khi vµ chØ khi bÝt thø I cña A vµ bÝt thø I cña B b»ng nhau (cïng b»ng 0 hay 1).

Riªng ®èi víi giai ®o¹n 16,

R16 = R15,

L16 = L15 f(R15,K16).

Giai ®o¹n thø 18, d·y 64 bit nhËn ®îc sÏ ®îc ho¸n vÞ b»ng ho¸n vÞ ngîc cña ho¸n vÞ ban ®Çu IP.

Trong phÇn cßn l¹i ta sÏ giíi thiÖu c¸ch tÝnh hµm f.

Bíc 1. TÝnh kho¸ ë giai ®o¹n thø U, KU, 1 £ U £ 16:

§Çu tiªn, kho¸ K sÏ ®îc ho¸n vÞ nhê b¶ng

57 49 41 33 25 17 9

1 58 50 42 34 26 18

10 2 59 51 43 35 27

19 11 3 60 52 44 36

63 55 47 39 31 23 15

7 62 54 46 38 30 22

- 413 -

14 6 61 53 45 37 29

21 13 5 28 20 12 4

D·y 56 bÝt nµy ®îc chia thµnh hai nöa: 28 bit ®Çu ®îc ký hiÖu lµ C0 vµ 28 bÝt cuèi ®îc ký hiÖu lµ D0 vµ víi U>0, c¸c d·y 28 bÝt CU vµ DU sÏ nhËn ®îc t¬ng øng tõ CU-1 vµ DU-1, nhê mét hoÆc hai ho¸n vÞ vßng tr¸i (LeftShift) b»ng c¸ch tra b¶ng sau:

U 1 2 3 4 5 6 7 8 9 10

11

12

13

14

15

16

1 1 2 2 2 2 2 1 2 2 2 2 2 2 2 1

VÝ dô C6 vµ D6 sÏ nhËn ®îc t¬ng øng tõ C5 vµ D5, nhê hai ho¸n vÞ vßng tr¸i cßn C8 vµ D8 sÏ nhËn ®îc t¬ng øng tõ C7 vµ D7, nhê mét ho¸n vÞ vßng tr¸i.

D·y 48 bit KU sÏ nhËn ®îc tõ d·y 56 bit CUDU nhê b¶ng chän sau:

14 17 11 24 1 5

3 28 15 6 21 10

23 19 12 4 26 8

16 7 27 20 12 2

41 52 31 37 47 55

30 40 51 45 33 48

44 49 39 56 34 53

46 42 50 36 29 32

Bíc 2. D·n d·y 32 bÝt RU-1 thµnh d·y 48 bÝt nhê b¶ng sau:

32 1 2 3 4 5

4 5 6 7 8 9

8 9 10 11 12 13

- 414 -

12 13 14 15 16 17

16 17 18 19 20 21

20 21 22 23 24 25

24 25 26 27 28 29

28 29 30 31 32 1

Nh vËy, sau khi d·n d·y RU-1 ta nhËn ®îc d·y 48 bit gåm c¸c bÝt víi c¸c sè hiÖu lÇn lît

8 9 10 11 12 13 12 13 14 15 16 17 16 17 18 19 20 21 20 21 22 23 24 25 24 25 26 27 28 29 28 29 30 31 32 1

cña d·y RU-1. Ta ký hiÖu d·y d·n ra ®îc lµ ZU.

Bíc 3. TÝnh d·y 48 bÝt Y = ZUKU.

Bíc 4. NÐn d·y 48 bit Y thµnh d·y 32 bÝt Y’ b»ng c¸ch dïng 8 hép (Box) S1, . . ., S8.

C¸c b¶ng nµy ®Òu gåm 4 dßng ®¸nh sè tõ 0 ®Õn 3 vµ 16 cét ®¸nh sè tõ 0 ®Õn 15, mäi phÇn tö cña 8 b¶ng trªn ®Òu cã gi¸ trÞ trong ph¹m vi 0..16.

S1

14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 70 15 7 4 14 2 13 1 10 6 12 11 9 5 3 84 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0

15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13

S2

15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 103 13 4 7 15 2 8 14 12 0 1 10 6 9 11 50 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15

13 8 10 1 3 15 4 2 11 6 7 13 0 5 14 9

- 415 -

S3

10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 813 7 0 9 3 4 6 10 2 8 5 14 12 11 15 113 6 4 9 8 15 3 0 11 1 2 12 5 10 14 71 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12

S4

7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 1513 8 11 5 6 15 0 3 4 7 2 12 1 10 14 910 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4

3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14

S5

2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 914 11 2 12 4 7 13 1 5 0 15 10 3 9 8 64 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14

11 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3

S6

12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 1110 15 4 2 7 12 9 5 6 1 13 14 0 11 3 89 14 15 5 2 8 12 3 7 0 4 10 1 13 11 64 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13

S7

4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 113 0 11 7 4 9 1 10 14 3 5 12 2 15 8 61 4 11 13 12 3 7 14 10 15 6 8 0 5 9 26 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12

S8

- 416 -

13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 71 15 13 8 10 3 7 4 12 5 6 11 0 14 9 27 11 4 1 9 12 14 2 0 6 10 13 15 3 5 82 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11

§Ó nÐn d·y 48 bÝt thµnh 32 bÝt, ta chia d·y 48 bÝt thµnh 8 d·y con liªn tiÕp ®¸nh sè tõ 1 ®Õn 8, mçi d·y 6 bÝt, d·y thø I, 1 £ I £ 8, do SI

nÐn thµnh d·y 4 bÝt, ghÐp 8 d·y 4 bÝt l¹i ta nhËn ®îc d·y 32 bit. C¸ch nÐn nh sau: gi¶ sö cã d·y 6 bÝt lµ d·y thø I,

b1b2b3b4b5b6

Hai bÝt b1b6 xem nh d¹ng nhÞ ph©n cña sè U, 0 £ U £ 3, cßn bèn bÝt gi÷a b2 b3b4 b5, xem nh d¹ng nhÞ ph©n cña sè V, 0 £ V £ 15, lÊy ph©n tö dßng U, cét V cña SI vµ biÓu diÔn díi d¹ng nhÞ ph©n víi 4 bÝt, ®ã sÏ lµ d¹ng nÐn cña d·y 6 bit b1b2b3b4b5b6.

VÝ dô, nÕu ®o¹n thø 7 lµ 100101, phÇn tö dßng 3 (d¹ng thËp ph©n cña 11) vµ cét 2 (d¹ng thËp ph©n cña 0010) b»ng 13 cã d¹ng nhÞ ph©n lµ 1101; d·y 100101 ®îc nÐn thµnh d·y 1101.

Bíc 5. f(RU-1,KU) nhËn ®îc tõ Y’ b»ng ho¸n vÞ cho bëi b¶ng sau:

16 7 20 21

29 12 28 17

1 15 23 26

5 18 31 10

2 8 24 14

32 27 3 9

19 13 30 6

22 11 4 25

- 417 -

§Ó gi¶i m· víi kho¸ m· K, ta lÆp l¹i qu¸ tr×nh m· ho¸ chØ kh¸c lµ d·y c¸c KU sÏ dïng theo thø tù ngîc l¹i: trong c¸c giai ®o¹n tõ 1 ®Õn 16, lÇn lît dïng c¸c kho¸ K16, K15, . . ., K1.

HÖ DES víi mét sè söa ®æi nhá hiÖn ®îc dïng trong nhiÒu giao dÞch trªn m¹ng. ¦u ®iÓm cña hÖ lµ tèc ®é m· ho¸ vµ gi¶i m· nhanh. Cã nhiÒu dù tÝnh tiÕn c«ng hÖ m· nhng mét khã kh¨n gÆp ph¶i khi ®ã lµ kh«ng gian kho¸ rÊt lín: 256 phÇn tö.

Denning gi¶ ®Þnh cã ngêi chÕ t¹o mét m¸y tÝnh song song víi 106 chip, mçi chip ®¶m nhiÖm viÖc duyÖt mét sè kho¸ vµ mçi kho¸ duyÖt trong 1 micro gi©y th× cÇn mét ngµy míi duyÖt hÕt vµ gi¸ thµnh thiÕt bÞ cì 20 triÖu ®« la Mü.

Tuy nhiªn, víi c¸c tiÕn bé hiÖn nay cña kü thuËt tÝnh to¸n, ngêi ta còng ®· tiÕn hµnh nhiÒu biÖn ph¸p t¨ng cêng cho ®é an toµn cña hÖ DES nh ¸p dông m· ho¸ DES mét sè lÇn hoÆc nghiªn cøu c¸c hÖ DES víi ®é dµi kho¸ 112 bÝt.

8.6.2.2. C¸c hÖ m· mËt kho¸ c«ng khai

Nh ta ®· nãi trong môc tríc, ®èi víi c¸c hÖ m· cæ ®iÓn, ngêi sö dông ph¶i gi÷ bÝ mËt c¶ ¸nh x¹ m· ho¸ lÉn ¸nh x¹ gi¶i m·. NÕu hÖ th«ng ®ång thêi b¶o ®¶m liªn l¹c cho N ngêi th× hÖ thèng ph¶i cung cÊp N(N-1)/2 kho¸. Víi N lín, ®ã lµ mét g¸nh nÆng cho hÖ thèng.

Vµo n¨m 1976, Diffie vµ Helmann ®a ra ý tëng vÒ c¸c hÖ m· mËt kho¸ c«ng khai (Public Key Cryptosystem - sÏ ®îc viÕt t¾t lµ PKC).

Khi dïng PKC, ngêi së h÷u kho¸ K cã thÓ c«ng khai ¸nh x¹ lËp m· EK vµ gi÷ bÝ mËt ¸nh x¹ gi¶i m· DK.

Muèn nh vËy, mét hÖ PKC ph¶i ®¸p øng ®îc c¸c yªu cÇu sau:

1. ViÖc tÝnh c¸c ¸nh x¹ m· ho¸ ph¶i lµ bµi to¸n dÔ.

2. §èi víi ngêi së h÷u kho¸ hîp ph¸p, viÖc tÝnh c¸c DK ph¶i nhanh chãng vµ thuËn tiÖn.

- 418 -

3. §èi víi ngêi kh«ng së h÷u kho¸ hîp ph¸p, viÖc t×m DK tõ EK lµ bµi to¸n rÊt khã, thËm chÝ ngay c¶ khi anh/chÞ ta biÕt ®îc EK vµ EK(M), viÖc kh«i phôc ®îc M còng lµ bµi to¸n rÊt khã.

Gi¶ sö anh/chÞ A c«ng khai ¸nh x¹ lËp m· EA, nÕu B muèn göi mét th«ng b¸o M cho A, ngêi ®ã chØ viÖc göi EA(M). Khi nhËn ®îc EA(M), A ¸p ¸nh x¹ gi¶i m· DA vµo vµ sÏ nhËn ®îc M.

Tuy nhiªn ph¬ng thøc nµy vÉn cßn s¬ hë, anh/chÞ C nµo ®ã cã thÓ m¹o danh B göi cho A mét th«ng b¸o nµo ®ã víi néi dung bÊt lîi cho c¶ A vµ B. Khi ®ã gi÷a A vµ B sÏ x¶y ra tranh c·i: A kh¼ng ®Þnh B cã göi th«ng b¸o, cßn B th× phñ nhËn ®iÒu ®ã.

NÕu hÖ m· mËt ®îc thiÕt kÕ sao cho c¸c ¸nh x¹ E vµ D giao ho¸n (kh«ng phô thuéc thø tù ¸p dông), ta cã thÓ kh¾c phôc s¬ hë trªn nh sau: gi¶ sö A vµ B ®Òu dïng PKC, nÕu A muèn göi th«ng b¸o M cho B, A sÏ göi DA(M). V× B biÕt EA, B ¸p EA vµo DA(M) sÏ nhËn ®îc M.

Theo c¸ch nµy, A kh«ng thÓ tõ chèi th«ng b¸o M cña m×nh v× chØ cã A lµ chñ së h÷u hîp ph¸p D. Tuy nhiªn, B cã thÓ tõ chèi viÖc nhËn ®îc M. Giao thøc 4 bíc sau sÏ b¶o ®¶m viÖc kh«ng g©y nªn tranh c·i:

Bíc 1. A göi EA(M) cho B

Bíc 2. B göi DB EA(M) cho A

Bíc 3. A göi DADBEA(M) cho B

Bíc 4. B tÝnh EBDADBEA(M) ®Ó nhËn M.

HiÖn nay ngêi ta ®· thiÕt kÕ rÊt nhiÒu hÖ m· mËt kho¸ c«ng khai vµ mét khuynh híng kh¸ phæ biÕn lµ kÕt hîp viÖc b¶o mËt víi viÖc söa sai, tøc lµ thiÕt kÕ c¸c hÖ m· mËt cã kh¶ n¨ng söa sai. Sau ®©y ta sÏ giíi thiÖu mét hÖ m· mËt kho¸ c«ng khai tiªu biÓu. §ã lµ hÖ RSA.

RSA lµ ba ch÷ ®Çu cña nh÷ng ngêi thiÕt kÕ hÖ m·: Rivest, Shamir vµ Adleman. HÖ nµy ra ®êi n¨m 1978.

§Ó x©y dùng mét kho¸ m·, ta tiÕn hµnh c¸c bíc sau:

- 419 -

Chän hai sè nguyªn tè kh¸c nhau Ýt (nãi chung lín ®Õn hµng tr¨m ch÷ sè) P vµ Q.

TÝnh N = P.Q vµ (N) = (P - 1).(Q - 1), N ®îc gäi lµ m« ®un cña hÖ m·.

Chän ngÉu nhiªn mét sè nguyªn d¬ng D>1 sao cho D nguyªn tè víi (N) vµ tÝnh sè nguyªn d¬ng E sao cho E.D 1 (Mod (N)), E ®îc gäi lµ sè mò m· ho¸ cßn D ®îc gäi lµ sè mò gi¶i m·.

§Ó tiÕn hµnh m· ho¸, b¶n râ cÇn ®îc tiÒn xö lý thµnh c¸c sè nguyªn d¬ng trong ph¹m vi 2..N-1. NÕu M lµ b¶n râ th× b¶n m· C sÏ ®îc tÝnh theo c«ng thøc

C = ME Mod N

§Ó gi¶i m·, b»ng c¸ch tÝnh

CD Mod N

ta sÏ nhËn ®îc M.

Ngêi së h÷u hÖ m· c«ng khai N, E vµ gi÷u bÝ mËt D còng nh P vµ Q.

B»ng c¸c kÕt qu¶ cña lý thuyÕt sè vµ dïng thuËt gi¶i FastExp (xem Môc 4.5.2), ta cã thÓ chøng tá ®îc tÝnh ®óng ®¾n cña viÖc gi¶i m· vµ hÖ m· ®¸p øng c¸c yªu cÇu cña mét PKC.

Sù an toµn cña hÖ RSA dùa trªn ®é khã cña bµi to¸n ph©n tÝch sè N thµnh tÝch hai sè P vµ Q. Cho tíi nay bµi to¸n ph©n tÝch mét sè nguyªn d¬ng thµnh tÝch c¸c thõa sè nguyªn tè vÉn cßn nhiÒu vÊn ®Ò cha ®îc gi¶i quyÕt.

Mét nhîc ®iÓm dÔ thÊy cña hÖ RSA lµ nÕu kh«ng cÈn thËn, sau khi m· ho¸, b¶n râ cã thÓ bÞ béc lé. Mét hÖ m· ®îc gäi lµ béc lé b¶n râ nÕu cã b¶n râ M mµ sau khi m· ho¸, ta vÉn nhËn ®îc chÝnh M.

VÝ dô nÕu chän P = 97, Q = 109, E =865 th× víi mäi M, 1 £ M £ N-1, ta cã

- 420 -

M865 Mod N = M

Tuy nhiªn, vÒ mÆt to¸n häc, khi chon P, Q vµ D, ngêi ta cã thÓ t×m ®îc sè lîng vµ c¸c gi¸ trÞ cña M mµ sau khi m· ho¸, ta vÉn nhËn ®îc M. Khi ®ã, c¸c gi¸ trÞ chän lµm b¶n râ ph¶i kh¸c víi c¸c gi¸ trÞ M lµm béc lé b¶n râ.

So víi hÖ DES, hÖ RSA cã tèc ®é m· ho¸ chËm h¬n.

Bµi tËp

H·y ph¸t biÓu theo quan niÖm cña Tin häc vÒ bµi to¸n vµ tr×nh bµy thuËt gi¶i cho mçi mét trong 17 bµi to¸n ®Çu tiªn. §¸nh gi¸ ®é phøc t¹p cña tõng thuËt gi¶i:

Bµi 1. Gi¶i vµ biÖn luËn ph¬ng tr×nh bËc nhÊt tæng qu¸t: aX + b = 0.

Bµi 2. Gi¶i vµ biÖn luËn ph¬ng tr×nh bËc hai tæng qu¸t: aX2 + bX + c = 0.

Bµi 3. Gi¶i vµ biÖn luËn hÖ ph¬ng tr×nh bËc nhÊt hai Èn sè tæng qu¸t.

Bµi 4. Gi¶i vµ biÖn luËn ph¬ng tr×nh trïng ph¬ng tæng qu¸t: aX4 + bX2 + c = 0.

Bµi 5. Gi¶i vµ biÖn luËn hÖ hai ph¬ng tr×nh bËc hai a1X2 + b1X + c1

= 0 vµ a2X2 + b2X + c2 = 0.

Bµi 6. Cho mét h×nh ch÷ nhËt ABCD víi hai c¹nh nguyªn d¬ng AB = M vµ BC = N. H×nh ch÷ nhËt ®îc chia thµnh c¸c « vu«ng ®¬n vÞ. H·y t×m sè « vu«ng cã ®iÓm chung víi ®êng chÐo AC.

Bµi 7. Cho mét h×nh ch÷ nhËt ABCD víi hai c¹nh nguyªn d¬ng AB=M vµ BC= N. H×nh ch÷ nhËt ®îc chia thµnh c¸c « vu«ng ®¬n vÞ. H·y t×m sè « vu«ng cã ®iÓm trong chung víi ®êng chÐo AC.

Bµi 8. XÐt d·y v« h¹n c¸c ch÷ sè A nhËn ®îc b»ng c¸ch viÕt liªn tiÕp c¸c sè nguyªn d¬ng liªn tiÕp t¨ng dÇn b¾t ®Çu tõ 1, 2, 3, 4, . . . .

- 421 -

1234567891011121314151617181920212223.....

Cho sè nguyªn d¬ng N. H·y t×m ch÷ sè thø N cña d·y A.

VÝ dô víi N =13, ch÷ sè thø N cña d·y trªn lµ 1.

Bµi 9. Cho sè nguyªn d¬ng N. LËp d·y B c¸c ch÷ sè nhËn ®îc b»ng c¸ch viÕt c¸c sè nguyªn d¬ng liªn tiÕp t¨ng dÇn b¾t ®Çu tõ 1, 2, 3, 4, . . . cho tíi N. H·y t×m ch÷ sè thø N tÝnh tõ ch÷ sè cuèi cïng cña d·y B.

Bµi 10. XÐt tËp A c¸c sè nguyªn d¬ng ®îc x¸c ®Þnh nh sau:

4. 1ÎA.

5. NÕu KÎA th× 2K+1 vµ 3K+1 ÎA.

6. A gåm vµ chØ gåm c¸c sè tho¶ m·n mét trong hai ®iÒu kiªn 1 vµ 2.

Cho mét sè nguyªn d¬ng N kh«ng lín h¬n 60000. H·y t×m sè c¸c sè thuéc A kh«ng lín h¬n N.

Bµi 11. Hai ngêi A vµ B ch¬i trß ch¬i sau: A bÝ mËt chän mét sè nguyªn d¬ng N vµ nãi râ N kh«ng lín mét sè M nguyªn d¬ng vµ B ®o¸n xem A chän sè nµo. B ®îc quyÒn hái A mét sè c©u hái vµ A sÏ chØ tr¶ lêi ®óng hay sai vµ mäi c©u tr¶ lêi cña A lµ chÝnh x¸c. H·y chän cho B mét sè Ýt nhÊt c©u hái ®Ó sau khi hái xong, B ®o¸n ®óng ®îc sè N.

Bµi 12. §Ó tæng kÕt ®iÓm cuèi häc kú vµ tiÕn hµnh ph©n lo¹i kÕt qu¶ häc tËp cña c¸c häc sinh trong mét líp häc, gi¸o viªn chñ nhiÖm cã sæ ®iÓm cña líp. CÇn tÝnh ®iÓm trung b×nh tõng m«n häc vµ tÝnh ®iÓm trung b×nh toµn häc kú cho tõng häc sinh.

Víi mçi m«n häc, c¸c ®iÓm kiÓm tra miÖng, kiÓm tra 15 phót tÝnh hÖ sè 1, c¸c ®iÓm kiÓm tra 1 tiÕt tÝnh hÖ sè 2, ®iÓm kiÓm tra häc kú tÝnh hÖ sè 3. Khi tÝnh ®iÓm trung b×nh toµn häc kú, c¸c ®iÓm

- 422 -

trung b×nh m«n cña V¨n, To¸n tÝnh hÖ sè 3, cña Lý, Ho¸, Ngo¹i ng÷ - hÖ sè 2, c¸c m«n cßn l¹i - hÖ sè 1.

Cã n¨m møc ph©n lo¹i häc tËp: kÐm, trung b×nh, kh¸, giái vµ xuÊt s¾c t¬ng øng víi ®iÓm trung b×nh toµn häc kú thuéc c¸c miÒn: <5, [5,7), [7,8), [8,9) vµ [9,10]. H·y viÕt ra cho gi¸o viªn chñ nhiÖm c¸c bíc tiÕn hµnh c«ng viÖc nµy.

Bµi 13. Trªn mÆt ph¼ng to¹ ®é cho to¹ ®é cña bèn ®iÓm A, B, C, D trong ®ã kh«ng cã ba ®iÓm nµo th¼ng hµng. H·y cho biÕt hai ®o¹n AB vµ CD cã ®iÓm chung hay kh«ng.

Bµi 14. Trªn mÆt ph¼ng to¹ ®é cho to¹ ®é cña bèn ®iÓm A, B, C, D trong ®ã kh«ng cã ba ®iÓm nµo th¼ng hµng. H·y cho biÕt hai ®o¹n AB vµ CD cã ®iÓm trong chung hay kh«ng.

Bµi 15. Cho h×nh ch÷ nhËt ABCD vµ mét ®iÓm M trªn mÆt ph¼ng to¹ ®é. BiÕt to¹ ®é cña A, B, C, D, M. H·y cho biÕt kh¶ n¨ng nµo trong hai kh¶ n¨ng sau x¶y ra:

3. M thuéc h×nh ch÷ nhËt ABCD.

4. M kh«ng thuéc h×nh ch÷ nhËt ABCD.

Bµi 16. Cho h×nh ch÷ nhËt ABCD vµ hai ®iÓm kh¸c nhau M, N trªn mÆt ph¼ng to¹ ®é. BiÕt to¹ ®é cña A, B, C, D, M, N. H·y cho biÕt kh¶ n¨ng nµo trong ba kh¶ n¨ng sau x¶y ra:

4. §o¹n MN n»m trong (cã thÓ cã ®iÓm trªn biªn) h×nh ch÷ nhËt ABCD.

5. §o¹n MN n»m ngoµi h×nh ch÷ nhËt ABCD.

6. §o¹n MN cã ®iÓm n»m ngoµi h×nh ch÷ nhËt ABCD vµ cã ®iÓm n»m trong h×nh ch÷ nhËt ABCD.

Bµi 17. Trªn mÆt ph¼ng to¹ ®é cho ®a gi¸c P1 . . .PN. §a gi¸c ®îc gäi lµ tù c¾t nÕu cã hai c¹nh PIPI+1 vµ PJPJ+1 víi I<J-1 (quy íc ®Ønh PN+1 lµ ®Ønh P1) cã ®iÓm chung. §a gi¸c ®îc gäi lµ låi nÕu víi bÊt kú

- 423 -

c¹nh nµo cña ®a gi¸c, toµn bé ®a gi¸c n»m vÒ mét phÝa cña ®êng th¼ng ®i qua c¹nh ®ã. BiÕt to¹ ®é c¸c ®Ønh cña ®a gi¸c. H·y cho biÕt ®a gi¸c cã tù c¾t kh«ng? NÕu ®a gi¸c kh«ng tù c¾t, h·y cho biÕt ®a gi¸c cã låi kh«ng?. NÕu ®a gi¸c kh«ng låi, h·y chän mét sè Ýt nhÊt c¸c ®Ønh sao cho mäi ®Ønh P1, . .,PN ®Òu thuéc ®a gi¸c låi cã c¸c ®Ønh lµ c¸c ®Ønh ®îc chän (®a gi¸c nµy ®îc gäi lµ bao låi cña tËp ®iÓm P1, . .,PN).

Bµi 18. Cho N x©u S1, . . ., SN ®Òu cã ®é dµi kh«ng qu¸ 20 vµ x©u S cã ®é dµi kh«ng qu¸ 255, N kh«ng lín 100. H·y t×m mäi c¸ch biÓu diÔn x©u S díi d¹ng ghÐp cña c¸c x©u S1, . . ., SN.

D÷ liÖu vµo ®îc cho bëi file XAU.INP trong ®ã dßng thø nhÊt ghi x©u S, tiÕp theo lµ N dßng, dßng thø I ghi x©u SI.

KÕt qu¶ ghi ra file XAU.OUT nh sau: dßng thø nhÊt ghi sè B lµ sè c¸ch biÓu diÔn kh¸c nhau, nÕu B>0, tiÕp theo lµ B dßng mçi dßng ghi c¸c chØ sè cña c¸c x©u mµ theo tr×nh tù ®ã ta ghÐp víi nhau sÏ thu ®îc x©u S.

Bµi 19. Mét xe dän r¸c trong mét khu phè gåm N nót giao th«ng ®¸nh sè tõ 1 ®Õn N, N<=50, gi÷a hai nót I vµ J cã ®o¹n phè hai chiÒu dµi nguyªn d¬ng C[I,J] = C[J,I] <= 1000. HÖ thèng c¸c ®o¹n phè liªn th«ng. Hµnh tr×nh cña xe xuÊt ph¸t tõ nót U, sau khi ®· ®i qua mçi ®o¹n phè Ýt nhÊt mét lÇn l¹i quay vÒ nót U. H·y t×m cho xe mét hµnh tr×nh ng¾n nhÊt.

D÷ liÖu vµo ®îc cho bëi file XR.INP trong ®ã dßng thø nhÊt ghi hai sè N, U. TiÕp theo lµ mét sè dßng, mçi dßng ghi ba sè I, J, K víi ý nghÜa cã ®o¹n phè nçi nót I víi nót J víi ®é dµi K.

KÕt qu¶ ghi ra file XR.OUT nh sau: dßng thø nhÊt ghi sè D lµ sè nót trªn hµnh tr×nh cña xe b¾t ®Çu tõ U vµ kÕt thóc t¹i U, tiÕp theo lµ mét sè dßng, mçi dßng ghi tªn mét nót trªn hµnh tr×nh lÇn lît b¾t ®Çu tõ U vµ cuèi cïng lµ U.

- 424 -

VÝ dô

XR.INP XR.OUT

4 2 6

1 2 1 2 1 2 3

2 3 1 4 3 2

3 4 1

Bµi 20. Cã mét hÖ thèng ®êng liªn th«ng nèi N nót giao th«ng cã tªn 1..N, 3£N£200. HÖ thèng ®êng nµy ®· xuèng cÊp. CÇn chän mét sè ®o¹n ®êng n©ng cÊp sao cho ®èi víi hÖ thèng chØ gåm c¸c ®o¹n ®êng ®îc n©ng cÊp, hai yªu cÇu sau ®îc tho¶ m·n:

1. Gi÷a hai nót bÊt kú chØ cã ®óng mét ®êng ®i.

2. Sè M c¸c nót giao th«ng chØ lµ ®Çu mót cña mét ®o¹n ®-êng lµ nhiÒu nhÊt cã thÓ ®îc.

D÷ liÖu vµo ®îc cho bëi file NC.INP gåm N dßng trong ®ã dßng thø I ghi tªn c¸c nót cã ®o¹n ®êng nèi trùc tiÕp víi nót I.

KÕt qu¶ ghi ra file NC.OUT nh sau: dßng thø nhÊt ghi sè M, tiÕp theo lµ mét sè dßng, mçi dßng ghi tªn hai nót ®Çu mót cña mét ®o¹n ®-êng cÇn n©ng cÊp.

VÝ dô

NC.INP NC.OUT

2 3 8 5

1 5 6 8 2 8

1 4 7 8 1 8

3 5 6 7 3 8

2 4 6 7 8

2 4 5 7 7 6

3 4 6 8 4 6

- 425 -

1 2 3 7 5 6

Bµi 21. Cho mét h×nh ch÷ nhËt cã kÝch thíc M, N, M, N nguyªn d-¬ng kh«ng lín h¬n 100. Cã mét m¸y c¾t mµ khi c¾t mét h×nh ch÷ nhËt bÊt kú, m¸y chØ c¾t ®îc mét nh¸t theo ph¬ng song song víi mét trong hai c¹nh h×nh ch÷ nhËt.

H·y t×m c¸ch c¾t h×nh ch÷ nhËt ®· cho thµnh mét sè h×nh vu«ng cã c¹nh nguyªn d¬ng sao cho tæng c¸c gi¸ trÞ cña c¸c h×nh vu«ng ®ã lµ lín nhÊt cã thÓ ®îc.

D÷ liÖu vµo ®îc cho bëi file CAT.INP trong ®ã dßng thø nhÊt ghi hai sè M vµ N, trong 100 dßng tiÕp theo, dßng thø I ghi gi¸ trÞ cña h×nh vu«ng cã c¹nh b»ng I. Chó ý r»ng kh«ng nhÊt thiÕt h×nh vu«ng lín h¬n cã gi¸ trÞ lín h¬n. KÕt qu¶ ghi ra file CAT.OUT nh sau: dßng thø nhÊt ghi tæng gi¸ trÞ c¸c hinh vu«ng c¾t ®îc, dßng thø hai ghi sè H lµ sè h×nh vu«ng c¾t ®îc, dßng thø ba ghi H ®é dµi c¹nh cña H h×nh vu«ng c¾t ®îc.

VÝ dô

CAT.INP CAT.OUT5 6 3501 550 3 3 2 2 210011. . . . 1

Bµi 22. Mét x©u ký tù ®îc gäi lµ palindrom nÕu khi viÕt x©u theo thø tù ngîc l¹i, ta vÉn nhËn ®îc chÝnh x©u ®ã, x©u ®é dµi 1 lu«n lµ palindrom.

Cho mét x©u S cã ®é dµi kh«ng qu¸ 1000. H·y t×m c¸ch biÓu diÔn S díi d¹ng ghÐp cña mét sè Ýt nhÊt x©u palindrom.

- 426 -

D÷ liÖu vµo ®îc cho bëi file PAL.INP gåm mét dßng ghi tõ ®Çu dßng x©u S.

KÕt qu¶ ghi ra file PAL.OUT nh sau: dßng thø nhÊt ghi sè K lµ sè x©u palindrom cña biÓu diÔn x©u S. Dßng thø hai ghi K sè lµ vÞ trÝ c¸c x©u palindrom xuÊt hiÖn trong S.

VÝ dô

PAL.INP PAL.OUTabacc 2

1 4Bµi 23. Víi mçi x©u ký tù S, ta cã thÓ thùc hiÖn c¸c phÐp biÕn ®æi sau víi c¸c ký hiÖu t¬ng øng trong ®ã gi÷a hai môc chØ cã ®óng mét dÊu trèng:

1. X i : xo¸ ký tù thø i cña S

2. C i a: chÌn vµo tríc ký tù thø i cña S ký tù ®îc ký hiÖu lµ a. NÕu x©u S cã ®é dµi N th× C N+1 a cã nghÜa lµ viÕt vµo cuèi x©u S ký tù ®îc ký hiÖu lµ a.

3. T i a: thay ký tù thø i cña S b»ng ký tù ®îc ký hiÖu lµ a.

Bµi to¸n ®Æt ra lµ cho hai x©u ký tù S1 vµ S2 cã ®é dµi kh«ng qu¸ 100, h·y t×m mét d·y Ýt nhÊt phÐp biÕn ®æi thuéc bèn lo¹i trªn biÕn S1 thµnh S2.

D÷ liÖu vµo ®îc cho bëi file XAU.INP gåm hai dßng, dßng thø nhÊt/hai ghi tõ ®Çu dßng x©u S1/S2.

KÕt qu¶ ghi ra file XAU.OUT nh sau: dßng thø nhÊt ghi sè B lµ sè biÕn ®æi cÇn dïng, nÕu B>0, trong B dßng tiÕp theo, mçi dßng ghi ký hiÖu mét phÐp biÕn ®æi, khi ghi ký hiÖu, gi÷a c¸c phÇn ng¨n c¸ch ®óng mét dÊu trèng; thø tù c¸c phÐp biÕn ®æi tõ trªn xuèng díi lµ thø tù thùc hiÖn ®Ó biÕn S1 thµnh S2.

VÝ dô

- 427 -

XAU.INP XAU.OUTacadc 2abcabc C 2 b

T 5 b

- 428 -