u trúc d li u và gi i thu t
U TRÚC D
LI U VÀ GI I THU T
(5 VHT: 60LT + 30TH)
Ch
ng 0.
0.1. Xác
M
u - Các b
c gi i bài toán trên máy tính
nh bài toán ...................................................................................... Trang 4
0.2. Tìm c u trúc d li u bi u di n bài toán ............................................................... 4
0.3. Tìm thu t toán ..................................................................................................... 5
0.4. L p trình ............................................................................................................. 6
0.5. Ki m th ............................................................................................................. 7
0.5.1. Ch y th và tìm l i .................................................................................. 7
0.5.2. Xây d ng các b Test ............................................................................... 7
0.6. T i u ch
Ch
ng 1.
ng trình ............................................................................................ 8
T ng quan v c u trúc d li u và gi i thu t
1.1. Vai trò c a c u trúc d li u trong m t
án tin h c ............................................ 9
1.2. Các tiêu chu n ánh giá c u trúc d li u ............................................................. 9
1.2.1. Ph n ánh úng th c t .............................................................................. 9
1.2.2. Phù h p v i các thao tác trên ó ............................................................. 10
1.2.3. Ti t ki m tài nguyên h th ng ................................................................ 10
1.3. Ki u d li u và c u trúc d li u ......................................................................... 10
1.3.1.
nh ngh a ki u d li u .......................................................................... 10
1.3.2. Các thu c tính c a m t ki u d li u ....................................................... 11
1.3.3. Các ki u d li u c b n .......................................................................... 11
1.3.4. Các ki u d li u có c u trúc ................................................................... 12
Ch
2.1.
ng 2.
Phân tích và ánh giá gi i thu t
ph c t p tính toán và các ký pháp
2.1.1. Th i gian th c hi n ch
2.1.2.
2.2. Xác
ánh giá ............................................. 16
ng trình ........................................................... 16
ph c t p c a gi i thu t ...................................................................... 16
nh
ph c t p tính toán c a gi i thu t .................................................... 17
2.2.1. Quy t c t ng ........................................................................................... 17
2.2.2. Quy t c nhân .......................................................................................... 17
2.2.3. M t s tính ch t ..................................................................................... 18
2.2.4. Phép toán tích c c .................................................................................. 19
2.3.
ph c t p tính toán v i tình tr ng d li u vào ................................................ 20
Trang 1
u trúc d li u và gi i thu t
2.4. Chi phí th c hi n thu t toán .............................................................................. 20
Ch
ng 3.
quy và gi i thu t
3.1. Khái ni m v
3.2. Gi i thu t
quy
quy ......................................................................................... 21
quy ............................................................................................... 21
3.3. Thi t k gi i thu t
quy .................................................................................. 21
3.4. Hàm n! .............................................................................................................. 21
3.4.1. Dãy Fibonacci ........................................................................................ 22
3.4.2. Bài toán Tháp Hà N i ............................................................................ 22
3.5. Hi u l c c a
Ch
ng 4.
quy .......................................................................................... 23
Tìm ki m và s p x p
4.1. Gi i thi u .......................................................................................................... 25
4.2. Các gi i thu t tìm ki m (tìm ki m n i) .............................................................. 25
4.2.1. Tìm ki m tu n t (Sequential Search) .................................................... 25
4.2.2. Tìm ki m nh phân (Binary Search) ....................................................... 27
4.3. Các gi i thu t s p x p c b n ............................................................................ 29
4.3.1. S p x p ki u l a ch n (Selection Sort) ................................................... 30
4.3.2. S p x p ki u chèn (Insertion Sort) .......................................................... 32
4.3.3. S p x p
i ch tr c ti p (Interchange Sort) ........................................... 34
4.3.4. S p x p n i b t (Bubble Sort) ................................................................ 37
4.3.5. S p x p chèn v i
4.3.6. S p x p ki u phân
4.4.
Ch
dài b
c gi m d n (Shell Sort) .............................. 40
n (Quick Sort) ..................................................... 42
ánh giá, nh n xét ............................................................................................ 44
ng 5.
C u trúc d li u
ng
5.1. Gi i thi u .......................................................................................................... 46
5.2. Bi u di n danh sách trong máy tính .................................................................. 46
5.2.1.
u tr k ti p v i danh sách tuy n tính ................................................ 46
5.2.2.
u tr móc n i v i danh sách tuy n tính (danh sách liên k t) ............... 49
5.2.3. Các phép toán trên danh sách liên k t ..................................................... 50
5.3. S p x p danh sách liên k t ................................................................................ 57
5.4. Các d ng khác c a danh sách liên k t ............................................................... 59
Trang 2
u trúc d li u và gi i thu t
Ch
ng 6.
Ng n x p và hàng
i
6.1. Ng n x p (Stack) .............................................................................................. 62
6.1.1.
nh ngh a ............................................................................................. 62
6.1.2.
u tr Stack b ng m ng ....................................................................... 62
6.1.3.
u tr Stack b ng danh sách liên k t .................................................... 64
6.1.4.
ng d ng c a Stack ............................................................................... 66
6.2. Hàng
i (Queue) ............................................................................................. 69
6.2.1.
nh ngh a ............................................................................................. 69
6.2.2.
u tr Queue b ng m ng ...................................................................... 69
6.2.3.
u tr Queue b ng danh sách liên k t .................................................. 71
6.2.4.
ng d ng c a Queue .............................................................................. 74
ng 7.
Cây
Ch
7.1.
nh ngh a cây .................................................................................................. 75
7.2. Cây nh phân (Binary Tree) ............................................................................... 75
7.2.1. Bi u di n cây nh phân ........................................................................... 76
7.2.2. Duy t cây nh phân ................................................................................ 77
7.2.3. Bi u di n cây t ng quát b ng cây nh phân ............................................. 79
7.3. Cây nh phân tìm ki m ...................................................................................... 79
7.4.
ánh giá ........................................................................................................... 85
7.5. Cây nh phân cân b ng ...................................................................................... 85
Trang 3
u trúc d li u và gi i thu t
Ch
ng 0.
0.1. Xác
u - Các b
c gi i bài toán trên máy tính
D li u vào
X lý
nh bài toán
K t qu ra
Vi c xác nh bài toán là ph i xác nh xem ta ph i gi i quy t v n
gì? v i gi
thi t nào a cho và c n t nh ng yêu c u nào. Khác v i bài toán thu n túy toán h c ch
c n xác nh rõ gi thi t và k t lu n ch không c n xác nh yêu c u v l i gi i, ôi khi
nh ng bài toán tin h c ng d ng trong th c t ch c n tìm l i gi i t t t i m c nào ó,
th p chí là t i m c ch p nh n
c. B i l i gi i t t nh t có th òi h i quá nhi u th i
gian và chi phí.
Xác nh úng yêu c u bài toán là r t quan tr ng b i nó nh h ng t i cách th c
gi i quy t và ch t l ng l i gi i. M t bài toán th c t th ng cho b i nh ng thông tin
khá m h v hình th c, ta ph i phát bi u l i m t cách chính xác và ch t ch
hi u
úng bài toán.
Ví d :
• Bài toán: M t d án có n ng i tham gia th o lu n, h mu n chia thành
các nhóm và m i nhóm th o lu n riêng v m t ph n c a d án. Nhóm có
bao nhiêu ng i thì
c trình lên b y nhiêu ý ki n. N u l y m i nhóm
m t ý ki n em ghép l i thì
c m t b ý ki n tri n khai d án. Hãy tìm
cách chia s b ý ki n cu i cùng thu
c là l n nh t.
• Phát bi u l i: Cho m t s nguyên d ng n, tìm các phân tích n thành t ng
các s nguyên d ng sao cho tích c a các s ó là l n nh t.
Trên th c t , ta nên xét m t vài tr ng h p c th thông qua ó hi u
c bài toán
rõ h n và th y
c các thao tác c n ph i ti n hành.
i v i nh ng bài toán n gi n,
ôi khi ch c n qua ví d ta có th
a v m t bài toán quen thu c gi i.
0.2. Tìm c u trúc d li u bi u di n bài toán
Khi gi i m t bài toán, ta c n ph i nh ngh a t p h p d li u bi u di n tình tr ng
c th . Vi c l a ch n này tùy thu c vào v n
gi i quy t và các thao tác s ti n hành
trên d li u vào. Có nh ng thu t toán ch thích ng v i m t cách t ch c d li u nh t
nh, i v i nh ng cách t ch c d li u khác s kém hi u qu ho c không th th c hi n
c. Chính vì v y nên b c xây d ng c u trúc d li u không th tách r i b c tìm ki m
gi i thu t gi i quy t v n .
Các tiêu chu n khi l a ch n c u trúc d li u:
Ch
−
C u trúc d li u tr
xu t c a bài toán.
−
C u trúc d li u ph i phù h p v i các thao tác c a thu t toán mà ta l a ch n
gi i quy t bài toán
−
C u trúc d li u ph i cài
d ng.
ng 0. Các b
c h t ph i bi u di n
t
c
y
các thông tin nh p và
c trên máy tính v i ngôn ng l p trình ang s
c gi i bài toán trên máy tính
Trang 4
u trúc d li u và gi i thu t
trình nh
i v i m t s bài toán, tr c khi t ch c d li u ta ph i vi t m t
kh o sát xem d li u c n l u tr l n t i m c nào.
n ch
ng
0.3. Tìm thu t toán
Thu t toán là m t h th ng ch t ch và rõ ràng các quy t c nh m xác nh m t dãy
các thao tác trên c u trúc d li u sao cho: v i b d li u vào, sau m t s h u h n b c
th c hi n thao tác ã ch ra, ta t
c m c tiêu ã nh. Các c tr ng c a thu t toán:
v Tính
n
nh:
m i
c c a thu t toán, các thao tác ph i th t rõ ràng , không gây nên s nh p
nh ng, l n x n, tùy ti n, a ngh a. Th c hi n úng các b c c a thu t toán thì v i m t
d li u vào, ch cho duy nh t m t k t qu ra.
v Tính d ng:
Thu t toán không
m t s h u h n b c.
v Tính úng
c r i vào quá trình vô h n, ph i d ng l i và cho k t qu sau
n:
Sau khi th c hi n t t c các b c c a thu t toán theo úng quá trình ã nh, ta
ph i
c k t qu mong mu n v i m i b d li u vào. K t qu ó
c ki m ch ng
b ng yêu c u bài toán.
v Tính ph d ng:
Thu t toán ph i d s a i thích ng
c v i b t k bài toán nào trong m t l p
các bài toán và có th làm vi c trên các d li u khác nhau.
v Tính kh thi:
Kích th c
nh , m t thu t toán s có tính hi u qu b ng 0 n u l
nó yêu c u v t quá kh n ng l u tr c a máy tính.
ng b nh mà
Thu t toán ph i
c máy tính th c hi n trong th i gian cho phép,
u này khác
v i l i gi i toán (ch c n ch ng minh là k t thúc sau h u h n b c). Ví d nh x p th i
khóa bi u cho m t h c k thì không th cho máy tính ch y t i h c k sau m i ra
c.
D hi u và d cài
t.
Ví d : Input: 2 s nguyên d
Output:
c s chung l n nh t c a a và b.
Thu t toán s ti n hành
B
ng a và b
c mô t nh sau (thu t toán Euclide):
c 1 (Input): Nh p 2 s nguyên a và b.
c 2: N u b > 0 thì qua b
c 3:
t r:= a mod b;
c 4 (Output):
c 3, ng
t a:=b;
c l i chuy n qua b
t b:=r; quay l i b
c 4.
c 2.
c s chung l n nh t ph i tìm là giá tr c a a. K t thúc thu t
toán.
u
Ch
thu t toán:
ng 0. Các b
c gi i bài toán trên máy tính
Trang 5
u trúc d li u và gi i thu t
u ý:
Khi mô t thu t toán b ng ngôn ng t nhiên, ta không c n ph i quá chi ti t các
c và ti n trình th c hi n mà ch c n mô t m t cách hình th c
chuy n thành
ngôn ng l p trình. Ví d khi vi t s
thu t toán quy.
i v i các thu t toán ph c t p và n ng v tính toán, các b c và các công th c
c n
c mô t m t cách t ng minh và chú thích rõ ràng
khi l p trình ta có th
nhanh chóng tra c u.
i v i nh ng thu t toán kinh
n thì ph i thu c. Khi gi i m t bài toán l n trong
m t th i gian gi i h n, ta ch ph i thi t k t ng th còn nh ng ch ã thu c thì c l p
vào. Tính úng n c a nh ng modun ã thu c ta không c n quan tâm n a mà ph i t p
trung gi i quy t các ph n khác.
0.4. L p trình
Sau khi ã có thu t toán, ta ph i ti n hành l p trình th hi n thu t toán ó. Mu n
l p trình t
c hi u qu cac, c n ph i có k thu t l p trình t t. K thu t l p trình t t
th hi n k n ng vi t ch ng trình, kh n ng g r i và thao tác nhanh. L p trình t t
không ph i ch n m v ng ngôn ng l p trình là , ph i bi t cách vi t ch ng trình uy n
chuy n, khôn khéo và phát tri n d n d n
chuy n các ý t ng ra thành các ch ng
trình hoàn ch nh.Th c t cho th y, m t thu t toán hay nh ng do cài t v ng v nên khi
ch y l i cho k t qu sai ho c t c
ch m.
Thông th ng, ta không nên c th hóa ngay toàn b ch
hành theo ph ng pháp tinh ch t ng b c.
Ch
ng trình mà nên ti n
−
Ban u, ch ng trình
c th hi n b ng ngôn ng t nhiên, th hi n thu t
toán v i các b c t ng th , m i b c nêu lên m t công vi c ph i th c hi n.
−
M t công vi c n gi n ho c m t
n ch ng trình ã
ti n hành vi t mã l nh ngay b ng ngôn ng l p trình.
−
M t s công vi c ph c t p thì ta l i chia thành nh ng công vi c nh h n
ti p t c v i nh ng công vi c nh h n ó.
ng 0. Các b
c gi i bài toán trên máy tính
c h c thu c thì ta
l i
Trang 6
u trúc d li u và gi i thu t
Trong quá trình tinh ch t ng b c, ta ph i a ra nh ng bi u di n d li u. Nh
v y cùng v i s tinh ch các công vi c, d li u c ng
c tinh ch d n, có c u trúc h n,
th hi n rõ h n m i liên h gi a các d li u.
Ph ng pháp tinh ch t ng b c là m t th hi n c a t duy gi i quy t v n
t
trên xu ng, giúp cho ng i l p trình có
c m t nh h ng th hi n phong cách vi t
ch ng trình. Tránh vi c mò m m, xóa i vi t l i nhi u l n, bi n ch ng trình thành t
gi y nháp…
0.5. Ki m th
0.5.1. Ch y th và tìm l i
Ch ng trình là do con n
i vi t ra, mà ã là con ng i thì ai c ng có th nh m
l n. M t ch ng trình vi t xong ch a ch c ã
c ch y ngay trên máy tính
cho ra
k t qu mong mu n. K n ng tìm l i, s a l i,
u ch nh l i ch ng trình c ng là m t k
ng quan tr ng c a ng i l p trình. K n ng này ch có
c b ng kinh nghi m tìm và
s a ch a l i c a chính mình. Có ba lo i l i:
v L i cú pháp: l i này th ng g p nh t nh ng d s a nh t, ch c n n m v ng
ngôn ng l p trình là . M t ng i
c coi là không bi t l p trình n u không
bi t s a l i cú pháp.
v L i cài t: vi c cài t th hi n không úng thu t toán ã nh, i v i l này
thì ph i xem l i t ng th ch ng trình, k t h p v i các ch c n ng g r i s a
l i cho úng.
v L i thu t toán: l i này ít g p nh ng nguy hi m nh t, n u nh thì ph i
u
ch nh l i thu t toán, n u n ng thì có khi ph i lo i b hoàn toàn thu t toán sai và
làm l i t
u.
0.5.2. Xây d ng các b Test
Có nhi u ch ng trình r t khó ki m tra tính úng n. Nh t là khi không bi t n
k t qu úng là th nào. Vì v y n u nh ch ng trình vãn ch y ra k t qu (không bi t
úng sai th nào) thì vi c tìm l i là r t khó kh n. Khi ó ta nên làm các b test
th
ch ng trình c a mình.
Các b test nên t trong các file v n b n, b i vi c t o m t file v n b n r t nhanh
và m i l n ch y th ch c n thay tên file d li u vào là xong, không c n gõ l i b test t
bàn phím. Kinh nghi m làm b test là:
−
B t u v i m t b test nh , n gi n, làm b ng tay c ng có
sánh v i k t qu ch ng trình ch y ra.
−
Các b test ph i a d ng, tránh l p i l p l i các b test t
−
Có m t vài b test l n ch
ki m tra tính ch u ng c a ch ng trình mà thôi.
K t qu có úng hay không thì trong a s tr ng h p không th ki m ch ng
c v i b test này.
c áp s
so
ng t .
u ý r ng ch ng trình ch y qua
c h t các test không có ngh a là ch ng trình
ó ã úng. B i có th ta ch a xây d ng
c b test làmcho ch ng trình ch y sai. Vì
v y n u có th , ta nên tìm cách ch ng minh tính úng n c a thu t toán và ch ng
trình, i u này th ng r t khó.
Ch
ng 0. Các b
c gi i bài toán trên máy tính
Trang 7
u trúc d li u và gi i thu t
0.6. T i u ch
ng trình
M t ch ng trình ã ch y úng không có ngh a là vi c l p trình ã xong, ta ph i
s a i l i m t vài chi ti t
ch ng trình có th ch y nhanh h n, hi u qu h n. Thông
th ng, tr c khi ki m th thì ta nên t m c tiêu vi t ch ng trình sao cho n gi n,
mi n sao ch y ra k t qu úng là
c, sau ó khi t i u ch ng trình, ta xem l i nh ng
ch nào vi t ch a t t thì t i u l i mã l nh
ch ng trình ng n g i h n, ch y nhanh
n. Không nên vi t t i âu t i u mã n ó, b i ch ng trình có mã l nh t i u
th ng ph c t p, khó ki m soát. Ta nên t i u ch ng trình theo các tiêu chu n sau:
v Tính tin c y:
Ch ng trình ph i ch y úng nh d
nh, mô t úng m t gi i thu t úng. Thông
th ng khi vi t ch ng trình, ta luôn có thói quen ki m tra tính úng n c a các b c
m i khi có th .
v Tính uy n chuy n:
Ch ng trình ph i d s a i. B i ít có ch ng trình nào vi t ra ã hoàn h o ngay
c mà v n còn ph i s a i l i. Ch ng trình vi t d s a i s làm gi m b t công s c
c a l p trình viên khi phát tri n ch ng trình.
v Tính trong sáng:
Ch ng trình vi t ra d
mình làm cái gì,
n u có
ti n hay bi n i
c ch
ch ng trình ph thu c r t nhi
c d hi u,
sau m t th i gian dài, khi c l i còn hi u
u ki n thì còn có th s a sai (n u phát hi n l i m i), c i
ng trình gi i quy t bài toán khác. Tính trong sáng c a
u vào công c l p trình và phong cách l p trình.
v Tính h u hi u:
Ch ng trình ph i ch y nhanh và ít t n b nh , t c là ti t ki m
c c v không
gian và th i gian.
có m t ch ng trình h u hi u, c n ph i có gi i thu t t t và nh ng
ti u x o khi l p trình. Tuy nhiên, vi c áp d ng quá nhi u ti u x o có th khi n ch ng
trình tr nên r i r m, khó hi u khi s a i. Tiêu chu n h u hi u nên d ng l i m c ch p
nh n
c, không quan tr ng b ng ba tiêu chu n trên. B i phàn c ng phát tri n r t
nhanh, yêu c u h u hi u không c n t ra quá n ng.
T nh ng phân tích trên, chúng ta nh n th y r ng vi c làm ra m t ch ng trình
òi h i r t nhi u công
n và tiêu t n khá nhi u công s c. Ch m t công
n không
h p lý s làm t ng chi phí vi t ch ng trình. Ngh ra cách gi i quy t v n
ã khó, bi n
ý t ng ó thành hi n th c c ng không d chút nào.
Ch
ng 0. Các b
c gi i bài toán trên máy tính
Trang 8
u trúc d li u và gi i thu t
Ch
ng 1.
ng quan v c u trúc d li u và gi i thu t
1.1. Vai trò c a c u trúc d li u trong m t
án tin h c
Th c hi n gi i m t bài toán tin h c là chuy n bài toán th c t thành bài toán có th
gi i quy t trên máy tính. M t bài toán th c t b t k
u bao g m các i t ng d li u
và các yêu c u x lý trên các i t ng ó. Vì th , xây d ng bài toán tin h c ph n ánh
c bài toán th c t c n chú tr ng n hai v n :
v T ch c bi u di n các
it
ng th c t :
Các thành ph n d li u th c t a d ng, phong phú và th ng ch a ng nh ng
quan h nào ó v i nhau, do ó trong bài toán tin h c c n ph i t ch c, xây d ng các c u
trúc d li u thích h p nh t sao cho v a có th ph n ánh chính xác các d li u th c t
này, v a có th d dàng dùng máy tính
x lý. Công vi c này g i là xây d ng c u trúc
d li u cho bài toán.
v Xây d ng các thao tác x lý d li u:
T nh ng yêu c u x lý trong th c t , c n tìm ra các gi i thu t t ng ng
xác
nh trình t các thao tác máy tính ph i thi hành
cho ra k t qu mong mu n, ây là
c xây d ng gi i thu t cho bài toán.
Tuy nhiên khi gi i quy t m t bài toán trên máy tính, chúng ta th ng có khuynh
ng ch chú tr ng n vi c xây d ng gi i thu t mà quyên i t m quan tr ng c a vi c
t ch c d li u trong bài toán. Gi i thu t ph n ánh các phép x lý, còn i t ng x lý
c a gi i thu t l i là d li u. Chính d li u ch a ng các thông tin c n thi t th c hi n
gi i thu t.
xác nh
c gi i thu t phù h p c n ta c n ph i bi t nó tác ng n lo i
d li u nào và khi l a ch n c u trúc d li u c ng c n ph i hi u rõ nh ng thao tác nào tác
ng lên d li u ó. Nh v y trong m t bài toán tin h c, c u trúc d li u và gi i thu t có
m i quan h ch t ch v i nhau,
c th hi n qua công th c:
C u trúc d li u + Gi i thu t = Ch
ng trình
V i m t c u trúc d li u ã ch n, s có nh ng gi i thu t t ng ng, phù h p. Khi
c u trúc d li u thay i th ng gi i thu t c ng ph i thay i theo
tránh vi c x lý
ng ép, thi u t nhiên trên m t c u trúc không phù h p. H n n a, m t c u trúc d li u
t t s giúp gi i thu t x lý trên ó có th phát huy tác d ng t t h n, v a nhanh v a ti t
ki m v t t , gi i thu t c ng n gi n và d hi u h n.
1.2. Các tiêu chu n ánh giá c u trúc d li u
Do t m quan tr ng c a c u trúc d li u trong vi c gi i các bài toán trên máy tính,
nên nh t thi t ph i chú tr ng n vi c l a ch n m t ph ng án t ch c d li u thích h p.
M t c u trúc d li u t t ph i tho mãn các tiêu chu n sau:
1.2.1. Ph n ánh úng th c t
ây là tiêu chu n quan tr ng nh t, quy t nh tính úng n c a toàn b bài toán.
C n xem xét k l ng c ng nh d trù các tr ng thái bi n i c a d li u trong chu
trình ho t ng
có th l a ch n c u trúc d li u l u tr th hi n chính xác i t ng
th c t .
Ch
ng 1. T ng quan v c u trúc d li u và gi i thu t
Trang 9
u trúc d li u và gi i thu t
Ví d : M t s tình hu ng ch n c u trúc l u tr sai
−
Ch n bi n s nguyên integer
l u tr ti n th ng bán hàng (
c tính theo
công th c ti n th ng bán hàng = tr giá hàng *5%), do v y khi làm tròn m i
giá tr ti n th ng s gây thi t h i cho nhân viên bán hàng. Tr ng h p này
ph i s d ng bi n s th c ph n ánh úng k t qu c a công th c tính th c t .
−
Trong tr ng trung h c, m i l p có th nh n t i a 25 h c sinh. L p hi n có 20
h c sinh, m i tháng, m i h c sinh óng h c phí 15.000 ng. Ch n m t bi n
s nguyên (kh n ng -32768 ÷ 32767)
l u tr t ng s h c phí c a l p h c
trong tháng, n u x y ra tr ng h p có thêm 5 h c sinh n a vào l p thì giá tr
t ng h c phí thu
c là 375000 ng, v t kh n ng l u tr c a bi n ã ch n,
gây ra tình tr ng tràn, sai l ch.
1.2.2. Phù h p v i các thao tác trên ó
Tiêu chu n này giúp t ng hi u qu c a bài toán, vi c phát tri n các thu t toán
gi n, t nhiên h n, ch ng trình t hi u qu cao h n v t c
x lý.
n
1.2.3. Ti t ki m tài nguyên h th ng
C u trúc d li u ch nên s d ng tài nguyên v a
m nhi m
c ch c n ng
c a nó. Thông th ng có hai lo i tài nguyên c n l u ý nh t: CPU và b nh . Tiêu chu n
này nên cân nh c tu vào tình hu ng c th khi th c hi n bài toán. N u t ch c s d ng
bài toán c n có nh ng x lý nhanh thì khi ch n c u trúc d li u y u t ti t ki m th i gian
x lý ph i t n ng h n tiêu chu n s d ng t i a b nh , và ng c l i.
Ví d : M t s tình hu ng ch n c u trúc l u tr lãng phí
−
S d ng bi n integer (2 bytes)
l u tr m t giá tr cho bi t tháng hi n hành.
Trong tình hu ng này ta ch c n s d ng bi n ki u byte là .
−
l u tr danh sách h c viên trong m t l p, s d ng m ng 60 ph n t (gi i
h n s h c viên trong l p t i a là 60). N u s l ng h c viên th t s ít h n 60,
thì gây lãng phí b nh . H n n a, s h c viên có th thay i theo t ng k ,
t ng n m. Trong tr ng h p này ta c n có m t c u trúc d li u linh ng h n
m ng nh danh sách liên k t…
1.3. Ki u d li u và c u trúc d li u
Máy tính th c s ch có th l u tr
d ng nh phân thô s . N u mu n ph n ánh
c d li u th c t a d ng và phong phú, c n ph i xây d ng nh ng phép ánh x ,
nh ng qui t c t ch c ph c t p che lên t ng d li u thô, nh m a ra nh ng khái ni m
logic v hình th c l u tr khác nhau th ng
c g i là ki u d li u. Nh ã phân tích
ph n u, gi a hình th c l u tr và các thao tác x lý trên ó có quan h m t thi t v i
nhau. T ó có th
a ra m t nh ngh a cho ki u d li u nh sau:
1.3.1.
nh ngh a ki u d li u
Ki u d li u T
c xác
nh b i b <V,O>, v i :
−
V: t p các giá tr h p l mà
−
O : t p các thao tác x lý có th thi hành trên
it
ng ki u T có th l u tr ;
it
ng ki u T.
Ví d :
Ch
ng 1. T ng quan v c u trúc d li u và gi i thu t
Trang 10
u trúc d li u và gi i thu t
• Ki u d li u ký t = <Vc, Oc> v i:
− Vc = {a - z, A - Z}
− Oc = {l y mã ASCII c a ký t , bi n
hoa,...}
i ký t th
ng thành ký t
• Ki u d li u s nguyên = <Vi, Oi>
− Vc = {-32768 ÷32767}
− Oc = {+, -, *, /, %, các phép so sánh}
Nh v y, mu n s d ng m t ki u d li u c n n m v ng c n i dung d li u
phép l u tr và các x lý tác ng trên ó.
c
1.3.2. Các thu c tính c a m t ki u d li u
M t ki u d li u bao g m các thu c tính sau :
−
Tên ki u d li u;
−
Mi n giá tr ;
−
Kích th
−
T p các toán t tác
c l u tr ;
ng lên ki u d li u.
1.3.3. Các ki u d li u c b n
Thông th ng trong m t h ki u c a ngôn ng l p trình s có m t s ki u d li u
c g i là ki u d li u n hay ki u d li u phân t (atomic), các ki u d li u n bao
g m:
−
Ki u r i r c: s nguyên, ký t , logic, li t kê, mi n con.
−
Ki u liên t c: s th c.
Tu t ng ngôn ng l p trình, các ki u d li u nh ngh a s n này có th khác nhau
ôi chút. Ch ng h n, v i ngôn ng C, các ki u d li u này ch g m s nguyên, s th c,
ký t . Và theo quan i m c a C, ki u ký t th c ch t c ng là ki u s nguyên v m t l u
tr , ch khác v cách s d ng. Ngoài ra, giá tr logic úng (TRUE) và giá tr logic sai
(FALSE)
c bi u di n trong ngôn ng C nh là các giá tr nguyên khác 0 và b ng 0.
Trong khi ó Pascal nh ngh a t t c các ki u d li u ã li t kê trên và phân bi t
chung m t cách ch t ch : Ki u integer; Ki u real; Ki u boolean; Ki u char; Ki u li t kê;
Ki u
n con.
Các ki u d li u
nh s n trong C g m các ki u sau:
Tên ki u
char
Kích th
01 byte
unsign char
01 byte
0
int
unsign int
long
02 byte
02 byte
04 byte
-32738 n 32767
0 n 65335
-2 32 n 231 -1
Ch
c
-128
Mi n giá tr
n 127
n 255
ng 1. T ng quan v c u trúc d li u và gi i thu t
Ghi chú
Có th dùng nh s nguyên
1 byte có d u ho c ki u ký
t
S nguyên 1 byte không
d u
Có th g i t t là unsign
Trang 11
u trúc d li u và gi i thu t
unsign long
float
04 byte
04 byte
0 n 2 32-1
3.4E-38 n 3.4E38
double
long double
08 byte
10 byte
1.7E-308 n 1.7E308
3.4E-4932 n 1.1E4932
Gi i h n ch tr tuy t
i.Các giá tr <3.4E-38
c coi = 0. Tuy nhiên
ki u float ch có 7 ch s
có ngh a.
1.3.4. Các ki u d li u có c u trúc
Khi gi i quy t các bài toán ph c t p, ta ch s d ng các d li u các d li u n là
không , ta ph i c n n các c u trúc d li u. M t c u trúc d li u bao g m m t t p
h p nào ó các d li u phân t , các thành ph n này liên k t v i nhau b i m t ph ng
pháp nào ó. a s các ngôn ng l p trình u cài t s n m t s ki u có c u trúc c b n
nh m ng, chu i, t p tin, b n ghi...và cung c p c ch cho l p trình viên t
nh ngh a
ki u d li u m i.
v Ki u chu i ký t (String): là m t trong các ki u d li u có c u trúc n gi n
nh t và th ng các ngôn ng l p trình u nh ngh a nó nh m t ki u c b n.
Do tính thông d ng c a ki u chu i ký t các ngôn ng l p trình luôn cung c p
s n m t b các hàm th vi n các x lý trên ki u d li u này. c bi t trong C
th vi n các hàm x lý chu i ký t r t a d ng và phong phú. Các hàm này
c t trong th vi n string.lib c a C.
Chu i ký t
thúc b ng ký t
chi u dài c a m
ký t
u tiên
•
trong C
c c u trúc nh m t chu i liên ti p các ký t k t
có mã ASCII b ng 0 (NULL character). Nh v y, gi i h n
t chu i ký t trong C là 1 Segment (t i a ch a 65335 ký t ),
c ánh s là ký t th 0.
Ngôn ng Pascal: <ten_chuoi>: String (<kich_thuoc>);
Ví d : hoten: String; mssv: String(8);
•
Ngôn ng C: char <ten_chu i>[< kich_thuoc >]; hay char *<ten_chu i>;
Ví d : char a[10], b[] = “ABC”, *c= “ABC”;
Các thao tác trên chu i ký t r t a d ng. Sau ây là m t s thao tác thông d ng:
−
So sánh 2 chu i: strcmp
−
Sao chép 2 chu i: strcpy
−
Ki m tra 1 chu i n m trong chu i kia: strstr
−
C t 1 t ra kh i 1 chu i: strtok
−
i 1 s ra chu i: itoa
−
i 1 chu i ra s : atoi, atof, ...
−
i 1 hay 1 s giá tr ra chu i: sprintf
−
Ch
Nh p m t chu i: gets
Xu t m t chu i: puts
ng 1. T ng quan v c u trúc d li u và gi i thu t
Trang 12
u trúc d li u và gi i thu t
v Ki u m ng (array): là m t t p h p nhi u ph n t có cùng m t ki u giá tr và
chung m t tên. M i ph n t m ng bi u di n
c m t giá tr . Các ph n t c a
m ng
c truy xu t thông qua ch s .
•
Ngôn ng Pascal: <ten_mang>: array[ds_cacchieu] of <kieu_dulieu>;
Ví d : a: array[1..10] of integer; b: array[1..3,1..2] of integer;
•
Ngôn ng C: <kieu_dulieu> <ten_mang>[<ds_cacchieu>];
Ví d : int a[10], b[3][2];
Ta c ng có th v a khai báo v a gán giá tr kh i
ng cho m t m ng nh sau:
int a[5] = (1, 7, -3, 8, 19);
Trong tr
ng h p này C cho phép ta khai báo m t cách ti n l i h n:
int a[] = (1, 7, -3, 8, 19);
int b[ ][ ]={{1, 7, -3, 8, 19}, {4, 5, 2, 8, 9}, {21, -7, 45, -3, 4}};
(m ng a s có kích th
c là 3x5).
v Ki u b n ghi, m u tin (record, struct): là ki u
c dùng
l u tr m t i
t ng có nhi u thành ph n, các thành ph n có th thu c các ki u d li u khác
nhau.
•
Ngôn ng Pascal: <ten_bangghi>: record
<ten_thanhphan>: <kieu_dulieu>;
……
<ten_thanhphan>: <kieu_dulieu>;
end;
Ví d : sinhvien: record
hoten: string[30];
namsinh: integer;
diachi: string;
toan, ly, hoa, tong: real;
end;
•
Ngôn ng C: struct <ten_bangghi>
{
<kieu_dulieu> <ten_thanhphan>;
……
<kieu_dulieu> <ten_thanhphan>;
};
Ví d : struct hocvien
{
char ho[30];
char ten[7];
float toan, ly, hoa , dtb;
Ch
ng 1. T ng quan v c u trúc d li u và gi i thu t
Trang 13
u trúc d li u và gi i thu t
char xeploai[10];
};
v Ki u con tr (Pointer): là m t ki u d li u dùng
ch a
ho c m t hàm nào ó. Con tr th ng
c dùng :
a ch c a m t bi n
+
Tr v nhi u tr t hàm qua c ch truy n theo tham s theo
hàm (tham s hình th c bi n).
+
T o các c u trúc d li u ph c t p nh danh sách liên k t và cây nh phân.
+
Truy n m ng và chu i gi a các hàm khá thu n l i.
•
Ngôn ng Pascal: <ten_contro> = ^<kieu_dulieu>;
a ch trong
Ví d : Pointer = ^Node ;
Node = record
infor : Item ;
next : Pointer;
end ;
•
Ngôn ng C: <kieu_dulieu> *<ten_contro>;
Ví d : int *songuyen, char *chuoi;
v Ki u file (t p tin): là ki u d li u cho phép th c hi n các thao tác (m , óng,
xóa, ghi ký t , xóa ký t ,…) trên các t p tin (v n b n, nh phân).
•
Ngôn ng C: <ten_taptin>: file of <kieu_dulieu>;
Ví d : fileReal: file of real;
•
Ngôn ng C: FILE *<ten_taptin>;
Ví d : FILE *fptr;
Bài t p
1.Tìm thêm m t s ví d minh ho m i quan h gi a c u trúc d li u và gi i thu t.
2. Cho bi t m t s ki u d li u
c nh ngh a s n trong m t ngôn ng l p trình các b n
th ng s d ng. Cho bi t m t s ki u d li u ti n nh này có
áp ng m i yêu c u v t
ch c d li u không ?
3.
t ngôn ng l p trình có nên cho phép ng
li u có c u trúc? Gi i thích và cho ví d .
i s d ng t
nh ngh a thêm các ki u d
4. Gi s có m t b ng gi tàu cho bi t thông tin v các chuy n tàu khác nhau c a m ng
ng s t. Hãy bi u di n các d li u này b ng m t c u trúc d li u thích h p (file, array, struct
...) sao cho d dàng truy xu t gi kh i hành, gi
n c a m t chuy n tàu b t k t i m t nhà ga
tk .
5. Gi s quy t c t ch c qu n lý nhân viên c a m t công ty nh sau :
Thông tin v m t nhân viên bao g m lý l ch và b ng ch m công :
− Lý l ch nhân viên :
+ Mã nhân viên : chu i 8 ký t
Ch
ng 1. T ng quan v c u trúc d li u và gi i thu t
Trang 14
u trúc d li u và gi i thu t
+ Tên nhân viên : chu i 20 ký t
+ Tình tr ng gia ình : 1 ký t ( M = Married, S = Single)
+ con : s nguyên $ 20
+ Trình
v n hoá : chu i 2 ký t (C1 = c p 1 ; C2 = c p 2 ; C3 = c p 3; H =
c; CH = cao h c)
+
ng c n b n : s $ 1000000
− Ch m công nhân viên :
+ ngày ngh có phép trong tháng : s $ 28
+ ngày ngh không phép trong tháng : s $ 28
+ ngày làm thêm trong tháng : s $ 28
+ t q a công vi c : chu i 2 ký t (T = T t; TB = t ;K = Kém)
+
ng th c l nh trong tháng : s $ 2000000
Quy t c tính l ng :
ng th c l nh = L ng c n b n + Ph tr i
Trong ó n u:
- s con > 2: Ph tr i = +5% L ng c n b n
- trình
v n hoá = CH: Ph tr i = +10%L ng c n b n
- làm thêm: Ph tr i=+4%L ng c n b n/ngày
- ngh không phép: Ph tr i= -5%L ng c n b n/ngày
Ch c n ng yêu c u :
- C p nh t lý l ch, b ng ch m công cho nhân viên (thêm, xoá, s a)
- Xem b ng l ng hàng tháng
- Tìm thông tin c a m t nhân viên
ch c c u trúc d li u thích h p
bi u di n các thông tin trên, và cài
ch ng trình theo các ch c n ng ã mô t .
Ch
ng 1. T ng quan v c u trúc d li u và gi i thu t
i
t
Trang 15
u trúc d li u và gi i thu t
Ch
ng 2.
2.1.
Phân tích và ánh giá gi i thu t
ph c t p tính toán và các ký pháp
2.1.1. Th i gian th c hi n ch
ánh giá
ng trình
M t ph ng pháp xác nh hi u qu th i gian th c hi n c a m t gi i thu t là l p
trình nó và o l ng th i gian th c hi n c a ho t ng trên m t máy tính xác nh i
v it ph p
c ch n l c các d li u vào.
Th i gian th c hi n không ch ph thu c vào gi i thu t mà còn ph thu c vào t p
các ch th c a máy tính, ch t l ng c a máy tính và k x o c a ng i l p trình. S thi
hành c ng có th i u ch nh th c hi n t t trên t p c bi t các d li u vào
c ch n.
Ð v t qua các tr ng i này, các nhà khoa h c máy tính ã ch p nh n tính ph c t p c a
th i gian
c ti p c n nh m t s o l ng c b n s th c thi c a gi i thu t. Thu t ng
tính hi u qu s
c p n s o l ng này và c bi t i v i s ph c t p th i gian
trong tr ng h p x u nh t.
Th i gian th c hi n m t ch ng trình là m t hàm c a kích th
hi u T(n) trong ó n là kích th c ( l n) c a d li u vào.
c d li u vào, ký
Ví d : Ch ng trình tính t ng c a n s có th i gian th c hi n là T(n) = Cn trong ó
C là m t h ng s .
Ð n v c a T(n) không ph i là n v
mà th ng
c xác nh b i s các l nh
o th i gian bình th ng nh gi , phút giây...
c th c hi n trong m t máy tính lý t ng.
Ví d : Khi ta nói th i gian th c hi n c a m t ch
ngh a là ch ng trình y c n Cn ch th th c thi.
2.1.2.
ng trình là T(n) = Cn thì có
ph c t p c a gi i thu t
Gi s ta có hai gi i thu t P1 và P2 v i th i gian th c hi n t ng ng là T1(n) =
100n (v i t su t t ng là n2) và T2(n) = 5n3 (v i t su t t ng là n 3). Gi i thu t nào s
th c hi n nhanh h n? Câu tr l i ph thu c vào kích th c d li u vào. V i n < 20 thì
P2 s nhanh h n P1 (T2
khi n > 20 thì ng c l i do s m c a 100n2 nh h n s m c a 5n3 (2<3).
ây chúng
ta ch nên quan tâm n tr ng h p n>20 vì khi n<20 thì th i gian th c hi n c a c P1
và P2 u không l n và s khác bi t gi a T1 và T2 là không áng k .
2
Nh v y m t cách h p lý là ta xét t su t t ng c a hàm th i gian th c hi n ch
trình thay vì xét chính b n thân th i gian th c hi n.
ng
Cho m t hàm T(n), T(n) g i là có
ph c t p f(n) n u t n t i các h ng C, n0 sao
cho T(n) Cf(n) v i m i n n0 (t c là T(n) có t su t t ng là f(n)) và kí hi u T(n) là
O(f(n)) ( c là “ô c a f(n)”)
Ví d T(n)= (n+1)2 có t su t t ng là n2 nên T(n)= (n+1) 2 là O(n2)
Chú ý: O(C.f(n))=O(f(n)) v i C là h ng s . Ð c bi t O(C)=O(1)
Nói cách khác
ph c t p tính toán c a gi i thu t là m t hàm ch n trên c a hàm
th i gian. Vì h ng nhân t C trong hàm ch n trên không có ý ngh a nên ta có th b qua
vì v y hàm th hi n
ph c t p có các d ng th ng g p sau: log2n, n, nlog2n, n2, n 3, 2n,
n
n!, n . Ba hàm cu i cùng ta g i là d ng hàm m , các hàm khác g i là hàm a th c. M t
Ch
ng 2. Phân tích và ánh giá gi i thu t
Trang 16
u trúc d li u và gi i thu t
gi i thu t mà th i gian th c hi n có
ph c t p là m t hàm a th c thì ch p nh n
c
t c là có th cài t
th c hi n, còn các gi i thu t có
ph c t p hàm m thì ph i tìm
cách c i ti n gi i thu t.
Vì ký hi u log2n th ng có m t trong
ph c t p nên trong khôn kh tài li u này,
ta s dùng logn thay th cho log2n v i m c ích duy nh t là
cho g n trong cách vi t.
Khi nói n
ph c t p c a gi i thu t là ta mu n nói n hi u qu c a th i gian
th c hi n c a ch ng trình nên ta có th xem vi c xác nh th i gian th c hiên c a
ch ng trình chính là xác nh ph c t p c a gi i thu t.
2.2. Xác
nh
ph c t p tính toán c a gi i thu t
Cách tính
ph c t p c a m t gi i thu t b t k là m t v n
nhiên ta có th tuân theo m t s nguyên t c sau:
không
n gi n. Tuy
2.2.1. Quy t c t ng
N u T1(n) và T2(n) là th i gian th c hi n c a hai
n ch ng trình P1 và P2; và
T1(n)=O(f(n)), T2(n)=O(g(n)) thì th i gian th c hi n c a
n hai ch ng trình ó n i
ti p nhau là T(n)=O(max(f(n),g(n)))
Ch ng minh:
T1(n) = O(f(n)) nên ∃ n1 và c1
T2(n) = O(g(n)) nên ∃ n2 và c2
c1.f(n) v i ∀ n
T1(n)
c2.g(n) v i ∀ n
T2(n)
n1.
n2.
Ch n n0 = max(n1, n2) và c = max(c1, c2) ta có:
V i∀n
n0:
T1(n) + T2(n)
g(n))).
c1.f(n) + c2.g(n)
c.f(n) + c.g(n)
c.(f(n) + g(n))
2c.(max(f(n),
V y T1(n) + T2(n) = O(max(f(n), g(n))).
Ví d : Trong m t ch ng trình có 3 b c th c hi n mà th i gian th c hi n t ng
c l n l t là O(n2), O(n3) và O(nlog2n) thì th i gian th c hi n 2 b c u là
O(max (n2, n3)) = O(n3). Khi ó th i gian th c hi n ch ng trình s là
O(max(n3,nlog2n)) = O(n3).
2.2.2. Quy t c nhân
N u T1(n) và T2(n) là th i gian th c hi n c a hai
n ch ng trình P1và P2 và
T1(n) = O(f(n)), T2(n) = O(g(n)) thì th i gian th c hi n c a
n hai
n ch ng trình
ó l ng nhau là T(n) = O(f(n).g(n))
Ch ng minh:
Th i gian th c hi n T1(n) l n
ngh a:
n ch
ng trình P2 s là T1(n).T2(n). Theo
∃ c1 và n1
T1(n)
c1(f(n)) v i ∀ n
n1
∃ c2 và n2
T2(n)
c2(g(n)) v i ∀ n
n2
V yv i∀n
max(n1, n2) ta có T1(n).T2(n)
nh
c1.c2(g(n).f(n))
V y T(n) = O(f(n).g(n)).
Ch
ng 2. Phân tích và ánh giá gi i thu t
Trang 17
u trúc d li u và gi i thu t
2.2.3. M t s tính ch t
Theo
nh ngh a v
ph c t p tính toán ta có m t s tính ch t:
−
V i P(n) là m t a th c b c k thì O(P(n)) = O(nk). Vì th , m t thu t toán có
ph c t p c p a th c, ng i ta th ng ký hi u là O(nk)
−
V i a và b là hai c s tu ý và f(n) là m t hàm d ng thì logaf(n) =
logab.logbf(n). T c là: O(logaf(n)) = O(logbf(n)). V y v i m t thu t toán có
ph c t p c p logarit c a f(n), ng i ta ký hi u là O(logf(n)) mà không c n ghi
s c a logarit.
−
N u m t thu t toán có
ph thu c vào kích th
thu t toán ó là O(1).
−
M
ph
ch
th
−
Không ph i lúc nào m t gi i thu t c p O(n2) c ng t t h n gi i thu t c p O(n3).
B i n u nh gi i thu t c p O(n2) có th i gian th c hi n là 1000n 2, còn gi i
thu t c p O(n3) l i ch c n th i gian th c hi n là n3, thì v i n < 1000, rõ ràng
gi i thu t O(n3) t t h n gi i thu t O(n2). Trên ây là xét trên ph ng di n tính
toán lý thuy t
nh ngh a gi i thu t này "t t" h n gi i thu t kia, khi ch n
m t thu t toán gi i m t bài toán th c t ph i có m t s m m d o nh t nh.
−
C ng theo
ph c t p là h ng s , t c là th i gian th c hi n không
c d li u vào thì ta ký hi u
ph c t p tính toán c a
t gi i thu t có c p là các hàm nh 2 n, n!, nn
c g i là m t gi i thu t có
c t p hàm m . Nh ng gi i thu t nh v y trên th c t th ng có t c
r t
m. Các gi i thu t có c p là các hàm a th c ho c nh h n hàm a th c thì
ng ch p nh n
c.
nh ngh a v
ph c t p tính toán:
+
M t thu t toán có c p O(1) c ng có th vi t là O(logn)
+
M t thu t toán có c p O(logn) c ng có th vi t là O(n)
+
M t thu t toán có c p O(n) c ng có th vi t là O(n.logn)
+
M t thu t toán có c p O(n.logn) c ng có th vi t là O(n2)
+
M t thu t toán có c p O(n2) c ng có th vi t là O(n3)
+
M t thu t toán có c p O(n3) c ng có th vi t là O(2n)
V y
ph c t p tính toán c a m t thu t toán có nhi u cách ký hi u, thông
th ng ng i ta ch n c p th p nh t có th , t c là ch n ký pháp O(f(n)) v i f(n) là m t
hàm t ng ch m nh t theo n.
i ây là m t s hàm s hay dùng
ký hi u
ph c t p tính toán và b ng giá
tr c a chúng ti n theo dõi s t ng c a hàm theo i s n.
Th i gian th c hi n c a các thu t toán có
Ch
ng 2. Phân tích và ánh giá gi i thu t
ph c t p khác nhau:
Trang 18
u trúc d li u và gi i thu t
O(logn)
O(n)
O(nlogn)
O(n2)
10-7 giây
10-6 giây
10-5 giây
O(n6)
O(2n)
10-4 giây
3 phút
1014 m
O(n!)
10142
m
2.2.4. Phép toán tích c c
D a vào nh ng nh n xét ã nêu trên v các quy t c khi ánh giá th i gian th c
hi n gi i thu t, ta ch c n chú ý n m t phép toán mà ta g i là phép toán tích c c trong
m t
n ch ng trình. ó là m t phép toán trong m t
n ch ng trình mà s l n th c
hi n không ít h n các phép toán khác.
Xét hai o n ch
ng trình tính ex b ng công th c g n úng:
i x và n cho tr
c.
Ch ng trình 1: Tính riêng t ng s
h ng r i c ng l i
Ch ng trình 2: Tính s h ng sau
qua s h ng tr c
void main() {
void main() {
int i, j, n;
int i, n;
float x, p, S;
float x, p, S;
printf("nhap x:"); scanf("%f",&x);
printf("nhap x:"); scanf("%f",&x);
printf("nhap n:"); scanf("%d",&n);
printf("nhap n:"); scanf("%d",&n);
S=0;
S=1; p=1;
for (i = 0; i <= n; i++) {
for (i = 1; i <= n; i++) {
p = 1;
p = p * x / i;
for (j = 1; j <= i; j++)
S = S + p;
}
p = p * x / j;
printf("exp(%f)=%f",x,S);
S = S + p;
}
}
printf("exp(%f)=%f",x,S);
Phép toán tích c c là p := p * x / i.
}
S l n th c hi n: n.
Phép toán tích c c là p := p * x / j;
V y
ph c t p tính toán c a thu t
toán là O(n)
S l n th c hi n: 0+1+…+n=n(n-1)/2 l n.
V y
ph c t p tính toán c a thu t toán là
O(n2)
Ch
ng 2. Phân tích và ánh giá gi i thu t
Trang 19
u trúc d li u và gi i thu t
2.3.
ph c t p tính toán v i tình tr ng d li u vào
Th i gian th c hi n ch ng trình không ch ph thu c vào kích th c mà còn ph
thu c vào tính ch t c a d li u vào. Ngh a là d li u vào có cùng kích th c nh ng th i
gian th c hi n ch ng trình có th khác nhau. Ch ng h n ch ng trình s p x p dãy s
nguyên t ng d n, khi ta cho vào dãy có th t thì th i gian th c hi n khác v i khi ta cho
vào dãy ch a có th t , ho c khi ta cho vào m t dãy ã có th t t ng thì th i gian th c
hi n c ng khác so v i khi ta cho vào m t dãy ã có th t gi m.
Vì v y th ng ta coi T(n) là th i gian th c hi n ch ng trình trong tr ng h p x u
nh t trên d li u vào có kích th c n, t c là: T(n) là th i gian l n nh t
th c hi n
ch ng trình i v i m i d li u vào có cùng kích th c n.
2.4. Chi phí th c hi n thu t toán
Khái ni m
ph c t p tính toán t ra là
ánh giá chi phí th c hi n m t gi i
thu t v m t th i gian. Nh ng chi phí th c hi n gi i thu t còn có r t nhi u y u t khác
n a: không gian b nh ph i s d ng là m t ví d . Tuy nhiên, trên ph ng di n phân
tích lý thuy t, ta ch có th xét t i v n
th i gian b i vi c xác nh các chi phí khác
nhi u khi r t m h và ph c t p.
i v i ng i l p trình thì khác, m t thu t toán v i
ph c t p dù r t th p c ng s là vô d ng n u nh không th cài t
c trên máy tính,
chính vì v y khi b t tay cài t m t thu t toán, ta ph i bi t cách t ch c d li u m t cách
khoa h c, tránh lãng phí b nh không c n thi t. Có m t quy lu t t ng i khi t ch c
d li u: Ti t ki m
c b nh thì th i gian th c hi n th ng s ch m h n và ng c l i.
Bi t cân i, dung hoà hai y u t ó là m t k n ng c n thi t c a ng i l p trình, mà k
ng ó l i ch t kinh nghi m m i có ch không th h c
c qua sách v .
Ch
ng 2. Phân tích và ánh giá gi i thu t
Trang 20
u trúc d li u và gi i thu t
Ch
ng 3.
quy và gi i thu t
3.1. Khái ni m v
quy
quy
Ta nói m t i t ng là
quy n u nó
c
ng khác cùng d ng v i chính nó b ng quy n p.
nh ngh a qua chính nó ho c m t
i
Ví d :
t hai chi c g ng c u i di n nhau. Trong chi c g ng th nh t ch a
hình chi c g ng th hai. Chi c g ng th hai l i ch a hình chi c g ng th nh t nên
t t nhiên nó ch a l i hình nh c a chính nó trong chi c g ng th nh t... m t góc nhìn
h p lý, ta có th th y m t dãy nh vô h n c a c hai chi c g ng.
M t ví d khác là n u ng i ta phát hình tr c ti p phát thanh viên ng i bên máy vô
tuy n truy n hình, trên màn hình c a máy này l i có chính hình nh c a phát thanh viên
ó ng i bên máy vô tuy n truy n hình và c nh th ...
Trong toán h c, ta c ng hay g p các
nh ngh a
quy:
Giai th a c a n (n!): N u n = 0 thì n! = 1; n u n > 0 thì n! = n.(n-1)!
3.2. Gi i thu t
quy
N u l i gi i c a m t bài toán P
c th c hi n b ng l i gi i c a bài toán P' có d ng
gi ng nh P thì ó là m t l i gi i quy. Gi i thu t t ng ng v i l i gi i nh v y g i là
gi i thu t quy. M i nghe thì có v h i l nh ng i m m u ch t c n l u ý là: P' tuy có
d ng gi ng nh P, nh ng theo m t ngh a nào ó, nó ph i "nh " h n P, d gi i h n P và
vi c gi i nó không c n dùng n P.
nh ngh a m t hàm
quy hay th t c
quy g m hai ph n:
−
Ph n neo (anchor): ph n này
c th c hi n khi mà công vi c quá n gi n, có
th gi i tr c ti p ch không c n ph i nh
n m t bài toán con nào c .
−
Ph n
quy: trong tr ng h p bài toán ch a th gi i
c b ng ph n neo, ta
xác nh nh ng bài toán con và g i
quy gi i nh ng bài toán con ó. Khi ã
có l i gi i ( áp s ) c a nh ng bài toán con r i thì ph i h p chúng l i
gi i
bài toán ang quan tâm.
Ph n
quy th hi n tính "quy n p" c a l i gi i. Ph n neo c ng r t quan tr ng b i
nó quy t nh t i tính h u h n d ng c a l i gi i.
3.3. Thi t k gi i thu t
quy
3.3.1. Hàm n!
int Factorial (int n) {
// Nh n vào s t nhiên n và tr v n!
if (n==0) return 1;
// Ph n neo
return n* Factorial (n-1);
// Ph n
quy
}
s
ây, ph n neo nh ngh a k t qu hàm t i n = 0, còn ph n
nh ngh a k t qu hàm qua giá tr c a n và giai th a c a n - 1.
quy ( ng v i n > 0)
Ví d : Dùng hàm này tính 3!, tr c h t nó ph i i tính 2! b i 3!
c tính b ng
tích c a 3 * 2!. T ng t
tính 2!, nó l i i tính 1! b i 2!
c tính b ng 2 * 1!. Áp
d ng b c quy n p này thêm m t l n n a, 1! = 1 * 0!, và ta t t i tr ng h p c a ph n
Ch
ng 3.
quy và gi i thu t
quy
Trang 21
u trúc d li u và gi i thu t
neo, n ây t giá tr 1 c a 0!, nó tính
c 1! = 1*1 = 1; t giá tr c a 1! nó tính
2!; t giá tr c a 2! nó tính
c 3!; cu i cùng cho k t qu là 6.
c
3.3.2. Dãy Fibonacci
toán
Dãy s Fibonacci b t ngu n t bài toán c v vi c sinh s n c a các c p th . Bài
t ra nh sau:
1) Các con th không bao gi ch t
2) Hai tháng sau khi ra
m t cái)
i, m i c p th m i s sinh ra m t c p th con (m t
c,
3) Khi ã sinh con r i thì c m i tháng ti p theo chúng l i sinh
c m t c p con
m i Gi s t
u tháng 1 có m t c p m i ra i thì n gi a tháng th n s có bao nhiêu
c p. Ví d , n = 5, ta th y:
Gi a tháng th 1:
1 c p (ab) (c p ban
u)
Gi a tháng th 2:
1 c p (ab) (c p ban
u v n ch a
Gi a tháng th 3:
2 c p (AB)(cd) (c p ban
Gi a tháng th 4:
3 c p (AB)(cd)(ef) (c p ban
Gi a tháng th 5:
5 c p (AB)(CD)(ef)(gh)(ik) (c c p (AB) và (CD) cùng
Bây gi , ta xét t i vi c tính s c p th
N u m i c p th
tháng th n - 1
tháng th n s là: F(n) = 2 * F(n - 1)
u
)
ra thêm 1 c p con)
u ti p t c
)
)
tháng th n: F(n)
u sinh ra m t c p th con thì s c p th
Nh ng v n
không ph i nh v y, trong các c p th
tháng th n - 1, ch có
nh ng c p th ã có tháng th n - 2 m i sinh con tháng th n
c thôi. Do ó F(n)
= F(n - 1) + F(n - 2) (= s c + s sinh ra). V y có th tính
c F(n) theo công th c sau:
−
F(n) = 1 n u n
−
F(n) = F(n - 1) + F(n - 2) n u n > 2
2
int F(int n) {
if (n
// Tính s c p th
2) return 1;
tháng th n
// Ph n neo
return F(n - 1) + F(n - 2);
// Ph n
quy
}
3.3.3. Bài toán Tháp Hà N i
ây là m t bài toán mang tính ch t m t trò ch i, n i dung n sau: Có n a
ng
kính hoàn toàn phân bi t, t ch ng lên nhau, các a
c x p theo th t gi m d n
c a
ng kính tính t d i lên, a to nh t
c t sát t. Có ba v trí có th
t các
a ánh s 1, 2, 3. Ch ng a ban u
c t v trí 1:
1
Ng
Ch
ng 3.
2
3
i ta mu n chuy n c ch ng a t v trí 1 sang v trí 2, theo nh ng
quy và gi i thu t
quy
u ki n:
Trang 22
u trúc d li u và gi i thu t
−
Khi di chuy n m t
−
M i l n ch có th chuy n m t
−
T i m t v trí,
−
a l n h n không bao gi
c phép t lên trên a nh h n (hay nói cách
khác: m t a ch
c t trên m t t ho c t trên m t a l n h n)
a, ph i
t nó vào m t trong ba v trí ã cho
a và ph i là
a nào m i chuy n
a
n s ph i
trên cùng
t lên trên cùng
Trong tr ng h p có 2 a, cách làm có th mô t nh sau: Chuy n
trí 3, a l n sang v trí 2 r i chuy n a nh t v trí 3 sang v trí 2.
a nh sang v
Nh ng ng i m i b t u có th gi i quy t bài toán m t cách d dàng khi s
a là
ít, nh ng h s g p r t nhi u khó kh n khi s các a nhi u h n. Tuy nhiên, v i t duy
quy n p toán h c và m t máy tính thì công vi c tr nên khá d dàng: Có n a.
−
N u n = 1 thì ta chuy n
−
Gi s r ng ta có ph ng pháp chuy n
c n - 1 a t v trí 1 sang v trí 2, thì
cách chuy n n - 1 a t v trí x sang v trí y (1 x, y 3) c ng t ng t .
−
Gi s ràng ta có ph ng pháp chuy n
c n - 1 a gi a hai v trí b t k .
chuy n n a t v trí x sang v trí y, ta g i v trí còn l i là z (= 6 - x - y). Coi
a to nh t là ... m t t, chuy n n - 1 a còn l i t v trí x sang v trí z, sau ó
chuy n a to nh t ó sang v trí y và cu i cùng l i coi a to nh t ó là m t
t, chuy n n - 1 a còn l i ang v trí z sang v trí y ch ng lên a to nh t
ó.
Cách làm ó
a duy nh t ó t v trí 1 sang v trí 2 là xong.
c th hi n trong th t c
void Move(int n, int x, int y) {
quy d
i ây:
// Th t c chuy n n
a t v trí x sang v trí y
if (n == 1)
printf("\nChuyen 1 dia: %d --> %d", x, y);
else {
Move(n - 1, x, 6 - x - y); // Chuy n n - 1
Move(1, x, y);
// Chuy n
a t x sang v trí còn l i
a to nh t t x sang y
Move(n - 1, 6 - x - y, y); // Chuy n n - 1
a t v trí còn l i sang v trí y
}
}
Ch
ng trình chính r t
3.4. Hi u l c c a
n gi n, ch g m có 2 vi c: Nh p vào s n và g i Move(n, 1, 2).
quy
Qua các ví d trên, ta có th th y
quy là m t công c m nh
gi i các bài
toán. Có nh ng bài toán mà bên c nh gi i thu t
quy v n có nh ng gi i thu t l p khá
n gi n và h u hi u. Ch ng h n bài toán tính giai th a hay tính s Fibonacci. Tuy v y,
quy v n có vai trò x ng áng c a nó, có nhi u bài toán mà vi c thi t k gi i thu t
quy n gi n n nhi u so v i l i gi i l p và trong m t s t ng h p ch ng trình
quy ho t ng nhanh h n ch ng trình vi t không có
quy. Gi i thu t cho bài Tháp
Hà N i và thu t toán s p x p ki u phân o n (Quick Sort) mà ta s nói t i trong các bài
sau là nh ng ví d .
Ch
ng 3.
quy và gi i thu t
quy
Trang 23
u trúc d li u và gi i thu t
Có m t m i quan h kh ng khít gi a quy và quy n p toán h c. Cách gi i quy
cho m t bài toán d a trên vi c nh rõ l i gi i cho t ng h p suy bi n (neo) r i thi t k
làm sao
l i gi i c a bài toán
c suy ra t l i gi i c a bài toán nh
n cùng lo i
nh th . T ng t nh v y, quy n p toán h c ch ng minh m t tính ch t nào ó ng v i
s t nhiên c ng b ng cách ch ng minh tính ch t ó úng v i m t s t ng h p c s
(th ng ng i ta ch ng minh nó úng v i 0 hay úng v i 1) và sau ó ch ng minh tính
ch t ó s úng v i n b t k n u nó ã úng v i m i s t nhiên nh h n n. Do ó ta
không l y làm ng c nhiên khi th y quy n p toán h c
c dùng
ch ng minh các
tính ch t có liên quan t i gi i thu t
quy. Ch ng h n: Ch ng minh s phép chuy n a
gi i bài toán Tháp Hà N i v i n a là 2n-1:
−
Rõ ràng là tính ch t này úng v i n = 1, b i ta c n 21 - 1 = 1 l n chuy n
th c hi n yêu c u.
−
V i n > 1; Gi s r ng
chuy n n - 1 a gi a hai v trí ta c n 2n-1 - 1 phép
chuy n a, khi ó
chuy n n a t v trí x sang v trí y, nhìn vào gi i thu t
quy ta có th th y r ng trong t ng h p này nó c n (2n-1 - 1) + 1 + (2n-1
- 1) = 2 n - 1 phép chuy n
V y thì cô n g th c này s
a. Tính ch t
a
c ch ng minh úng v i n.
úng v i m i n.
Th t áng ti c n u nh chúng ta ph i l p trình v i m t công c không cho phép
quy, nh ng nh v y không có ngh a là ta bó tay tr c m t bài toán mang tính
quy.
M i gi i thu t
quy u có cách thay th b ng m t gi i thu t không
quy (kh
quy), có th nói
c n v y b i t t c các ch ng trình con
quy s
u
c trình
d ch chuy n thành nh ng mã l nh không
quy t c khi giao cho máy tính th c hi n.
Vi c tìm hi u cách kh
quy m t cách "máy móc" nh các ch ng trình d ch thì
ch c n hi u rõ c ch x p ch ng c a các th t c trong m t dây chuy n g i
quy là có
th làm
c. Nh ng mu n kh
quy m t cách tinh t thì ph i tùy thu c vào t ng bài
toán mà kh
quy cho khéo. Không ph i tìm âu xa, nh ng k thu t gi i công th c
truy h i b ng quy ho ch ng là ví d cho th y tính ngh thu t trong nh ng cách ti p
c n bài toán mang b n ch t quy tìm ra m t gi i thu t không quy y hi u qu .
Ch
ng 3.
quy và gi i thu t
quy
Trang 24
u trúc d li u và gi i thu t
Ch
ng 4.
Tìm ki m và s p x p
4.1. Gi i thi u
Trong h u h t các h l u tr , qu n lý d li u, thao tác tìm ki m th
hi n nh t khai thác thông tin:
Ví du: tra c u t
ng
c th c
n, tìm sách trong th vi n...
Do các h th ng thông tin th ng ph i l u tr m t kh i l ng d li u áng k , nên
vi c xây d ng các gi i thu t cho phép tìm ki m nhanh s có ý ngh a r t l n. N u d li u
trong h th ng ã
c t ch c theo m t tr t t nào ó, thì vi c tìm ki m s ti n hành
nhanh chóng và hi u qu h n:
Ví d : các t trong t
n
c s p x p theo t ng v n, trong m i v n l i
x p theo trình t alphabet; sách trong th vi n
c x p theo ch
…
cs p
Vì th , khi xây d ng m t h qu n lý thông tin trên máy tính, bên c nh các thu t
toán tìm ki m, các thu t toán s p x p d li u c ng là m t trong nh ng ch
c quan
tâm hàng u.
Hi n nay ã có nhi u gi i thu t tìm ki m và s p x p d c xây d ng, m c
hi u
qu c a t ng gi i thu t còn ph thu c vào tính ch t c a c u trúc d li u c th mà nó tác
ng n. D li u
c l u tr ch y u trong b nh chính và trên b nh ph , do c
i m khác nhau c a thi t b l u tr , các thu t toán tìm ki m và s p x p
c xây d ng
cho các c u trúc l u tr trên b nh chính ho c ph c ng có nh ng c thù khác nhau.
Ch ng này s trình bày các thu t toán s p x p và tìm ki m d li u
c l u tr trên b
nh chính - g i là các gi i thu t tìm ki m và s p x p n i.
4.2. Các gi i thu t tìm ki m
Có 2 gi i thu t th ng
c áp d ng
tìm ki m d li u là tìm tuy n tính và tìm
nh phân. Ð
n gi n trong vi c trình bày gi i thu t, bài toán
c c t nh sau:
m c
T p d li u
c l u tr là dãy s : a1, a2,...,aN (l u ý trong ngông ng C ch s
nh ban u là 0).
Gi s ch n c u trúc d li u m ng
khoá c n tìm là x, ta có khai báo:
l u tr dãy s này trong b nh chính và
int a[N];
int x;
4.2.1. Tìm ki m tuy n tính – Linear Search (tu n t - SequentialSearch)
v
Gi i thu t:
Tìm tuy n tính là m t k thu t tìm ki m r t n gi n và c
n. Thu t toán ti n
hành so sánh x l n l t v i ph n t th nh t, th hai,... c a m ng a cho n khi g p
c
ph n t có khóa c n tìm, ho c ã tìm h t m ng mà không th y x. Các b c ti n hành nh
sau:
B
c 1 (Input): Nh p m ng s nguyên a và s nguyên x.
c 2: i = 1;
Ch
ng 4. Tìm ki m và s p x p
// b t
u t ph n t
u tiên c a dãy.
Trang 25