Tải bản đầy đủ (.pdf) (261 trang)

Thiết kế trang và lập trình - Tổng lượng tri thức cốt lõi và thực hành

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.1 MB, 261 trang )

c Lc
1 Cu trúc d liu 1
1.1 Cu trúc d liu là gì? 2
1.2 Cu trúc d liu c s 3
1.2.1 Kiu d liu c s 3
1.2.2 Kiu có cu trúc 4
1.2.3 Kiu d liu tru tng 7
1.3 Cu trúc d liu hng vn  8
1.3.1 Cu trúc danh sách 8
1.3.2 Ngn xp 10
1.3.3 Hàng i 11
1.3.4 Cu trúc cây 12
1.3.5 Bm 17
2 Thut toán 23
2.1 C s v thut toán 24
2.1.1 Thut toán là gì? 24
2.1.2 Thut toán và cu trúc d liu 26
2.2 Các thut toán 30
2.2.1 Thut toán duyt 30
2.2.2 Thut toán sp xp 34
2.2.3 Thut toán  qui 49
2.2.4 X lí xâu kí t 51
2.2.5 X lí tp 55
2.2.6 V hình 63
2.2.7  th 67
2.2.8 Tính toán s 71
2.2.9 Thut toán i sánh 78
2.2.10 Thut toán xp x và xác sut 82
2.3 ánh giá thut toán 87
2.3.1 ánh giá theo  phc tp tính toán 87
2.3.2 ánh giá theo tính hp l 88


2.3.3 ánh giá theo biu din 88
2.4 Cách thit k thut toán 89
3 Thit k trong 95
3.1 Thit k trong là gì? 96
3.1.1 Mc ích ca thit k trong và nhng m cn lu ý 96
3.1.2 Th tc thit k trong 97
3.2 Phân hoch và cu trúc chc nng 101
3.2.1 Các n v ca vic phân hoch và cu trúc chc nng 101
3.2.2 Các th tc phân hoch và cu trúc chc nng 103
3.2.3 Phng pháp thit k có cu trúc 109
3.3 Thit k d liu vt lí 112
3.3.1 Th tc thit k d liu vt lí 112
3.3.2 T chc d liu vt lí 117
3.4 Thit k vào ra chi tit 120
3.4.1 Thit k d liu vào chi tit 120
3.4.2 Thit k màn hình 123
2 Chng 1 Cu trúc d liu
3.4.3 Thit k d liu a ra chi tit 132
3.5 To ra và dùng li các b phn 136
3.5.1 Khái nim v to ra và dùng li các b phn 136
3.5.2 Dùng gói phn mm 136
3.6 To ra tài liu thit k trong 137
3.6.1 T chc tài liu thit k trong 137
3.6.2 Các m cn lu ý khi to ra tài liu thit k trong 139
3.6.3 Kim m thit k 140
4 Thit k chng trình 140
4.1 Mc ích và nhim v ca thit k chng trình 144
4.1.1 Mc ích ca thit k chng trình 144
4.1.2 Nhim v thit k chng trình 145
4.2 Thit k có cu trúc cho chng trình 148

4.2.1 Th tc thit k có cu trúc 148
4.2.2 Các k thut phân hoch mô un n hình 151
4.2.3 Tiêu chí cho vic phân hoch mô un 160
4.2.4 Phân hoch chng trình 171
4.3 To ra c t mô un và c t kim th 173
4.3.1 To ra c t mô un 173
4.3.2 To ra c t kim th 175
4.4 To ra tài liu thit k chng trình 177
4.4.1 To ra tài liu thit k chng trình và ni dung 177
4.4.2 Nhng m cn lu ý khi to ra tài liu thit k chng trình 179
4.4.3 Hp kim m thit k 179
5 Thc hin chng trình 183
5.1 Lp trình 184
5.1.1 Mô thc lp trình 184
5.1.2 Phong cách lp trình 185
5.1.3 Dùng b x lí ngôn ng 186
5.1.4 Môi trng lp trình 187
5.2 Kim th 189
5.2.1 Tng quan v kim th 189
5.2.2 Kim thn v 190
5.2.3 Kim th tích hp 190
5.2.4 Kim th h thng 195
5.2.5 Các kim th khác 197
5.2.6 K hoch và nhim v kim th 197
6 Cp nht vn hành và phát trin h thng 204
6.1 Thit k chng trình 205
6.1.1 Thit k chng trình hng i tng 205
1 u trúc d liu
c ích ca chng
Vic chn cu trúc d liu thích hp nht và th tc mô

 d liu là mu cht  to ra chng trình hiu qu,
 hiu.
Chng này mô t các cu trúc d liu a dng bn cn
m c xem nh bc u tiên  hc lp trình.
• Hiu cách phân loi các cu trúc d liu a dng
‚ Hiu các kiu d liu c s thông dng nht và
ng d liu
ƒ Hiu các c trng và c ch ca cu trúc d liu
ng vn c dùng  gii quyt các bài toán
c bit, cng nh cách dùng cu trúc d liu c s
cho vic cài t chng trình
2 Chng 1 Cu trúc d liu
1.1 u trúc d liu là gì?
p các d liu cùng mt loi c máy tính x lí c gi là "kiu d liu." Trong giai n
thit k chng trình, cách thc d liu nên c biu din và lp trình trong máy tính phi
c xem xét cn thn,  có th chn c kiu d liu thích hp nht. Mt kiu d liu
c biu din và lp trình c gi là "cu trúc d liu."
Hình 1-1-1 ch ra phân lp v các cu trúc d liu.
Hình 1-1-1 Phân lp v các cu trúc d liu
u trúc d liu c s có thc biu din trong hu ht tt c các ngôn ng lp trình. Cu
trúc d liu hng vn  là cu trúc d liu có thc dùng mt cách có hiu qu gii
quyt nhng vn  chuyên dng. Có mt s cu trúc d liu hng vn  mà không th
c biu din trong ngôn ng lp trình. Trong trng hp ó, cu trúc d liu c sc
dùng.
u trúc
 liu
u trúc d
liu hng
n 
(To ra t

u trúc d
liu c s)
u trúc danh sách
Ngn xp
Hàng i
u trúc cây
m
Kiu d liu
 s
Kiu con tr
Kiu n
Kiu nguyên
Kiu thc
Kiu kí t
Kiu logic
Kiu lit kê
Kiu b phn
Kiu có
u trúc
Kiu mng
Kiu bn ghi
u trúc d
liu c s
Kiu d liu
tru tng
1.2 Cu trúc d liu c s 3
1.2 u trúc d liu c s
1.2.1 Kiu d liu c s
Kiu d liu c s là tp các d liu riêng l và thng c dùng  to ra chng trình. Nó
c phân loi thành các kiu n và con tr.

(1) Kiu n
Kiu n là kiu d liu c s nht. Khi dùng kiu n cho lp trình, kiu d liu thng
c khai báo theo qui tc cú pháp ca ngôn ng.
• Kiu nguyên
Kiu nguyên biu din cho s nguyên, và c biu din bên trong máy tính nh s nh
phân theo s du phy tnh, không có ch s có ngha sau du chm thp phân. Giá tr ti a
hay ti thiu ca kiu nguyên là n v ca d liu mà máy tính có th x lí vào mt lúc, và
nó c xác nh bi chiu dài t.
‚ Kiu s thc
Kiu s thc biu din cho s thc. Nó c dùng  biu din cho s du phy tnh và du
phy ng.
ƒ Kiu kí t
Kiu kí t biu din cho ch cái, s và các kí hiu nh các kí t. Mt mã kí tc biu
din nh s nh phân trong máy tính.
„ Kiu logic
Kiu logic c dùng  thc hin các phép toán logic nh các phép toán AND, OR và
NOT.
… Kiu lit kê
Kiu lit kê c nh ngha nh kiu d liu kê ra tt c các giá tr có th ca bin. Trong
trng hp kiu lit kê, có th k tên kiu s nguyên.
† Kiu b phn
Kiu b phn c dùng  xác nh mt tp con các giá tr nguyên thu bng cách hn ch
các kiu d liu hin có. Kiu d liu có các gii hn trên và di nh các ràng buc c
i là kiu min b phn.
(2) Kiu con tr
Kiu con tr có a chc cp trong n v b nh chính. Nó c dùng  tham chiu ti
các bin, các bn ghi tp hay các hàm. Nó c dùng cho Pascal và C nhng không dùng cho
FORTRAN và COBOL.
4 Chng 1 Cu trúc d liu
Hình 1-2-1 Hình nh v kiu con tr

1.2.2 Kiu có cu trúc
u trúc d liu có cha mt cu trúc d liu c s hay bt kì kiu d liu c xác nh nào
nh phn t ca nó (d liu), c gi là kiu có cu trúc. Kiu có cu trúc c phân loi
thành kiu mng và kiu bn ghi.
(1) Kiu mng
ng c gi là bng. Kiu mng là d liu có cu trúc có cha d liu thuc cùng kiu và
kích c. Tng d liu cá nhân c gi là mt phn t mng, phn t bng hay phn t. Cách
ng c mô t hoc cách d liu c b trí có thay i tu theo ngôn ng lp trình c
dùng.
• Mng mt chiu
ng mt chiu có cu trúc d liu mà d liu c sp thành mng theo mt hàng.  xác
nh mt phn t trong mng này, trc ht a vào du ngoc tròn m ( hay du ngoc
vuông [ sau tên ca mng, ri a vào ch s và du ngoc tròn óng ) hay du ngoc vuông
óng ]. Ch s ch ra s th t tính tnh ca mng, ni phn t xác nh ó c nh v.
ng "A" có s phn tc kí hiu là "i" c biu din là A (i).
Hình 1-2-2 Mng mt chiu
Th 1 th 2 th 3

th I

Phn t Phn t Phn t

Phn t

A(1) A(2) A(3)

A(I)

‚ Mng hai chiu
t cu trúc d liu trong ó d liu c sp hàng theo c hai chiu ngang và ng c

i là mng hai chiu. D liu theo chiu ng c gi là ct và d liu theo chiu ngang
c gi là hàng.  xác nh phn t nào ó trong mng này, hai ch s tr nên cn thit:
t ch s th t theo chiu ng (trên hàng nào) ni phn t xác nh ó c nh v và
ch s kia ch ra s th t nào theo chiu ngang (trong ct nào) mà nó c nh v. Chng
n, mng "A" c nh v hàng "i" và ct "j" có thc din t là A (i, j).
a ch ca bin "b"  liu
Bin kiu con tr
Bin "b"
1.2 Cu trúc d liu c s 5
Hình 1-2-3 Mng hai chiu (vi ba hàng và hai ct)
t 1
Hàng 1 A(1, 1) A(1, 2)
A(2, 1) A(2, 2)
A(3, 1) A(3, 2)
Khi mng hai chiu c lu gi trong n v b nh chính, nó ly dng ca mng mt chiu.
ng hai chiu c v trong Hình 1-2-3 ly dng ca mng mt chiu có sáu phn t. Nh
c v trong Hình 1-2-4, d liu c lu gi theo kiu tun t hoc theo chiu ca hàng
hoc theo chiu ca ct. Chiu theo ó d liu c lu gi thay i tùy theo trình biên dch
a ngôn ng lp trình c dùng. Nói chung, d liu c lu gi theo chiu ng khi
Fortran c dùng và theo chiu ngang khi COBOL c dùng.
Hình 1-2-4 Cách d liu ca mng hai chiu c lu gi trong n v b nh chính
A(1,1) A(1,2)
A(2,1) A(2,2)
A(3,1) A(3,2)
ƒ Mng ba chiu
ng ba chiu có cu trúc d liu nhiu hn mng hai chiu. Nó có cu trúc ba chiu cha các
t phng, các hàng và ct cng nh các phn t. Bng vic xây dng mng ba chiu trong
ng hai chiu, có th x lí mng ba chiu theo cùng cách nh mng hai chiu.
ng 2 chiu
 nh chính

A(1,1)
A(1,2)
A(2,1)
A(2,2)
A(3,1)
A(3,2)
A(1,1)
A(2,1)
A(3,1)
A(1,2)
A(2,2)
A(3,2)
 liu c D liu c
u tr lu tr
theo hàng theo ct
6 Chng 1 Cu trúc d liu
Hình 1-2-5 Xây dng mng ba chiu thành mng hai chiu
ng nhiu chiu nh các mng bn, nm hay nhiu chiu cng có thc nh ngha.
Tuy nhiên, có th có nhng gii hn nào ó v s chiu, tùy theo kiu ca ngôn ng lp trình
hay trình biên dch.
ng có thc phân loi thành mng tnh và mng ng theo phng pháp c dùng 
sit cht mt min.
- Mng tnh: Mng mà vùng c yêu cu do chng trình xác nh
- Mng ng: Mng mà vùng c yêu cu sc xác nh ra sau khi ch sc
dùng cho vic to mng c cung cp qua mt biu thc và biu
thc ó c tính trong khi thc hin chng trình
(2) Kiu bn ghi
c du d liu kiu có cu trúc là cao cp hn trong vic d tham chiu và thc hin thao tác
trên các phn t, nó cng có nhc m  ch nó ch có th gii quyt d liu thuc cùng mt
kiu. Do ó, d liu có cha các d liu vi kiu khác nhau phi ly dng ca d liu kiu bn

ghi. Kiu bn ghi này cng còn c gi là kiu cu trúc.
Hình 1-2-6 Kiu bn ghi
Hình 1-2-6 ch ra cu trúc d liu ca kiu bn ghi. Mt bn ghi cha s hiu sinh viên (kiu
nguyên), tên (kiu kí t) và m (kiu nguyên). Mt d liu kiu bn ghi cha mt tp các
n ghi có cùng nh dng này. Mc du d liu kiu bn ghi mt chiu có thc gii quyt
A(1,1,1) A(1,1,2)
A(1,2,1) A(2,2,2)
A(1,3,1) A(1,3,2)
A(1,1,1) A(1,1,2)
A(1,2,1) A(1,2,2)
A(1,3,1) A(1,3,2)
A(2,1,1) A(2,1,2)
A(2,1,1) A(2,1,2)
A(2,2,1) A(2,2,2)
A(2,3,1) A(2,3,2)
t
t phng
Hàng
t phng
th hai
t phng
th nht
 Tên m S Tên m
sinh viên sinh viên
n ghi (d liu v sinh viên)
Kiu nguyên
Kiu kí t
(kiu xâu chui)
Kiu sp xp
1.2 Cu trúc d liu c s 7

theo cùng cách nh mng mt chiu, tng d liu vn phi c t tên  nhn din vì tng
phn t cha nhiu d liu.
1.2.3 Kiu d liu tru tng
 liu cha cu trúc d liu nào ó và kiu ca các phép toán c gi là kiu d liu tru
ng.  truy nhp vào kiu d liu này, bn không cn bit v cu trúc bên trong ca nó. Tt
 các d liu u c che du ngoi tr d liu bn truy nhp  tham chiu, thêm vào hay
xoá i. u này c gi là che giu thông tin. Che giu thông tin hoc che giu d liu 
c  kiu d liu c gi là bao bc d liu.
Hình 1-2-7 Kiu d liu tru tng
(Các phép toán +
u trúc d liu)
Chng trình
t qu
 liu <Cu trúc d liu tru tng>
8 Chng 1 Cu trúc d liu
1.3 u trúc d liu hng vn

Các cu trúc d liu hng vn  khác nhau có thc trù tính bng vic dùng các kiu
ng, kiu con tr và các cu trúc d liu c s khác.
1.3.1 u trúc danh sách
Không ging kiu d liu c s gii quyt cho tng d liu riêng l, cu trúc danh sách cho
phép d liu c móc ni ln nhau và gii quyt c mt cc. D liu c b trí theo cu trúc
danh sách này c gi là mt danh sách.
(1) Cu trúc danh sách và các ô
ng vic dùng ch s cho tng phn t trong mng, có th truy nhp nhanh chóng vào bt kì
phn t nào. Tng t nh vy, vic thay i d liu có thc thc hin d dàng. Nu bn
chèn mt d liu vào âu ó trong mng, bn phi dch chuyn toàn b tng d liu sau ó lùi
i mt v trí. Nu bn xoá mt d liu trong mng, tng t, bn phi dch chuyn toàn b
ng d liu sau d liu b xoá ó nhích lên mt v trí.
Hình 1-3-1 Chèn thêm mt phn t mng

Không ging nh cu trúc kiu mng, cu trúc danh sách cho phép phn t d liu ca cùng
kiu c sp hàng tun t. Kim mng òi hi rng vic b trí logic cho các phn t là ging
t nh vic b trí vt lí ca chúng trong b nh chính. Trong trng hp ca cu trúc danh
sách, vic b trí logic không sánh ht nh vic b trí vt lí.
Danh sách cha các ô và mi ô bao gm nhng phn t sau:
- Phn d liu cha phn t d liu
- Phn con tr cha a ch
Do ó, phn d liu ca ô có cùng cu trúc d liu nh cu trúc d liu ca d liu c lu
gi và phn con tr ca ô có cu trúc d liu kiu con tr. u này ngha là các ô biu din
cho d liu (cu trúc) kiu bn ghi cha các phn t có cu trúc d liu khác nhau. Danh sách
cha a ch ô trong phn con tr và ô này c móc ni sang ô kia qua con tr.
Arai Ueki Endou Okada
 trí mng c chèn
Trc khi chèn
Sau khi chèn
Arai Inoue Ueki Endou Okada
i d liu c dch v phía sau
Inoue
u t
c chèn
1.3 Cu trúc d liu hng vn  9
Hình 1-3-2 Cu trúc danh sách
(2) Chèn d liu vào danh sách
 chèn d liu vào danh sách, mi u bn cn làm là thay th các con tr ti d liu i
trc và i sau d liu c chèn vào ó. Bi vì bn không phi dch chuyn các phn t nh
trng hp d liu kiu mng, nên bn có th chèn thêm d liu mt cách d dàng và nhanh
chóng. (Xem Hình 1-3-3.)
Hình 1-3-3 Chèn d liu vào danh sách
(3) Xoá d liu khi danh sách
 xoá d liu khi danh sách, mi u bn cn phi làm là thay th các con tr nh khi bn

chèn d liu vào danh sách. Ô cha d liu (Inoue) vn còn trong vùng b nh nh rác sau khi
 liu ã b xoá, nhc v trong Hình 1-3-4.
Hình 1-3-4 Xoá d liu khi danh sách
c du cu trúc danh sách cho phép d liu c chèn thêm hay c xoá i ch bng cách
thay th các con tr, nó có nhc m là bn phi ln theo tng con tr mt tu nu bn
mun truy nhp vào d liu c bit.
(4) Kiu cu trúc danh sách
Các cu trúc danh sách tiêu biu bao gm:
- Danh sách mt chiu
- Danh sách hai chiu
- Danh sách vòng.
i vì nhng danh sách này c biu din di dng tuyn thng, nên nói chung chúng c
i là danh sách tuyn tính.
• Danh sách mt chiu
Danh sách mt chiu cng còn c gi là danh sách mt hng. Phn con tr ca ô cha
Phn d liu Phn con tr Phn d liu Phn con tr
InoueArai
Ueki
Phn d liu Phn con tr
Arai
Arai
Inoue
Ueki Endou
Endou Ueki
Ô c chèn
i d liu c chèn
Trc khi chèn
Sau khi chèn
Phn d liu Phn con tr
Inoue Endou Ueki Arai

Inoue Arai
Ueki Endou
Ô b xóa
Sau khi
xóa
Trc
khi xóa
10 Chng 1 Cu trúc d liu
a ch ca ô mà trong ó d liu tip c lu gi. Bng vic ln theo nhng a ch này
ng ô mt, bn có th thc hin vic duyt d liu.
Hình 1-3-5 Danh sách mt chiu
Con tr th nht c gi là gc hay u. Bi vì phn con tr ca ô cui không có bt kì a
ch nào trong ó d liu có thc lu gi, nên NULL (giá tr s là không) hay 󲄉0 c
chèn thêm vào phn này.
‚ Danh sách hai chiu
Danh sách hai chiu có hai phn con tr ( và ) cha a ch các ô nhc v trong
Hình 1-3-6.
Hình 1-3-6 Danh sách hai chiu
Phn con tr  và uc v trong Hình 1-3-6 cha a ch ca ô k tip và a ch ca ô
ng trc tng ng. a ch ca ô cui cùng c cha trong con truôi. Trong trng
p danh sách hai chiu, d liu có thc ln theo t ô u hoc uôi.
ƒ Danh sách vòng
Danh sách hai chiu cha NULL  ô u tiên c gi là danh sách vòng. Phn con tr ca
ô th nht này và phn con tr cha NULL ca ô cui cùng cha a ch ô khác, do vy d
liu có dng cái vòng. D liu có thc duyt theo cùng cách nh trong danh sách hai
chiu.
Hình 1-3-7 Danh sách vòng
1.3.2 Ngn xp
Ngn xp là cu trúc d liu c thit k da trên mng mt chiu. Phn t cui cùng c
u gi sc c ra trc ht. Nó c so sánh vi trò chi ném vòng.

Arai Inoue Wada NULL
u
Ô
Arai   Inoue   Wada

NULL
NULL
uôi
u
 Arai   Inoue   Wada 

u
 trí uôi
 trí u
1.3 Cu trúc d liu hng vn  11
Hình 1-3-8 Trò chi ném vòng
Trò chi ném vòng c chi bng cách ném các vòng mu theo th t, lc, vàng và lam
a vào d liu). Chúng c ly ra tng cái mt (a ra d liu) theo th to li vic ném
vào, tc là lam, vàng, lc và . Tc là vòng lam c ném vào cui cùng sc ly ra u
tiên.
Kiu cu trúc d liu này mà có thc so sánh vi trò chi ném vòng c gi là ngn xp.
 thng này còn có thut ng là h thng vào-sau-ra-trc (LIFO). Vic lu tr d liu trong
ngn xp c gi là "n vào (PUSH)" và vic ly d liu ra t ngn xp c gi là "bt ra
(POP)." Bin u khin vic n vào và bt ra c gi là con tr ngn xp.
n d liu vào ngn xp, t con tr ngn xp "sp" là +1 và lu gi d liu trong phn t
ng c vit là "sp."  làm bt ra d liu t ngn xp, hãy ly d liu ã c lu gi
trong mng c ch bi "sp" và t con tr ngn xp là sp-1.
Hình 1-3-9 Cu trúc ngn xp
1.3.3 Hàng i
Hàng i là cu trúc d liu da trên mng mt chiu. D liu c lu giu tiên c c

ra u tiên. Nó c so sánh vi hàng ngi ang i trc máy tr tin ca ngân hàng.
Hình 1-3-10 Hàng i
u trúc d liu cho phép khách hàng c phc v trên c sn trc phc v trc c
i là hàng i. H thng này c gi là h thng (FIFO). Hai con tr ch ra u và uôi ca
hàng i là cn cho vic kim soát hàng i. Con tr ch ra u và uôi ca hàng i c
 liu D
 liu C
 liu B
 liu A
Ngn xp (4)
Ngn xp (3)
Ngn xp (2)
Ngn xp (1)
 liu ly ra  liu nhp vào
4
Con tr ngn xp sp
ra
POP PUSH
sp - 1 sp + 1
12 Chng 1 Cu trúc d liu
biu din nh bin u và bin uôi tng ng. (Xem Hình 1-3-11.)
Hình 1-3-11 Cu trúc hàng i
<Th tc vn hành hàng i>
1.  lu gi d liu vào hàng i (enqueue), t bin truôi tng thêm 1 và ct gi d
liu.
2.  ly ra d liu t hàng i (dequeue), ly d liu ra và t bin tru tng lên 1.
1.3.4 u trúc cây
u trúc cây là mt trong nhng cu trúc d liu rt hu dng vì nó có th kim soát d liu
phc tp tt hn các cu trúc d liu kiu mng hay danh sách.
i vì nó có cu trúc phân cp nh t chc ca công ti hay cây gia ình, nên nó thích hp cho

kiu làm vic bao gm phân loi tng bc.
Hình 1-3-12 S t chc
c du tng ô c sp theo th t tuyn tính trong cu trúc danh sách, d liu c sp
trong khi nó phân nhánh trong cu trúc cây.
u trúc cây bao gm các phn tc v di ây:
- Nút: Tng ng vi d liu
- Nhánh: Ni nút này vi nút khác
- Gc: Nút  cp cao nht, không có cha m
- Con: Nút r nhánh ra di mt nút khác
- Cha m: D liu gc trc khi nó chia nhánh
- Lá: Nút  cp thp nht không có con
Hình 1-3-13 v ra cu trúc cây
Hình 1-3-13 Cu trúc cây
 liu A D liu B D liu C D liu D
(1) (2) (3) (4) (5) (6)
p xp
Hàng i
Con tru Con tr cui
ng thng
Qun lý
hành chính
Qun lý
nhà máy
Qun lý
bán hàng
Qun lý b phn
hành chính
Qun lý b phn
 toán
Qun lý b phn

bán hàng th 1
Qun lý b phn
bán hàng th 2
Qun lý b phn k
hoch và bán hàng
Qun lý b phn
qun lý cht lng
Qun lý b phn
n phm
Qun lý b phn
Mua bán
A
B C
D E
G
F
H

Nhánh
Nút
c
. A là cha nút C
. Nút D và E là con nút C.
1.3 Cu trúc d liu hng vn  13
(1) Cây nh phân
u s nhánh ch ra t mt nút là "n" hay ít hn, tc là nu s con là 0 cho ti "n", mt cu
trúc cây nh vy c gi là cây N ngôi. Cây N-ngôi có 2 nhánh (n=2), tc là cây N ngôi
không có con, có mt hay hai con, c gi là cây nh phân, thng là cu trúc d liu thng
dùng nht. Mt khác, cu trúc cây có ba hay nhiu nhánh (n>2) c gi là cây nhiu nhánh.
Cây nh phân bao gm mt phn d liu và hai phn con tr. Con tr trái ch ra v trí ca nút

kéo dài sang bên trái và các nhánh ch ra trong khi phn con tr phi ch ra v trí ca nút kéo
dài sang bên phi và các nhánh ch ra.
Hình 1-3-14 Cu trúc cây nh phân
Phn con tr trái Phn d liu Phn con tr phi
Cây nh phân có cu trúc phân cp cha m - con, nhc v trong Hình 1-3-15.
Hình 1-3-15 Cu trúc cây nh phân c s
<Cách thc hin vic duyt d liu cây nh phân>
 duyt d liu c bit trong d liu cây nh phân, phi ln theo tng nút mt. Có ba
phng pháp thc hin duyt d liu cây nh phân. Vì khó gii thích bng li nên hãy kim li
Hình 1-3-16 và xem cách d liu c duyt bng vic dùng tng phng pháp.
Hình 1-3-16 Cách thc hin duyt d liu cây nh phân
- Th t gc trc (Pre-order): Vi gc là m bt u, nút bên trái ca mi nút c
duyt qua theo cách tun t.
- Th t gc gia (Mid-order): Vi lá ti áy bên trái làm m bt u, ri duyt qua nút
cha nó và tip ó duyt qua phn còn li ca nút ó theo cách tun t.
- Th t gc sau (Post order): Vi lá ti áy bên trái làm m bt u, phn bên phi mi
nút c duyt qua theo cách tun t ri mi n nút cha ca nó.
(2) Cây nh phân hoàn chnh
u cây nh phân c xây dng theo cách s các nhánh t gc ti tng lá dc theo mt
nhánh là bng hoc sai khác mt so vi s các nhánh t gc ti tng lá dc theo nhánh khác
(hoc nu chiu cao t gc ti tng lá là bng hay sai khác mt vi chiu cao t gc ti tng
lá thuc vào nhánh khác), thì cây ó c gi là cây nh phân hoàn chnh. Hình 1-3-17 v ra
cây nh phân hoàn chnh có mi nút.
Cha
Con
Con
14 Chng 1 Cu trúc d liu
Hình 1-3-17 Cây nh phân hoàn chnh
(3) Cây tìm kim nh phân
Cây tìm kim nh phân c dùng nh mt bin th ca cây nh phân. Trong trng hp ca

cây tìm kim nh phân, con cháu bên trái là nh hn cha m và con cháu  bên phi là ln hn
cha m.
Thut toán cây tìm kim nh phân là nh sau:
1. Gc là m vic tìm kim bt u.
2. D liu cây nh phân c so sánh vi d liu cn tìm.
3. Nu d liu cây nh phân = d liu cn tìm, vic tìm là thành công (c hoàn tt).
4. Nu d liu cây nh phân > d liu cn tìm, thì các nút bên trái ca cây nh phân c tìm
và so sánh.
5. Nu d liu cây nh phân < d liu cn tìm, thì các nút bên phi ca cây nh phân c
tìm và so sánh.
6. Nu không tìm thy con nào, vic tìm kim là không thành công (không tìm thy d liu).
Hình 1-3-18 Thc hin vic tìm kim v d liu trong cây tìm kim nh phân
(4) Cây cân bng
u d liu c thêm vào hay b xoá i trong cu trúc cây, thì các lá ngu nhiên phát trin và
tính hiu qu ca phép toán s gim i. Cu trúc cây có kh nng t t chc li chính nó c
i là cây cân bng. Cây cân bng i din là B-cây và ng (heap).
• B-cây
B-cây là phiên bn c phát trin thêm na ca cây nh phân:
- Lá cui b bi và mi nút u có s các nút c xác nh là "m."
- Mi nút u có s ti a d liu c xác nh là "m-1."
- Tt c các lá u trên cùng mt mc.
- D liu c cha trong tng nút c b trí trong hàng i.
i vì nhng c trng trên có th làm tng b nh và tính hiu qu tính toán, nên tên
"B-cây" ngha là cây cân bng tt.
1
3
2 7
6 8 10
954
1

2 7
3 6 8 10
4 5 9
<Cây nh phân hoàn chnh> <Cu trúc d liu>
15
2
8 21
10 28
13
1) 15>10
2) 8<10
3) 10=10
1.3 Cu trúc d liu hng vn  15
a. c trng ca B-cây
-  tng vic s dng vùng b nh, s con tr mà mi nút có c t là m/2 hoc
nhiu hn và là m hoc ít hn. S con tr theo mt ng tuy vy c t là 2 hoc
nhiu hn.
- Mi lúc d liu b xoá hay c b sung thêm, vic ch ra và ghép li c thc hin
ng  cho s các phn t ca mt nút có th tr thành m/2 hay nhiu hn hoc m
hay ít hn. u này cho phép lá bao gi cng c duy trì trên cùng mc.
- Vic tìm kim bt u t gc.
- Vic thêm vào hay xoá i d liu bt u t lá.
Hình 1-3-19 ch ra B-cây b nm vi các phn t7, 6, 10, 2, 5, 12, 4, 9, 8, 11, 1, 3.
Hình 1-3-19 B-cây b nm
b. Xoá d liu
Hình 1-3-20 v ra trng hp d liu "4" b xoá khi B-cây c v trong Hình 1-3-19.
u mt mình "4" b xoá i, thì s các phn t b xoá ca mt nút tr thành mt và các
yêu cu ca B-cây không thc áp ng.
Hình 1-3-20 B-cây sai
Nút tó "4" b xoá i c gp vào mt nút k hoc  bên phi hoc  bên trái. Bi vì

các con tr ca cha m cng phi c t chc li, nên "6" c chuyn sang nút cp thp
n và tng nút có thc t chc li, nhc v trong Hình 1-3-21.
Hình 1-3-21 B-cây úng
‚ng
Cây nh phân hoàn chnh có mi quan h kích c nào ó gia nút cha m và nút con c
i là ng (heap). ng khác vi cây nh phân  chng không có mi quan h kích
thc nào ó gia các anh em.
3 6 9
7 8
10 11 12
4 5
1 2
3 6 9
7 8
10 11 12
5
1 2
3 9
1 2
5 6 7 8
10 11 12
16 Chng 1 Cu trúc d liu
Hình 1-3-22 Ví d vng
i vì ng có cu trúc ca cây nh phân hoàn chnh, nên nó là mt loi cây cân bng, t
chc c. Trong trng hp ca ng, giá tr ti a (hay giá tr ti thiu) ca tt c các d
liu c ghi li trong gc. Bng vic dùng c trng này, d liu có thc sp xp bng
vic ly ra d liu ti gc theo cách tun t.
Hình 1-3-23 Sp xp d liu dùng ng
9
87

6
53
41
9
87
3
56
41
ng ây không phi là ng
i quan h v kích c
trong hình ch nht chm
là khác nhau
6
4 5
1
3 2
6
5
4 2
1
3
5
3
1 2
3
1 2
4
4
3 2
1

4
3
1.3 Cu trúc d liu hng vn  17
1.3.5 m
m là cách dùng mt cu trúc d liu kiu mng. Vi vic dùng bm, bn có th truy nhp
trc tip vào d liu c bit bng vic dùng mt khoá mà không phi truy nhp ln lt vào
 liu c ghi.
(1) Chuyn i sang a ch bm
 chuyn mt khoá sang a ch bm (ch s), ngi ta dùng mt hàm bm. Hàm bm tiêu
biu là:
- Phng pháp chia
- Phng pháp ng kí
- Phng pháp i c s.
• Phng pháp chia
Khoá c chia theo mt giá tr nào ó (mt s nguyên t gn nht vi s phn t mng
thng c dùng) và s dc dùng làm a ch (ch s) ca khoá.
Ví d Khoá: 1234 và s phn t mng : 100
1234÷97 (s nguyên t gn 100 nht) = 12 70 : a ch (ch s)
‚ Phng pháp ng kí
Khoá c phân tách theo mt qui tc nào ó và tng c dùng làm a ch (ch s) ca
khoá.
Ví d Khoá: 1234
1234 c phân tách thành 12 và 34 và c hai s này c ly tng.
12 + 34 = 46 : a ch (ch s)
ƒ Phng pháp chuyn c s
Khoá thng c biu din theo s h thp phân, Khoá này c chuyn thành c s khác
i thp phân (chng hn c s ba), và kt quc dùng làm a ch (ch s) ca khoá.
Ví d Khoá bn ghi: 1234
1 × 3
3

+ 2 × 3
2
+ 3 × 3
1
+ 4 × 3
0
= 27 + 18 + 9 + 4
= 58 : a ch (ch s)
∗ Giá tr ca tng ch s theo h c s 3 là 3 hay nh hn. Tuy nhiên trong trng hp
này s kin này không cn c tính ti.
(2) ng ngha
Khi mt khoá c chuyn thành a ch bng vic dùng hàm bm, các khoá khác nhau có th
c chuyn vào cùng mt a ch. u này c gi là ng ngha (hay ng ) (xem Hình
1-3-24). Mt bn ghi có th dùng a chã chuyn i c gi là bn ghi nhà còn bn ghi
không th dùng c nó sc gi là bn ghi ng ngha.
18 Chng 1 Cu trúc d liu
Hình 1-3-24 Xut hin ng ngha
 gii quyt sng ngha, mt phng pháp c bit hay phng pháp dây chuyn c
dùng:
• Phng pháp tun t
ng vic dùng phng pháp tun t, bn ghi ng ngha c lu gi trong không gian t
do c nh v gn a ch mong mun. Có kh nng là sng ngha li có th xut hin
theo phn ng dây chuyn.
‚ Phng pháp dây chuyn
i vic dùng phng pháp dây chuyn, mt vùng b nh tách bit c thit lp và các
n ghi ng ngha c lu gi trong vùng này. Trong trng hp này, cn cung cp mt
con tr ch ra a ch ni các bn ghi ng ngha c ct gi.
n ghi có thc s
ng vi khóa 234
(Bn ghi nhà)

39
40
41
u khóa c chuyn thành 97 s dng phép chia
Khóa bn ghi: 234
234 ÷ 97 = 240
Khóa bn ghi: 525 X
525 ÷ 97 = 540 ng ngha
Bài tp 19
Bài tp
Q1 Khi lu gi mng hai chiu "a" có mi hàng và mi ct trong không gian b
nh liên tc theo hàng, a ch ni lu gi [5, 6] là gì? Trong câu hi này, a ch
c biu din theo s thp phân.
a. 145 b. 185 c. 190 d. 208 e. 212
Q2 Hình di ây là danh sách mt chiu. Tokyo ng u trong danh sách này và
con tr cha a ch ca d liu c nêu di ây. Nagoya ng cui ca danh
sách và con tr cha 0. Hãy chn mt cách úng a thêm Shizuoka vào a ch
150 gia Atami và Hamamatsu.
Con tru a ch  liu Con tr
10 10 Tokyo 50
30 Nagoya 0
50 Shin Yokohama 90
70 Hamamatsu 30
90 Atami 70
150 Shizuoka
a. Con tr cho Shizuoka c t là 50 và con tr cho Hamamatsu c t là 150
b. Con tr cho Shizuoka c t là 70 và con tr cho Atami c t là 150
c. Con tr cho Shizuoka c t là 90 và con tr cho Hamamatsu c t là 150
d. Con tr cho Shizuoka c t là 150 và con tr cho Atami c t là 90
Q3 Cu trúc d liu thích hp cho thao tác FIFO (vào trc ra trc) là gì?

a. Cây nh phân b. Hàng i c. Ngn xp d. ng
Q4 Hai thao tác ngn xp c nh ngha nh sau:
PUSH n: D liu (nguyên "n") c y vào ngn xp.
POP: D liu c bt ra khi ngn xp.
u thao tác ngn xp c thc hin trên ngn xp rng theo th tc c nêu di ây, thì
có th thu c kt qu gì?
PUSH 1 → PUSH 5 → POP → PUSH 7 → PUSH 6 → PUSH 4 →POP → POP → PUSH 3
a b C d e
1 3 3 3 6
7 4 4 7 4
3 5 6 1 3
a ch
100
101
102
103
a [1, 1]
a [1, 1]
20 Chng 1 Cu trúc d liu
Q5 Hình 2 là biu din mng cho cây nh phân c v trong Hình 1. Giá tr nào nên
c t vào ch "a"?
Ch s Giá tr
Con tr 1 Con tr 2
1 200 3 2
2 220 0 0
3 180 5
a
4 190 0 0
5 150 6 0
6 130 0 0

Hình 1 Cây nh phân
Hình 2
Biu din mng cho cây nh phân
a. 2 b. 3 c. 4 d. 5
Q6 Khi phn t 12 b xoá khi cây tìm kim nh phân c v di ây, phn t nào
nên c chuyn ti m phn tã b xoá  t chc li cây tìm kim nh phân?
a. 9 b. 10 c. 13 d. 14
Q7 Nu hai hay ít hn hai nhánh ch ra t tng nút ca mt cây, thì cây nh vy c
i là cây nh phân. Cây nh phân bao gm mt nút, mt cây trái và mt cây phi.
Có ba phng pháp thc hin tìm kim trên cây này:
(1) Th t gc trc: Vic tìm kim c thc hin theo th t ca nút, cây trái ri n cây
phi.
(2) Th t gc gia: Vic tìm kim c thc hin theo th t ca cây trái, nút và cây phi.
(3) Th t gc sau: Vic tìm kim c thc hin theo th t cây trái, cây phi và nút.
u vic tìm kim c thc hin bng vic dùng phng pháp th t gc sau, thì kt qu
nào trong các kt qu sau có th là cái ra xem nh giá tr ca nút?
a. abchidefjgk b. abechidfjgk c. hcibdajfegk d. hicdbjfkgea
b e
f gc d
ih j k
a
9
4 8
7
12
2 5
31
10
14
6

11
13
15
200
220
180
150
190
130
Bài tp 21
Q8 Cây nh phân c v di ây có thc biu din bng vic dùng biu thc s
c. Biu thc nào là úng?
a. A + B × C + (D + E) ÷ F b. A + B × C - (D + E) ÷ F
c. A + B × C - D + E ÷ F d. A× B + C + (D - E) ÷ F
e. A × B + C - D + E ÷ F
Q9 Xét ti vic lu gi d liu bng cách dùng B-cây, hãy chn câu chú thích úng t
nhng câu sau:
a. Chia ra và gp li các nút  cho phép chiu sâu phân cp tr thành nh nhau.
b. Nhn din v trí ni d liu c lu gi bng vic dùng mt hàm nào ó và giá tr khoá.
c. Ch có th truy nhp tun t ti d liu u và d liu tip ó.
d. Có danh mc và mt thành viên. Thành viên là tp c t chc tun t.
Q10 Có mt ng vi giá tr ca nút cha m nh hn giá tr ca nút con.  chèn thêm
 liu vào trong ng này, bn có th thêm mt phn t vào phn sau nht và lp
i vic trao i cha m vi con cái khi phn t này nh hn cha m. Khi phn t 7
c thêm vào v trí * ca ng tip, phn t nào s vào v trí A?
a. 7 b. 9 c. 11 d. 24 e. 25
Q11 Mt s có nm ch s (a
1
a
2

a
3
a
4
a
5
) phi c lu gi trong mt mng bng vic
dùng phng pháp bm. Nu hàm bm c xác nh nh mod (a
1
+a
2
+a
3
+a
4
+a
5
,
13) và nu s có nm ch sc lu gi trong mt phn t mng  v trí sánh vi
giá tr bm ã c tính, thì ti v trí ó 54321 sc t vào âu trong mng
c v di ây? ây, giá tr mod (x, 13) là phn d khi ly x chia cho 13.
 trí Mng
0
1
2
⋅⋅⋅
11
12
9
11 14

28
19
29 34
24
25
*
A
-
+
÷
F
+
XA
CB D
E
22 Chng 1 Cu trúc d liu
a. 1 b. 2 c. 7 d. 11
Q12 Nm d liu vi các giá tr khoá c phân bu và ngu nhiên trong phm vi t
1 ti 1,000,000 phi c ng kí vào bng bm kích c 10. Xác sut xp x cho
ng  xy ra là gì? ây, phn d thu c khi mt giá tr khoá c chia theo
kích c ca bng bm c dùng nh giá tr bm.
a. 0.2 b. 0.5 c. 0.7 d. 0.9
2 Thut toán
c ích ca chng
Các c s ca vic lp trình là thit k thut toán.
Trong thit k cu trúc logic ca chng trình, u
quan trng là dùng thut toán thích hp nht. Tng t
nh vy, trong vic chn chng trình t th vin,
thut toán nào c dùng là mt trong nhng tiêu
chun quan trng nht  chn chng trình thích hp

nht.
Chng này mô t cho các c s ca thit k thut toán
và các thut toán tiêu biu.
• Hiu các c s ca thut toán, nhnh ngha thut
toán, thit k, mi quan h vi cu trúc d liu,
phng pháp biu din v.v
‚ Hiu c trng và ý ngha ca các thut toán tìm
kim, sp xp, x lí kí t và x lí tp tiêu biu.

×