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

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

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 (572.64 KB, 20 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

M C L C

<b>Ụ</b>

<b>Ụ</b>


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 tố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:ụ ề ệ ử ụ ố


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=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   


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

CH

<b>ƯƠ</b>

NG 1: GI I THI U CHUNG

<b>Ớ</b>

<b>Ệ</b>


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


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


<i>Ví dụ: Cho 1 dãy các ph n t , có th  bi u di n d</i>ầ ử ể ể ễ ướ ạ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:<b>ộ ố ấ</b> <b>ề</b>


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:<b>ữ ễ</b> <b>ạ</b> <b>ậ</b>


Ngơn ng  di n đ t thu t toá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++.ế ằ ữ ự ữ


<i>1.3.1. C u trúc c a m t ch<b>ấ</b></i> <i><b>ủ</b></i> <i><b>ộ</b></i> <i><b>ươ</b>ng trình chính:</i>
void main()


{


S1;
S2;
...
Sn;
}



L u ýư :


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=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.ặ ữ ấ ặ ể


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

<i>Ví dụ</i>:


void main() /* Chuong trinh chuyen so he 10 thanh 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 2 la: ";
while (T!=0)


{



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


}


<i>1.3.2. Các ký t :<b>ự</b></i>


<i> </i> 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.


<i>1.3.3. Các câu l nh:<b>ệ</b></i>


<i>­ L nh gánệ</i> :   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;    


<i>­ L nh ghépệ</i> :  

{S

1

; S

2

; ...; S

n

;}

 coi nh  là m t câu l nh (trong đó Sư ộ ệ i là các câu 


l nh).ệ


<i>­ L nh ifệ</i> : 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>;


<i>­ L nh switchệ</i> : Theo c u trúc sau:ấ


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


case gt1: S1;
case gt2: S2;
...


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

}


­ <i>L nh l pệ</i> <i>ặ</i> : for, while, do ... while:  Tương t  nh  các l nh l p c aự ư ệ ặ ủ  


C.


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


­  <i>L nh vào raệ</i> :  cin và cout  gi ng nh  C++.ố ư


<i>1.3.4. Ch<b>ươ</b>ng trình con: </i>


<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 ý<b>ư</b> : 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><b>ị ủ</b>  đ  gán k t qu  cho hàmể ế ả .


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


<i>Ví dụ</i>: 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.ế


<i>Cách 1: </i><b>int namnhuan(x)</b>


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


else


return 0;
}


<i>Cách 2: </i><b>int namnhuan(x)</b>


{ return(((x % 4 == 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).ị ả ề ọ ủ ụ


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


<i>Cách 1:</i> void hoandoi(&a, &b) //a và b là các tham biến


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


<i>Cách 2:</i> void hoandoi(&a, &b)


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


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

a= a-b;
}


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

CH

<b>ƯƠ</b>

NG 2: THI T K  VÀ PHÂN TÍCH THU T

<b>Ế</b>

<b>Ế</b>

<b>Ậ</b>

 TỐN


2.1. Thi t k  thu t tốn:<b>ế ế</b> <b>ậ</b>


<i>2.1.1. Module hố thu t tốn:<b>ậ</b></i>


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 tốn l n thành các bàiớ  


tố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.ấ


<i>Ví dụ:</i>


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.ạ ư ệ


<i>Ví dụ: Ch</i>ươ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, ...ấ ả ề


<i>Yêu c u:ầ</i>


­ 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ổ <sub>S a thơng tin </sub>ử


file d  li uữ ệ Xoá d  


li uệ Xem v i <sub>m i b n </sub>ọ ảớ
ghi


Tra 
c uứ


Th   ẻ
sách


Th ng kêố



Theo 


</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=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.ộ ệ ấ ề ờ


<i>2.1.2. Ph<b>ươ</b>ng pháp tinh ch nh t ng b<b>ỉ</b></i> <i><b>ừ</b></i> <i><b>ướ</b>c:</i>


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 tốn theo ki u top­down.ậ ể


Xu t phát t  ngơn ng  t  nhiên c a thu t toán, thu t toán s  đấ ừ ữ ự ủ ậ ậ ẽ ược chi ti t hốế  
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: <b>ậ</b>


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 .ố ư ệ ả ề ặ ờ ư ớ


<i>2.2.1. Tính đúng đ n:<b>ắ</b></i>


Đây là m t 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.ủ ộ ậ


<i>2.2.2. Mâu thu n gi a tính đ n gi n và tính hi u qu :<b>ẫ</b></i> <i><b>ữ</b></i> <i><b>ơ</b></i> <i><b>ả</b></i> <i><b>ệ</b></i> <i><b>ả</b></i>


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.ầ ề ờ ộ ả ọ ẹ


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


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 toán, ký hi u là T(n).ờ ự ệ ộ ậ ệ


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



</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=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.ể ờ ự ệ ủ ậ


<i>Ví dụ:</i>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 toá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”.ờ ự ệ ậ ộ ứ ạ ủ ậ


<i>2.2.3.1. Đ  ph c t p tính tốn c a thu t toán:ộ</i> <i>ứ ạ</i> <i>ủ</i> <i>ậ</i>


N u th i gian th c hi n m t thu t tốn là T(n) = Cnế ờ ự ệ ộ ậ 2  <sub>(C: h ng), thì ta nói</sub><sub>ằ</sub> <sub> </sub>


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


O(n2<sub>).</sub>


<i>T ng qt:ổ</i>  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).ộ ứ ạ ủ ậ ấ


<i>2.2.3.2. Xác đ nh đ  ph c t p c a thu t toán:ị</i> <i>ộ</i> <i>ứ ạ</i> <i>ủ</i> <i>ậ</i>


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:ộ ứ ạ ừ ầ ủ ậ ụ ể ộ ố ắ


<i>­ Quy t c tính t ngắ</i> <i>ổ</i> :



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))).


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


L u ý<b>ư</b> :  g1(n)   g2(n) ( n   n0)   O(g1(n) + g2(n)) = O(g2(n))


<i>Ví dụ:</i> O(n + log2n) = O(n)


<i>­ Quy t c nhân:ắ</i>


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)   thì   đ   ph c   t p   tính   tốn   làệ ặ ộ ứ ạ  


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


L u ý:<b>ư</b>


 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)ằ


<i>Ví dụ:</i>



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++)


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=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<sub>).</sub>


 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.ợ ấ ấ


<i>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</i>ộ ồ ầ ử ả ộ  


giá tr  cho trị ước.


void timkiem(x)
{



found=0;// gán giá trị cho found lúc ban đầu là 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])


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

CH

<b>ƯƠ</b>

NG 3: Đ  QUY (RECURSION)

<b>Ệ</b>


3.1. Đ i c<b>ạ ươ</b>ng:


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


<i>Ví dụ: M t hàm đ  quy là m t hàm đ</i>ộ ệ ộ ượ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.



<i>Ví dụ: Tên bi n đ</i>ế ượ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).ợ ế


<i>Ví dụ: Cho s  t  nhiên n, ta đ nh nghĩa n! nh  sau:</i>ố ự ị ư 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.ế


<i>Ví dụ: Cho dãy các ph n t  m ng V[1], V[2], ..., V[n] đã đ</i>ầ ử ả ượ ắ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ợ ế  



</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

vi c phân tích đó, ngệ ười ta đã xem thu t toán đ  quy là thu t toá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.ỗ ọ


<i>Ví d :ụ</i>


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);


}


<i>K t qu :ế</i> <i>ả</i> 3 Ong


2 Ba
1 Ong
0 Ba


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


­ Tham s  hố bài tố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.ợ ế


<i>Ví dụ:</i>


<i>1) L p hàm GT(n) = n!ậ</i>


long GT(n)


{ if (n==0) return 1;


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


2) <i>Dãy s  Fibonaciố</i> : F1 = F2 = 1;



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


long F(n)


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=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


<b>Ư</b> <b>ể</b> Khuy t đi m<b>ế</b> <b>ể</b>


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). <sub>Có th  gây t n b  nh  </sub>ể ố ộ ớ   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:

<b>ậ</b>




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 ).ồ ữ ố


<i>Ví d  1ụ</i> <i>: Vi t th  t c in xâu đ o ng</i>ế ủ ụ ả ượ ủ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à <i>batdau và l y </i>ấ <i>soluong ký t .</i>ự


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;
}


<i>Cách 1:</i>


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



</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=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);
}


}


<i>Cách 2:</i>


­ 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];


}
}


<i>Ví d  2ụ</i> <i>:</i> 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  hố bài tố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:ợ ế


</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=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 tốn quay lui:<b>ậ</b>


Ta có th  dùng k  thu t đ  quy đ  di n t  thu t toán quay lui. Bài toán sể ỹ ậ ệ ể ễ ả ậ ử 
d ng thu t tố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 đó.ả ề ệ


<i>Phương pháp c a thu t tốn quay lui:ủ</i> <i>ậ</i>


<i>­</i> 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ó.ệ ấ ả ả ể ủ


<i>Ví dụ</i>: 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 luôn 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:ể ả ủ ụ ệ


</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

void Try(i) //Thử xem xi sẽ nhận giá trị nào
for (mỗi khả năng j của x<i>i</i>)


{


if <Chấp nhận>
{



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


else Try(i+1);
}


}


 

Bài t p:

<b>ậ</b>



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


</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

CH

<b>ƯƠ</b>

NG 4: M NG VÀ DANH SÁCH TUY N TÍNH

<b>Ả</b>

<b>Ế</b>


4.1. M ng và c u trúc l u tr  c a m ng:<b>ả</b> <b>ấ</b> <b>ư</b> <b>ữ ủ</b> <b>ả</b>


­ 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.ả ộ ậ ứ ự ồ ộ ố ố ị ầ ử


<i>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]</i>ể ộ ố ầ ử  


(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.ậ ộ ả ề



<i>Ví dụ: float B[100][100]</i>;


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.ự ả ề ả ề


 <i>C u trúc l u tr :ấ</i> <i>ư</i> <i>ữ</i>


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.ể ế ế


<i>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</i>ọ ả ề ồ ầ ử ỗ ầ ử ộ  


(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ị ỉ ầ ử 0


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


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


L u ý:<b>ư</b>


­ Đ 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 :ự



<i>Ví dụ</i>:  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)


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

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


 

Bài t p:

<b>ậ</b>



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 .ầ ử


<i>L u ýư</i> <i>: do các ph n t  c a m ng th</i>ầ ử ủ ả ườ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 xố / 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):<b>ế</b>


 <i>Đ nh nghĩa:ị</i>


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).ư ữ ử ụ ộ ớ


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=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 1 ... M ... n­1
0 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):<b>ế</b>
<i>4.3.1. Đ nh nghĩa:<b>ị</b></i>


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).


<i>4.3.2. L u tr  Stack b ng m ng:<b>ư</b></i> <i><b>ữ</b></i> <i><b>ằ</b></i> <i><b>ả</b></i>


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 ý:<b>ư</b>


­ 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).ể ạ ỏ ầ ử ỗ ạ



 <i>Thu t toán b  sung m t ph n t  X vào Stack S có đ nh là T:ậ</i> <i>ổ</i> <i>ộ</i> <i>ầ ử</i> <i>ỉ</i>


2


</div>

<!--links-->

×