Giáo trình Cấu trúc dữ liệu và thuật toán trên C++

20 10 0
Giáo trình Cấu trúc dữ liệu và thuật toán trên C++

Đ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

Tuy nhiên, ta có th  so sánh th i gian th c hi n c a hai thu t toán khác nhau.[r]

(1)

M C L C M C L CỤ Ụ

             1   Chương 1: GI I THI U CHUNGỚ Ệ

             3   1.1. Thu t toán và c u trúc d  li u:ậ ấ ữ ệ

             3   1.2. M t s  v n đ  liên quan:ộ ố ấ ề

              3   1.3. Ngơn ng  di n đ t thu t tốn:ữ ễ ậ

              3    Ngơn ng  di n đ t thu t tốn đữ ễ ậ ược quy ướ ục s  d ng trong giáo trình này là ngơn ngữ  t a C++.ự

              3   1.3.1. C u trúc c a m t chấ ủ ộ ương trình chính:

             3   1.3.2. Các ký t :ự

              5   1.3.3. Các câu l nh:ệ

             5   1.3.4. Chương trình con: 

              6   Chương 2: Thi t k  và phân tích thu t TỐNẾ Ế Ậ

             8   2.1. Thi t k  thu t toán:ế ế ậ

             8   2.1.1. Module hoá thu t toán:ậ

             8   2.1.2. Phương pháp tinh ch nh t ng bỉ ước:

              9   2.2. Phân tích thu t tốn: ậ

             9   2.2.1. Tính đúng đ n:ắ

              9   2.2.2. Mâu thu n gi a tính đ n gi n và tính hi u qu :ẫ ữ ả ệ ả

              9   2.2.3. Phân tích th i gian th c hi n thu t toán:ờ ự ệ ậ

             9   Chương 3: đ  quy (RecursiON)Ệ

             12    3.1. Đ i cạ ương:

             12    3.2. Phương pháp đ  thi t k  m t thu t toán đ  quy:ể ế ế ộ ậ ệ

             13    3.3. Thu t toán quay lui:ậ

             16    Chương 4: M ng và danh sách tuy n tínhẢ Ế

              18    4.1. M ng và c u trúc l u tr  c a m ng:ả ấ ữ ủ ả

             18    4.2. Danh sách tuy n tính (Linear list):ế

              19    4.3. Ngăn x p (Stack):ế

              20    4.3.1. Đ nh nghĩa:ị

              20    4.3.2. L u tr  Stack b ng m ng:ư ữ ằ ả

             20    4.3.3. Các ví d :ụ

              21    4.3.4. Stack v i vi c cài đ t thu t toán đ  quy:ớ ệ ặ ậ ệ

              25    4.4. Hàng đ i (Queue):ợ

              28    4.4.1. Đ nh nghĩa:ị

              28    4.4.2. L u tr  Queue b ng m ng:ư ữ ằ ả

             28    Chương 5: danh sách móc n i (LINKED LIST)Ố

             31    5.1. Danh sách móc n i đ n:ố

              31    5.1.1. T  ch c danh sách n i đ n:ổ ứ ố

             31    5.1.2. M t s  phép toán trên danh sách n i đ n:ộ ố ố

             31    5.2. Danh sách n i vòng:ố

             33    5.2.1. Nguyên t c:ắ

             33    5.2.2. Thu t toán b  sung và lo i b  m t nút c a danh sách n i vòng:ậ ổ ỏ ộ ủ ố

             34    5.3. Danh sách n i kép:ố

             34    5.3.1. T  ch c:ổ ứ

              34    5.3.2. M t s  phép toán trên danh sách n i kép:ộ ố ố

              35    5.4. Ví d  v  vi c s  d ng danh sách móc n i:ụ ề ệ ụ ố

(2)

5.5. Stack và Queue móc n i:ố

             37    Chương 6: CÂY (TREE)

              40    6.1. Đ nh nghĩa và các khái ni m:ị ệ

              40    6.1.1. Đ nh nghĩa:ị

              40    6.1.2. Các khái ni m liên quan:ệ

              40    6.2. Cây nh  phân:ị

              41    6.2.1. Đ nh nghĩa và tính ch t:ị ấ

              41    6.2.2. Bi u di n cây nh  phân:ể ễ ị

              42    6.2.3. Phép duy t cây nh  phân:ệ ị

              43    6.2.4. Cây nh  phân n i vòng:ị ố

             49    6.3. Cây t ng quát:ổ

              51    6.3.1. Bi u di n cây t ng quát:ể ễ ổ

              51    6.3.2. Phép duy t cây t ng quát:ệ ổ

              53    6.4.  ng d ng (Bi u di n cây bi u th c s  h c):Ứ ụ ể ễ ể ứ ố ọ

              53    Chương 7:  Đ  th  (GRAPH)Ồ Ị

             58    7.1. Đ nh nghĩa và các khái ni m v  đ  th :ị ệ ề ị

              58    7.2. Bi u  di n đ  th :ể ễ ị

              59    7.2.1. Bi u di n b ng ma tr n lân c n (ma tr n k ):ễ ễ ằ ậ ậ ậ ề

             59    7.2.2. Bi u di n b ng danh sách lân c n (danh sách k )ể ễ ằ ậ ề

              59    7.3. Phép duy t m t đ  th :ệ ộ ị

              61    7.3.1. Tìm ki m theo chi u sâu:ế ề

             61    7.3.2.Tìm ki m theo chi u r ng:ế ề ộ

             62    7.4. Cây khung và cây khung v i giá c c ti u:ớ ự ể

              63    Chương 8:  S P X PẮ Ế

             65    8.1. Đ t v n đ :ặ ấ ề

             65    8.2. M t s  phộ ố ương pháp s p x p đ n gi n:ắ ế ả

             65    8.2.1. S p x p ki u l a ch n:ắ ế ể ự ọ

             65    8.2.2. S p x p ki u chèn:ắ ế ể

             65    8.2.3. S p x p ki u n i b t:ắ ế ể ổ ọ

              66    8.3. S p x p ki u phân đo n (S p x p nhanh ­ quick sort):ắ ế ể ắ ế

              66    8.4. S p x p ki u vun đ ng (Heap sort):ắ ế ể ố

             67    8.5. S p x p ki u tr n (Merge sort):ắ ế ể ộ

             69    Chương 9:  tìm ki mẾ

              71    9.1. Bài tốn tìm ki m:ế

             71    9.2. Tìm ki m tu n t :ế ầ ự

             71    9.3. Tìm ki m nh  phân:ế ị

              71    9.4. Cây nh  phân tìm ki m:ị ế

              71    Tài li u Tham kh oỆ Ả

              74   

(3)

CHƯƠNG 1: GI I THI U CHUNG 1.1. Thu t toán và c u trúc d  li u: ữ ệ

Theo Niklaus Wirth: Thu t toán + C u trúc d  li u = Chậ ấ ữ ệ ương trình

Ví dụ: Cho 1 dãy các ph n t , có th  bi u di n dầ ể ể ễ ướ ại d ng m ng ho c danhả ặ  

sách

C u trúc d  li u và thu t tốn có m i quan h  m t thi t v i nhau. do đó vi cấ ữ ệ ậ ố ệ ậ ế ệ   nghiên c u các c u trúc d  li u sau này đi đôi v i vi c xác l p các thu t toán xứ ấ ữ ệ ệ ậ ậ ử  lý trên các c u trúc  y.ấ ấ

1.2. M t s  v n đ  liên quan:ộ ố ấ

L a ch n m t c u trúc d  li u thích h p đ  t  ch c d  li u vào ra và trên cự ọ ộ ấ ữ ệ ợ ể ổ ứ ữ ệ ơ  s  đó xây d ng đở ự ược thu t tốn x  lý h u hi u nh m đ a t i k t qu  mongậ ữ ệ ằ ế ả   mu n cho bài toán là m t khâu r t quan tr ng.ố ộ ấ ọ

Ta c n phân bi t 2 lo i quy cách d  li u: ầ ệ ữ ệ

Quy cách bi u di n hình th c: Cịn để ễ ứ ược g i là c u trúc logic c a d  li u.ọ ấ ủ ữ ệ   Đ i v i m i ngơn ng  l p trình xác đ nh s  có m t b  c u trúc logic c a dố ỗ ữ ậ ị ẽ ộ ộ ấ ủ ữ  li u. D  li u thu c lo i c u trúc nào thì c n ph i có mơ t  ki u d  li uệ ữ ệ ộ ấ ầ ả ả ể ữ ệ   tương  ng v i c u trúc d  li u đó. ứ ấ ữ ệ Ví d : ụ Trong C có các ki u d  li u: Struct,ể ữ ệ   Union, File,

Quy cách l u tr : là cách bi u di n m t c u trúc d  li u trong b  nh   Víư ữ ể ễ ộ ấ ữ ệ ộ   d : C u trúc d  li u m ng đụ ấ ữ ệ ả ượ ưc l u tr  trong b  nh  theo quy t c l u tr  kữ ộ ắ ữ ế  ti p.ế   Có 2 quy cách l u tr :ư ữ

         L u tr  trong: ví d  RAM.ư ữ ụ

         L u tr  ngồi: ví d  đĩa (disk).ư ữ ụ

1.3. Ngơn ng  di n đ t thu t tốn:ữ ễ

Ngơn ng  di n đ t thu t tốn đữ ễ ậ ược quy ướ ục s  d ng trong giáo trình này  là ngơn ng  t a C++.ữ ự

Đ c đi mặ ể : G n gi ng v i Turbo C++, do đó d  dàng trong vi c chuy nầ ố ễ ệ ể   m t chộ ương trình vi t b ng ngơn ng  t a C++ sang ngơn ng  C++.ế ằ ữ ự ữ

1.3.1. C u trúc c a m t ch ương trình chính: void main()

{

S1; S2; Sn; }

L u ýư :

(4)

Đ  đ n gi n, chể ả ương trình có th  khơng c n vi t khai báo. Tuy nhiên có thể ầ ế ể  mơ t  trả ước chương trình b ng ngơn ng  t  nhiên.ằ ữ ự

Ph n thuy t minh đầ ế ược đ t gi a 2 d u /* , */ ho c // đ  ghi chú trên 1 dòng.ặ ữ ấ ặ ể

(5)

Ví dụ:

void main() /* Chuong trinh chuyen so he 10 he 2*/ {

cout << "n = ";

cin >> n; /* Nhap n la so he cs 10*/ T=0;

while (n!=0) {

r = n % 2; Push(T, r); n = n / 2; }

cout << "Ket qua chuyen doi sang he co so la: "; while (T!=0)

{

Pop(T, r); cout << r; }

}

1.3.2. Các ký t :

  Các ký t  s  d ng trong chự ụ ương trình là tương t  nh  trong C++.ự

L u ý: Trong C++ là có s  phân bi t gi a ch  hoa và ch  thư ự ệ ữ ữ ữ ường

1.3.3. Các câu l nh:

­ L nh gánệ :   V = E;

Trong đó: V là bi n (variable), và E là bi u th c (expression).ế ể ứ

L u ýư : Có th  dùng phép gán chung.  ể Ví dụ: a=b=1;    

­ L nh ghépệ :  {S1; S2;  ; Sn;} coi nh  là m t câu l nh (trong đó Sư ộ ệ i là các câu 

l nh).ệ

­ L nh ifệ : Tương t  nh  l nh if c a ngôn ng  C.ự ệ ủ ữ

if (<biểu thức điều kiện>) <câu lệnh>;

ho c:ặ if (<biểu thức điều kiện>) <câu lệnh 1>; else <câu lệnh 2>;

­ L nh switchệ : Theo c u trúc sau:ấ

switch (<biểu thức>) {

case gt1: S1; case gt2: S2;

(6)

}

­ L nh l pệ : for, while, while:  Tương t  nh  các l nh l p c aự ệ ặ ủ  

C

­ L nh nh yệ : goto n  (n: s  hi u/nhãn c a chố ệ ủ ương trình)

­  L nh vào raệ :  cin cout  gi ng nh  C++.ố

1.3.4. Chương trình con: 

<kiểu trả về> <Tên hàm>(<danh sách tham số>) {

S1; S2; S3;

[return (giá trị trả về) ]      Báo k t thúc chế ương trình con

}

L u ýư : N u hàm có ki u tr  v  khác ki u void thì khi k t thúc hàm ph i có câuế ể ả ề ể ế ả   l nh ệ return <giá tr  c a hàm>ị ủ  đ  gán k t qu  cho hàmể ế ả

Sau đây là ví d  v  hàm có tr  v  giá tr ụ ề ả ề ị

Ví dụ: Vi t chế ương trình con d ng hàm NamNhuan(x). Cho k t qu  n u s  x làạ ế ả ế ố   năm nhu n có giá tr  là True(1), ngậ ị ược l i có giá tr  là False(0); ch ng h nạ ị ẳ :  NamNhuan(1996) cho giá tr  1, NamNhuan(1997) cho giá tr  0. Bi t r ng x đị ị ế ằ ược  g i là năm nhu n n u x chia h t cho 4 và x không chia h t cho 100 ho c x chiaọ ậ ế ế ế ặ   h t cho 400.ế

Cách 1: int namnhuan(x)

{ if ((x % == && x % 100 != 0)||(x % 400 == 0)) return 1;

else

return 0; }

Cách 2: int namnhuan(x)

{ return(((x % == 0) && (x % 100 != 0)) || (x % 400 = 0));

}

Ví d  vi t v  chụ ế ề ương trình con khơng có giá tr  tr  v  (hay cịn g i là th  t c).ị ả ề ọ ủ ụ

Ví dụ: Vi t hàm Hoandoi(a, b) đ  hốn đ i giá tr  c a 2 bi n s  a và b cho nhau.ế ể ổ ị ủ ế ố

Cách 1: void hoandoi(&a, &b) //a b tham biến

{ tam=a; a=b; b=tam; }

Cách 2: void hoandoi(&a, &b)

{ a= a+b; b= a-b;

(7)

a= a-b; }

(8)

CHƯƠNG 2: THI T K  VÀ PHÂN TÍCH THU T  TỐN 2.1. Thi t k  thu t tốn:ế ế

2.1.1. Module hố thu t tốn:

Các bài tốn ngày càng đa d ng và ph c t p, do đó thu t tốn mà ta đ  xu tạ ứ ậ ề ấ   càng có quy mơ l n và vi c vi t chớ ệ ế ương trình c n có m t lầ ộ ượng l p trình đơngậ   đ o. Mu n làm đả ố ược vi c này , ngệ ười ta phân chia các bài toán l n thành các bàiớ   toán nh  (module). Và dĩ nhiên m t module có th  chia nh  thành các module conỏ ộ ể ỏ   khác n a,  b y gi  vi c t  ch c l i gi i s  đữ ấ ệ ổ ứ ả ẽ ược th  hi n theo m t c u trúcể ệ ộ ấ   phân c p.ấ

Ví dụ:

Q trình module hố bài tốn được xem là ngun lý “chia đ  tr ” (divide &ể ị   conquer) hay cịn g i là thi t k  t  đ nh xu ng (top­down) ho c là thi t k  tọ ế ế ỉ ố ặ ế ế ừ  khái quát đ n chi ti t (specialization).ế ế

Vi c module hố trong l p trình th  hi n  :ệ ậ ể ệ

Các chương trình con

C m các chụ ương trình con xung quanh m t c u trúc d  li u nào đó. Ch ngộ ấ ữ ệ ẳ   h n, th  vi n trong C.ạ ệ

Ví dụ: Chương trình qu n lý đ u sách c a m t th  vi n nh m ph c v  đ c giả ầ ủ ộ ệ ằ ụ ụ ộ ả  tra c u sách. C  th , gi  s  ta đã có m t file d  li u g m các b ng ghi v  cácứ ụ ể ả ộ ữ ệ ả ề   thông tin liên quan đ n m t đ u sách nh : tên sách, mã s , tác gi , nhà xu t b n,ế ộ ầ ố ả ấ ả   năm xu t b n, giá ti n,  ấ ả ề

Yêu c u:ầ

­ C p nh t d  li u đậ ậ ữ ệ ược ­ Tìm ki m.ế

­ In  n.ấ

8

A

B C

E F G H I

D

H  chệ ương trình  qu n lý sáchả

C p nh t d  li uậ ậ ữ ệ Tìm ki mế In  nấ

B  sung thêm sáchổ S a thơng tin ử

file d  li uữ ệ Xố d   ữ

li uệ Xem v i m i b n ọ ảớ ghi

Tra  c uứ

Th   ẻ sách

Th ng kêố

Theo  mã

(9)

Nh n xétậ :

­ Vi c module hoá làm cho bài toán đệ ược đ nh hị ướng rõ ràng

­ B ng cách này, ngằ ười ta có th  phân chia cơng vi c cho đ i ngũ l p trình.ể ệ ộ ậ

­ Đây là m t công vi c m t nhi u th i gian.ộ ệ ấ ề

2.1.2. Phương pháp tinh ch nh t ng b ước:

Phương pháp tinh ch nh t ng bỉ ước là phương pháp thi t k  thu t toán g nế ế ậ ắ   li n v i l p trình. Nó ph n ánh tinh th n c a q trình module hố và thi t kề ậ ả ầ ủ ế ế  thu t toán theo ki u top­down.ậ ể

Xu t phát t  ngơn ng  t  nhiên c a thu t tốn, thu t tốn s  đấ ữ ự ủ ậ ậ ẽ ược chi ti t hoáế   d n d n và cu i cùng công vi c x  lý s  đầ ầ ố ệ ẽ ược thay th  d n b i các câu l nhế ầ ệ   (c a m t ngơn ng  l p trình nào đó). Q trình này là đ  tr  l i d n d n các câuủ ộ ữ ậ ể ả ầ ầ   h i: What? (làm gì?), How (làm nh  th  nào?)ỏ ế

2.2. Phân tích thu t tốn: 

Ch t lấ ượng c a m t chủ ộ ương trình hay thu t tốn bao g m:ậ

­ Tính đúng đ n.ắ

­ Tính đ n gi n (d  hi u, d  qu n lý, d  l p).ơ ả ễ ể ễ ả ễ ậ

­ Tính t i  u (hi u qu ) v  m t th i gian cũng nh  không gian nh ố ệ ả ề ặ

2.2.1. Tính đúng đ n:

Đây là m t yêu c u phân tích quan tr ng nh t cho m t thu t tốn. Thơngộ ầ ọ ấ ộ ậ   thường, người ta th  nghi m (test) nh  m t s  b  d  li u nào đó đ  cho ch yử ệ ộ ố ộ ữ ệ ể   chương trình r i so sánh k t qu  th  nghi m v i k t qu  mà ta đã bi t. Tuyồ ế ả ệ ế ả ế   nhiên, theo Dijkstra: “Vi c th  nghi m chệ ệ ương trình ch  ch ng minh s  có m tỉ ứ ự ặ   c a l i ch  không ch ng minh s  v ng m t c a l i”.ủ ỗ ứ ứ ự ắ ặ ủ ỗ

Ngày nay, v i các cơng c  tốn h c ngớ ụ ọ ười ta có th  ch ng minh tính đúng đ nể ứ ắ   c a m t thu t tốn.ủ ộ ậ

2.2.2. Mâu thu n gi a tính đ n gi n và tính hi u qu : ơ

M t thu t toán đ n gi n (d  hi u) ch a h n t i  u v  th i gian và b  nh ộ ậ ả ễ ể ẳ ố ề ộ   Đ i v i nh ng chố ữ ương trình ch  dùng m t vài l n thì tính đ n gi n có th   coiỉ ộ ầ ả ể   tr ng nh ng n u chọ ế ương trình được s  d ng nhi u l n (ví d , các ph n m m)ử ụ ề ầ ụ ầ ề   thì th i gian th c hi n rõ ràng ph i đờ ự ệ ả ược chú ý

u c u v  th i gian và khơng gian ít khi có m t gi i pháp tr n v n.ầ ề ộ ả ọ ẹ

2.2.3. Phân tích th i gian th c hi n thu t toán:

Th i gian th c hi n thu t toán ph  thu c vào nhi u y u t :ờ ự ệ ậ ụ ộ ề ế ố

­ Kích thước d  li u đ a vào (dung lữ ệ ượng).  N u g i n là kích thế ọ ước d  li uữ ệ   vào thì th i gian th c hi n m t thu t tốn, ký hi u là T(n).ờ ự ệ ộ ậ ệ

­ T c đ  x  lý c a máy tính, b  nh  (RAM).ố ộ ủ ộ

(10)

Tuy nhiên, ta có th  so sánh th i gian th c hi n c a hai thu t tốn khác nhau.ể ự ệ ủ ậ

Ví dụ:N u th i gian th c hi n c a thu t toán th  nh t Tế ự ệ ủ ậ ứ ấ 1(n) = Cn2  (C: h ngằ  

dương) và th i gian th c hi n thu t tốn th  hai Tờ ự ệ ậ ứ 2(n) = Kn (K: h ng) thì khi nằ  

khá l n, th i gian th c hi n thu t toán 2 s  t i  u h n so v i thu t toán 1.ớ ự ệ ậ ẽ ố ậ

Cách đánh giá th i gian th c hi n thu t toán theo ki u trên đờ ự ệ ậ ể ược g i là đánhọ   giá th i gian th c hi n thu t tốn theo “đ  ph c t p tính tốn c a thu t tốn”.ờ ự ệ ậ ộ ứ ủ ậ

2.2.3.1. Đ  ph c t p tính tốn c a thu t toán:ộ ứ ạ

N u th i gian th c hi n m t thu t toán là T(n) = Cnế ự ệ ộ ậ  (C: h ng), thì ta nóiằ  

r ng: Đ  ph c t p tính tốn c a thu t tốn này có c p là nằ ộ ứ ủ ậ ấ 2 và ta ký hi u T(n) =ệ  

O(n2).

T ng qt:ổ  T(n) = O(g(n)) thì ta nói đ  ph c t p c a thu t tốn có c p là g(n).ộ ứ ủ ậ ấ

2.2.3.2. Xác đ nh đ  ph c t p c a thu t toán:ị ứ ạ

Vi c xác đ nh đ  ph c t p tính tốn c a m t thu t tốn nói chung là ph c t p.ệ ị ộ ứ ủ ộ ậ ứ   Tuy nhiên, trong th c t  đ  ph c t p c a m t thu t tốn có th  đự ế ộ ứ ủ ộ ậ ể ược xác đ nh tị ừ  đ  ph c t p t ng ph n c a thu t tốn. C  th , ta có m t s  quy t c sau:ộ ầ ủ ậ ụ ể ộ ố ắ

­ Quy t c tính t ngắ :

N u chế ương trình P được phân tích thành 2 ph n: Pầ 1, P2 và n u đ  ph c t pế ộ ứ  

c a Pủ 1 là T1(n) = O(g1(n)) và đ  ph c t p c a Pộ ứ ủ 2 là T2(n) = O(g2(n)) thì đ  ph cộ ứ  

t p c a P là:  T(n) = O(max(gạ ủ 1(n), g2(n)))

Ví dụ: g1(n) = n2, g2(n) = n3.  Suy ra: T(n) = O(n3)

L u ýư :  g1(n)   g2(n) ( n   n0)   O(g1(n) + g2(n)) = O(g2(n))

Ví dụ: O(n + log2n) = O(n)

­ Quy t c nhân:ắ

N u đ  ph c t p c a Pế ộ ứ ủ 1  là O(g1(n)), đ  ph c t p c a Pộ ứ ủ 2  là O(g2(n)) thì độ 

ph c   t p   c a   Pứ ủ 1  l ng   Pồ 2  (P1  câu   l nh   l p)     đ   ph c   t p   tính   tốn   làệ ặ ộ ứ  

O(g1(n).g2(n))

L u ý:ư

 Câu l nh gán, cin, cout, if, switch có th i gian th c hi n b ng h ng s  C =ệ ự ệ ằ ằ ố   O(1)

 Câu l nh l p trong vịng g(n) l n thì s  có th i gian th c hi n là O(g(n)).ệ ặ ầ ẽ ự ệ

 O(Cg(n)) = O(g(n)) (C: h ng)ằ

Ví dụ:

1) Câu l nh:ệ for (i=1;i<=n;i++) // O(n)

P=P*i; // O(1)

có th i gian th c hi n là: O(n*1) = O(n).ờ ự ệ

2) for (i=1;i<=n;i++)

(11)

for (j=1;j<=n;j++) x=x+1;

có th i gian th c hi n là: O(n*n*1) = O(nờ ự ệ 2).

 Thông thường, đ  xác đ nh đ  ph c t p tính tốn c a m t thu t tốn, ngể ị ộ ứ ủ ộ ậ ười ta 

đi tìm m t l nh/phép tốn có s  l n th c hi n là nhi u nh t (l nh/phép toánộ ệ ố ầ ự ệ ề ấ ệ   tích c c) t  đó tính s  l n này ự ố ầ  đ  ph c t p c a tính tốn.ộ ứ ủ

 Có khi th i gian th c hi n m t thu t tốn cịn ph  thu c vào đ c đi m c a dờ ự ệ ộ ậ ụ ộ ặ ể ủ ữ 

li u. B y gi  T(n) trong trệ ấ ường h p thu n l i nh t có th  khác T(n) trongợ ậ ợ ấ ể   trường h p x u nh t. Tuy nhiên, thông thợ ấ ấ ường người ta v n đánh giá đ  ph cẫ ộ ứ   t p tính tốn c a thu t tốn thơng qua T(n) trong trạ ủ ậ ường h p x u nh t.ợ ấ ấ

Ví dụ: Cho m t dãy g m có n ph n t  m ng: V[0], V[1],  , V[n­1]. X là m tộ ầ ả ộ  

giá tr  cho trị ước

void timkiem(x) {

found=0;// gán giá trị cho found lúc ban đầu False i=0;

while ((i< n) && (!found)) if (v[i]==x)

{

cout << i; found=1; }

else i=i+1; if (found==0)

cout << “khơng có”; }

T(n) thu n l i = O(1)ậ ợ (X = V[0])

(12)

CHƯƠNG 3: Đ  QUY (RECURSION) 3.1. Đ i cạ ương:

­ Chương trình đ  quy là chệ ương trình g i đ n chính nó.ọ ế

Ví dụ: M t hàm đ  quy là m t hàm độ ệ ộ ược đ nh nghĩa d a vào chính nó.ị ự

­ Trong lý thuy t tin h c, ngế ọ ười ta thường dùng th  thu t đ  quy đ  đ nh nghĩaủ ậ ệ ể ị   các đ i tố ượng

Ví dụ: Tên bi n đế ược đ nh nghĩa nh  sau:ị

­ M i ch  cái là m t tên.ỗ ữ ộ

­ N u t là tên bi n thì t <ch  cái>, t <ch  s > cũng là tên bi n.ế ế ữ ữ ố ế

­ M t chộ ương trình đ  quy ho c m t đ nh nghĩa đ  quy thì khơng th  g i đ nệ ặ ộ ị ệ ể ọ ế   chính nó mãi mãi mà ph i có m t đi m d ng đ n m t trả ộ ể ế ộ ường h p đ c bi t nàoợ ặ ệ   đó, mà ta g i là trọ ường h p suy bi n (degenerate case).ợ ế

Ví dụ: Cho s  t  nhiên n, ta đ nh nghĩa n! nh  sau:ố ự ị n! = 

1     0!

1)!  ­ (n    * n

­ L i gi i đ  quy: N u l i gi i c a m t bài tốn T nào đó đờ ả ệ ế ả ủ ộ ược th c hi n b ngự ệ ằ   m t l i gi i c a bài tốn T' có d ng gi ng nh  T, nh ng theo m t nghĩa nào đó T'ộ ả ủ ố ư ộ   là "nh  h n" T và T' có khuynh hỏ ướng ngày càng ti p c n v i trế ậ ường h p suyợ   bi n.ế

Ví dụ: Cho dãy các ph n t  m ng V[1], V[2],  , V[n] đã đầ ả ượ ắc s p x p theoế  

th  t  tăng d n, g i X là m t giá tr  b t k  Vi t thu t tốn tìm ki m đ  in v  tríứ ự ầ ọ ộ ị ấ ỳ ế ậ ế ể ị   c a ph n t  nào đó trong m ng có giá tr  b ng X (n u có). Ngủ ầ ả ị ằ ế ượ ạc l i, thơng báo  khơng có

void timkiem(d, c, x) {

if (d>c)

cout << “khong co”; else

{

g=(d+c)/ 2; if (x==V[g]) cout << g;

else if (x<V[g]) timkiem(d, g-1, x); else timkiem(g+1, c, x);

} }

Nh n xétậ :

Bài tốn tìm ki m ban đ u đế ầ ược tách thành các bài tốn tìm ki m v iế   ph m vi nh  h n cho đ n khi g p ph i các trạ ỏ ế ặ ả ường h p suy bi n. Chínhợ ế  

(13)

vi c phân tích đó, ngệ ười ta đã xem thu t tốn đ  quy là thu t tốn th  hi nậ ệ ậ ể ệ   phương pháp "chia đ  tr ".ể ị

N u th  t c ho c hàm ch a l i g i đ n chính nó (ví d  trên) thì đế ủ ụ ặ ứ ọ ế ụ ược g iọ   là đ  quy tr c ti p. Ngệ ự ế ượ ạc l i, có th  t c ch a l i g i đ n th  t c khácủ ụ ứ ọ ế ủ ụ   mà   th  t c này ch a l i l i g i đ n nó thì đở ủ ụ ứ ọ ế ược g i là đ  quy gián ti p,ọ ệ ế   hay còn g i là đ  quy tọ ệ ương h  hay còn g i là Forward.ỗ ọ

Ví d :ụ

void Ba(int n) {

cout << n;

if (n>0) Ong(n-1); }

void Ong(int n); {

cout << n;

if (n>0) Ba(n-1); }

void main() {

Ong(3); }

K t qu :ế Ong

2 Ba Ong Ba

3.2. Phương pháp đ  thi t k  m t thu t toán đ  quy: ế ế ộ

­ Tham s  hoá bài toán.ố

­ Phân tích trường h p chung (đ a bài tốn dợ ướ ại d ng bài tốn cùng lo i nh ngạ   có ph m vi gi i quy t nh  h n theo nghiã d n d n s  ti n đ n trạ ả ế ỏ ầ ầ ẽ ế ế ường h p suyợ   bi n).ế

­ Tìm trường h p suy bi n.ợ ế

Ví dụ:

1) L p hàm GT(n) = n!ậ

long GT(n)

{ if (n==0) return 1;

else return n*GT(n-1); }

2) Dãy s  Fibonaciố : F1 = F2 = 1;

Fn = Fn­1 + F n­2.        (n   3)

long F(n)

(14)

else return F(n-1)+F(n-2); }

Nh n xétậ :

­ Thông thu ng thay vì s  d ng l i gi i đ  quy cho m t bài tốn, ta có th  thayờ ụ ả ệ ộ ể   th  b ng l i gi i không đ  quy (kh  đ  quy) b ng phế ằ ả ệ ệ ằ ương pháp l p.ặ

­ Vi c s  d ng thu t tốn đ  quy có:ệ ụ ậ ệ

u đi m

Ư Khuy t đi mế

Thu n l i cho vi c bi u di n bài tốn.ậ ợ ệ ể ễ Có khi khơng đượ ố ưc t i  u v  th i gian.ề

G n (đ i v i chọ ố ương trình) Có th  gây t n b  nh  ể ố ộ   x y ra hi nả ệ  

tượng tràn b  nh  ngăn x p (Stack) n uộ ế ế   d  li u l n.ữ ệ

­ Chính vì v y, trong l p trình ngậ ậ ười ta c  tránh s  d ng th  t c đ  quy n uố ụ ủ ụ ệ ế   th y không c n thi t.ấ ầ ế

 Bài t p:

1)  Vi t hàm lu  th a float ế ỹ lt(float x, int n) cho ra giá tr  xị n

2) Vi t chế ương trình nh p vào s  nguyên r i đ o ngậ ố ả ượ ốc s  đó l i (khơng đạ ược  dùng phương pháp chuy n s  thành xâu).ể ố

3) Vi t chế ương trình cho phép s n sinh và hi n th  t t c  các s  d ng nh  phânả ể ị ấ ả ố ị   đ  dài n (ộ có g m n ch  s ).ồ ữ ố

Ví d  1ụ : Vi t th  t c in xâu đ o ngế ủ ụ ả ượ ủc c a xâu X

Trước khi xây d ng hàm InNguoc thì ta xây d ng hàm tách chu i con t  chu iự ự ỗ ỗ   m  trẹ ướ ịc t  v  trí là batdau và l y soluong ký t

char *copy(char *chuoi,int batdau,int soluong) { int i; char *tam;

tam=(char *)malloc(100);

for(i=(batdau-1);i<strlen(chuoi)&& i<(batdau-1+soluong);i++) tam[i-(batdau-1)]=chuoi[i];

tam[i]=NULL; return tam; }

Cách 1:

­ Trường h p chung:ợ + In ký t  cu i c a xâu X.ự ố ủ

(15)

+ Đ o ngả ược ph n còn l i.ầ

­ Trường h p suy bi n: N u xâu r ng thì khơng làm gì h t.ợ ế ế ỗ ế

void InNguoc(X){

if (X[0] !=’’) {

cout << X[strlen(X)-1];

InNguoc(copy(X,0,strlen(x)-2); }

}

Cách 2:

­ Trường h p chung:ợ + Đ o ngả ược xâu X đã b  ký t  đ u tiên.ỏ ự ầ

+ In ký t  đ u tiên c a X.ự ầ ủ

­ Trường h p suy bi n: N u xâu r ng thì khơng làm gì h t.ợ ế ế ỗ ế

void Innguoc(X){ if (X!=”“)

{

InNguoc(copy(X, 1,strlen(X)-2); cout << X[0];

} }

Ví d  2ụ : Bài tốn tháp Hà n i: Cho ba c c A, B, C; có n đĩa khác nhau độ ọ ược x pế  

theo th  t  nh  trên l n dứ ự ỏ ướ ằi n m trên c c A. ọ Yêu c u:ầ  Chuy n ch ng đĩa t  c cể ọ   A sang c c C v i đi u ki n:ọ ề ệ

­ M i l n ch  đỗ ầ ỉ ược chuy n m t đĩa.ể ộ

­ Khơng có trường h p đĩa l n đợ ược đ t trên đĩa nh ặ ỏ

­ Có th  dùng c c B làm c c trung gian.ể ọ ọ

 Tham s  hoá bài toán:  ố HaNoi(n, A, B, C) //char A, B, C

Trong đó: n: S  đĩa.ố

A: C c ngu n c n chuy n đĩa đi.ọ ầ ể

B: C c trung gian.ọ

C: C c đích đ  chuy n đĩa đ n.ọ ể ể ế

Chương trình chính nh  sau:ư

void main() {

cin >> n;

A= 'A'; B= 'B'; C= 'C'; HaNoi(3, A, B, C);

}

 Thu t toán đ  quy:ậ ệ

­ Trường h p suy bi n:ợ ế

(16)

­ Trường h p chung (n ợ  2):

Th  v i n=2:ử + Chuy n đĩa th  nh t t  A sang B.ể ứ ấ

+ Chuy n đĩa th  2 t  A sang C.ể

+ Chuy n đĩa th  nh t t  B sang C.ể ứ ấ

 T ng quát:ổ + Chuy n (n ­1) đĩa t  A sang B (C làm trung gian).ể

+ Chuy n 1 đĩa t  A sang C (B: trung gian)ể

+ Chuy n (n ­1) đĩa t  B sang C (A: trung gian).ể

Suy ra thu t toán đ  quy:ậ ệ

void HaNoi(n, A, B, C) {

if (n==1) cout << A << “” << C; else

{

HaNoi(n -1, A, C, B); HaNoi(1, A, B, C);

HaNoi(n -1, B, A, C);

} }

3.3. Thu t toán quay lui:

Ta có th  dùng k  thu t đ  quy đ  di n t  thu t tốn quay lui. Bài tốn sể ỹ ậ ệ ể ễ ả ậ ử  d ng thu t toán quay lui thụ ậ ường có d ng: Xác đ nh m t b  g m n thành ph n: xạ ị ộ ộ ầ 1, 

x2, , xn tho  mãn đi u ki n B nào đó.ả ề ệ

Phương pháp c a thu t toán quay lui:ủ

­ Gi  s  ta đã xác đ nh đả ị ược i­1 thành ph n: xầ 1, x2, , xi­1. Đ  xác đ nh thànhể ị  

ph n xầ i, ta duy t t t c  các kh  năng có th  có c a nó.ệ ấ ả ả ể ủ

Ví dụ: xi có th  có giá tr  t  1 đ n 8; g i j là các giá tr  có th  có c a xể ị ế ọ ị ể ủ i, lúc đó 

ta dùng câu l nh For nh  sau: ệ For (j=1;j<8;j++)

­ Bây gi , v i m i kh  năng j ta ln ki m tra xem j có đờ ỗ ả ể ược ch p nh n khơng?ấ ậ   (li u b  (xệ ộ 1, x2, …, xi) hi n t i có thỗ mãn đi u ki n B hay khơng?)ệ ề ệ

 Nh  v y, x y ra 2 trư ậ ả ường h p:ợ

N u ch p nh n j:ế ấ ậ

­ Xác đ nh xị i theo j: xi=j;

­ Sau đó, n u i cịn nh  h n n thì ta ti n hành xác đ nh xế ỏ ế ị i+1

­ Ngượ ạc l i (i = n) thì ta được m t l i gi i.ộ ả

­ Ki m tra j ti p theo.ể ế

N u t t c  các kh  năng c a j khơng có kh  năng nào đế ấ ả ả ủ ả ược ch p nh n thìấ ậ   quay l i bạ ước trước đ  xác đ nh l i xể ị i­1. (C  ch  ho t đ ng trong b  nhơ ế ộ ộ ớ 

c a thu t tốn đ  quy giúp có th  th c hi n đủ ậ ệ ể ự ệ ược đi u này).ề

 Vi c xác đ nh xệ ị i có th  mơ t  qua th  t c đ  quy sau:ể ả ủ ụ ệ

(17)

void Try(i) //Thử xem xi nhận giá trị for (mỗi khả j xi)

{

if <Chấp nhận> {

<Xác định xi theo j>; // Ví dụ: x[i]=j; if (i==n) <Ghi nhận lời giải>;

else Try(i+1); }

}

 Bài t p:

1) Tìm t t c  các hốn v  c a m t m ng g m có n ph n t ấ ả ị ủ ộ ả ầ

(18)

CHƯƠNG 4: M NG VÀ DANH SÁCH TUY N TÍNH 4.1. M ng và c u trúc l u tr  c a m ng: ư ữ ủ

­ M ng là c u trúc d  li u đ n gi n và thông d ng trong nhi u ngôn ng  l pả ấ ữ ệ ả ụ ề ữ ậ   trình

­ M ng là m t t p có th  t  g m m t s  c  đ nh các ph n t  có cùng quy cách.ả ộ ậ ứ ự ộ ố ố ị ầ

Ví dụ: Trong C, đ  khai báo m t dãy s  nguyên n ph n t : a[0], a[1], , a[n­1]ể ộ ố ầ  

(v i nớ  100), ta khai báo m ng a nh  sau:ả

 int a[100] ;

Lúc này, vi c truy xu t s  thông qua các ph n t  c a m ng, ký hi u:ệ ấ ẽ ầ ủ ả ệ   a[0], a[1], a[99]

­ Ma tr n là m t m ng 2 chi u.ậ ộ ả ề

Ví dụ: float B[100][100];

Khi đó, B[i][j] là m t ph n t  c a ma tr n B. Trong đó i là hàng cịn j là c t.ộ ầ ủ ậ ộ

­ Tương t  ta cũng có m ng 3 chi u, m ng 4 chi u.ự ả ề ả ề

C u trúc l u tr :ấ ư

Cách l u tr  m ng thông thư ữ ả ường (đ i v i m i ngơn ng  l p trình) là l u trố ọ ữ ậ ữ  theo ki u k  ti p.ể ế ế

Ví dụ: G i a là m ng 1 chi u g m có n ph n t , m i ph n t  có đ  dài là dọ ả ề ầ ỗ ầ ộ  

(chi m d byte) và đế ượ ưc l u tr  k  ti p nh  hình dữ ế ế ưới đây:        d       d

a0 a1 an­1

    Loc (a0): đ a ch  ph n t  aị ỉ ầ

 đ a ch  c a ph n t  th  aị ỉ ủ ầ ứ i:

    Loc (ai) = Loc (a0) + d*i

L u ý:ư

­ Đ i v i m ng nhi u chi u, vi c t  ch c l u tr  cũng đố ả ề ề ệ ổ ứ ữ ược th c hi nự ệ   tương t :ự

Ví dụ:  int a[3][2];

a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]  Đ a ch  c a ph n t  aị ỉ ủ ầ ij:

Loc (a[i][j]) = Loc (a[0][0]) + d*(i*n + j)

(19)

Trong đó, n là s  c t c a ma tr n.ố ộ ủ ậ

 Bài t p:

1) Vi t cơng th c t ng qt đ  tính đ a ch  c a m t ph n t  nào đó c a m tế ứ ổ ể ị ỉ ủ ộ ầ ủ ộ   m ng n chi u (Loc a[iả ề 0, …, in­1]), v i ch  s  các chi u này l n lớ ỉ ố ề ầ ượt là: b0 b'0, 

b1 b'1, ,

 bn­1 b'n­1; trong đó: i0   [b0 b'0], i1   [b1 b'1], …, in­1   [bn­1 b'n­1].  Đ a ch  này phị ỉ ụ 

thu c vào đ a ch  c a ch  s  đ u tiên a[bộ ị ỉ ủ ỉ ố ầ 0, b1, , bn­1].  Cho d là đ  dài c a m tộ ủ ộ  

ph n t ầ

L u ýư : do các ph n t  c a m ng thầ ủ ả ường đượ ưc l u tr  k  ti p nhau nên vi cữ ế ế ệ  

truy nh p vào chúng nhanh, đ ng đ u v i m i ph n t  ( u đi m). Trong lúcậ ề ọ ầ ể   đó, nhược đi m c a vi c l u tr  m ng là:ể ủ ệ ữ ả

+ Ph i khai báo ch  s  t i đa, do đó có trả ỉ ố ố ường h p gây lãng phí b  nh ợ ộ

+ Khó khăn trong vi c th c hi n phép xoá / chèn m t ph n t  trongệ ự ệ ộ ầ   m ng.ả

2) Gi  s  trong b  nh  có m ng a g m n ph n t  aả ộ ả ầ 0, a1,   ,an­1

Hãy vi t các hàm sau:ế

+ void Xoa(i): Xoá ph n t  th  i trong m ng này.ầ ứ ả

+ void ChenSau(i, x): Chèn sau ph n t  th  i m t ph n t  có giá tr  là x.ầ ứ ộ ầ ị

4.2. Danh sách tuy n tính (Linear list):ế

Đ nh nghĩa:ị

Danh sách tuy n tính là m t dãy có th  t  aế ộ ứ ự 1, a2, , an (n>=0). N u n=0 đế ược 

g i là danh sách r ng. Ngọ ỗ ượ ạc l i: a1 được g i là ph n t  đ u tiên, aọ ầ ầ n được g i làọ  

ph n t  cu i cùng, và n đầ ố ược g i là chi u dài c a danh sách.ọ ề ủ

­ Đ i v i danh sách tuy n tính, v i m i ph n t  aố ế ỗ ầ i (i =1, n­1) thì có ph n tầ ử 

ti p theo là aế i+1 và v i m i ph n t  aớ ỗ ầ i (i = 2 n) thì có ph n t  đ ng trầ ứ ước là 

ai –1

­ Danh sách tuy n tính khác c  b n v i m ng m t chi u   ch  là ế ả ả ộ ề ỗ kích thước  c a danh sách khơng c  đ nhủ ố ị  b i vì phép b  sung và phép lo i b  thở ổ ỏ ường  xun tác đ ng lên m t danh sách. Ví d : Stack.ộ ộ ụ

­  Có nhi u cách đ  l u tr  m t danh sách tuy n tính:ề ể ữ ộ ế

+ L u tr  theo đ a ch  k  ti p b ng m ng 1 chi u.ư ữ ị ỉ ế ế ằ ả ề

+ L u tr  đ a ch  b ng con tr  (s  d ng danh sách móc n i).ư ữ ị ỉ ằ ỏ ụ ố

+ L u tr  ra file (s  d ng b  nh  ngoài).ư ữ ụ ộ

(20)

+ Phép ghép 2 ho c nhi u danh sách thành m t danh sách (xemặ ề ộ   nh  bài t p, làm trên m ng và tr ).ư ậ ả ỏ

0 M n­1 n­1

+ Phép tách (tách m t danh sách thành 2 danh sách).ộ

+ Sao chép m t danh sách ra nhi u danh sách (2 danh sách).ộ ề

+ C p nh t ho c s a đ i n i dung các ph n t  c a danh sách.ậ ậ ặ ổ ộ ầ ủ

+ S p x p các ph n t  trong danh sách theo th  t   n đ nh trắ ế ầ ứ ự ấ ị ước

+ Tìm ki m m t ph n t  trong danh sách tho  mãn m t đi u ki n choế ộ ầ ả ộ ề ệ   trước

4.3. Ngăn x p (Stack):ế 4.3.1. Đ nh nghĩa:

Stack là m t ki u danh sách tuy n tính đ c bi t, trong đó phép b  sung và lo iộ ể ế ặ ệ ổ   b  ch  th c hi n   m t đ u g i là đ nh Stack (đ u kia g i là đáy c a Stack).ỏ ỉ ự ệ ộ ầ ọ ỉ ầ ọ ủ

Nguyên t c b  sung và lo i b  đ i v i Stack đắ ổ ỏ ố ược g i là nguyên t c vào sauọ ắ   ra trước (LIFO – Last In First Out)

4.3.2. L u tr  Stack b ng m ng:ư

Vì Stack là m t danh sách tuy n tính nên có th  s  d ng m ng m t chi u độ ế ể ụ ả ộ ề ể  t  ch c m t Stack. Ch ng h n: s  d ng m ng S đ  l u tr  dãy các ph n t :ổ ứ ộ ẳ ụ ả ể ữ ầ   S[1], S[2], , S[n] (n g i là s  ph n t  c c đ i c a m ng S).ọ ố ầ ự ủ ả

G i T là ch  s  c a ph n t  đ nh c a Stack. T đọ ỉ ố ủ ầ ỉ ủ ượ ục s  d ng đ  theo dõi v  tríể ị   đ nh c a Stack nên n u s  d ng danh sách móc n i đ  t  ch c m t Stack thì Tỉ ủ ế ụ ố ể ổ ứ ộ   được xem nh  là m t con tr  ch  vào v  trí đ nh c a Stack.ư ộ ỏ ỉ ị ỉ ủ

Giá tr  c a T s  tăng lên m t đ n v  khi b  sung m t ph n t  vào danh sách vàị ủ ẽ ộ ị ổ ộ ầ   s  gi m b t 1 khi lo i b  m t ph n t  ra kh i Stack.ẽ ả ỏ ộ ầ ỏ

S[n] … S[T]

… S[2] S[1]

L u ý:ư

­ Khi T = n thì khơng th  b  sung thêm (hay nói cách khác là Stack đ y).ể ổ ầ

­ Khi T = 0 thì khơng th  lo i b  ph n t  vì khi đó Stack r ng (hay Stack c n).ể ỏ ầ ỗ

Thu t toán b  sung m t ph n t  X vào Stack S có đ nh là T:ậ ầ ử

2

Ngày đăng: 30/03/2021, 04:45

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan