Giáo trình môn Cấu trúc dữ liệu và giải thuật

MUÏC LUÏC  
Muïc  
Trang  
CHÖÔNG 1: TOÅNG QUAN VEÀ CAÁU TRUÙC DÖÕ LIEÄU & GT ...........3  
1.1. Taàm quan troïng cuûa CTDL & GT trong moät ñeà aùn tin hoïc........................ 3  
1.1.1. Xaây döïng caáu truùc döõ lieäu ......................................................................... 3  
1.1.2. Xaây döïng giaûi thuaät ................................................................................... 3  
1.1.3. Moái quan heä giöõa caáu truùc döõ lieäu vaø giaûi thuaät ....................................... 3  
1.2. Ñaùnh giaù Caáu truùc döõ lieäu & Giaûi thuaät....................................................... 3  
1.2.1. Caùc tieâu chuaån ñaùnh giaù caáu truùc döõ lieäu ................................................. 3  
1.2.2. Ñaùnh giaù ñoä phöùc taïp cuûa thuaät toaùn........................................................ 4  
1.3. Kieåu döõ lieäu..................................................................................................... 4  
1.3.1. Khaùi nieäm veà kieåu döõ lieäu.......................................................................... 4  
1.3.2. Caùc kieåu döõ lieäu cô sôû ............................................................................... 4  
1.3.3. Caùc kieåu döõ lieäu coù caáu truùc...................................................................... 5  
1.3.4. Kieåu döõ lieäu con troû................................................................................... 5  
1.3.5. Kieåu döõ lieäu taäp tin.................................................................................... 5  
Caâu hoûi vaø baøi taäp ................................................................................................. 6  
CHÖÔNG 2: KYÕ THUAÄT TÌM KIEÁM (Searching) .............................8  
2.1. Khaùi quaùt veà tìm kieám.................................................................................... 8  
2.2. Caùc giaûi thuaät tìm kieám noäi ........................................................................... 8  
2.2.1. Ñaët vaán ñeà................................................................................................. 8  
2.2.2. Tìm tuyeán tính............................................................................................ 8  
2.2.3. Tìm nhò phaân............................................................................................ 10  
2.3. Caùc giaûi thuaät tìm kieám ngoaïi ..................................................................... 14  
2.3.1. Ñaët vaán ñeà............................................................................................... 14  
2.3.2. Tìm tuyeán tính.......................................................................................... 14  
2.3.3. Tìm kieám theo chæ muïc............................................................................. 16  
Caâu hoûi vaø baøi taäp ............................................................................................... 17  
CHÖÔNG 3: KYÕ THUAÄT SAÉP XEÁP (SORTING) .............................19  
3.1. Khaùi quaùt veà saép xeáp.................................................................................... 19  
3.2. Caùc giaûi thuaät saép xeáp noäi............................................................................ 19  
3.2.1 Saép xeáp baèng phöông phaùp ñoåi choã.......................................................... 20  
3.2.2. Saép xeáp baèng phöông phaùp choïn ............................................................. 28  
3.2.3. Saép xeáp baèng phöông phaùp cheøn ............................................................. 33  
3.2.4. Saép xeáp baèng phöông phaùp troän .............................................................. 40  
3.3. Caùc giaûi thuaät saép xeáp ngoaïi........................................................................ 60  
3.3.1. Saép xeáp baèng phöông phaùp troän .............................................................. 60  
3.3.2. Saép xeáp theo chæ muïc............................................................................... 79  
Caâu hoûi vaø baøi taäp ............................................................................................... 82  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
CHÖÔNG 4: DANH SAÙCH (LIST).....................................................84  
4.1. Khaùi nieäm veà danh saùch ............................................................................... 84  
4.2. Caùc pheùp toaùn treân danh saùch..................................................................... 84  
4.3. Danh saùch ñaëc ............................................................................................... 85  
4.3.1. Ñònh nghóa............................................................................................... 85  
4.3.2. Bieåu dieãn danh saùch ñaëc.......................................................................... 85  
4.3.3. Caùc thao taùc treân danh saùch ñaëc ............................................................. 85  
4.3.4. Öu nhöôïc ñieåm vaø ÖÙng duïng ................................................................... 91  
4.4. Danh saùch lieân keát ........................................................................................ 92  
4.4.1. Ñònh nghóa............................................................................................... 92  
4.4.2. Danh saùch lieân keát ñôn ............................................................................ 92  
4.4.3. Danh saùch lieân keát keùp .......................................................................... 111  
4.4.4. Öu nhöôïc ñieåm cuûa danh saùch lieân keát .................................................. 135  
4.5. Danh saùch haïn cheá...................................................................................... 135  
4.5.1. Haøng ñôïi................................................................................................ 135  
4.5.2. Ngaên xeáp ............................................................................................... 142  
4.5.3. ÖÙng duïng cuûa danh saùch haïn cheá.......................................................... 147  
Caâu hoûi vaø baøi taäp ............................................................................................. 147  
CHÖÔNG 5: CAÂY (TREE) ...............................................................149  
5.1. Khaùi nieäm – Bieåu dieãn caây......................................................................... 149  
5.1.1. Ñònh nghóa caây ...................................................................................... 149  
5.1.2. Moät soá khaùi nieäm lieân quan ................................................................... 149  
5.1.3. Bieåu dieãn caây......................................................................................... 151  
5.2. Caây nhò phaân ............................................................................................... 152  
5.2.1. Ñònh nghóa............................................................................................. 152  
5.2.2. Bieåu dieãn vaø Caùc thao taùc ..................................................................... 152  
5.2.3. Caây nhò phaân tìm kieám........................................................................... 163  
5.3. Caây caân baèng............................................................................................... 188  
5.3.1. Ñònh nghóa – Caáu truùc döõ lieäu............................................................... 188  
5.3.2. Caùc thao taùc .......................................................................................... 189  
Caâu hoûi vaø baøi taäp ............................................................................................. 227  
OÂN TAÄP (REVIEW)..........................................................................224  
Heä thoáng laïi caùc Caáu truùc döõ lieäu vaø caùc Giaûi thuaät ñaõ hoïc.......................... 224  
Caâu hoûi vaø Baøi taäp oân taäp toång hôïp................................................................. 227  
TAØI LIEÄU THAM KHAÛO .................................................................229  
By Hút thuc lá có hi cho sc khe at 9:19 pm, Jun 25, 2007  
Trang: 2  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
Chöông 1: TOÅNG QUAN VEÀ CAÁU TRUÙC DÖÕ LIEÄU VAØ GIAÛI THUAÄT  
1.1. Taàm quan troïng cuûa caáu truùc döõ lieäu vaø giaûi thuaät trong moät  
ñeà aùn tin hoïc  
1.1.1. Xaây döïng caáu truùc döõ lieäu  
Coù theå noùi raèng khoâng coù moät chöông trình maùy tính naøo maø khoâng coù döõ lieäu ñeå xöû lyù.  
Döõ lieäu coù theå laø döõ lieäu ñöa vaøo (input data), döõ lieäu trung gian hoaëc döõ lieäu ñöa ra  
(output data). Do vaäy, vieäc toå chöùc ñeå löu tröõ döõ lieäu phuïc vuï cho chöông trình coù yù  
nghóa raát quan troïng trong toaøn boä heä thoáng chöông trình. Vieäc xaây döïng caáu truùc döõ  
lieäu quyeát ñònh raát lôùn ñeán chaát löôïng cuõng nhö coâng söùc cuûa ngöôøi laäp trình trong vieäc  
thieát keá, caøi ñaët chöông trình.  
1.1.2. Xaây döïng giaûi thuaät  
Khaùi nieäm giaûi thuaät hay thuaät giaûi maø nhieàu khi coøn ñöôïc goïi laø thuaät toaùn duøng ñeå chæ  
phöông phaùp hay caùch thöùc (method) ñeå giaûi quyeát vaàn ñeà. Giaûi thuaät coù theå ñöôïc minh  
hoïa baèng ngoân ngöõ töï nhieân (natural language), baèng sô ñoà (flow chart) hoaëc baèng maõ  
giaû (pseudo code). Trong thöïc teá, giaûi thuaät thöôøng ñöôïc minh hoïa hay theå hieän baèng  
maõ giaû töïa treân moät hay moät soá ngoân ngöõ laäp trình naøo ñoù (thöôøng laø ngoân ngöõ maø  
ngöôøi laäp trình choïn ñeå caøi ñaët thuaät toaùn), chaúng haïn nhö C, Pascal, …  
Khi ñaõ xaùc ñònh ñöôïc caáu truùc döõ lieäu thích hôïp, ngöôøi laäp trình seõ baét ñaàu tieán haønh  
xaây döïng thuaät giaûi töông öùng theo yeâu caàu cuûa baøi toaùn ñaët ra treân cô sôû cuûa caáu truùc  
döõ lieäu ñaõ ñöôïc choïn. Ñeå giaûi quyeát moät vaán ñeà coù theå coù nhieàu phöông phaùp, do vaäy  
söï löïa choïn phöông phaùp phuø hôïp laø moät vieäc maø ngöôøi laäp trình phaûi caân nhaéc vaø tính  
toaùn. Söï löïa choïn naøy cuõng coù theå goùp phaàn ñaùng keå trong vieäc giaûm bôùt coâng vieäc  
cuûa ngöôøi laäp trình trong phaàn caøi ñaët thuaät toaùn treân moät ngoân ngöõ cuï theå.  
1.1.3. Moái quan heä giöõa caáu truùc döõ lieäu vaø giaûi thuaät  
Moái quan heä giöõa caáu truùc döõ lieäu vaø Giaûi thuaät coù theå minh hoïa baèng ñaúng thöùc:  
Caáu truùc döõ lieäu + Giaûi thuaät = Chöông trình  
Nhö vaäy, khi ñaõ coù caáu truùc döõ lieäu toát, naém vöõng giaûi thuaät thöïc hieän thì vieäc theå hieän  
chöông trình baèng moät ngoân ngöõ cuï theå chæ laø vaán ñeà thôøi gian. Khi coù caáu truùc döõ lieäu  
maø chöa tìm ra thuaät giaûi thì khoâng theå coù chöông trình vaø ngöôïc laïi khoâng theå coù  
Thuaät giaûi khi chöa coù caáu truùc döõ lieäu. Moät chöông trình maùy tính chæ coù theå ñöôïc hoaøn  
thieän khi coù ñaày ñuû caû Caáu truùc döõ lieäu ñeå löu tröõ döõ lieäu vaø Giaûi thuaät xöû lyù döõ lieäu  
theo yeâu caàu cuûa baøi toaùn ñaët ra.  
1.2. Ñaùnh giaù caáu truùc döõ lieäu vaø giaûi thuaät  
1.2.1. Caùc tieâu chuaån ñaùnh giaù caáu truùc döõ lieäu  
Ñeå ñaùnh giaù moät caáu truùc döõ lieäu chuùng ta thöôøng döïa vaøo moät soá tieâu chí sau:  
- Caáu truùc döõ lieäu phaûi tieát kieäm taøi nguyeân (boä nhôù trong),  
Trang: 3  
By Hút thuc lá có hi cho sc khe at 9:19 pm, Jun 25, 2007  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
- Caáu truùc döõ lieäu phaûi phaûn aûnh ñuùng thöïc teá cuûa baøi toaùn,  
- Caáu truùc döõ lieäu phaûi deã daøng trong vieäc thao taùc döõ lieäu.  
1.2.2. Ñaùnh giaù ñoä phöùc taïp cuûa thuaät toaùn  
Vieäc ñaùnh giaù ñoä phöùc taïp cuûa moät thuaät toaùn quaû khoâng deã daøng chuùt naøo. ÔÛ daây,  
chuùng ta chæ muoán öôùc löôïng thôøi gian thöïc hieän thuaän toaùn T(n) ñeå coù theå coù söï so  
saùnh töông ñoái giöõa caùc thuaät toaùn vôùi nhau. Trong thöïc teá, thôøi gian thöïc hieän moät  
thuaät toaùn coøn phuï thuoäc raát nhieàu vaøo caùc ñieàu kieän khaùc nhö caáu taïo cuûa maùy tính,  
döõ lieäu ñöa vaøo, …, ôû ñaây chuùng ta chæ xem xeùt treân möùc ñoä cuûa löôïng döõ lieäu ñöa vaøo  
ban ñaàu cho thuaät toaùn thöïc hieän.  
Ñeå öôùc löôïng thôøi gian thöïc hieän thuaät toaùn chuùng ta coù theå xem xeùt thôøi gian thöïc hieän  
thuaät toaùn trong hai tröôøng hôïp:  
- Trong tröôøng hôïp toát nhaát: Tmin  
- Trong tröôøng hôïp xaáu nhaát: Tmax  
Töø ñoù chuùng ta coù theå öôùc löôïng thôøi gian thöïc hieän trung bình cuûa thuaät toaùn: Tavg  
1.3. Kieåu döõ lieäu  
1.3.1. Khaùi nieäm veà kieåu döõ lieäu  
Kieåu döõ lieäu T coù theå xem nhö laø söï keát hôïp cuûa 2 thaønh phaàn:  
- Mieàn giaù trò maø kieåu döõ lieäu T coù theå löu tröõ: V,  
- Taäp hôïp caùc pheùp toaùn ñeå thao taùc döõ lieäu: O.  
T = <V, O>  
Moãi kieåu döõ lieäu thöôøng ñöôïc ñaïi dieän bôûi moät teân (ñònh danh). Moãi phaàn töû döõ lieäu coù  
kieåu T seõ coù giaù trò trong mieàn V vaø coù theå ñöôïc thöïc hieän caùc pheùp toaùn thuoäc taäp hôïp  
caùc pheùp toaùn trong O.  
Ñeå löu tröõ caùc phaàn töû döõ lieäu naøy thöôøng phaûi toán moät soá byte(s) trong boä nhôù, soá  
byte(s) naøy goïi laø kích thöôùc cuûa kieåu döõ lieäu.  
1.3.2. Caùc kieåu döõ lieäu cô sôû  
Haàu heát caùc ngoân ngöõ laäp trình ñeàu coù cung caáp caùc kieåu döõ lieäu cô sôû. Tuøy vaøo moãi  
ngoân ngöõ maø caùc kieåu döõ lieäu cô sôû coù theå coù caùc teân goïi khaùc nhau song chung quy  
laïi coù nhöõng loaïi kieåu döõ lieäu cô sôû nhö sau:  
- Kieåu soá nguyeân: Coù theå coù daáu hoaëc khoâng coù daáu vaø thöôøng coù caùc kích thöôùc sau:  
+ Kieåu soá nguyeân 1 byte  
+ Kieåu soá nguyeân 2 bytes  
+ Kieåu soá nguyeân 4 bytes  
Kieåu soá nguyeân thöôøng ñöôïc thöïc hieän vôùi caùc pheùp toaùn: O = {+, -, *, /, DIV, MOD, <,  
>, <=, >=, =, …}  
Trang: 4  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
- Kieåu soá thöïc: Thöôøng coù caùc kích thöôùc sau:  
+ Kieåu soá thöïc 4 bytes  
+ Kieåu soá thöïc 6 bytes  
+ Kieåu soá thöïc 8 bytes  
+ Kieåu soá thöïc 10 bytes  
Kieåu soá thöïc thöôøng ñöôïc thöïc hieän vôùi caùc pheùp toaùn: O = {+, -, *, /, <, >, <=, >=, =, …}  
- Kieåu kyù töï: Coù theå coù caùc kích thöôùc sau:  
+ Kieåu kyù töï byte  
+ Kieåu kyù töï 2 bytes  
Kieåu kyù töï thöôøng ñöôïc thöïc hieän vôùi caùc pheùp toaùn: O = {+, -, <, >, <=, >=, =, ORD,  
CHR, …}  
- Kieåu chuoãi kyù töï: Coù kích thöôùc tuøy thuoäc vaøo töøng ngoân ngöõ laäp trình  
Kieåu chuoãi kyù töï thöôøng ñöôïc thöïc hieän vôùi caùc pheùp toaùn: O = {+, &, <, >, <=, >=, =,  
Length, Trunc, …}  
- Kieåu luaän lyù: Thöôøng coù kích thöôùc 1 byte  
Kieåu luaän lyù thöôøng ñöôïc thöïc hieän vôùi caùc pheùp toaùn: O = {NOT, AND, OR, XOR, <, >,  
<=, >=, =, …}  
1.3.3. Caùc kieåu döõ lieäu coù caáu truùc  
Kieåu döõ lieäu coù caáu truùc laø caùc kieåu döõ lieäu ñöôïc xaây döïng treân cô sôû caùc kieåu döõ lieäu  
ñaõ coù (coù theå laïi laø moät kieåu döõ lieäu coù caáu truùc khaùc). Tuøy vaøo töøng ngoân ngöõ laäp  
trình song thöôøng coù caùc loaïi sau:  
- Kieåu maûng hay coøn goïi laø daõy: kích thöôùc baèng toång kích thöôùc cuûa caùc phaàn töû  
- Kieåu baûn ghi hay caáu truùc: kích thöôùc baèng toång kích thöôùc caùc thaønh phaàn (Field)  
1.3.4. Kieåu döõ lieäu con troû  
Caùc ngoân ngöõ laäp trình thöôøng cung caáp cho chuùng ta moät kieåu döõ lieäu ñaëc bieät ñeå löu  
tröõ caùc ñòa chæ cuûa boä nhôù, ñoù laø con troû (Pointer). Tuøy vaøo loaïi con troû gaàn (near  
pointer) hay con troû xa (far pointer) maø kieåu döõ lieäu con troû coù caùc kích thöôùc khaùc  
nhau:  
+ Con troû gaàn: 2 bytes  
+ Con troû xa: 4 bytes  
1.3.5. Kieåu döõ lieäu taäp tin  
Taäp tin (File) coù theå xem laø moät kieåu döõ lieäu ñaëc bieät, kích thöôùc toái ña cuûa taäp tin tuøy  
thuoäc vaøo khoâng gian ñóa nôi löu tröõ taäp tin. Vieäc ñoïc, ghi döõ lieäu tröïc tieáp treân taäp tin  
raát maát thôøi gian vaø khoâng baûo ñaûm an toaøn cho döõ lieäu treân taäp tin ñoù. Do vaäy, trong  
thöïc teá, chuùng ta khoâng thao taùc tröïc tieáp döõ lieäu treân taäp tin maø chuùng ta caàn chuyeån  
töøng phaàn hoaëc toaøn boä noäi dung cuûa taäp tin vaøo trong boä nhôù trong ñeå xöû lyù.  
Trang: 5  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
Caâu hoûi vaø Baøi taäp  
1. Trình baøy taàm quan troïng cuûa Caáu truùc döõ lieäu vaø Giaûi thuaät ñoái vôùi ngöôøi laäp trình?  
2. Caùc tieâu chuaån ñeå ñaùnh giaù caáu truùc döõ lieäu vaø giaûi thuaät?  
3. Khi xaây döïng giaûi thuaät coù caàn thieát phaûi quan taâm tôùi caáu truùc döõ lieäu hay khoâng?  
Taïi sao?  
4. Lieät keâ caùc kieåu döõ lieäu cô sôû, caùc kieåu döõ lieäu coù caáu truùc trong C, Pascal?  
5. Söû duïng caùc kieåu döõ lieäu cô baûn trong C, haõy xaây döïng caáu truùc döõ lieäu ñeå löu tröõ  
trong boä nhôù trong (RAM) cuûa maùy tính ña thöùc coù baäc töï nhieân n (0 n 100) treân  
tröôøng soá thöïc (ai , x  
R):  
n
i
fn ( x ) =  
a i x  
i = 0  
Vôùi caáu truùc döõ lieäu ñöôïc xaây döïng, haõy trình baøy thuaät toaùn vaø caøi ñaët chöông trình ñeå  
thöïc hieän caùc coâng vieäc sau:  
- Nhaäp, xuaát caùc ña thöùc.  
- Tính giaù trò cuûa ña thöùc taïi giaù trò x0 naøo ñoù.  
- Tính toång, tích cuûa hai ña thöùc.  
6. Töông töï nhö baøi taäp 5. nhöng ña thöùc trong tröôøng soá höõu tyû Q (caùc heä soá ai vaø x laø  
caùc phaân soá coù töû soá vaø maãu soá laø caùc soá nguyeân).  
7. Cho baûng giôø taøu ñi töø ga Saigon ñeán caùc ga nhö sau (ga cuoái laø ga Haø noäi):  
TAØU ÑI  
S2  
S4  
S6  
S8  
S10  
S12  
S14  
S16  
S18  
LH2  
27giôø 10g30  
21g00 21g50 11g10 15g40 10g00 12g30 17g00 20g00 22g20 13g20 18g40  
SN2  
HAØNH TRÌNH 32 giôø 41 giôø 41 giôø 41 giôø 41 giôø 41 giôø 41 giôø 41 giôø 41 giôø  
SAIGON ÑI  
MÖÔNG MAÙN  
THAÙP CHAØM  
NHA TRANG  
TUY HOØA  
DIEÂU TRÌ  
2g10  
5g01  
6g47  
9g43  
11g49  
15g41  
15g21 19g53 14g07 16g41 21g04  
18g06 22g47 16g43 19g19  
20g00  
23g09  
1g20  
4g55  
1g15  
4g05  
5g42  
8g36  
3g16  
6g03  
8g06  
10g50  
17g35 22g58  
20g19 2g15  
22g46 5g15  
2g10  
4g15  
7g34  
0g08  
1g57  
5g11  
7g09  
4g10  
8g12  
0g47  
3g39  
5g46  
9g24  
10g39  
12g20  
18g50 21g10  
21g53  
0g00  
3g24  
4g38  
6g19  
0g19  
2g30  
5g55  
7g10  
9g26  
10g42 13g00  
QUAÛNG NGAÕI  
11g21 14g35 17g04  
12g40 16g08 18g21  
14g41 17g43 20g17 10g53  
TAM KYØ  
ÑAØ NAÜNG  
HUEÁ  
6g11  
8g29  
9g03  
13g27 19g04  
16g21 22g42 12g29 15g47 11g12 14g32 18g13 21g14 23g50 15g10  
ÑOÂNG HAØ  
ÑOÀNG HÔÙI  
VINH  
THANH HOÙA  
NINH BÌNH  
NAM ÑÒNH  
PHUÛ LYÙ  
0g14  
2g27  
7g45  
10g44  
12g04  
12g37  
13g23  
14g40  
13g52 17g12 12g42 16g05 19g38 22g39  
1g25  
3g28  
9g20  
12g20  
19g15  
23g21  
15g52 19g46 14g41 17g59 21g38  
0g52  
7g07  
9g59  
21g00  
0g01  
1g28  
2g01  
2g42  
4g00  
1g08  
4g33  
5g54  
6g26  
7g08  
8g30  
20g12 23g50  
2g59  
6g39  
7g57  
8g29  
9g09  
23g09  
0g31  
1g24  
2g02  
3g15  
3g33  
4g50  
5g22  
6g00  
7g10  
11g12 13g51  
11g44 14g25  
12g23 15g06  
ÑEÁN HAØ NOÄI  
5g00  
10g25 13g45 16g20  
Söû duïng caùc kieåu döõ lieäu cô baûn, haõy xaây döïng caáu truùc döõ lieäu thích hôïp ñeå löu tröõ  
baûng giôø taøu treân vaøo boä nhôù trong vaø boä nhôù ngoaøi (disk) cuûa maùy tính.  
Vôùi caáu truùc döõ lieäu ñaõ ñöôïc xaây döïng ôû treân, haõy trình baøy thuaät toaùn vaø caøi ñaët  
chöông trình ñeå thöïc hieän caùc coâng vieäc sau:  
- Xuaát ra giôø ñeán cuûa moät taøu T0 naøo ñoù taïi moät ga G0 naøo ñoù.  
Trang: 6  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
- Xuaát ra giôø ñeán caùc ga cuûa moät taøu T0 naøo ñoù.  
- Xuaát ra giôø caùc taøu ñeán moät ga G0 naøo ñoù.  
- Xuaát ra baûng giôø taøu theo maãu ôû treân.  
Löu yù:  
- Caùc oâ troáng ghi nhaän taïi caùc ga ñoù, taøu naøy khoâng ñi ñeán hoaëc chæ ñi qua maø  
khoâng döøng laïi.  
- Doøng “HAØNH TRÌNH” ghi nhaän toång soá giôø taøu chaïy töø ga Saigon ñeán ga Haø noäi.  
8. Töông töï nhö baøi taäp 7. nhöng chuùng ta caàn ghi nhaän theâm thoâng tin veà ñoaøn taøu khi  
döøng taïi caùc ga chæ ñeå traùnh taøu hay ñeå cho khaùch leân/xuoáng (caùc doøng in nghieâng  
töông öùng vôùi caùc ga coù khaùch leân/xuoáng, caùc doøng khaùc chæ döøng ñeå traùnh taøu).  
9. Söû duïng kieåu döõ lieäu caáu truùc trong C, haõy xaây döïng caáu truùc döõ lieäu ñeå löu tröõ trong  
boä nhôù trong (RAM) cuûa maùy tính traïng thaùi cuûa caùc coät ñeøn giao thoâng (coù 3 ñeøn:  
Xanh, Ñoû, Vaøng). Vôùi caáu truùc döõ lieäu ñaõ ñöôïc xaây döïng, haõy trình baøy thuaät toaùn vaø  
caøi ñaët chöông trình ñeå moâ phoûng (minh hoïa) cho hoaït ñoäng cuûa 2 coät ñeøn treân hai  
tuyeán ñöôøng giao nhau taïi moät ngaõ tö.  
10. Söû duïng caùc kieåu döõ lieäu cô baûn trong C, haõy xaây döïng caáu truùc döõ lieäu ñeå löu tröõ  
trong boä nhôù trong (RAM) cuûa maùy tính traïng thaùi cuûa moät baøn côø CARO coù kích  
thöôùc M×N (0 M, N 20). Vôùi caáu truùc döõ lieäu ñöôïc xaây döïng, haõy trình baøy thuaät  
toaùn vaø caøi ñaët chöông trình ñeå thöïc hieän caùc coâng vieäc sau:  
- In ra maøn hình baøn côø CARO trong traïng thaùi hieän haønh.  
- Kieåm tra xem coù ai thaéng hay khoâng? Neáu coù thì thoâng baùo “Keát thuùc”, neáu khoâng  
coù thì thoâng baùo “Tieáp tuïc”.  
Trang: 7  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
Chöông 2: KYÕ THUAÄT TÌM KIEÁM (SEARCHING)  
2.1. Khaùi quaùt veà tìm kieám  
Trong thöïc teá, khi thao taùc, khai thaùc döõ lieäu chuùng ta haàu nhö luùc naøo cuõng phaûi thöïc  
hieän thao taùc tìm kieám. Vieäc tìm kieám nhanh hay chaäm tuøy thuoäc vaøo traïng thaùi vaø traät  
töï cuûa döõ lieäu treân ñoù. Keát quaû cuûa vieäc tìm kieám coù theå laø khoâng coù (khoâng tìm thaáy)  
hoaëc coù (tìm thaáy). Neáu keát quaû tìm kieám laø coù tìm thaáy thì nhieàu khi chuùng ta coøn phaûi  
xaùc ñònh xem vò trí cuûa phaàn töû döõ lieäu tìm thaáy laø ôû ñaâu? Trong phaïm vi cuûa chöông  
naøy chuùng ta tìm caùch giaûi quyeát caùc caâu hoûi naøy.  
Tröôùc khi ñi vaøo nghieân cöùu chi tieát, chuùng ta giaû söû raèng moãi phaàn töû döõ lieäu ñöôïc  
xem xeùt coù moät thaønh phaàn khoùa (Key) ñeå nhaän dieän, coù kieåu döõ lieäu laø T naøo ñoù, caùc  
thaønh phaàn coøn laïi laø thoâng tin (Info) lieân quan ñeán phaàn töû döõ lieäu ñoù. Nhö vaäy moãi  
phaàn töû döõ lieäu coù caáu truùc döõ lieäu nhö sau:  
typedef  
struct DataElement  
Key;  
{ T  
InfoType  
} DataType;  
Info;  
Trong taøi lieäu naøy, khi noùi tôùi giaù trò cuûa moät phaàn töû döõ lieäu chuùng ta muoán noùi tôùi giaù  
trò khoùa (Key) cuûa phaàn töû döõ lieäu ñoù. Ñeå ñôn giaûn, chuùng ta giaû söû raèng moãi phaàn töû  
döõ lieäu chæ laø thaønh phaàn khoùa nhaän dieän.  
Vieäc tìm kieám moät phaàn töû coù theå dieãn ra treân moät daõy/maûng (tìm kieám noäi) hoaëc dieãn  
ra treân moät taäp tin/ file (tìm kieám ngoaïi). Phaàn töû caàn tìm laø phaàn töû caàn thoûa maõn ñieàu  
kieän tìm kieám (thöôøng coù giaù trò baèng giaù trò tìm kieám). Tuøy thuoäc vaøo töøng baøi toaùn cuï  
theå maø ñieàu kieän tìm kieám coù theå khaùc nhau song chung quy vieäc tìm kieám döõ lieäu  
thöôøng ñöôïc vaän duïng theo caùc thuaät toaùn trình baøy sau ñaây.  
2.2. Caùc giaûi thuaät tìm kieám noäi (Tìm kieám treân daõy/maûng)  
2.2.1. Ñaët vaán ñeà  
Giaû söû chuùng ta coù moät maûng M goàm N phaàn töû. Vaán ñeà ñaët ra laø coù hay khoâng phaàn töû  
coù giaù trò baèng X trong maûng M? Neáu coù thì phaàn töû coù giaù trò baèng X laø phaàn töû thöù  
maáy trong maûng M?  
2.2.2. Tìm tuyeán tính (Linear Search)  
Thuaät toaùn tìm tuyeán tính coøn ñöôïc goïi laø Thuaät toaùn tìm kieám tuaàn töï (Sequential  
Search).  
a. Tö töôûng:  
Laàn löôït so saùnh caùc phaàn töû cuûa maûng M vôùi giaù trò X baét ñaàu töø phaàn töû ñaàu tieân  
cho ñeán khi tìm ñeán ñöôïc phaàn töû coù giaù trò X hoaëc ñaõ duyeät qua heát taát caû caùc phaàn  
töû cuûa maûng M thì keát thuùc.  
Trang: 8  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
b. Thuaät toaùn:  
B1: k = 1  
B2: IF M[k] X AND k N  
//Duyeät töø ñaàu maûng  
//Neáu chöa tìm thaáy vaø cuõng chöa duyeät heát maûng  
B2.1: k++  
B2.2: Laëp laïi B2  
B3: IF k N  
Tìm thaáy taïi vò trí k  
B4: ELSE  
Khoâng tìm thaáy phaàn töû coù giaù trò X  
B5: Keát thuùc  
c. Caøi ñaët thuaät toaùn:  
Haøm LinearSearch coù prototype:  
int LinearSearch (T M[], int N, T X);  
Haøm thöïc hieän vieäc tìm kieám phaàn töû coù giaù trò X treân maûng M coù N phaàn töû. Neáu tìm  
thaáy, haøm traû veà moät soá nguyeân coù giaù trò töø 0 ñeán N-1 laø vò trí töông öùng cuûa phaàn  
töû tìm thaáy. Trong tröôøng hôïp ngöôïc laïi, haøm traû veà giaù trò –1 (khoâng tìm thaáy). Noäi  
dung cuûa haøm nhö sau:  
int LinearSearch (T M[], int N, T X)  
{ int k = 0;  
while (M[k] != X && k < N)  
k++;  
if (k < N)  
return (k);  
return (-1);  
}
d. Phaân tích thuaät toaùn:  
- Tröôøng hôïp toát nhaát khi phaàn töû ñaàu tieân cuûa maûng coù giaù trò baèng X:  
Soá pheùp gaùn: Gmin = 1  
Soá pheùp so saùnh: Smin = 2 + 1 = 3  
- Tröôøng hôïp xaáu nhaát khi khoâng tìm thaáy phaàn töû naøo coù giaù trò baèng X:  
Soá pheùp gaùn: Gmax = 1  
Soá pheùp so saùnh: Smax = 2N+1  
- Trung bình:  
Soá pheùp gaùn: Gavg = 1  
Soá pheùp so saùnh: Savg = (3 + 2N + 1) : 2 = N + 2  
e. Caûi tieán thuaät toaùn:  
Trong thuaät toaùn treân, ôû moãi böôùc laëp chuùng ta caàn phaûi thöïc hieän 2 pheùp so saùnh ñeå  
kieåm tra söï tìm thaáy vaø kieåm soaùt söï heát maûng trong quaù trình duyeät maûng. Chuùng ta  
coù theå giaûm bôùt 1 pheùp so saùnh neáu chuùng ta theâm vaøo cuoái maûng moät phaàn töû caàm  
canh (sentinel/stand by) coù giaù trò baèng X ñeå nhaän dieän ra söï heát maûng khi duyeät  
maûng, khi ñoù thuaät toaùn naøy ñöôïc caûi tieán laïi nhö sau:  
Trang: 9  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
B1: k = 1  
B2: M[N+1] = X  
B3: IF M[k] X  
B3.1: k++  
//Phaàn töû caàm canh  
B3.2: Laëp laïi B3  
B4: IF k < N  
Tìm thaáy taïi vò trí k  
B5: ELSE  
Khoâng tìm thaáy phaàn töû coù giaù trò X  
B6: Keát thuùc  
//k = N song ñoù chæ laø phaàn töû caàm canh  
Haøm LinearSearch ñöôïc vieát laïi thaønh haøm LinearSearch1 nhö sau:  
int LinearSearch1 (T M[], int N, T X)  
{ int k = 0;  
M[N] = X;  
while (M[k] != X)  
k++;  
if (k < N)  
return (k);  
return (-1);  
}
f. Phaân tích thuaät toaùn caûi tieán:  
- Tröôøng hôïp toát nhaát khi phaàn töû ñaàu tieân cuûa maûng coù giaù trò baèng X:  
Soá pheùp gaùn: Gmin = 2  
Soá pheùp so saùnh: Smin = 1 + 1 = 2  
- Tröôøng hôïp xaáu nhaát khi khoâng tìm thaáy phaàn töû naøo coù giaù trò baèng X:  
Soá pheùp gaùn: Gmax = 2  
Soá pheùp so saùnh: Smax = (N+1) + 1 = N + 2  
- Trung bình:  
Soá pheùp gaùn: Gavg = 2  
Soá pheùp so saùnh: Savg = (2 + N + 2) : 2 = N/2 + 2  
- Nhö vaäy, neáu thôøi gian thöïc hieän pheùp gaùn khoâng ñaùng keå thì thuaät toaùn caûi tieán seõ  
chaïy nhanh hôn thuaät toaùn nguyeân thuûy.  
2.2.3. Tìm nhò phaân (Binary Search)  
Thuaät toaùn tìm tuyeán tính toû ra ñôn giaûn vaø thuaän tieän trong tröôøng hôïp soá phaàn töû cuûa  
daõy khoâng lôùn laém. Tuy nhieân, khi soá phaàn töû cuûa daõy khaù lôùn, chaúng haïn chuùng ta tìm  
kieám teân moät khaùch haøng trong moät danh baï ñieän thoaïi cuûa moät thaønh phoá lôùn theo  
thuaät toaùn tìm tuaàn töï thì quaû thöïc maát raát nhieàu thôøi gian. Trong thöïc teá, thoâng thöôøng  
caùc phaàn töû cuûa daõy ñaõ coù moät thöù töï, do vaäy thuaät toaùn tìm nhò phaân sau ñaây seõ ruùt  
ngaén ñaùng keå thôøi gian tìm kieám treân daõy ñaõ coù thöù töï. Trong thuaät toaùn naøy chuùng ta  
giaû söû caùc phaàn töû trong daõy ñaõ coù thöù töï taêng (khoâng giaûm daàn), töùc laø caùc phaàn töû  
ñöùng tröôùc luoân coù giaù trò nhoû hôn hoaëc baèng (khoâng lôùn hôn) phaàn töû ñöùng sau noù.  
Khi ñoù, neáu X nhoû hôn giaù trò phaàn töû ñöùng ôû giöõa daõy (M[Mid]) thì X chæ coù theå tìm  
Trang: 10  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
thaáy ôû nöûa ñaàu cuûa daõy vaø ngöôïc laïi, neáu X lôùn hôn phaàn töû M[Mid] thì X chæ coù theå tìm  
thaáy ôû nöûa sau cuûa daõy.  
a. Tö töôûng:  
Phaïm vi tìm kieám ban ñaàu cuûa chuùng ta laø töø phaàn töû ñaàu tieân cuûa daõy (First = 1)  
cho ñeán phaàn töû cuoái cuøng cuûa daõy (Last = N).  
So saùnh giaù trò X vôùi giaù trò phaàn töû ñöùng ôû giöõa cuûa daõy M laø M[Mid].  
Neáu X = M[Mid]: Tìm thaáy  
Neáu X < M[Mid]: Ruùt ngaén phaïm vi tìm kieám veà nöûa ñaàu cuûa daõy M (Last = Mid–1)  
Neáu X > M[Mid]: Ruùt ngaén phaïm vi tìm kieám veà nöûa sau cuûa daõy M (First = Mid+1)  
Laëp laïi quaù trình naøy cho ñeán khi tìm thaáy phaàn töû coù giaù trò X hoaëc phaïm vi tìm  
kieám cuûa chuùng ta khoâng coøn nöõa (First > Last).  
b. Thuaät toaùn ñeä quy (Recursion Algorithm):  
B1: First = 1  
B2: Last = N  
B3: IF (First > Last)  
//Heát phaïm vi tìm kieám  
B3.1: Khoâng tìm thaáy  
B3.2: Thöïc hieän Bkt  
B4: Mid = (First + Last)/ 2  
B5: IF (X = M[Mid])  
B5.1: Tìm thaáy taïi vò trí Mid  
B5.2: Thöïc hieän Bkt  
B6: IF (X < M[Mid])  
Tìm ñeä quy töø First ñeán Last = Mid – 1  
B7: IF (X > M[Mid])  
Tìm ñeä quy töø First = Mid + 1 ñeán Last  
Bkt: Keát thuùc  
c. Caøi ñaët thuaät toaùn ñeä quy:  
Haøm BinarySearch coù prototype:  
int BinarySearch (T M[], int N, T X);  
Haøm thöïc hieän vieäc tìm kieám phaàn töû coù giaù trò X trong maûng M coù N phaàn töû ñaõ coù  
thöù töï taêng. Neáu tìm thaáy, haøm traû veà moät soá nguyeân coù giaù trò töø 0 ñeán N-1 laø vò trí  
töông öùng cuûa phaàn töû tìm thaáy. Trong tröôøng hôïp ngöôïc laïi, haøm traû veà giaù trò –1  
(khoâng tìm thaáy). Haøm BinarySearch söû duïng haøm ñeä quy RecBinarySearch coù  
prototype:  
int RecBinarySearch(T M[], int First, int Last, T X);  
Haøm RecBinarySearch thöïc hieän vieäc tìm kieám phaàn töû coù giaù trò X treân maûng M  
trong phaïm vi töø phaàn töû thöù First ñeán phaàn töû thöù Last. Neáu tìm thaáy, haøm traû veà  
moät soá nguyeân coù giaù trò töø First ñeán Last laø vò trí töông öùng cuûa phaàn töû tìm thaáy.  
Trong tröôøng hôïp ngöôïc laïi, haøm traû veà giaù trò –1 (khoâng tìm thaáy). Noäi dung cuûa caùc  
haøm nhö sau:  
Trang: 11  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
int RecBinarySearch (T M[], int First, int Last, T X)  
{ if (First > Last)  
return (-1);  
int Mid = (First + Last)/2;  
if (X == M[Mid])  
return (Mid);  
if (X < M[Mid])  
return(RecBinarySearch(M, First, Mid – 1, X));  
else  
return(RecBinarySearch(M, Mid + 1, Last, X));  
}
//=======================================================  
int BinarySearch (T M[], int N, T X)  
{ return (RecBinarySearch(M, 0, N – 1, X));  
}
d. Phaân tích thuaät toaùn ñeä quy:  
- Tröôøng hôïp toát nhaát khi phaàn töû ôû giöõa cuûa maûng coù giaù trò baèng X:  
Soá pheùp gaùn: Gmin = 1  
Soá pheùp so saùnh: Smin = 2  
- Tröôøng hôïp xaáu nhaát khi khoâng tìm thaáy phaàn töû naøo coù giaù trò baèng X:  
Soá pheùp gaùn: Gmax = log2N + 1  
Soá pheùp so saùnh: Smax = 3log2N + 1  
- Trung bình:  
Soá pheùp gaùn: Gavg = ½ log2N + 1  
Soá pheùp so saùnh: Savg = ½(3log2N + 3)  
e. Thuaät toaùn khoâng ñeä quy (Non-Recursion Algorithm):  
B1: First = 1  
B2: Last = N  
B3: IF (First > Last)  
B3.1: Khoâng tìm thaáy  
B3.2: Thöïc hieän Bkt  
B4: Mid = (First + Last)/ 2  
B5: IF (X = M[Mid])  
B5.1: Tìm thaáy taïi vò trí Mid  
B5.2: Thöïc hieän Bkt  
B6: IF (X < M[Mid])  
B6.1: Last = Mid – 1  
B6.2: Laëp laïi B3  
B7: IF (X > M[Mid])  
B7.1: First = Mid + 1  
B7.2: Laëp laïi B3  
Bkt: Keát thuùc  
Trang: 12  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
f. Caøi ñaët thuaät toaùn khoâng ñeä quy:  
Haøm NRecBinarySearch coù prototype: int NRecBinarySearch (T M[], int N, T X);  
Haøm thöïc hieän vieäc tìm kieám phaàn töû coù giaù trò X trong maûng M coù N phaàn töû ñaõ coù  
thöù töï taêng. Neáu tìm thaáy, haøm traû veà moät soá nguyeân coù giaù trò töø 0 ñeán N-1 laø vò trí  
töông öùng cuûa phaàn töû tìm thaáy. Trong tröôøng hôïp ngöôïc laïi, haøm traû veà giaù trò –1  
(khoâng tìm thaáy). Noäi dung cuûa haøm NRecBinarySearch nhö sau:  
int NRecBinarySearch (T M[], int N, T X)  
{ int First = 0;  
int Last = N – 1;  
while (First <= Last)  
{ int Mid = (First + Last)/2;  
if (X == M[Mid])  
return(Mid);  
if (X < M[Mid])  
Last = Mid – 1;  
else  
First = Mid + 1;  
}
return(-1);  
}
g. Phaân tích thuaät toaùn khoâng ñeä quy:  
- Tröôøng hôïp toát nhaát khi phaàn töû ôû giöõa cuûa maûng coù giaù trò baèng X:  
Soá pheùp gaùn: Gmin = 3  
Soá pheùp so saùnh: Smin = 2  
- Tröôøng hôïp xaáu nhaát khi khoâng tìm thaáy phaàn töû naøo coù giaù trò baèng X:  
Soá pheùp gaùn: Gmax = 2log2N + 4  
Soá pheùp so saùnh: Smax = 3log2N + 1  
- Trung bình:  
Soá pheùp gaùn: Gavg = log2N + 3.5  
Soá pheùp so saùnh: Savg = ½(3log2N + 3)  
h. Ví duï:  
Giaû söû ta coù daõy M goàm 10 phaàn töû coù khoùa nhö sau (N = 10):  
1
3
4
5
8
15  
17  
22  
25  
30  
- Tröôùc tieân ta thöïc hieän tìm kieám phaàn töû coù giaù trò X = 5 (tìm thaáy):  
Laàn laëp First Last First > Last  
Mid  
M[Mid]  
X =  
M[Mid]  
False  
False  
False  
True  
X <  
M[Mid]  
True  
False  
False  
X >  
M[Mid]  
False  
True  
Ban ñaàu  
0
0
2
3
9
3
3
3
False  
False  
False  
False  
4
1
2
3
8
3
4
5
1
2
3
True  
Trang: 13  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
Keát quaû sau 3 laàn laëp (ñeä quy) thuaät toaùn keát thuùc.  
- Baây giôø ta thöïc hieän tìm kieám phaàn töû coù giaù trò X = 7 (khoâng tìm thaáy):  
Laàn laëp First Last First > Last  
Mid  
M[Mid]  
X =  
M[Mid]  
False  
False  
False  
False  
X <  
M[Mid]  
True  
False  
False  
False  
X >  
M[Mid]  
False  
True  
True  
True  
Ban ñaàu  
0
0
2
3
4
9
3
3
3
3
False  
False  
False  
False  
True  
4
1
2
3
8
3
4
5
1
2
3
4
Keát quaû sau 4 laàn laëp (ñeä quy) thuaät toaùn keát thuùc.  
Löu yù:  
Thuaät toaùn tìm nhò phaân chæ coù theå vaän duïng trong tröôøng hôïp daõy/maûng ñaõ coù  
thöù töï. Trong tröôøng hôïp toång quaùt chuùng ta chæ coù theå aùp duïng thuaät toaùn tìm  
kieám tuaàn töï.  
Caùc thuaät toaùn ñeä quy coù theå ngaén goïn song toán keùm boä nhôù ñeå ghi nhaän maõ  
leänh chöông trình (moãi laàn goïi ñeä quy) khi chaïy chöông trình, do vaäy coù theå  
laøm cho chöông trình chaïy chaäm laïi. Trong thöïc teá, khi vieát chöông trình neáu coù  
theå chuùng ta neân söû duïng thuaät toaùn khoâng ñeä quy.  
2.3. Caùc giaûi thuaät tìm kieám ngoaïi (Tìm kieám treân taäp tin)  
2.3.1. Ñaët vaán ñeà  
Giaû söû chuùng ta coù moät taäp tin F löu tröõ N phaàn töû. Vaán ñeà ñaët ra laø coù hay khoâng phaàn  
töû coù giaù trò baèng X ñöôïc löu tröõ trong taäp tin F? Neáu coù thì phaàn töû coù giaù trò baèng X laø  
phaàn töû naèm ôû vò trí naøo treân taäp tin F?  
2.3.2. Tìm tuyeán tính  
a. Tö töôûng:  
Laàn löôït ñoïc caùc phaàn töû töø ñaàu taäp tin F vaø so saùnh vôùi giaù trò X cho ñeán khi ñoïc  
ñöôïc phaàn töû coù giaù trò X hoaëc ñaõ ñoïc heát taäp tin F thì keát thuùc.  
b. Thuaät toaùn:  
B1: k = 0  
B2: rewind(F)  
//Veà ñaàu taäp tin F  
B3: read(F, a)  
//Ñoïc moät phaàn töû töø taäp tin F  
//Vò trí phaàn töû hieän haønh (sau phaàn töû môùi ñoïc)  
B4: k = k + sizeof(T)  
B5: IF a X AND !(eof(F))  
Laëp laïi B3  
B6: IF (a = X)  
Tìm thaáy taïi vò trí k byte(s) tính töø ñaàu taäp tin  
B7: ELSE  
Khoâng tìm thaáy phaàn töû coù giaù trò X  
Trang: 14  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
B8: Keát thuùc  
c. Caøi ñaët thuaät toaùn:  
Haøm FLinearSearch coù prototype:  
long FLinearSearch (char * FileName, T X);  
Haøm thöïc hieän tìm kieám phaàn töû coù giaù trò X trong taäp tin coù teân FileName. Neáu tìm  
thaáy, haøm traû veà moät soá nguyeân coù giaù trò töø 0 ñeán filelength(FileName) laø vò trí  
töông öùng cuûa phaàn töû tìm thaáy so vôùi ñaàu taäp tin (tính baèng byte). Trong tröôøng hôïp  
ngöôïc laïi, hoaëc coù loãi khi thao taùc treân taäp tin haøm traû veà giaù trò –1 (khoâng tìm thaáy  
hoaëc loãi thao taùc treân taäp tin). Noäi dung cuûa haøm nhö sau:  
long FLinearSearch (char * FileName, T X)  
{ FILE * Fp;  
Fp = fopen(FileName, “rb”);  
if (Fp == NULL)  
return (-1);  
long k = 0;  
T a;  
int SOT = sizeof(T);  
while (!feof(Fp))  
{ if (fread(&a, SOT, 1, Fp) == 0)  
break;  
k = k + SOT;  
if (a == X)  
break;  
}
fclose(Fp);  
if (a == X)  
return (k - SOT);  
return (-1);  
}
d. Phaân tích thuaät toaùn:  
- Tröôøng hôïp toát nhaát khi phaàn töû ñaàu tieân cuûa taäp tin coù giaù trò baèng X:  
Soá pheùp gaùn: Gmin = 1 + 2 = 3  
Soá pheùp so saùnh: Smin = 2 + 1 = 3  
Soá laàn ñoïc taäp tin: Dmin = 1  
- Tröôøng hôïp xaáu nhaát khi khoâng tìm thaáy phaàn töû naøo coù giaù trò baèng X:  
Soá pheùp gaùn: Gmax = N + 2  
Soá pheùp so saùnh: Smax = 2N + 1  
Soá laàn ñoïc taäp tin: Dmax = N  
- Trung bình:  
Soá pheùp gaùn: Gavg = ½(N + 5)  
Soá pheùp so saùnh: Savg = (3 + 2N + 1) : 2 = N + 2  
Soá laàn ñoïc taäp tin: Davg = ½(N + 1)  
Trang: 15  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
2.3.3. Tìm kieám theo chæ muïc (Index Search)  
Nhö chuùng ta ñaõ bieát, moãi phaàn töû döõ lieäu ñöôïc löu tröõ trong taäp tin döõ lieäu F thöôøng coù  
kích thöôùc lôùn, ñieàu naøy cuõng laøm cho kích thöôùc cuûa taäp tin F cuõng khaù lôùn. Vì vaäy  
vieäc thao taùc döõ lieäu tröïc tieáp leân taäp tin F seõ trôû neân laâu, chöa keå söï maát an toaøn cho  
döõ lieäu treân taäp tin. Ñeå giaûi quyeát vaán ñeà naøy, ñi keøm theo moät taäp tin döõ lieäu thöôøng coù  
theâm caùc taäp tin chæ muïc (Index File) ñeå laøm nhieäm vuï ñieàu khieån thöù töï truy xuaát döõ  
lieäu treân taäp tin theo moät khoùa chæ muïc (Index key) naøo ñoù. Moãi phaàn töû döõ lieäu trong  
taäp tin chæ muïc IDX goàm coù 2 thaønh phaàn: Khoùa chæ muïc vaø Vò trí vaät lyù cuûa phaàn töû döõ  
lieäu coù khoùa chæ muïc töông öùng treân taäp tin döõ lieäu. Caáu truùc döõ lieäu cuûa caùc phaàn töû  
trong taäp tin chæ muïc nhö sau:  
typedef  
struct IdxElement  
IdxKey;  
{ T  
long Pos;  
} IdxType;  
Taäp tin chæ muïc luoân luoân ñöôïc saép xeáp theo thöù töï taêng cuûa khoùa chæ muïc. Vieäc taïo  
taäp tin chæ muïc IDX seõ ñöôïc nghieân cöùu trong Chöông 3, trong phaàn naøy chuùng ta xem  
nhö ñaõ coù taäp tin chæ muïc IDX ñeå thao taùc.  
a. Tö töôûng:  
Laàn löôït ñoïc caùc phaàn töû töø ñaàu taäp tin IDX vaø so saùnh thaønh phaàn khoùa chæ muïc vôùi  
giaù trò X cho ñeán khi ñoïc ñöôïc phaàn töû coù giaù trò khoùa chæ muïc lôùn hôn hoaëc baèng X  
hoaëc ñaõ ñoïc heát taäp tin IDX thì keát thuùc. Neáu tìm thaáy thì ta ñaõ coù vò trí vaät lyù cuûa  
phaàn töû döõ lieäu treân taäp tin döõ lieäu F, khi ñoù chuùng ta coù theå truy caäp tröïc tieáp ñeán vò  
trí naøy ñeå ñoïc döõ lieäu cuûa phaàn töû tìm thaáy.  
b. Thuaät toaùn:  
B1: rewind(IDX)  
B2: read(IDX, ai)  
B3: IF ai.IdxKey < X AND !(eof(IDX))  
Laëp laïi B2  
B4: IF ai.IdxKey = X  
Tìm thaáy taïi vò trí ai.Pos byte(s) tính töø ñaàu taäp tin  
B5: ELSE  
Khoâng tìm thaáy phaàn töû coù giaù trò X  
B6: Keát thuùc  
c. Caøi ñaët thuaät toaùn:  
Haøm IndexSearch coù prototype:  
long IndexSearch (char * IdxFileName, T X);  
Haøm thöïc hieän tìm kieám phaàn töû coù giaù trò X döïa treân taäp tin chæ muïc coù teân  
IdxFileName. Neáu tìm thaáy, haøm traû veà moät soá nguyeân coù giaù trò töø 0 ñeán  
filelength(FileName)-1 laø vò trí töông öùng cuûa phaàn töû tìm thaáy so vôùi ñaàu taäp tin döõ  
lieäu (tính baèng byte). Trong tröôøng hôïp ngöôïc laïi, hoaëc coù loãi khi thao taùc treân taäp tin  
chæ muïc haøm traû veà giaù trò –1 (khoâng tìm thaáy). Noäi dung cuûa haøm nhö sau:  
Trang: 16  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
long IndexSearch (char * IdxFileName, T X)  
{ FILE * IDXFp;  
IDXFp = fopen(IdxFileName, “rb”);  
if (IDXFp == NULL)  
return (-1);  
IdxType ai;  
int SOIE = sizeof(IdxType);  
while (!feof(IDXFp))  
{ if (fread(&ai, SOIE, 1, IDXFp) == 0)  
break;  
if (ai.IdxKey >= X)  
break;  
}
fclose(IDXFp);  
if (ai.IdxKey == X)  
return (ai.Pos);  
return (-1);  
}
d. Phaân tích thuaät toaùn:  
- Tröôøng hôïp toát nhaát khi phaàn töû ñaàu tieân cuûa taäp tin chæ muïc coù giaù trò khoùa chæ  
muïc lôùn hôn hoaëc baèng X:  
Soá pheùp gaùn: Gmin = 1  
Soá pheùp so saùnh: Smin = 2 + 1 = 3  
Soá laàn ñoïc taäp tin: Dmin = 1  
- Tröôøng hôïp xaáu nhaát khi moïi phaàn töû trong taäp tin chæ muïc ñeàu coù khoùa chæ muïc  
nhoû hôn giaù trò X:  
Soá pheùp gaùn: Gmax = 1  
Soá pheùp so saùnh: Smax = 2N + 1  
Soá laàn ñoïc taäp tin: Dmax = N  
- Trung bình:  
Soá pheùp gaùn: Gavg = 1  
Soá pheùp so saùnh: Savg = (3 + 2N + 1) : 2 = N + 2  
Soá laàn ñoïc taäp tin: Davg = ½(N + 1)  
Caâu hoûi vaø Baøi taäp  
1. Trình baøy tö töôûng cuûa caùc thuaät toaùn tìm kieám: Tuyeán tính, Nhò phaân, Chæ muïc? Caùc  
thuaät toaùn naøy coù theå ñöôïc vaän duïng trong caùc tröôøng hôïp naøo? Cho ví duï?  
2. Caøi ñaët laïi thuaät toaùn tìm tuyeán tính baèng caùc caùch:  
- Söû duïng voøng laëp for,  
- Söû duïng voøng laëp do … while?  
Coù nhaän xeùt gì cho moãi tröôøng hôïp?  
Trang: 17  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
3. Trong tröôøng hôïp caùc phaàn töû cuûa daõy ñaõ coù thöù töï taêng, haõy caûi tieán laïi thuaät toaùn  
tìm tuyeán tính? Caøi ñaët caùc thuaät toaùn caûi tieán? Ñaùnh giaù vaø so saùnh giöõa thuaät toaùn  
nguyeân thuûy vôùi caùc thuaät toaùn caûi tieán.  
4. Trong tröôøng hôïp caùc phaàn töû cuûa daõy ñaõ coù thöù töï giaûm, haõy trình baøy vaø caøi ñaët laïi  
thuaät toaùn tìm nhò phaân trong hai tröôøng hôïp: Ñeä quy vaø Khoâng ñeä quy?  
5. Vaän duïng thuaät toaùn tìm nhò phaân, haõy caûi tieán vaø caøi ñaët laïi thuaät toaùn tìm kieám döïa  
theo taäp tin chæ muïc? Ñaùnh giaù vaø so saùnh giöõa thuaät toaùn nguyeân thuûy vôùi caùc thuaät  
toaùn caûi tieán?  
6. Söû duïng haøm random trong C ñeå taïo ra moät daõy (maûng) M coù toái thieåu 1.000 soá  
nguyeân, sau ñoù choïn ngaãu nhieân (cuõng baèng haøm random) moät giaù trò nguyeân K. Vaän  
duïng caùc thuaät toaùn tìm tuyeán tính, tìm nhò phaân ñeå tìm kieám phaàn töû coù giaù trò K  
trong maûng M.  
Vôùi cuøng moät döõ lieäu nhö nhau, cho bieát thôøi gian thöïc hieän caùc thuaät toaùn.  
7. Trình baøy vaø caøi ñaët thuaät toaùn tìm tuyeán tính ñoái vôùi caùc phaàn töû treân maûng hai  
chieàu trong hai tröôøng hôïp:  
- Khoâng söû duïng phaàn töû “Caàm canh”.  
- Coù söû duïng phaàn töû “Caàm canh”.  
Cho bieát thôøi gian thöïc hieän cuûa hai thuaät toaùn trong hai tröôøng hôïp treân.  
8. Söû duïng haøm random trong C ñeå taïo ra toái thieåu 1.000 soá nguyeân vaø löu tröõ vaøo moät  
taäp tin coù teân SONGUYEN.DAT, sau ñoù choïn ngaãu nhieân (cuõng baèng haøm random)  
moät giaù trò nguyeân K. Vaän duïng thuaät toaùn tìm tuyeán tính ñeå tìm kieám phaàn töû coù giaù  
trò K trong taäp tin SONGUYEN.DAT.  
9. Thoâng tin veà moãi nhaân vieân bao goàm: Maõ soá – laø moät soá nguyeân döông, Hoï vaø Ñeäm –  
laø moät choãi coù toái ña 20 kyù töï, Teân nhaân vieân – laø moät chuoãi coù toái ña 10 kyù töï,  
Ngaøy, Thaùng, Naêm sinh – laø caùc soá nguyeân döông, Phaùi – Laø “Nam” hoaëc “Nöõ”, Heä  
soá löông, Löông caên baûn, Phuï caáp – laø caùc soá thöïc. Vieát chöông trình nhaäp vaøo danh  
saùch nhaân vieân (ít nhaát laø 10 ngöôøi, khoâng nhaäp truøng maõ giöõa caùc nhaân vieân vôùi  
nhau) vaø löu tröõ danh saùch nhaân vieân naøy vaøo moät taäp tin coù teân NHANSU.DAT, sau  
ñoù vaän duïng thuaät toaùn tìm tuyeán tính ñeå tìm kieám treân taäp tin NHANSU.DAT xem coù  
hay khoâng nhaân vieân coù maõ laø K (giaù trò cuûa K coù theå nhaäp vaøo töø baøn phím hoaëc  
phaùt sinh baèng haøm random). Neáu tìm thaáy nhaân vieân coù maõ laø K thì in ra maøn hình  
toaøn boä thoâng tin veà nhaân vieân naøy.  
10. Vôùi taäp tin döõ lieäu coù teân NHANSU.DAT trong baøi taäp 9, thöïc hieän caùc yeâu caàu sau:  
- Taïo moät baûng chæ muïc theo Teân nhaân vieân.  
- Tìm kieám treân baûng chæ muïc xem trong taäp tin NHANSU.DAT coù hay khoâng nhaân  
vieân coù teân laø X, neáu coù thì in ra toaøn boä thoâng tin veà nhaân vieân naøy.  
- Löu tröõ baûng chæ muïc naøy vaøo trong taäp tin coù teân NSTEN.IDX.  
- Vaän duïng thuaät toaùn tìm kieám döïa treân taäp tin chæ muïc NSTEN.IDX ñeå tìm xem coù  
hay khoâng nhaân vieân coù teân laø X trong taäp tin NHANSU.DAT, neáu coù thì in ra toaøn  
boä thoâng tin veà nhaân vieân naøy.  
- Coù nhaän xeùt gì khi thöïc hieän tìm kieám döõ lieäu treân taäp tin baèng caùc phöông phaùp:  
Tìm tuyeán tính vaø Tìm kieám döïa treân taäp tin chæ muïc.  
Trang: 18  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
Chöông 3: KYÕ THUAÄT SAÉP XEÁP (SORTING)  
3.1. Khaùi quaùt veà saép xeáp  
Ñeå thuaän tieän vaø giaûm thieåu thôøi gian thao taùc maø ñaëc bieät laø ñeå tìm kieám döõ lieäu deã  
daøng vaø nhanh choùng, thoâng thöôøng tröôùc khi thao taùc thì döõ lieäu treân maûng, treân taäp  
tin ñaõ coù thöù töï. Do vaäy, thao taùc saép xeáp döõ lieäu laø moät trong nhöõng thao taùc caàn thieát  
vaø thöôøng gaëp trong quaù trình löu tröõ, quaûn lyù döõ lieäu.  
Thöù töï xuaát hieän döõ lieäu coù theå laø thöù töï taêng (khoâng giaûm daàn) hoaëc thöù töï giaûm  
(khoâng taêng daàn). Trong phaïm vi chöông naøy chuùng ta seõ thöïc hieän vieäc saép xeáp döõ  
lieäu theo thöù töï taêng. Vieäc saép xeáp döõ lieäu theo thöù töï giaûm hoaøn toaøn töông töï.  
Coù raát nhieàu thuaät toaùn saép xeáp song chuùng ta coù theå phaân chia caùc thuaät toaùn saép xeáp  
thaønh hai nhoùm chính caên cöù vaøo vò trí löu tröõ cuûa döõ lieäu trong maùy tính, ñoù laø:  
- Caùc giaûi thuaät saép xeáp thöù töï noäi (saép xeáp thöù töï treân daõy/maûng),  
- Caùc giaûi thuaät saép xeáp thöù töï ngoaïi (saép xeáp thöù töï treân taäp tin/file).  
Cuõng nhö trong chöông tröôùc, chuùng ta giaû söû raèng moãi phaàn töû döõ lieäu ñöôïc xem xeùt  
coù moät thaønh phaàn khoùa (Key) ñeå nhaän dieän, coù kieåu döõ lieäu laø T naøo ñoù, caùc thaønh  
phaàn coøn laïi laø thoâng tin (Info) lieân quan ñeán phaàn töû döõ lieäu ñoù. Nhö vaäy moãi phaàn töû  
döõ lieäu coù caáu truùc döõ lieäu nhö sau:  
typedef  
struct DataElement  
Key;  
{ T  
InfoType  
} DataType;  
Info;  
Trong chöông naøy noùi rieâng vaø taøi lieäu naøy noùi chung, caùc thuaät toaùn saép xeáp cuûa  
chuùng ta laø saép xeáp sao cho caùc phaàn töû döõ lieäu coù thöù töï taêng theo thaønh phaàn khoùa  
(Key) nhaän dieän. Ñeå ñôn giaûn, chuùng ta giaû söû raèng moãi phaàn töû döõ lieäu chæ laø thaønh  
phaàn khoùa nhaän dieän.  
3.2. Caùc giaûi thuaät saép xeáp noäi (Saép xeáp treân daõy/maûng)  
ÔÛ ñaây, toaøn boä döõ lieäu caàn saép xeáp ñöôïc ñöa vaøo trong boä nhôù trong (RAM). Do vaäy, soá  
phaàn töû döõ lieäu khoâng lôùn laém do giôùi haïn cuûa boä nhôù trong, tuy nhieân toác ñoä saép xeáp  
töông ñoái nhanh. Caùc giaûi thuaät saép xeáp noäi bao goàm caùc nhoùm sau:  
- Saép xeáp baèng phöông phaùp ñeám (counting sort),  
- Saép xeáp baèng phöông phaùp ñoåi choã (exchange sort),  
- Saép xeáp baèng phöông phaùp choïn löïa (selection sort),  
- Saép xeáp baèng phöông phaùp cheøn (insertion sort),  
- Saép xeáp baèng phöông phaùp troän (merge sort).  
Trong phaïm vi cuûa giaùo trình naøy chuùng ta chæ trình baøy moät soá thuaät toaùn saép xeáp tieâu  
bieåu trong caùc thuaät toaùn saép xeáp ôû caùc nhoùm treân vaø giaû söû thöù töï saép xeáp N phaàn töû  
coù kieåu döõ lieäu T trong maûng M laø thöù töï taêng.  
Trang: 19  
Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät  
3.2.1. Saép xeáp baèng phöông phaùp ñoåi choã (Exchange Sort)  
Caùc thuaät toaùn trong phaàn naøy seõ tìm caùch ñoåi choã caùc phaàn töû ñöùng sai vò trí (so vôùi  
maûng ñaõ saép xeáp) trong maûng M cho nhau ñeå cuoái cuøng taát caû caùc phaàn töû trong maûng  
M ñeàu veà ñuùng vò trí nhö maûng ñaõ saép xeáp.  
Caùc thuaät toaùn saép xeáp baèng phöông phaùp ñoåi choã bao goàm:  
- Thuaät toaùn saép xeáp noåi boït (bubble sort),  
- Thuaät toaùn saép xeáp laéc (shaker sort),  
- Thuaät toaùn saép xeáp giaûm ñoä taêng hay ñoä daøi böôùc giaûm daàn (shell sort),  
- Thuaät toaùn saép xeáp döïa treân söï phaân hoaïch (quick sort).  
ÔÛ ñaây chuùng ta trình baøy hai thuaät toaùn phoå bieán laø thuaät toaùn saép xeáp noåi boït vaø saép  
xeáp döïa treân söï phaân hoaïch.  
a. Thuaät toaùn saép xeáp noåi boït (Bubble Sort):  
- Tö töôûng:  
+ Ñi töø cuoái maûng veà ñaàu maûng, trong quaù trình ñi neáu phaàn töû ôû döôùi (ñöùng phía  
sau) nhoû hôn phaàn töû ñöùng ngay treân (tröôùc) noù thì theo nguyeân taéc cuûa boït khí  
phaàn töû nheï seõ bò “troài” leân phía treân phaàn töû naëng (hai phaàn töû naøy seõ ñöôïc ñoåi  
choã cho nhau). Keát quaû laø phaàn töû nhoû nhaát (nheï nhaát) seõ ñöôïc ñöa leân (troài leân)  
treân beà maët (ñaàu maûng) raát nhanh.  
+ Sau moãi laàn ñi chuùng ta ñöa ñöôïc moät phaàn töû troài leân ñuùng choã. Do vaäy, sau N–1  
laàn ñi thì taát caû caùc phaàn töû trong maûng M seõ coù thöù töï taêng.  
- Thuaät toaùn:  
B1: First = 1  
B2: IF (First = N)  
Thöïc hieän Bkt  
B3: ELSE  
B3.1: Under = N  
B3.2: If (Under = First)  
Thöïc hieän B4  
B3.3: Else  
B3.3.1: if (M[Under] < M[Under - 1])  
Swap(M[Under], M[Under – 1])  
B3.3.2: Under--  
B3.3.3: Laëp laïi B3.2  
B4: First++  
//Ñoåi choã 2 phaàn töû cho nhau  
B5: Laëp laïi B2  
Bkt: Keát thuùc  
- Caøi ñaët thuaät toaùn:  
Haøm BubbleSort coù prototype nhö sau:  
void BubbleSort(T M[], int N);  
Trang: 20  
Tải về để xem bản đầy đủ
pdf 229 trang baolam 26/04/2022 10800
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình môn Cấu trúc dữ liệu và giải thuật", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_mon_cau_truc_du_lieu_va_giai_thuat.pdf