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

IT Ebooks - Trang Minh Truc''s website CautrucDL>

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 (1.71 MB, 93 trang )

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 (T2khi 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


×