1. Trang chủ
  2. » Công Nghệ Thông Tin

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

144 573 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Cấu Trúc Dữ Liệu Và Giải Thuật
Trường học Học Viện Công Nghệ Bưu Chính Viễn Thông
Chuyên ngành Công Nghệ Thông Tin
Thể loại Tài Liệu Học Tập
Năm xuất bản 2007
Thành phố Hà Nội
Định dạng
Số trang 144
Dung lượng 1,07 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Lý thuyết cấu trúc dữ liệu và giải thuật đầy đủ.

Trang 2

L I NÓI U

C u trúc d li u và gi i thu t là m t trong nh ng môn h c c b n c a sinh viên ngành Công ngh thông tin Các c u trúc d li u và các gi i thu t đ c xem nh là 2 y u t quan tr ng nh t trong l p trình, đúng nh câu nói n i ti ng c a Niklaus Wirth: Ch ng trình = C u trúc d li u +

Gi i thu t (Programs = Data Structures + Algorithms) N m v ng các c u trúc d li u và các gi i thu t là c s đ sinh viên ti p c n v i vi c thi t k và xây d ng ph n m m c ng nh s d ng các công c l p trình hi n đ i

C u trúc d li u có th đ c xem nh là 1 ph ng pháp l u tr d li u trong máy tính

nh m s d ng m t cách có hi u qu các d li u này Và đ s d ng các d li u m t cách hi u qu thì c n ph i có các thu t toán áp d ng trên các d li u đó Do v y, c u trúc d li u và gi i thu t là

2 y u t không th tách r i và có nh ng liên quan ch t ch v i nhau Vi c l a ch n m t c u trúc

d li u có th s nh h ng l n t i vi c l a ch n áp d ng gi i thu t nào

Tài li u “C u trúc d li u và gi i thu t” bao g m 7 ch ng, trình bày v các c u trúc d li u

và các gi i thu t c b n nh t trong tin h c

Ch ng 1 trình bày v phân tích và thi t k thu t toán u tiên là cách phân tích 1 v n đ ,

t th c ti n cho t i ch ng trình, cách thi t k m t gi i pháp cho v n đ theo cách gi i quy t b ng máy tính Ti p theo, các ph ng pháp phân tích, đánh giá đ ph c t p và th i gian th c hi n gi i thu t c ng đ c xem xét trong ch ng Ch ng 2 trình bày v đ qui, m t khái ni m r t c b n trong toán h c và khoa h c máy tính Vi c s d ng đ qui có th xây d ng đ c nh ng ch ng trình gi i quy t đ c các v n đ r t ph c t p ch b ng m t s ít câu l nh, đ c bi t là các v n đ mang b n ch t đ qui

Ch ng 3, 4, 5, 6 trình bày v các c u trúc d li u đ c s d ng r t thông d ng nh m ng

và danh sách liên k t, ng n x p và hàng đ i, cây, đ th ó là các c u trúc d li u c ng r t g n

g i v i các c u trúc trong th c ti n Ch ng 7 trình bày v các thu t toán s p x p và tìm ki m Các thu t toán này cùng v i các k thu t đ c s d ng trong đó đ c coi là các k thu t c s cho l p trình máy tính Các thu t toán đ c xem xét bao g m các l p thu t toán đ n gi n và c các thu t toán cài đ t ph c t p nh ng có th i gian th c hi n t i u

Cu i m i ph n đ u có các câu h i và bài t p đ sinh viên ôn luy n và t ki m tra ki n th c

c a mình Cu i tài li u có các ph l c h ng d n tr l i câu h i, mã ngu n tham kh o và tài li u tham kh o

V nguyên t c, các c u trúc d li u và các gi i thu t có th đ c bi u di n và cài đ t b ng

b t c ngôn ng l p trình hi n đ i nào Tuy nhiên, đ có đ c các phân tích sâu s c h n và có k t

qu th c t h n, tác gi đã s d ng ngôn ng l p trình C đ minh ho cho các c u trúc d li u và thu t toán Do v y, ngoài các ki n th c c b n v tin h c, ng i đ c c n có ki n th c v ngôn ng

l p trình C

Cu i cùng, m c dù đã h t s c c g ng nh ng ch c ch n không tránh kh i các thi u sót Tác

gi r t mong nh n đ c s góp ý c a b n đ c và đ ng nghi p đ tài li u đ c hoàn thi n h n

Hà N i, tháng 10/2007

Trang 3

CH NG 1 PHÂN TÍCH VÀ THI T K GI I THU T

Ch ng 1 trình bày các khái ni m v gi i thu t và ph ng pháp tinh ch nh t ng b c

ch ng trình đ c th hi n qua ngôn ng di n đ t gi i thu t Ch ng này c ng nêu ph ng pháp phân tích và đánh giá m t thu t toán, các khái ni m liên quan đ n vi c tính toán th i gian th c

h c t t ch ng này, sinh viên c n n m v ng ph n lý thuy t và tìm các ví d t ng t đ

th c hành phân tích, thi t k , và đánh giá gi i thu t

1.1 GI I THU T VÀ NGÔN NG DI N T GI I THU T

Thu t toán có th đ c đ nh ngh a nh sau:

Thu t toán là m t chu i h u h n các l nh M i l nh có m t ng ngh a rõ ràng và có th

đ c th c hi n v i m t l ng h u h n tài nguyên trong m t kho ng h u h n th i gian

Ch ng h n l nh x = y + z là m t l nh có các tính ch t trên

Trong m t thu t toán, m t l nh có th l p đi l p l i nhi u l n, tuy nhiên đ i v i b t k b d

li u đ u vào nào, thu t toán ph i k t thúc sau khi th c thi m t s h u h n l nh

Nh đã nói trên, m i l nh trong thu t toán ph i có ng ngh a rõ ràng và có th đ c th c thi trong m t kho ng th i gian h u h n Tuy nhiên, đôi khi m t l nh có ng ngh a rõ ràng đ i v i

ng i này nh ng l i không rõ ràng đ i v i ng i khác Ngoài ra, th ng r t khó đ ch ng minh

m t l nh có th đ c th c hi n trong 1 kho ng h u h n th i gian Th m chí, k c khi bi t rõ ng ngh a c a các l nh, c ng khó đ có th ch ng minh là v i b t k b d li u đ u vào nào, thu t toán s d ng

Ti p theo, chúng ta s xem xét m t ví d v xây d ng thu t toán cho bài toán đèn giao thông:

Gi s ng i ta c n thi t k m t h th ng đèn cho m t nút giao thông có nhi u đ ng giao nhau ph c t p xây d ng t p các tr ng thái c a các đèn giao thông, ta c n ph i xây d ng m t

ch ng trình có đ u vào là t p các ngã r đ c phép t i nút giao thông (l i đi th ng c ng đ c xem nh là 1 ngã r ) và chia t p này thành 1 s ít nh t các nhóm, sao cho t t c các ngã r trong nhóm có th đ c đi cùng lúc mà không x y ra tranh ch p Sau đó, chúng ta s g n tr ng thái c a các đèn giao thông v i m i nhóm v a đ c phân chia V i cách phân chia có s nhóm ít nh t, ta

s xây d ng đ c 1 h th ng đèn giao thông có ít tr ng thái nh t

Trang 4

Ch ng h n, ta xem xét bài toán trên v i nút giao thông đ c cho nh trong hình 1.1

d i Trong nút giao thông trên, C và E là các đ ng 1 chi u, các đ ng còn l i là 2 chi u Có t t

c 13 ngã r t i nút giao thông này M t s ngã r có th đ c đi đ ng th i, ch ng h n các ngã r

AB (t A r sang B) và EC M t s ngã r thì không đ c đi đ ng th i (gây ra các tuy n giao thông xung đ t nhau), ch ng h n AD và EB H th ng đèn t i nút giao thông ph i ho t đ ng sao cho các ngã r xung đ t (ch ng h n AD và EB) không đ c cho phép đi t i cùng m t th i đi m, trong khi các ngã r không xung đ t thì có th đ c đi t i c ng 1 th i đi m

Hình 1.2 th ngã r

AB

Trang 5

Ngoài cách bi u di n trên, đ th còn có th đ c bi u di n thông qua 1 b ng, trong đó ph n

t hàng i, c t j có giá tr 1 khi và ch khi có 1 c nh n i đ nh i và đ nh j

Vi c tô màu m t đ th là vi c gán cho m i đ nh c a đ th m t màu sao cho không có hai

đ nh đ c n i b i 1 c nh nào đó l i có cùng m t màu D th y r ng v n đ nút giao thông có th

đ c chuy n thành bài toán tô màu đ th các ngã r trên sao cho ph i s d ng s màu ít nh t Bài toàn tô màu đ th là bài toán đã xu t hi n và đ c nghiên c u t r t lâu Tuy nhiên, đ

tô màu m t đ th b t k v i s màu ít nh t là bài toán r t ph c t p gi i bài toán này, ng i ta

th ng s d ng ph ng pháp “vét c n” đ th t t c các kh n ng có th Có ngh a, đ u tiên th

ti n hành tô màu đ th b ng 1 màu, ti p theo dùng 2 màu, 3 màu, v.v cho t i khi tìm ra ph ng pháp tô màu tho mãn yêu c u

Ph ng pháp vét c n có v thích h p v i các đ th nh , tuy nhiên đ i v i các đ th ph c

t p thì s tiêu t n r t nhi u th i gian th c hi n c ng nh tài nguyên h th ng Ta có th ti p c n

v n đ theo h ng c g ng tìm ra m t gi i pháp đ t t, không nh t thi t ph i là gi i pháp t i u

Ch ng h n, ta s c g ng tìm m t gi i pháp tô màu cho đ th ngã r trên v i m t s màu khá ít,

g n v i s màu ít nh t, và th i gian th c hi n vi c tìm gi i pháp là khá nhanh Gi i thu t tìm các

gi i pháp đ t t nh ng ch a ph i t i u nh v y g i là các gi i thu t tìm theo “c m tính”

i v i bài toán tô màu đ th , m t thu t toán c m tính th ng đ c s d ng là thu t toán

“tham n” (greedy) Theo thu t toán này, đ u tiên ta s d ng m t màu đ tô nhi u nh t s đ nh có

th , tho mãn yêu c u bài toán Ti p theo, s d ng màu th 2 đ tô các đ nh ch a đ c tô trong

b c 1, r i s d ng đ n màu th 3 đ tô các đ nh ch a đ c tô trong b c 2, v.v

Trang 6

tô màu các đ nh v i màu m i, chúng ta th c hi n các b c:

- L a ch n 1 đ nh ch a đ c tô màu và tô nó b ng màu m i

- Duy t qua các đ nh ch a đ c tô màu V i m i đ nh d ng này, ki m tra xem có c nh nào n i nó v i m t đ nh v a đ c tô b i màu m i hay không N u không có c nh nào thì ta tô màu đ nh này b ng màu m i

Thu t toán này đ c g i là “tham n” vì t i m i b c nó tô màu t t c các đ nh có th mà không c n ph i xem xét xem vi c tô màu đó có đ l i nh ng đi m b t l i cho các b c sau hay không Trong nhi u tr ng h p, chúng ta có th tô màu đ c nhi u đ nh h n b ng 1 màu n u chúng ta b t “tham n” và b qua m t s đ nh có th tô màu đ c trong b c tr c

Ví d , xem xét đ th hình 1.3, trong đó đ nh 1 đã đ c tô màu đ Ta th y r ng hoàn toàn

có th tô c 2 đ nh 3 và 4 là màu đ , v i đi u ki n ta không tô đ nh s 2 màu đ Tuy nhiên, n u ta

áp d ng thu t toán tham n theo th t các đ nh l n d n thì đ nh 1 và đ nh 2 s là màu đ , và khi

đó đ nh 3, 4 s không đ c tô màu đ

Hình 1.3 th

Bây gi ta s xem xét thu t toán tham n đ c áp d ng trên đ th các ngã r hình 1.2 nh

th nào Gi s ta b t đ u t đ nh AB và tô cho đ nh này màu xanh Khi đó, ta có th tô cho đ nh

AC màu xanh vì không có c nh n i đ nh này v i AB AD c ng có th tô màu xanh vì không có

c nh n i AD v i AB, AC nh BA không có c nh n i t i AB, AC, AD nên c ng có th đ c tô màu xanh Tuy nhiên, đ nh BC không tô đ c màu xanh vì t n t i c nh n i BC và AB T ng t

nh v y, BD, DA, DB không th tô màu xanh vì t n t i c nh n i chúng t i m t trong các đ nh đã

tô màu xanh C nh DC thì có th tô màu xanh Cu i cùng, c nh EA, EB, EC c ng không th tô màu xanh trong khi ED có th đ c tô màu xanh

Trang 7

Hình 1.4 Tô màu xanh cho các đ nh c a đ th ngã r

Ti p theo, ta s d ng màu đ đ tô các đ nh ch a đ c tô màu b c tr c u tiên là

BC BD c ng có th tô màu đ , tuy nhiên do t n t i c nh n i DA v i BD nên DA không đ c tô màu đ T ng t nh v y, DB không tô đ c màu đ còn EA có th tô màu đ Các đ nh ch a

đ c tô màu còn l i đ u có c nh n i t i các đ nh đã tô màu đ nên c ng không đ c tô màu

Hình 1.5 Tô màu đ trong b c 2

B c 3, các đ nh ch a đ c tô màu còn l i là DA, DB, EB, EC N u ta tô màu đ nh DA là màu l c thì DB c ng có th tô màu l c Khi đó, EB, EC không th tô màu l c và ta ch n 1 màu

th t là màu vàng cho 2 đ nh này

Trang 8

Hình 1.6 Tô màu l c và màu vàng cho các đ nh còn l i

Nh v y, ta có th dùng 4 màu xanh, đ , l c, vàng đ tô màu cho đ th ngã r hình 1.2 theo yêu c u nh đã nói trên B ng t ng h p màu đ c mô t nh sau:

1.1.2 Ngôn ng di n đ t gi i thu t và k thu t tinh ch nh t ng b c

Sau khi đã xây d ng đ c mô hình toán h c cho v n đ c n gi i quy t, ti p theo, ta có th hình thành m t thu t toán cho mô hình đó Phiên b n đ u tiên c a thu t toán th ng đ c di n t

d i d ng các phát bi u t ng đ i t ng quát, và sau đó s đ c tinh ch nh d n t ng b c thành chu i các l nh c th , rõ ràng h n Ví d trong thu t toán tham n trên, ta mô t b c th c hi n

m c t ng quát là “L a ch n 1 đ nh ch a đ c tô màu” V i phát bi u nh v y, ta hy v ng r ng

ng i đ c có th n m đ c ý t ng th c hi n thao tác Tuy nhiên, đ chuy n các phát bi u đó

Trang 9

thành ch ng trình máy tính, c n ph i qua 1 s b c tinh ch nh cho t i khi đ t đ n m c các phát

bi u đ u có th đ c chuy n đ i tr c ti p sang các l nh c a ngôn ng l p trình

Tr l i ví d v bài toán tô màu đ th b ng thu t toán tham n Ta s xem xét vi c mô t thu t toán t m c t ng quát cho t i m t s m c c th h n T i b c nào đó, gi s ta có đ th G

có 1 s đ nh đã đ c tô màu theo quy t c đã nói trên Th t c Tham_an d i đây s xác đ nh 1

t p các đ nh ch a đ c tô màu thu c G mà có th cùng đ c tô b i 1 màu m i Th t c này s

đ c g i đi g i l i nhi u l n cho t i khi t t c các đ nh c a G đã đ c tô màu m c t ng quát,

th t c đ c mô t nh sau:

void Tham_an(GRAPH: G, SET: Mau_moi)

{

Mau_moi = T p r ng;

For m i đ nh v ch a đ c tô màu thu c G

If v không đ c n i t i đ nh nào trong t p Mau_moi {

Tô màu m i cho đ nh v;

a v vào t p Mau_moi;

}

}

Trong th t c trên, ta s d ng m t ngôn ng di n đ t gi i thu t t a nh ngôn ng l p trình

C Trong ngôn ng này, các l nh đ c mô t d i d ng ngôn ng t nhiên nh ng v n tuân theo cú pháp c a ngôn ng l p trình

Ta nh n th y r ng các phát bi u trong th t c trên còn r t t ng quát, và ch a t ng ng v i các l nh trong ngôn ng l p trình, ch ng h n các đi u ki n ki m tra trong câu l nh For và If

m c mô t hi n t i là không th c hi n đ c trong C th t c có th th c thi đ c, ta c n ph i tinh ch nh m t s b c đ có th chuy n đ i v ch ng trình trong ngôn ng l p trình C thông

th ng

u tiên, ta xem xét l nh If trên ki m tra xem đ nh v có n i t i m t đ nh nào đó trong

t p Mau_moi hay không, ta xem xét t ng đ nh w trong Mau_moi và s d ng đ th G đ ki m tra xem có t n t i c nh n i v à w không l u gi k t qu ki m tra, ta s d ng m t bi n ton_tai Khi đó, th t c đ c tinh ch nh nh sau:

void Tham_an(GRAPH: G, SET: Mau_moi)

Trang 10

Tô màu m i cho đ nh v;

a v vào t p Mau_moi;

}

}

}

Nh v y, ta có th th y r ng đi u ki n ki m tra trong phát bi u If đã đ c mô t c th h n

b ng các phát nh h n,và các phát bi u này có th d dàng chuy n thành các l nh c th trong C

Ti p theo, ta s tinh ch nh các vòng l p For đ duy t qua các đ nh thu c G và thu c Mau_moi làm đi u này, t t nh t là ta thay For b ng m t vòng l p While, bi n v ban đ u đ c gán là ph n t

đ u tiên ch a tô màu trong t p G, và t i m i b c l p, bi n v s đ c thay b ng ph n t ch a tô màu ti p theo trong G Vòng l p F bên trong có th th c hi n t ng t

Void Tham_an(GRAPH: G, SET: Mau_moi)

Tô màu m i cho đ nh v;

Nh v y, ta th y các phát bi u trong th t c đã khá c th , tuy nhiên, đ chuy n đ i thành

ch ng trình trong ngôn ng C thì c n t i vài b c tinh ch nh n a B n đ c hãy xem nh đó là bài t p và t gi i đ hi u rõ v ngôn ng di n đ t gi i thu t c ng nh k thu t tinh ch nh t ng

b c

1.2 PHÂN TÍCH THU T TOÁN

V i m i v n đ c n gi i quy t, ta có th tìm ra nhi u thu t toán khác nhau Có nh ng thu t toán thi t k đ n gi n, d hi u, d l p trình và s a l i, tuy nhiên th i gian th c hi n l n và tiêu t n

Trang 11

nhi u tài nguyên máy tính Ng c l i, có nh ng thu t toán thi t k và l p trình r t ph c t p,

nh ng cho th i gian ch y nhanh h n, s d ng tài nguyên máy tính hi u qu h n Khi đó, câu h i

đ t ra là ta nên l a ch n gi i thu t nào đ th c hi n?

i v i nh ng ch ng trình ch đ c th c hi n m t vài l n thì th i gian ch y không ph i là tiêu chí quan tr ng nh t i v i bài toán ki u này, th i gian đ l p trình viên xây d ng và hoàn thi n thu t toán đáng giá h n th i gian ch y c a ch ng trình và nh v y nh ng gi i thu t đ n

gi n v m t thi t k và xây d ng nên đ c l a ch n

i v i nh ng ch ng trình đ c th c hi n nhi u l n thì th i gian ch y c a ch ng trình đáng giá h n r t nhi u so v i th i gian đ c s d ng đ thi t k và xây d ng nó Khi đó, l a ch n

m t gi i thu t có th i gian ch y nhanh h n (cho dù vi c thi t k và xây d ng ph c t p h n) là m t

l a ch n c n thi t Trong th c t , trong giai đo n đ u c a vi c gi i quy t v n đ , m t gi i thu t

đ n gi n th ng đ c th c hi n tr c nh là 1 nguyên m u (prototype), sau đó nó s đ c phân tích, đánh giá, và c i ti n thành các phiên b n t t h n

- ph c t p v th i gian c a thu t toán

Thông th ng, th i gian ch y c a ch ng trình không ph thu c vào giá tr d li u đ u vào

mà ph thu c vào kích th c c a d li u đ u vào Do v y th i gian ch y c a ch ng trình nên

th i gian th c hi n ch ng trình T(n) trong tr ng h p x u nh t ho c t t nh t ó là th i gian

th c hi n l n nh t ho c nh nh t trong t t c các b d li u vào có kích th c n Ta c ng đ nh ngh a th i gian th c hi n trung bình c a ch ng trình trên m i b d li u vào kích th c n Trong

th c t , c l ng th i gian th c hi n trung bình khó h n nhi u so v i th i gian th c hi n trong

tr ng h p x u nh t ho c t t nh t, b i vì vi c phân tích thu t toán trong tr ng h p trung bình khó h n v m t toán h c, đ ng th i khái ni m “trung bình” không có ý ngh a th c s rõ ràng

Y u t ch t l ng c a mã máy đ c t o b i ch ng trình d ch và t c đ th c thi l nh c a máy c ng nh h ng t i th i gian th c hi n ch ng trình cho th y chúng ta không th th hi n

th i gian th c hi n chu ng trình d i đ n v th i gian chu n, ch ng h n phút ho c giây Thay vào

Trang 12

Ví d , xét hàm T(n) = (n+1)2 Ta có th th y T(n) là O(n2) v i n0 = 1 và c = 4, vì ta có T(n)

= (n+1)2 < 4n2 v i m i n ≥ 1 Trong ví d này, ta c ng có th nói r ng T(n) là O(n3

), tuy nhiên, phát bi u này “y u” h n phát bi u T(n) là O(n2)

Nhìn chung, ta nói T(n) là O(f(n)) n u t n t i các h ng s d ng c và n0 sao cho T(n) < c.f(n) v i n ≥ n0 M t ch ng trình có th i gian th c hi n là O(f(n)) thì đ c xem là có c p đ

t ng f(n)

Vi c đánh giá các ch ng trình có th đ c th c hi n qua vi c đánh giá các hàm th i gian

ch y c a ch ng trình,b qua các h ng s t l V i gi thi t này, m t ch ng trình v i th i gian

th c hi n là O(n2) s t t h n ch ng trình v i th i gian ch y O(n3) Bên c nh các y u t h ng s

xu t phát t ch ng trình d ch và máy, còn có thêm h ng s t b n thân chu ng trình Ví d , trên cùng m t ch ng trình d ch và cùng 1 máy, ch ng trình đ u tiên có th i gian th c hi n là 100n2

, trong khi chu ng trình th 2 có th i gian th c hi n là 5n3 V i n nh , có th 5n3 nh h n 100n2, tuy nhiên v i n đ l n thì 5n3

s l n h n 100n2đáng k

M t lý do n a đ xem xét c p đ t ng v th i gian th c hi n c a ch ng trình là nó cho phép ta xác đ nh đ l n c a bài toán mà ta có th gi i quy t M c dù máy tính có t c đ ngày càng cao, tuy nhiên, v i nh ng ch ng trình có th i gian th c hi n có c p đ t ng l n (t n2

tr lên), thì vi c t ng t c đ c a máy tính t o ra s khác bi t không đáng k v kích th c bài toán có th

x lý b i máy tính trong m t kho ng th i gian c đ nh

, nlog n)) = O(n3)

Nguyên t c nhân c p đ t ng c a hàm nh sau: V i gi thi t v T1(n) và T2(n) nh trên, n u

2 đo n ch ng trình P1 và P2 không đ c th c hi n tu n t mà l ng nhau thì th i gian ch y t ng

th s là T1(n).T2(n) = O(f(n).(g(n))

minh ho cho vi c phân tích và tính toán th i gian th c hi n c a 1 ch ng trình, ta s xem xét m t thu t toán đ n gian đ s p x p các ph n t c a m t t p h p, đó là thu t toán s p x p

n i b t (bubble sort)

Thu t toán nh sau :

void buble (int a[n]){

Trang 13

th i gian th c hi n c đ nh, không ph thu c vào n, do v y, các l nh 4, 5, 6 s có th i gian th c

hi n là O(1), t c th i gian th c hi n là h ng s Theo quy t c c ng c p đ t ng thì t ng th i gian

th c hi n c 3 l nh là O(max(1, 1, 1)) = O(1)

Ti p theo ta s xem xét th i gian th c hi n c a các l nh l p và r nhánh L nh If ki m tra

đi u ki n đ th c hi n nhóm l nh gán 4, 5, 6 Vi c ki m tra đi u ki n s có th i gian th c hi n là O(1) Ngoài ra, chúng ta ch a bi t đ c là đi u ki n có tho mãn hay không, t c là không bi t

đ c nhóm l nh gán có đ c th c hi n hay không Do v y, ta gi thi t tr ng h p x u nh t là t t

c các l n ki m tra đi u ki n đ u tho mãn, và các l nh gán đ c th c hi n Nh v y, toàn b l nh

If s có th i gian th c hi n là O(1)

Ti p t c xét t trong ra ngoài, ta xét đ n vòng l p trong (bi n duy t j) Trong vòng l p này,

t i m i b c l p ta c n th c hi n các thao tác nh ki m tra đã g p đi u ki n d ng ch a và t ng

bi n duy t lên 1 n u ch a d ng Nh v y, m i b c l p có th i gian th c hi n là O(1) S b c

l p là n-i, do đó theo quy t c nhân c p đ t ng thì t ng th i gian th c hi n c a vòng l p này là O((n-i)x1) = O(n-i)

Cu i cùng, ta xét vòng l p ngoài cùng (bi n duy t i) Vòng l p này đ c th c hi n (n-1) l n,

do đó, t ng th i gian th c hi n c a ch ng trình là:

∑ (n-i) = n(n-1)/2 = n2

/2- n/2 = O(n2)

Nh v y, th i gian th c hi n gi i thu t s p x p n i b t là t l v i n2

M t s quy t c chung trong vi c phân tích và tính toán th i gian th c hi n ch ng trình

- Th i gian th c hi n các l nh gán, đ c, ghi v.v, luôn là O(1)

- Th i gian th c hi n chu i tu n t các l nh đ c xác đ nh theo quy t c c ng c p đ t ng

Có ngh a là th i gian th c hi n c a c nhóm l nh tu n t đ c tính là th i gian th c

hi n c a l nh l n nh t

- Th i gian th c hi n l nh r nhánh If đ c tính b ng th i gian th c hi n các l nh khi

đi u ki n ki m tra đ c tho mãn và th i gian th c hi n vi c ki m tra đi u ki n Th i gian th c hi n vi c ki m tra đi u ki n luôn là O(1)

- Th i gian th c hi n 1 vòng l p đ c tính là t ng th i gian th c hi n các l nh thân vòng l p qua t t c các b c l p và th i gian đ ki m tra đi u ki n d ng (th ng là O(1)) Th i gian th c hi n này th ng đ c tính theo quy t c nhân c p đ t ng s l n

th c hi n b c l p và th i gian th c hi n các l nh thân vòng l p Các vòng l p ph i

đ c tính th i gian th c hi n m t cách riêng r

1.3 TÓM T T CH NG 1

Các ki n th c c n nh trong ch ng 1:

- Thu t toán là m t chu i h u h n các l nh M i l nh có m t ng ngh a rõ ràng và có th

đ c th c hi n v i m t l ng h u h n tài nguyên trong m t kho ng h u h n th i gian

Trang 14

- Thu t toán th ng đ c mô t b ng các ngôn ng di n đ t gi i thu t g n v i ngôn ng

t nhiên Các mô t này s đ c t nh ch nh d n d n đ đ t t i m c ngôn ng l p trình

- Th i gian th c hi n thu t toán th ng đ c coi nh là 1 hàm c a kích th c d li u đ u vào

- Th i gian th c hi n thu t toán th ng đ c tính trong các tr ng h p t t nh t, x u nh t,

ho c trung bình

- bi u th c p đ t ng c a hàm, ta s d ng ký hi u O(n) Ví d , ta nói th i gian th c

hi n T(n) c a ch ng trình là O(n2), có ngh a là t n t i các h ng s du ng c và n0 sao cho T(n) ≤ cn2

3 Th i gian th c hi n m t ch ng trình th ng ph thu c vào các y u t nào? Phân tích

c th t ng y u t

4 Nói th i gian th c hi n ch ng trình là T(n) = O(f(n)) có ngh a là gì? Cho ví d minh

ho

5 Nêu quy t c c ng và nhân c p đ t ng c a hàm Có ví d minh ho

6 Nêu các quy t c chung trong vi c phân tích và đánh giá th i gian th c hi n ch ng trình

Trang 15

qui là m t khái ni m c b n trong toán h c và khoa h c máy tính M t đ i t ng đ c

g i là đ qui n u nó ho c m t ph n c a nó đ c đ nh ngh a thông qua khái ni m v chính nó M t

- M t ch cái b t k ghép v i 1 xâu s t o thành 1 xâu m i

T phát bi u “Xâu r ng là 1 xâu ký t ”, ta ghép b t k 1 ch cái nào v i xâu r ng đ u

t o thành xâu ký t Nh v y, ch cái b t k có th coi là xâu ký t Ti p t c ghép 1 ch cái b t k v i 1 ch cái b t k c ng t o thành 1 xâu ký t , v.v

3- nh ngh a hàm giai th a, n!

- Khi n=0, đ nh ngh a 0!=1

- Khi n>0, đ nh ngh a n!=(n-1)! x n

Nh v y, khi n=1, ta có 1!=0!x1 = 1x1=1 Khi n=2, ta có 2!=1!x2=1x2=2, v.v

Trong l nh v c l p trình, m t ch ng trình máy tính g i là đ qui n u trong ch ng trình có

l i g i chính nó i u này, tho t tiên, nghe có v h i vô lý M t ch ng trình không th g i mãi chính nó, vì nh v y s t o ra m t vòng l p vô h n Trên th c t , m t ch ng trình đ qui tr c khi g i chính nó bao gi c ng có m t thao tác ki m tra đi u ki n d ng N u đi u ki n d ng th a mãn, ch ng trình s không g i chính nó n a, và quá trình đ qui ch m d t Trong các ví d trên, ta đ u th y có các đi m d ng Ch ng h n, trong ví d th nh t, n u k = 0 thì có th suy ngay

k là s t nhiên, không c n tham chi u xem k-1 có là s t nhiên hay không

Nhìn chung, các ch ng trình đ qui đ u có các đ c đi m sau:

Trang 16

Khi ch ng trình g i t i chính nó, các tham s , ho c kho ng tham s , th ng tr nên nh

h n, đ ph n ánh 1 th c t là v n đ đã tr nên nh h n, d h n Khi tham s gi m t i m c c c

ti u, m t đi u ki n so sánh đ c ki m tra và ch ng trình k t thúc, ch m d t vi c g i t i chính

u đi m c a ch ng trình đ qui c ng nh đ nh ngh a b ng đ qui là có th th c hi n m t

s l ng l n các thao tác tính toán thông qua 1 đo n ch ng trình ng n g n (th m chí không có vòng l p, ho c không t ng minh đ có th th c hi n b ng các vòng l p) hay có th đ nh ngh a

m t t p h p vô h n các đ i t ng thông qua m t s h u h n l i phát bi u Thông th ng, m t

ch ng trình đ c vi t d i d ng đ qui khi v n đ c n x lý có th đ c gi i quy t b ng đ qui

T c là v n đ c n gi i quy t có th đ a đ c v v n đ t ng t , nh ng đ n gi n h n V n đ này

l i đ c đ a v v n đ t ng t nh ng đ n gi n h n n a v.v, cho đ n khi đ n gi n t i m c có

th tr c ti p gi i quy t đ c ngay mà không c n đ a v v n đ đ n gi n h n n a

2.1.1 i u ki n đ có th vi t m t ch ng trình đ qui

Nh đã nói trên, đ ch ng trình có th vi t d i d ng đ qui thì v n đ c n x lý ph i

đ c gi i quy t 1 cách đ qui Ngoài ra, ngôn ng dùng đ vi t ch ng trình ph i h tr đ qui

có th vi t ch ng trình đ qui ch c n s d ng ngôn ng l p trình có h tr hàm ho c th t c,

nh đó m t th t c ho c hàm có th có l i g i đ n chính th t c ho c hàm đó Các ngôn ng l p trình thông d ng hi n nay đ u h tr k thu t này, do v y v n đ công c đ t o các ch ng trình

đ qui không ph i là v n đ c n ph i xem xét Tuy nhiên, c ng nên l u ý r ng khi m t th t c đ qui g i đ n chính nó, m t b n sao c a t p các đ i t ng đ c s d ng trong th t c này nh các

bi n, h ng, các th t c con, v.v c ng đ c t o ra Do v y, nên h n ch vi c khai báo và s d ng các đ i t ng này trong th t c đ qui n u không c n thi t nh m tránh lãng phí b nh , đ c bi t

đ i v i các l i g i đ qui đ c g i đi g i l i nhi u l n Các đ i t ng c c b c a 1 th t c đ qui khi đ c t o ra nhi u l n, m c dù có cùng tên, nh ng do khác ph m vi nên không nh h ng gì

đ n ch ng trình Các đ i t ng đó s đ c gi i phóng khi th t c ch a nó k t thúc

N u trong m t th t c có l i g i đ n chính nó thì ta g i đó là đ qui tr c ti p Còn trong

tr ng h p m t th t c có m t l i g i th t c khác, th t c này l i g i đ n th t c ban đ u thì

đ c g i là đ qui gián ti p Nh v y, trong ch ng trình khi nhìn vào có th không th y ngay s

đ qui, nh ng khi xem xét k h n thì s nh n ra

2.1.2 Khi nào không nên s d ng đ qui

Trong nhi u tr ng h p, m t ch ng trình có th vi t d i d ng đ qui Tuy nhiên, đ qui không h n đã là gi i pháp t t nh t cho v n đ Nhìn chung, khi ch ng trình có th vi t d i d ng

l p ho c các c u trúc l nh khác thì không nên s d ng đ qui

Lý do th nh t là, nh đã nói trên, khi m t th t c đ qui g i chính nó, t p các đ i t ng

đ c s d ng trong th t c này nh các bi n, h ng, c u trúc v.v s đ c t o ra Ngoài ra, vi c chuy n giao đi u khi n t các th t c c ng c n l u tr các thông s dùng cho vi c tr l i đi u khi n cho th t c ban đ u

Lý do th hai là vi c s d ng đ qui đôi khi t o ra các tính toán th a, không c n thi t do tính ch t t đ ng g i th c hi n th t c khi ch a g p đi u ki n d ng c a đ qui minh h a cho

Trang 17

đi u này, chúng ta s xem xét m t ví d , trong đó c đ qui và l p đ u có th đ c s d ng Tuy nhiên, ta s phân tích đ th y s d ng đ qui trong tr ng h p này gây lãng phí b nh và các tính toán không c n thi t nh th nào

Xét bài toán tính các ph n t c a dãy Fibonaci Dãy Fibonaci đu c đ nh ngh a nh sau:

n a v.v, c nh v y s l i g i đ qui s t ng theo c p s m i u này rõ ràng là không hi u qu

vì trong s các l i g i đ qui đó có r t nhi u l i g i trùng nhau Ví d l i g i đ qui Fibonaci (6)

s d n đ n 2 l i g i Fibonaci (5) và Fibonaci (4) L i g i Fibonaci (5) s g i Fibonaci (4) và Fibonaci (3) Ngay ch này, ta đã th y có 2 l i g i Fibonaci (4) đ c th c hi n Hình 2.1 cho th y

s các l i g i đ c th c hi n khi g i th t c Fibonaci (6)

Hình 2.1 Các l i g i đ qui đ c th c hi n khi g i th t c Fibonaci (6)

Trong hình v trên, ta th y đ tính đ c ph n t th 6 thì c n có t i 25 l i g i ! Sau đây, ta

s xem xét vi c s d ng vòng l p đ tính giá tr các ph n t c a dãy Fibonaci nh th nào

u tiên, ta khai báo m t m ng F các s t nhiên đ ch a các s Fibonaci Vòng l p đ tính

và gán các s này vào m ng r t đ n gi n nh sau:

Trang 18

F[i] = F[i-1] + F [i-2];

Rõ ràng là v i vòng l p này, m i s Fibonaci (n) ch đ c tính 1 l n thay vì đ c tính toán

ch ng chéo nh trên

Tóm l i, nên tránh s d ng đ qui n u có m t gi i pháp khác cho bài toán M c dù v y, m t

s bài toán t ra r t phù h p v i ph ng pháp đ qui Vi c s d ng đ qui đ gi i quy t các bài toán này hi u qu và r t d hi u Trên th c t , t t c các gi i thu t đ qui đ u có th đ c đ a v

d ng l p (còn g i là “kh ” đ qui) Tuy nhiên, đi u này có th làm cho ch ng trình tr nên ph c

t p, nh t là khi ph i th c hi n các thao tác đi u khi n stack đ qui (b n đ c có th tìm hi u thêm

k thu t kh đ qui các tài li u tham kh o khác), d n đ n vi c ch ng trình tr nên r t khó hi u

Ph n ti p theo s trình bày m t s thu t toán đ qui đi n hình

2.2 THI T K GI I THU T QUI

2.2.2 Thu t toán Euclid tính c s chung l n nh t c a 2 s nguyên d ng

c s chung l n nh t (USCLN) c a 2 s nguyên d ng m, n là 1 s k l n nh t sao cho m

và n đ u chia h t cho k M t ph ng pháp đ n gi n nh t đ tìm USCLN c a m và n là duy t t s

nh h n trong 2 s m, n cho đ n 1, ngay khi g p s nào đó mà m và n đ u chia h t cho nó thì đó chính là USCLN c a m, n Tuy nhiên, ph ng pháp này không ph i là cách tìm USCLN hi u qu Cách đây h n 2000 n m, Euclid đã phát minh ra m t gi i thu t tìm USCLN c a 2 s nguyên

d ng m, n r t hi u qu Ý t ng c b n c a thu t toán này c ng t ng t nh ý t ng đ qui, t c

là đ a bài toán v 1 bài toán đ n gi n h n C th , gi s m l n h n n, khi đó vi c tính USCLN

c a m và n s đ c đ a v bài toán tính USCLN c a m mod n và n vì USCLN(m, n) = USCLN(m mod n, n)

Thu t toán đ c cài đ t nh sau:

int USCLN(int m, int n){

if (n==0) return m;

else return USCLN(n, m % n);

}

i m d ng c a thu t toán là khi n=0 Khi đó đ ng nhiên là USCLN c a m và 0 chính là

m, vì 0 chia h t cho m i s Khi n khác 0, l i g i đ qui USCLN(n, m% n) đ c th c hi n Chú ý

r ng ta gi s m >= n trong th t c tính USCLN, do đó, khi g i đ qui ta g i USCLN (n, m% n)

đ đ m b o th t các tham s vì n bao gi c ng l n h n ph n d c a phép m cho n Sau m i l n

g i đ qui, các tham s c a th t c s nh d n đi, và sau 1 s h u h n l i g i tham s nh h n s

b ng 0 ó chính là đi m d ng c a thu t toán

Trang 19

Ví d , đ tính USCLN c a 108 và 45, ta g i th t c USCLN(108, 45) Khi đó, các th t c sau s l n l t đ c g i:

USCLN(108, 45) 108 chia 45 d 18, do đó ti p theo g i

USCLN(45, 18) 45 chia 18 d 9, do đó ti p theo g i

USCLN(18, 9) 18 chia 9 d 0, do đó ti p theo g i

USCLN(9, 0) tham s th 2 = 0, do đó k t qu là tham s th nh t, t c là 9

Nh v y, ta tìm đ c USCLN c a 108 và 45 là 9 ch sau 4 l n g i th t c

2.2.3 Các gi i thu t đ qui d ng chia đ tr (divide and conquer)

Ý t ng c b n c a các thu t toán d ng chia đ tr là phân chia bài toán ban đ u thành 2

ho c nhi u bài toán con có d ng t ng t và l n l t gi i quy t t ng bài toán con này Các bài toán con này đ c coi là d ng đ n gi n h n c a bài toán ban đ u, do v y có th s d ng các l i

g i đ qui đ gi i quy t Thông th ng, các thu t toán chia đ tr chia b d li u đ u vào thành 2

ph n riêng r , sau đó g i 2 th t c đ qui đ v i các b d li u đ u vào là các ph n v a đ c chia

M t ví d đi n hình c a gi i thu t chia đ tr là Quicksort, m t gi i thu t s p x p nhanh Ý

t ng c b n c a gi i thu t này nh sau:

Gi i s ta c n s p x p 1 dãy các s theo chi u t ng d n Ti n hành chia dãy đó thành 2 n a sao cho các s trong n a đ u đ u nh h n các s trong n a sau Sau đó, ti n hành th c hi n s p

x p trên m i n a này Rõ ràng là sau khi m i n a đã đ c s p, ta ti n hành ghép chúng l i thì s

có toàn b dãy đ c s p Chi ti t v gi i thu t Quicksort s đ c trình bày trong ch ng 7 - S p

x p và tìm ki m

Ti p theo, chúng ta s xem xét m t bài toán c ng r t đi n hình cho l p bài toán đ c gi i

b ng gi i thu t đ qui chia đ tr

Bài toán tháp Hà n i

Có 3 chi c c c và m t b n chi c đ a Các đ a này có kích th c khác nhau và m i đ a đ u

có 1 l gi a đ có th xuyên chúng vào các c c Ban đ u, t t c các đ a đ u n m trên 1 c c, trong đó, đ a nh h n bao gi cùng n m trên đ a l n h n

Hình 2.2 Bài toán tháp Hà n i

Yêu c u c a bài toán là chuy n b n đ a t c c ban đ u A sang c c đích C (có th s d ng

c c trung gian B), v i các đi u ki n:

Trang 20

V i n=2, có th th c hi n nh sau:

- Chuy n đ a nh t c c A sang c c trung gian B

- Chuy n đ a l n t c c A sang c c đích C

- Cu i cùng, chuy n đ a nh t c c trung gian B sang c c đích C

Nh v y, c 2 đ a đã đ c chuy n sang c c đích C và không có tình hu ng nào đ a l n n m trên đ a nh

Trang 21

Nh v y, ta th y toàn b n đ a đã đ c chuy n t c c A sang c c C và không vi ph m b t

c đi u ki n nào c a bài toán

đây, ta th y r ng bài toán chuy n n c c đã đ c chuy n v bài toán đ n gi n h n là chuy n n-1 c c i m d ng c a thu t toán đ qui là khi n=1 và ta chuy n th ng c c này t c c ban đ u sang c c đích

Tính ch t chia đ tr c a thu t toán này th hi n ch : Bài toán chuy n n đ a đ c chia làm

2 bài toán nh h n là chuy n n-1 đ a L n th nh t chuy n n-1 đ a t c c a sang c c trung gian b,

và l n th 2 chuy n n-1 đ a t c c trung gian b sang c c đích c

Cài đ t đ qui cho thu t toán nh sau:

- Hàm chuyen(int n, int a, int c) th c hi n vi c chuy n đ a th n t c c a sang c c c

- Hàm thaphanoi(int n, int a, int c, int b) là hàm đ qui th c hi n vi c chuy n n đ a t c c

a sang c c c, s d ng c c trung gian là c c b

Ch ng trình nh sau:

void chuyen(int n, char a, char c){

printf(‘Chuyen dia thu %d tu coc %c sang coc %c

Trang 22

3- L i g i đ qui thaphanoi(n-1, b, c, a) đ chuy n n-1 đ a t c c b sang c c c, s d ng c c

Th t v y, theo ph ng pháp chuy n c a gi i thu t thì có 3 b c B c 1 chuy n n-1 đ a t

c c a sang c c b m t 2n-1-1 thao tác B c 2 chuy n 1 đ a t c c a sang c c c m t 1 thao tác B c

3 chuy n n-1 đ a t c c b sang c c c m t 2n-1

-1 thao tác T ng c ng ta m t (2n-1-1) + (2n-1-1) + 1 = 2*2n-1 -1 = 2n –1 thao tác chuy n ó là đi u c n ch ng minh

Nh v y, thu t toán có c p đ t ng r t l n Nói v c p đ t ng này, có m t truy n thuy t vui

v bài toán tháp Hà n i nh sau: Ngày t n th s đ n khi các nhà s m t ngôi chùa th c hi n xong vi c chuy n 40 chi c đ a theo quy t c nh bài toán v a trình bày V i đ ph c t p c a bài toàn v a tính đ c, n u gi s m i l n chuy n 1 đ a t c c này sang c c khác m t 1 giây thì v i

240-1 l n chuy n, các nhà s này ph i m t ít nh t 34.800 n m thì m i có th chuy n xong toàn b

s đ a này !

D i đây là toàn b mã ngu n ch ng trình tháp Hà n i vi t b ng C:

#include<stdio.h>

#include<conio.h>

void chuyen(int n, char a, char c);

void thaphanoi(int n, char a, char c, char b);

Trang 23

void chuyen(int n, char a, char c){

printf("Chuyen dia thu %d tu coc %c sang coc %c \n", n,

2.2.4 Thu t toán quay lui (backtracking algorithms)

Nh chúng ta đã bi t, các thu t toán đ c xây d ng đ giái quy t v n đ th ng đ a ra 1 quy t c tính toán nào đó Tuy nhiên, có nh ng v n đ không tuân theo 1 quy t c, và khi đó ta ph i dùng ph ng pháp th - sai (trial-and-error) đ gi i quy t Theo ph ng pháp này, quá trình th - sai đ c xem xét trên các bài toán đ n gi n h n (th ng ch là 1 ph n c a bài toán ban đ u) Các bài toán này th ng đ c mô t d i d ng đ qui và th ng liên quan đ n vi c gi i quy t m t s

h u h n các bài toán con

hi u rõ h n thu t toán này, chúng ta s xem xét 1 ví d đi n hình cho thu t toán quay lui, đó là bài toán Mã đi tu n

Cho bàn c có kích th c n x n (có n2 ô) M t quân mã đ c đ t t i ô ban đ u có to đ x0, y0

và đ c phép d ch chuy n theo lu t c thông th ng Bài toán đ t ra là t ô ban đ u, tìm m t chu i các n c đi c a quân mã, sao cho quân mã này đi qua t t c các ô c a bàn c , m i ô đúng 1 l n

Nh đã nói trên, quá trình th - sai ban đ u đ c xem xét m c đ n gi n h n C th , trong bài toán này, thay vì xem xét vi c tìm ki m chu i n c đi ph kh p bàn c , ta xem xét v n

đ đ n gi n h n là tìm ki m n c đi ti p theo c a quân mã, ho c k t lu n r ng không còn n c đi

k ti p th a mãn T i m i b c, n u có th tìm ki m đ c 1 n c đi k ti p, ta ti n hành ghi l i

n c đi này cùng v i chu i các n c đi tr c đó và ti p t c quá trình tìm ki m n c đi N u t i

b c nào đó, không th tìm n c đi k ti p th a mãn yêu c u c a bài toán, ta quay tr l i b c

Trang 24

tr c, h y b n c đi đã l u l i tr c đó và th sang 1 n c đi m i Quá trình có th ph i th r i quay l i nhi u l n, cho t i khi tìm ra gi i pháp ho c đã th h t các ph ng án mà không tìm ra

u tiên, ta s d ng 1 m ng 2 chi u đ mô t bàn c :

int Banco[n][n];

Các ph n t c a m ng này có ki u d li u s nguyên M i ph n t c a m ng đ i di n cho 1

ô c a bàn c Ch s c a ph n t t ng ng v i t a đ c a ô, ch ng h n ph n t Banco[0][0]

t ng ng v i ô (0,0) c a bàn c Giá tr c a ph n t cho bi t ô đó đã đ c quân mã đi qua hay

ch a N u giá tr ô = 0 t c là quân mã ch a đi qua, ng c l i ô đã đ c quân mã đã đi qua

Banco[x][y] = 0: ô (x,y) ch a đ c quân mã đi qua

Banco[x][y] = i: ô (x,y) đã đ c quân mã đi qua t i n c th i

Ti p theo, ta c n ph i thi t l p thêm 1 s tham s xác đ nh danh sách các n c đi k

ti p, ta c n ch ra t a đ hi n t i c a quân mã, t đó theo lu t c thông th ng ta xác đ nh các ô quân mã có th đi t i Nh v y, c n có 2 bi n x, y đ bi u th t a đ hi n t i c a quân mã cho

bi t n c đi có thành công hay không, ta c n dùng 1 bi n ki u boolean

N c đi k ti p ch p nh n đ c n u nó ch a đ c quân mã đi qua, t c là n u ô (u,v) đ c

ch n là n c đi k ti p thì Banco[u][v] = 0 là đi u ki n đ ch p nh n Ngoài ra, hi n nhiên là ô đó

ph i n m trong bàn c nên 0 ≤ u, v < n

Vi c ghi l i n c đi t c là đánh d u r ng ô đó đã đ c quân mã đi qua Tuy nhiên, ta c ng

c n bi t là quân mã đi qua ô đó t i n c đi th m y Nh v y, ta c n 1 bi n i đ cho bi t hi n t i đang th n c đi th m y, và ghi l i n c đi thành công b ng cách gán giá tr Banco[u][v]=i

Trang 25

Do i t ng lên theo t ng b c th , nên ta có th ki m tra xem bàn c còn ô tr ng không b ng cách ki m tra xem i đã b ng n2

ch a N u i<n2 t c là bàn c v n còn ô tr ng

bi t n c đi có thành công hay không, ta có th ki m tra bi n boolean nh đã nói trên Khi n c đi không thành công, ta ti n hành h y n c đi đã l u b c tr c b ng cách cho giá tr Banco[u][v] = 0

Nh v y, ta có th mô t c th h n hàm trên nh sau:

void ThuNuocTiepTheo(int i, int x, int y, int *q)

Ch n n c đi (u,v) trong danh sách n c đi k ti p;

if ((0 <= u) && (u<n) && (0 <= v) && (v<n) && (Banco[u][v]==0))

mã có th đi t i các ô nào, và cách tính v trí t ng đ i c a các ô đó so v i ô (x,y) ra sao

Theo lu t c thông th ng, quân mã t ô (x,y) có th đi t i 8 ô trên bàn c nh trong hình v :

Trang 26

Ta th y r ng 8 ô mà quân mã có th đi t i t ô (x,y) có th tính t ng đ i so v i (x,y) là: (x+2, y-1); (x+1, y-2); (x-1, y-2); (x-2, y-1); (x-2, y+1); (x-1, y+2); (x+1; y+2); (x+2, y+1)

N u g i dx, dy là các giá tr mà x, y l n l t ph i c ng vào đ t o thành ô mà quân mã có

th đi t i, thì ta có th gán cho dx, dy m ng các giá tr nh sau:

Chú ý r ng, v i các n c đi nh trên thì (u, v) có th là ô n m ngoài bàn c Tuy nhiên, nh

đã nói trên, ta đã có đi u ki n 0 ≤ u, v < n, do v y luôn đ m b o ô (u, v) đ c ch n là h p l

Cu i cùng, hàm ThuNuocTiepTheo có th đ c vi t l i hoàn toàn b ng ngôn ng C nh sau:

void ThuNuocTiepTheo(int i, int x, int y, int *q)

Nh v y, có th th y đ c đi m c a thu t toán là gi i pháp cho toàn b v n đ đ c th c

hi n d n t ng b c, và t i m i b c có ghi l i k t qu đ sau này có th quay l i và h y k t qu

đó n u phát hi n ra r ng h ng gi i quy t theo b c đó đi vào ngõ c t và không đem l i gi i pháp

t ng th cho v n đ Do đó, thu t toán đ c g i là thu t toán quay lui

D i đây là mã ngu n c a toàn b ch ng trình Mã đi tu n vi t b ng ngôn ng C:

Trang 29

Bài toán 8 quân h u

Bài toán 8 quân h u là 1 ví d r t n i ti ng v vi c s d ng ph ng pháp th - sai và thu t toán quay lui c đi m c a các bài toán d ng này là không th dùng các bi n pháp phân tích đ

gi i đ c mà ph i c n đ n các ph ng pháp tính toán th công, v i s kiên trì và đ chính xác cao Do đó, các thu t toán ki u này phù h p v i vi c s d ng máy tính vì máy tính có kh n ng tính toán nhanh và chính xác h n nhi u so v i con ng i

Bài toán 8 quân h u đ c phát bi u ng n g n nh sau: Tìm cách đ t 8 quân h u trên 1 bàn

c sao cho không có 2 quân h u nào có th n đ c nhau

T ng t nh phân tích bài Mã đi tu n, ta có hàm DatHau đ tìm v trí đ t quân h u ti p theo nh sau:

ch 1 quân h u, và t đó ta có quy đ nh là quân h u th i ph i đ t c t th i Nh v y, ta s dùng

bi n i đ bi u th ch s c t, và quá trình l a ch n v trí đ t quân h u s ch n 1 trong 8 v trí trong

c t cho bi n ch s hàng j

Trang 30

Hình 2.6 Các n c chi u c a quân h u Trong bài toán Mã đi tu n, ta s d ng m t m ng 2 chi u Banco(i, j) đ bi u th bàn c Tuy nhiên, trong bài toán này n u ti p t c dùng c u trúc d li u đó s d n t i m t s ph c t p trong

vi c ki m tra v trí đ t quân h u có an toàn hay không, b i vì ta c n ph i ki m tra hàng và các

đ ng chéo đi qua ô quân h u s đ c đ t (không c n ki m tra c t vì theo quy đ nh ban đ u, có đúng 1 quân h u đ c đ t trên m i c t) i v i m i ô trong c t, s có 1 hàng và 2 đ ng chéo đi qua nó là đ ng chéo trái và đ ng chéo ph i

Ta s dùng 3 m ng ki u boolean đ bi u th cho các hàng, các đ ng chéo trái, và các

đ ng chéo ph i (có t t c 15 đ ng chéo trái và 15 đ ng chéo ph i)

int a[8];

int b[15], c[15];

Trong đó:

a[j] = 0: Hàng j ch a b chi m b i quân h u nào

b[k] = 0: ng chéo trái k ch a b chi m b i quân h u nào

c[k] = 0: ng chéo ph i k ch a b chi m b i quân h u nào

Chú ý r ng các ô (i, j) cùng n m trên 1 đ ng chéo trái thì có cùng giá tr i + j, và cùng n m trên đ ng chéo ph i thì có cùng giá tr i – j N u đánh s các đ ng chéo trái và ph i t 0 đ n 14, thì ô (i, j) s n m trên đ ng chéo trái (i + j) và n m trên đ ng chéo ph i (i – j +7)

Do v y, đ ki m tra xem ô (i, j) có an toàn không, ta ch c n ki m tra xem hàng j và các

đ ng chéo (i +j), (i – j +7) đã b chi m ch a, t c là ki m tra a[i], b[i + j], và c[i – j +7]

Ngoài ra, ta c n có 1 m ng x đ l u gi ch s hàng c a quân h u trong c t i

int x[8];

V y v i thao tác đ t h u vào v trí hàng j trên c t i, ta c n th c hi n các công vi c:

x[i] = j; a[j] = 1; b[i + j] = 1; c[i – j + 7] = 1;

V i thao tác b h u ra h i hàng j trong c t i, ta c n th c hi n các công vi c:

a[j] = 0; b[i + j] = 0; c[i – j + 7] = 0;

Còn đi u ki n đ ki m tra xem v trí t i hàng j trong c t i có an toàn không là:

(a[j] = =0) && (b[i + j] == 0) && (c[i – j + 7] == 0)

Trang 31

Nh v y, hàm DatHau s đ c th hi n c th b ng ngôn ng C nh sau:

void DatHau(int i, int *q)

đ c đ nh ngh a thông qua khái ni m v chính nó

- Ch ng trình đ qui: M t ch ng trình máy tính g i là đ qui n u trong ch ng trình có

v y có th s d ng các l i g i đ qui đ gi i quy t

- Thu t toán quay lui dùng đ gi i quy t các bài toán không tuân theo 1 quy t c, và khi đó

ta ph i dùng ph ng pháp th - sai (trial-and-error) đ gi i quy t Theo ph ng pháp

Trang 32

này, quá trình th - sai đ c xem xét trên các bài toán đ n gi n h n (th ng ch là 1

ph n c a bài toán ban đ u) Các bài toán này th ng đ c mô t d i d ng đ qui và

th ng liên quan đ n vi c gi i quy t m t s h u h n các bài toán con

2.4 CÂU H I VÀ BÀI T P

1 Hãy trình bày m t s ví d v đ nh ngh a theo ki u đ qui

2 M t ch ng trình đ qui khi g i chính nó thì bài toán khi đó có kích th c nh th nào

so v i bài toán ban đ u? ch ng trình đ qui không b l p vô h n thì c n ph i làm gì?

3 Hãy cho bi t t i sao khi ch ng trình có th vi t d i d ng l p ho c c u trúc khác thì không nên s d ng đ qui?

4 Vi t ch ng trình đ qui tính t ng các s l trong kho ng t 1 đ n 2n+1

5 Hãy cho bi t các b c th c hi n chuy n đ a trong bài toán tháp Hà n i v i s l ng đ a

là 5

6 Hoàn thi n mã ngu n cho bài toán 8 quân h u và ch y th cho ra k t qu

Trang 33

CH NG 3

M NG VÀ DANH SÁCH LIÊN K T

Ch ng 3 gi i thi u v các ki u d li u danh sách, bao g m ki u d li u c s m ng và

ki u danh sách nâng cao là danh sách liên k t Ngoài ph n gi i thi u s l c v m ng, ch ng 3

t p trung vào các ki u danh sách liên k t

Ph n danh sách liên k t đ n gi i thi u các khái ni m danh sách, các thao tác c b n trên danh sách nh chèn ph n t , xoá ph n t , duy t qua toàn b danh sách Cu i ph n là m t ví d v

s d ng danh sách liên k t đ n đ bi u di n 1 đa th c

Ch ng này c ng đ c p t i m t s ki u danh sách liên k t khác nh danh sách liên k t vòng và danh sách liên k t kép

h c t t ch ng này, sinh viên c n n m v ng lý thuy t và tìm tòi m t s ví d khác minh

ho cho vi c s d ng m ng và danh sách liên k t

3.1 C U TRÚC D LI U KI U M NG (ARRAY)

Có th nói, m ng là c u trúc d li u c n b n và đ c s d ng r ng rãi nh t trong t t c các ngôn ng l p trình M t m ng là 1 t p h p c đ nh các thành ph n có cùng 1 ki u d li u, đ c

l u tr k ti p nhau và có th đ c truy c p thông qua m t ch s Ví d , đ truy c p t i ph n t

th i c a m ng a, ta vi t a[i] Ch s này ph i là s nguyên không âm và nh h n kích th c c a

m ng (s ph n t c a m ng) Trong ch ng trình, ch s này không nh t thi t ph i là các h ng s

ho c bi n s , mà có th là các bi u th c ho c các hàm

a1 a2 ai ai+1 an

L u ý r ng c u trúc c a b nh máy tính c ng đ c t ch c thành các ô nh , và c ng có th truy c p ng u nhiên thông qua các đ a ch Do v y, vi c l u tr d li u trong m ng có s t ng thích hoàn toàn v i b nh máy tính, trong đó có th coi toàn b b nh máy tính nh 1 m ng, và

Trang 34

Nh đã nói trên, m ng là c u trúc d li u d s d ng, t c đ truy c p cao Tuy nhiên,

nh c đi m chính c a m ng là không linh ho t v kích th c Ngh a là khi ta đã khai báo 1 m ng thì kích th c c a nó là c đ nh, không th thay đ i trong quá trình th c hi n ch ng trình i u này r t b t ti n khi ta ch a bi t tr c s ph n t c n x lý N u khai báo m ng l n s t n b nh

và nh h ng đ n hi u su t c a ch ng trình N u khai báo m ng nh s d n đ n thi u b nh Ngoài ra, vi c b trí l i các ph n t trong m ng c ng khá ph c t p, b i vì m i ph n t đã có v trí

c đ nh trong m ng, và đ b trí 1 ph n t sang 1 v trí khác, ta ph i ti n hành “d n” các ph n t

có liên quan

Trong ph n ti p theo, chúng ta s xem xét m t c u trúc d li u khác, c ng cho phép l u tr

1 t p các ph n t , nh ng có kích th c và cách b trí linh ho t h n ó là c u trúc d li u danh sách liên k t

3.2 DANH SÁCH LIÊN K T

3.2.1 Khái ni m

Khác v i m ng, danh sách liên k t là 1 c u trúc d li u có ki u truy c p tu n t M i ph n

t trong danh sách liên k t có ch a thông tin v ph n t ti p theo, qua đó ta có th truy c p t i

ph n t này

R Sedgewick (Alogrithms in Java - 2002) đ nh ngh a danh sách liên k t nh sau:

Danh sách liên k t là 1 c u trúc d li u bao g m 1 t p các ph n t , trong đó m i ph n t là

Danh sách liên k t có th đ c xem nh là 1 s b trí tu n t các ph n t trong 1 t p B t

đ u t 1 nút, ta coi đó là ph n t đ u tiên trong danh sách T nút này, theo liên k t mà nó tr t i,

ta có nút th 2, đ c coi là ph n t th 2 trong danh sách, v.v c ti p t c nh v y cho đ n h t danh sách Nút cu i cùng có th có liên k t là m t liên k t null, t c là không tr t i nút nào, ho c

nó có th tr v nút đ u tiên đ t o thành 1 vòng

Trang 35

Hình 3.1 Danh sách liên k t

Nh v y, m c dù cùng là c u trúc d li u bao g m 1 t p các ph n t , nh ng gi a danh sách liên k t và m ng có 1 s đi m khác bi t sau:

- M ng có th đ c truy c p ng u nhiên thông qua ch s , còn danh sách ch có th truy

c p tu n t Trong danh sách liên k t, mu n truy c p t i 1 ph n t ph i b t đ u t đ u danh sách sau đó l n l t qua các ph n t k ti p cho t i khi đ n ph n t c n truy c p

- Vi c b trí, s p đ t l i các ph n t trong 1 danh sách liên k t đ n gi n h n nhi u so v i

m ng B i vì đ i v i danh sách liên k t, đ thay đ i v trí c a 1 ph n t , ta ch c n thay

đ i các liên k t c a m t s ph n t có liên quan, còn trong m ng, ta th ng ph i thay

đ i v trí c a r t nhi u ph n t

- Do b n ch t đ ng c a danh sách liên k t, kích th c c a danh sách liên k t có th linh

ho t h n nhi u so v i m ng Kích th c c a danh sách không c n ph i khai báo tr c,

b t k lúc nào có th t o m i 1 ph n t và thêm vào v trí b t k trong danh sách Nói cách khác, m ng là 1 t p có s l ng c đ nh các ph n t , còn danh sách liên k t là 1 t p

typedef struct node *listnode;

u tiên, ta khai báo m t c u trúc node bao g m 2 thành ph n Thành ph n th nh t là 1

bi n nguyên ch a d li u, thành ph n th 2 là m t con tr ch a đ a ch c a nút k ti p Ti p theo,

ta đ nh ngh a m t ki u d li u con tr t i nút có tên là listnode

V i các danh sách liên k t có ki u ph n t ph c t p h n, ta ph i khai báo c u trúc c a ph n

t này tr c (itemstruct), sau đó đ a ki u c u trúc đó vào ki u ph n t trong c u trúc node

struct node {

itemstruct item;

struct node *next;

};

typedef struct node *listnode;

3.2.2 Các thao tác c b n trên danh sách liên k t

Nh đã nói trên, v i tính ch t đ ng c a danh sách liên k t, các nút c a danh sách không

đ c t o ra ngay t đ u mà ch đ c t o ra khi c n thi t Do vây, thao tác đ u tiên c n có trên danh sách là t o và c p phát b nh cho 1 nút T ng ng v i nó là thao tác gi i phóng b nh và

h y 1 nút khi không dùng đ n n a

NULL

Trang 36

Thao tác ti p theo c n xem xét là vi c chèn 1 nút đã t o vào danh sách Do c u trúc đ t bi t

c a danh sách liên k t, vi c chèn nút m i vào đ u, cu i, ho c gi a danh sách có m t s đi m khác

bi t Do v y, c n xem xét c 3 tr ng h p T ng t nh v y, vi c lo i b 1 nút kh i danh sách

c ng s đ c xem xét trong c 3 tr ng h p Cu i cùng là thao tác duy t qua toàn b danh sách Trong ph n ti p theo, ta s xem xét chi ti t vi c th c hi n các thao tác này, đ c th c hi n trên danh sách liên k t có ph n t c a nút là 1 s nguyên nh khai báo đã trình bày trên

3.2.2.1 T o, c p phát, và gi i phóng b nh cho 1 nút

listnode p; // Khai báo bi n p

p = (listnode)malloc(sizeof(struct node));//c p phát b nh cho

p

free(p); //gi i phóng b nh đã c p phát cho nút p;

3.2.2.2 Chèn m t nút vào đ u danh sách

Gi s ta có 1 danh sách mà đ u c a danh sách đ c tr t i b i con tr p

Các b c đ chèn 1 nút m i vào đ u danh sách nh sau:

Trang 37

Gi s ta có 1 danh sách mà đ u c a danh sách đ c tr t i b i con tr p

Các b c đ chèn 1 nút m i vào cu i danh sách nh sau (th c hi n đúng theo trình t ):

- T o và c p phát b nh cho 1 nút m i Nút này đ c tr t i b i q

- D ch chuy n con tr t i nút cu i c a danh sách làm đ c vi c này, ta ph i khai báo 1

bi n con tr m i r Ban đ u, bi n này, c ng v i p, tr đ n đ u danh sách L n l t d ch chuy n r theo các nút k ti p cho t i khi đ n cu i danh sách

- Cho con tr ti p c a nút cu i (đ c tr t i b i r) tr đ n nút m i t o là q, và cho con tr

Trang 38

3.2.2.4 Chèn m t nút vào tr c nút r trong danh sách

Gi s ta có 1 danh sách mà đ u c a danh sách đ c tr t i b i con tr p, và 1 nút r trong danh sách

Ta gi thi t r ng nút r không ph i là nút cu i cùng c a danh sách, vì n u nh v y, ta ch c n

th c hi n thao tác chèn 1 nút vào cu i danh sách nh đã trình bày trên

Các b c đ chèn 1 nút m i vào tr c nút r trong danh sách nh sau (th c hi n đúng theo trình t ):

Trang 39

- Cho con tr ti p c a nút r tr đ n q

void Insert_Middle(listnode *p, int position, int x){

int count=1, found=0;

Chú ý r ng trong hàm này, ta gi s r ng c n ph i xác đ nh nút r trong xâu t i 1 v trí cho

tr c position Sau đó m i ti n hành chèn nút m i vào tr c nút r

3.2.2.5 Xóa m t nút đ u danh sách

Gi s ta có 1 danh sách mà đ u c a danh sách đ c tr t i b i con tr p

Chú ý r ng đ xóa 1 nút trong danh sách thì danh sách đó không đ c r ng

Các b c đ xóa 1 nút đ u danh sách nh sau:

Trang 40

- D ch chuy n con tr p qua ph n t đ u tiên đ n ph n t k ti p

- Ng t liên k t c a bi n t m q v i nút ti p theo, gi i phóng b nh cho q

Gi s ta có 1 danh sách mà đ u c a danh sách đ c tr t i b i con tr p

Các b c đ xóa 1 nút cu i danh sách nh sau:

- D ch chuy n con tr t i nút g n nút cu i c a danh sách làm đ c vi c này, ta ph i dùng 2 bi n t m là q và r L n l t d ch chuy n q và r t đ u danh sách t i cu i danh sách, trong đó q luôn d ch chuy n sau r 1 nút Khi r t i nút cu i cùng thì q là nút g n nút cu i cùng nh t

Ngày đăng: 24/09/2013, 00:29

HÌNH ẢNH LIÊN QUAN

Hình 1.1 Nút giao thông - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 1.1 Nút giao thông (Trang 4)
Hình 1.2   th  ngã r  B A - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 1.2 th ngã r B A (Trang 4)
Hình 1.3   th - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 1.3 th (Trang 6)
Hình 1.4 Tô màu xanh cho các đ nh c a đ  th  ngã r - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 1.4 Tô màu xanh cho các đ nh c a đ th ngã r (Trang 7)
Hình 1.5 Tô màu đ  trong b c 2 - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 1.5 Tô màu đ trong b c 2 (Trang 7)
Hình 1.6 Tô màu l c và màu vàng cho các đ nh còn l i - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 1.6 Tô màu l c và màu vàng cho các đ nh còn l i (Trang 8)
Hình 2.1 Các l i g i  đ  qui  đ c th c hi n khi g i th  t c Fibonaci (6) - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 2.1 Các l i g i đ qui đ c th c hi n khi g i th t c Fibonaci (6) (Trang 17)
Hình 2.2 Bài toán tháp Hà n i - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 2.2 Bài toán tháp Hà n i (Trang 19)
Hình 2.3 K t qu  ch y chu ng trình tháp Hà n i v i 4 đ a - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 2.3 K t qu ch y chu ng trình tháp Hà n i v i 4 đ a (Trang 22)
Hình 2.4 Các n c đi c a quân mã x - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 2.4 Các n c đi c a quân mã x (Trang 25)
Hình 2.5 K t qu  ch y ch ng trình mã đi tu n - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 2.5 K t qu ch y ch ng trình mã đi tu n (Trang 28)
Hình 2.6 Các n c chi u c a quân h u - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 2.6 Các n c chi u c a quân h u (Trang 30)
Hình 3.2 Danh sách liên k t vòng - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 3.2 Danh sách liên k t vòng (Trang 44)
Hình 3.3 Danh sách liên k t kép - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 3.3 Danh sách liên k t kép (Trang 45)
Hình 4.1 Cài đ t ng n x p b ng m ng - Giáo trình cấu trúc dữ liệu và giải thuật.
Hình 4.1 Cài đ t ng n x p b ng m ng (Trang 49)

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w