Giáo trình Cấu trúc dữ liệu - Đại học Cần Thơ

NGUYN VĂN LINH  
TRN CAO ĐỆ  
TRƯƠNG THTHANH TUYN  
LÂM HOÀI BO  
PHAN HUY CƯỜNG  
TRN NGÂN BÌNH  
CU TRÚC DLIU  
1
Cu trúc dliu  
Li nói đu  
ĐẠI HC CN THƠ – 12/2003  
LI NÓI ĐẦU  
Để đáp ng nhu cu hc tp ca các bn sinh viên, nht là sinh viên chuyên ngành tin  
hc, Khoa Công NghThông Tin Trường Đại Hc Cn Thơ chúng tôi đã tiến hành biên  
son các giáo trình, bài ging chính trong chương trình hc. Giáo trình môn Cu Trúc Dữ  
Liu này được biên son cơ bn da trên quyn "Data Structures and Algorithms" ca  
Alfred V. Aho, John E. Hopcroft và Jeffrey D. Ullman do Addison-Wesley tái bn năm  
1987. Giáo trình này cũng được biên son da trên kinh nghim ging dy nhiu năm môn  
Cu Trúc DLiu và Gii Thut ca chúng tôi.  
Tài liu này được son theo đề cương chi tiết môn Cu Trúc DLiu ca sinh viên  
chuyên ngành tin hc ca Khoa Công NghThông Tin Trường Đại Hc Cn Thơ. Mc tiêu  
ca nó nhm giúp các bn sinh viên chuyên ngành có mt tài liu cô đọng dùng làm tài liu  
hc tp, nhưng chúng tôi cũng không loi trtoàn bcác đối tượng khác tham kho. Chúng  
tôi nghĩ rng các bn sinh viên không chuyên tin và nhng người quan tâm ti cu trúc dữ  
liu và gii thut stìm được trong này nhng điu hu ích.  
Mc dù đã rt cgng nhiu trong quá trình biên son giáo trình nhưng chc chn giáo  
trình scòn nhiu thiếu sót và hn chế. Rt mong nhn được sự đóng góp ý kiến quý báu  
ca sinh viên và các bn đọc để giáo trình ngày mt hoàn thin hơn.  
Cn thơ, ngày 10 tháng 11 năm 2003  
Các tác giả  
Trn Cao Đệ  
Nguyn Văn Linh  
Trương ThThanh Tuyn  
Lâm Hoài Bo  
Phan Huy Cường  
Trn Ngân Bình  
2
Trang  
Cu trúc dliu  
Mc lc  
MC LC  
3
Cu trúc dliu  
Mc lc  
4
Trang  
Cu trúc dliu  
Phn tng quan  
PHN TNG QUAN  
1. Mc đích yêu cu  
Môn hc cu trúc dliu cung cp cho sinh viên mt khi lượng ln các kiến thc cơ bn  
vcác kiu dliu tru tượng và các phép toán trên kiu dliu đó. Sau khi hc xong  
môn này, sinh viên cn phi:  
- Nm vng khái nim kiu dliu, kiu dliu tru tượng.  
- Nm vng và cài đặt được các kiu dliu tru tượng cơ bn như danh sách,  
ngăn xếp, hàng đợi, cây, tp hp, bng băm, đồ thbng mt ngôn nglp  
trình căn bn.  
- Vn dng được các kiu dliu tru tượng để gii quyết bài toán đơn gin  
trong thc tế.  
2. Đối tượng sdng  
Môn hc cu trúc dliu được dùng để ging dy cho các sinh viên sau:  
- Sinh viên năm th2 chuyên ngành Tin hc (môn bt buc )  
- Sinh viên năm th2 chuyên ngành Toán tin, Lý tin (môn bt buc)  
- Sinh viên năm thhai chuyên ngành Đin t- Vin thông và tự động hóa (môn  
tchn)  
3. Ni dung ct lõi  
Ni dung giáo trình gm 5 chương và đuc trình bày trong 60 tiết cho sinh viên, trong đó  
có khong 40 tiết lý thuyết và 20 tiết bài tp mà giáo viên shướng dn cho sinh viên trên  
lp. Bên cnh tài liu này còn có tài liu thc hành cu trúc dliu, do vy ni dung giáo  
trình hơi chú trng vcác cu trúc dliu và các gii thut trên các cu trúc dliu đó  
hơn là các chương trình hoàn chnh trong ngôn nglp trình C.  
Chương 1: Trình bày cách tiếp cn tmt bài toán đến chương trình, nó bao gm mô  
hình hoá bài toán, thiết lp cu trúc dliu theo mô hình bài toán, viết gii thut gii  
quyết bài toán và các bước tinh chế gii thut đưa đến cài đặt cthtrong mt ngôn ngữ  
lp trình  
Chương 2: Trình bày kiu dliu tru tượng danh sách, các cu trúc dliu để cài đặt  
danh sách. Ngăn xếp và hàng đợi cũng được trình bày trong chương này như là hai cu  
trúc danh sách đăc bit. Ở đây chúng tôi cũng mun trình bày vic ng dng ngăn xếp để  
khử đệ qui ca chương trình và nêu mt số ứng dng ca hàng đợi. Cui chương, chúng  
tôi trình bày cu trúc danh sách liên kết kép cho nhng bài toán cn duyt danh sách theo  
hai chiu xuôi, ngược mt cách thun li. Chương này có nhiu cài đặt tương đối chi tiết  
6
Cu trúc dliu  
Phn tng quan  
để các bn sinh viên mi tiếp cn vi lp trình có cơ hi nâng cao khnăng lp trình  
trong ngôn ngC đồng thi cũng nhm minh hovic cài đặt mt kiu dliu tru tượng  
trong mt ngôn nglp trình cth.  
Chương 3: Chương này gii thiu vkiu dliu tru tượng cây, khái nim cây tng  
quát, các phép duyt cây tng quát và cài đặt cây tng quát. Kế đến chúng tôi trình bày về  
cây nhphân, các cách cài đặt cây nhphân và ng dng cây nhphân để xây dng mã  
Huffman. Cui cùng, chúng tôi trình bày cây tìm kiếm nhphân như là mt ng dng ca  
cây nhphân để lưu trvà tìm kiếm dliu.  
Chương 4: Chương này dành để nói vkiu dliu tru tượng tp hp, các cách đơn  
gin để cài đặt tp hp như cài đặt bng vectơ bít hay bng danh sách có hoc không có  
tht. Phn chính ca chương này trình bày cu trúc dliu tự đin, đó là tp hp vi ba  
phép toán thêm, xoá và tìm kiếm phn t, cùng vi các cu trúc thích hp cho nó như là  
bng băm và hàng ưu tiên.  
Chương 5: Trình bày kiu dliu tru tượng đồ th, các cách biu din đồ thhay là cài  
đặt đồ th. Ở đây chúng tôi cũng trình bày các phép duyt đồ thbao gm duyt theo  
chiu rng và duyt theo chiu sâu mt đồ th. Do hn chế vthi lượng lên lp nên  
chúng tôi không tách riêng ra để trình bày đồ thcó hướng, đồ thvô hướng nhưng chúng  
tôi sphân bit nó nhng chcn thiết. Chương này đề cp mt sbài toán thường gp  
trên đồ thnhư là bài toán tìm đường đi ngn nht, bài toán tìm cây phti  
thiu.…Chương này được gii thiu để sinh viên tham kho thêm vcách cài đặt đồ thị  
và các bài toán trên đồ th.  
4. Kiến thc tiên quyết  
Để hc tt môn hc cu trúc dliu này, sinh viên cn phi có các kiến thc cơ bn sau:  
- Kiến thc và knăng lp trình căn bn.  
- Kiến thc toán ri rc.  
5. Danh mc tài liu tham kho  
[1] Aho, A. V. , J. E. Hopcroft, J. D. Ullman. "Data Structure and Algorihtms", Addison–  
Wesley; 1983  
[2] Đỗ Xuân Lôi . "Cu trúc dliu và gii thut". Nhà xut bn khoa hc và kthut. Hà  
ni, 1995.  
[3] N. Wirth " Cu trúc dliu + gii thut= Chương trình", 1983.  
[4] Nguyn Trung Trc, "Cu trúc dliu". BK tp HCM, 1990.  
[5] Lê Minh Trung ; “Lp trình nâng cao bng Pascal vi các cu trúc dliu “; 1997  
7
Trang  
Cu trúc dliu  
Phn tng quan  
[6] Ngô Trung Vit, Ngôn nglp trình C và C++ Bài ging- Bài tp – Li gii mu”;  
NXB Giao thông vn ti, 2000.  
[7] Nguyn Đình Tê, Hoàng Đức Hi, “ Giáo trình lý thuyết và bài tp ngôn ngC” ,  
NXB Giáo dc; 1998.  
[8] Lê Xuân Trường, “ Giáo trình cu trúc dliu bng ngôn ngC++”; NXB thng kê;  
1999.  
[9] Nguyn Thanh Thy, Nguyn Quang Huy ,” Bài tp lp trình ngôn ngC”, NXB  
Khoa hc kthut, 1999.  
[10] Michel T. Goodrich, Roberto Tamassia, David Mount, Data Structures and  
Algorithms in C++”. Weley International Edition; 2004.  
8
Trang  
Cu trúc dliu  
Chương I:Mở đầu  
CHƯƠNG I  
MỞ ĐẦU  
TNG QUAN  
1. Mc tiêu  
Sau khi hc xong chương này, sinh viên s:  
Nm được các bước trong lp trình để gii quyết cho mt bài toán.  
Nm vng khái nim kiu dliu tru tượng, skhác nhau gia kiu dliu, kiu dữ  
liu tru tượng và cu trúc dliu.  
2. Kiến thc cơ bn cn thiết  
Các kiến thc cơ bn cn thiết để hc chương này bao gm:  
Khnăng nhn biết và gii quyết bài toán theo hướng tin hc hóa.  
3. Tài liu tham kho  
Aho, A. V. , J. E. Hopcroft, J. D. Ullman. "Data Structure and Algorihtms", Addison–  
Wesley; 1983 (chapter 1)  
Đỗ Xuân Lôi . "Cu trúc dliu và gii thut". Nhà xut bn khoa hc và kthut. Hà  
ni, 1995. (Chương 1)  
4. Ni dung ct lõi  
Chương này chúng ta snghiên cu các vn đề sau:  
- Cách tiếp cn tbài toán đến chương trình  
- Kiu dliu tru tượng (Abstract Data Type).  
- Kiu dliu – Kiu dliu tru tượng – Cu trúc dliu.  
I.  
TBÀI TOÁN ĐẾN CHƯƠNG TRÌNH  
1. Mô hình hóa bài toán thc tế  
Để gii mt bài toán trong thc tế bng máy tính ta phi bt đầu tvic xác định bài toán.  
Nhiu thi gian và công sc bra để xác định bài toán cn gii quyết, tc là phi trli rõ  
ràng câu hi "phi làm gì?" sau đó là "làm như thế nào?". Thông thường, khi khi đầu, hu  
9
 
Cu trúc dliu  
Chương I: Mở đầu  
hết các bài toán là không đơn gin, không rõ ràng. Để gim bt sphc tp ca bài toán  
thc tế, ta phi hình thc hóa nó, nghĩa là phát biu li bài toán thc tế thành mt bài toán  
hình thc (hay còn gi là mô hình toán). Có thcó rt nhiu bài toán thc tế có cùng mt  
mô hình toán.  
Ví d1: Tô màu bn đồ thế gii.  
Ta cn phi tô màu cho các nước trên bn đồ thế gii. Trong đó mi nước đều được tô  
mt màu và hai nước láng ging (cùng biên gii) thì phi được tô bng hai màu khác nhau.  
Hãy tìm mt phương án tô màu sao cho smàu sdng là ít nht.  
Ta có thxem mi nước trên bn đồ thế gii là mt đỉnh ca đồ th, hai nước láng ging  
ca nhau thì hai đỉnh ng vi nó được ni vi nhau bng mt cnh. Bài toán lúc này trở  
thành bài toán tô màu cho đồ thnhư sau: Mi đỉnh đều phi được tô màu, hai đỉnh có cnh  
ni thì phi tô bng hai màu khác nhau và ta cn tìm mt phương án tô màu sao cho smàu  
được sdng là ít nht.  
Ví d2: Đèn giao thông  
Cho mt ngã năm như hình I.1, trong đó C và E là các đường mt chiu theo chiu mũi  
tên, các đường khác là hai chiu. Hãy thiết kế mt bng đèn hiu điu khin giao thông ti  
ngã năm này mt cách hp lý, nghĩa là: phân chia các li đi ti ngã năm này thành các  
nhóm, mi nhóm gm các li đi có thcùng đi đồng thi nhưng không xy ra tai nn giao  
thông (các hướng đi không ct nhau), và slượng nhóm là ít nht có thể được.  
Ta có thxem đầu vào (input) ca bài toán là tt ccác li đi ti ngã năm này, đầu ra  
(output) ca bài toán là các nhóm li đi có thể đi đồng thi mà không xy ra tai nn giao  
thông, mi nhóm stương ng vi mt pha điu khin ca đèn hiu, vì vy ta phi tìm kiếm  
li gii vi snhóm là ít nht để giao thông không btc nghn vì phi chờ đợi quá lâu.  
Trước hết ta nhn thy rng ti ngã năm này có 13 li đi: AB, AC, AD, BA, BC, BD,  
DA, DB, DC, EA, EB, EC, ED. Tt nhiên, để có thgii được bài toán ta phi tìm mt cách  
10  
Trang  
Cu trúc dliu  
Chương I: Mở đầu  
nào đó để thhin mi liên quan gia các li đi này. Li nào vi li nào không thể đi đồng  
thi, li nào và li nào có thể đi đồng thi. Ví dcp AB và EC có thể đi đồng thi, nhưng  
AD và EB thì không, vì các hướng giao thông ct nhau. Ở đây ta sdùng mt sơ đồ trc  
quan như sau: tên ca 13 li đi được viết lên mt phng, hai li đi nào nếu đi đồng thi sẽ  
xy ra đụng nhau (tc là hai hướng đi ct qua nhau) ta ni li bng mt đon thng, hoc  
cong, hoc ngon ngoèo tuthích. Ta scó mt sơ đồ như hình I.2. Như vy, trên sơ đồ này,  
hai li đi có cnh ni li vi nhau là hai li đi không thcho đi đồng thi.  
Vi cách biu din như vy ta đã có mt đồ th(Graph), tc là ta đã mô hình hoá bài toán  
giao thông trên theo mô hình toán là đồ th; trong đó mi li đi trthành mt đỉnh ca đồ  
th, hai li đi không thcùng đi đồng thi được ni nhau bng mt đon ta gi là cnh ca  
đồ th. Bây gita phi xác định các nhóm, vi snhóm ít nht, mi nhóm gm các li đi có  
thể đi đồng thi, nó ng vi mt pha ca đèn hiu điu khin giao thông. Gisrng, ta  
dùng màu để tô lên các đỉnh ca đồ thnày sao cho:  
¾ Các li đi cho phép cùng đi đồng thi scó cùng mt màu: Ddàng nhn thy rng  
hai đỉnh có cnh ni nhau skhông được tô cùng màu.  
¾ Snhóm là ít nht: ta phi tính toán sao cho smàu được dùng là ít nht.  
Tóm li, ta phi gii quyết bài toán sau:  
"Tô màu cho đồ thị ở hình I.2 sao cho:  
¾ Hai đỉnh có cnh ni vi nhau (hai còn gi là hai đỉnh knhau) không cùng màu.  
¾ Smàu được dùng là ít nht."  
11  
Trang  
Cu trúc dliu  
Chương I: Mở đầu  
Hai bài toán thc tế “tô màu bn đồ thế gii” và “đèn giao thông” xem ra rt khác bit  
nhau nhưng sau khi mô hình hóa, chúng thc cht chlà mt, đó là bài toán “tô màu đồ th”.  
Đối vi mt bài toán đã được hình thc hoá, chúng ta có thtìm kiếm cách gii trong  
thut ngca mô hình đó và xác định có hay không mt chương trình có sn để gii. Nếu  
không có mt chương trình như vy thì ít nht chúng ta cũng có thtìm được nhng gì đã  
biết vmô hình và dùng các tính cht ca mô hình để xây dng mt gii thut tt.  
2. Gii thut (algorithms)  
Khi đã có mô hình thích hp cho mt bài toán ta cn cgng tìm cách gii quyết bài toán  
trong mô hình đó. Khi đầu là tìm mt gii thut, đó là mt chui hu hn các chthị  
(instruction) mà mi chthcó mt ý nghĩa rõ ràng và thc hin được trong mt lượng thi  
gian hu hn.  
Knuth (1973) định nghĩa gii thut là mt chui hu hn các thao tác để gii mt bài toán  
nào đó. Các tính cht quan trng ca gii thut là:  
¾ Hu hn (finiteness): gii thut phi luôn luôn kết thúc sau mt shu hn bước.  
¾ Xác định (definiteness): mi bước ca gii thut phi được xác định rõ ràng và phi  
được thc hin chính xác, nht quán.  
¾ Hiu qu(effectiveness): các thao tác trong gii thut phi được thc hin trong mt  
lượng thi gian hu hn.  
Ngoài ra mt gii thut còn phi có đầu vào (input) và đầu ra (output).  
Nói tóm li, mt gii thut phi gii quyết xong công vic khi ta cho dliu vào. Có  
nhiu cách để thhin gii thut: dùng li, dùng lưu đồ, ... Và mt li dùng rt phbiến là  
dùng ngôn nggi, đó là skết hp ca ngôn ngtnhiên và các cu trúc ca ngôn nglp  
trình.  
Ví d: Thiết kế gii thut để gii bài toán “ tô màu đồ thtrên  
Bài toán tô màu cho đồ thkhông có gii thut tt để tìm li gii ti ưu, tc là, không có  
gii thut nào khác hơn là "thtt ccác khnăng" hay "vét cn" tt ccác trường hp có  
thcó, để xác định cách tô màu cho các đỉnh ca đồ thsao cho smàu dùng là ít nht.  
Thc tế, ta chcó th"vét cn" trong trường hp đồ thcó số đỉnh nh, trong trường hp  
ngược li ta không th"vét cn" tt ccác khnăng trong mt lượng thi gian hp lý, do  
vy ta phi suy nghĩ cách khác để gii quyết vn đề:  
Thêm thông tin vào bài toán để đồ thcó mt stính cht đặc bit và dùng các tính  
cht đặc bit này ta có thddàng tìm li gii, hoc  
Thay đổi yêu cu bài toán mt ít cho dgii quyết, nhưng li gii tìm được chưa chc  
là li gii ti ưu. Mt cách làm như thế đối vi bài toán trên là "Cgng tô màu cho đồ thị  
12  
Trang  
 
Cu trúc dliu  
Chương I: Mở đầu  
bng ít màu nht mt cách nhanh chóng". Ít màu nht ở đây có nghĩa là smàu mà ta tìm  
được không phi luôn luôn là smàu ca li gii ti ưu (ít nht) nhưng trong đa strường  
hp thì nó strùng vi đáp sca li gii ti ưu và nếu có chênh lch thì nó "không chênh  
lch nhiu" so vi li gii ti ưu, bù li ta không phi "vét cn" mi khnăng có th! Nói  
khác đi, ta không dùng gii thut "vét cn" mi khnăng để tìm li gii ti ưu mà tìm mt  
gii pháp để đưa ra li gii hp lý mt cách khthi vthi gian. Mt gii pháp như thế gi  
là mt HEURISTIC.  
HEURISTIC cho bài toán tô màu đồ th, thường gi là gii thut "háu ăn" (GREEDY) là:  
¾ Chn mt đỉnh chưa tô màu và tô nó bng mt màu mi C nào đó.  
¾ Duyt danh sách các đỉnh chưa tô màu. Đối vi mt đỉnh chưa tô màu, xác định xem  
nó có kvi mt đỉnh nào được tô bng màu C đó không. Nếu không có, tô nó bng màu C  
đó.  
Ý tưởng ca Heuristic này là hết sc đơn gin: dùng mt màu để tô cho nhiu đỉnh nht  
có thể được (các đỉnh được xét theo mt thtnào đó), khi không thđược na vi màu  
đang dùng thì dùng mt màu khác. Như vy ta có th"hi vng" là smàu cn dùng sít  
nht.  
Ví d: Đồ thhình I.3 và cách tô màu cho nó  
Tô theo GREEDY  
Ti ưu  
(xét ln lượt theo sthtcác  
(thtt ccác khnăng)  
đỉnh)  
1: đỏ; 2: đỏ  
3: xanh;4: xanh  
5: vàng  
1,3,4 : đỏ  
2,5 : xanh  
13  
Trang  
Cu trúc dliu  
Chương I: Mở đầu  
Rõ ràng cách tô màu trong gii thut "háu ăn" không luôn luôn cho li gii ti ưu nhưng  
được thc hin mt cách nhanh chóng.  
Trli bài toán giao thông trên và áp dng HEURISTIC Greedy cho đồ thtrong hình  
I.2 (theo thtcác đỉnh đã lit kê trên), ta có kết qu:  
Tô màu xanh cho các đỉnh: AB,AC,AD,BA,DC,ED  
Tô màu đỏ cho các đỉnh: BC,BD,EA  
Tô màu tím cho các đỉnh: DA,DB  
Tô màu vàng cho các đỉnh: EB,EC  
Như vy ta đã tìm ra mt li gii là dùng 4 màu để tô cho đồ thhình I.2. Như đã nói, li  
gii này không chc là li gii ti ưu. Vy liu có thdùng 3 màu hoc ít hơn 3 màu không?  
Ta có thtrli mô hình ca bài toán và dùng tính cht ca đồ thị để kim tra kết qu. Nhn  
xét rng:  
Mt đồ thcó k đỉnh và mi cp đỉnh bt kỳ đều được ni nhau thì phi dùng k màu để tô.  
Hình I.4 chra hai ví dvi k=3 và k=4.  
Hình I.4  
¾ Mt đồ thtrong đó có k đỉnh mà mi cp đỉnh bt ktrong k đỉnh này đều được ni  
nhau thì không thdùng ít hơn k màu để tô cho đồ th.  
Đồ thtrong hình I.2 có 4 đỉnh: AC,DA,BD,EB mà mi cp đỉnh bt kỳ đều được ni  
nhau vy đồ thhình I.2 không thtô vi ít hơn 4 màu. Điu này khng định rng li gii  
va tìm được trên trùng vi li gii ti ưu.  
Như vy ta đã gii được bài toán giao thông đã cho. Li gii cho bài toán là 4 nhóm, mi  
nhóm gm các li có thể đi đồng thi, nó ng vi mt pha điu khin ca đèn hiu. Ở đây  
cn nhn mnh rng, sdĩ ta có li gii mt cách rõ ràng cht chnhư vy là vì chúng ta đã  
gii bài toán thc tế này bng cách mô hình hoá nó theo mt mô hình thích hp (mô hình đồ  
th) và nhcác kiến thc trên mô hình này (bài toán tô màu và heuristic để gii) ta đã gii  
quyết được bài toán. Điu này khng định vai trò ca vic mô hình hoá bài toán.  
14  
Trang  
Cu trúc dliu  
Chương I: Mở đầu  
3. Ngôn nggivà tinh chế tng bước (Pseudo-language and stepwise refinement)  
Mt khi đã có mô hình thích hp cho bài toán, ta cn hình thc hoá mt gii thut trong  
thut ngca mô hình đó. Khi đầu là viết nhng mnh đề tng quát ri tinh chế dn thành  
nhng chui mnh đề cthhơn, cui cùng là các chththích hp trong mt ngôn nglp  
trình. Chng hn vi heuristic GREEDY, gisử đồ thlà G, heuristic sxác định mt tp  
hp Newclr các đỉnh ca G được tô cùng mt màu, mà ta gi là màu mi C trên. Để tiến  
hành tô màu hoàn tt cho đồ thG thì Heuristic này phi được gi lp li cho đến khi toàn  
thcác đỉnh đều được tô màu.  
void GREEDY ( GRAPH *G, SET *Newclr )  
{
/*1*/ Newclr = ;  
/*2*/ for (mi đỉnh v chưa tô màu ca G)  
/*3*/  
if (v không được ni vi mt đỉnh nào trong Newclr)  
{
/*4*/  
/*5*/  
đánh du v đã được tô màu;  
thêm v vào Newclr;  
}
}
Trong thtc bng ngôn ngginày chúng ta đã dùng mt stkhoá ca ngôn ngC  
xen ln các mnh đề tiếng Vit. Điu đặc bit na là ta dùng các kiu GRAPH, SET có vẻ  
xa l, chúng là các "kiu dliu tru tượng" mà sau này chúng ta sviết bng các khai báo  
thích hp trong ngôn nglp trình cth. Dĩ nhiên, để cài đặt thtc này ta phi cthhoá  
dn nhng mnh đề bng tiếng Vit trên cho đến khi mi mnh đề tương ng vi mt  
đon mã thích hp ca ngôn nglp trình. Chng hn mnh đề if /*3*/ có thchi tiết hoá  
hơn na như sau:  
void GREEDY ( GRAPH *G, SET *Newclr )  
{
/*1*/ Newclr= ;  
/*2*/ for (mi đỉnh v chưa tô màu ca G)  
{
/*3.1*/  
int found=0;  
15  
Trang  
 
Cu trúc dliu  
Chương I: Mở đầu  
/*3.2*/  
/*3.3*/  
/*3.4*/  
/*3.5*/  
for (mi đỉnh w trong Newclr)  
if (có cnh ni gia v và w)  
found=1;  
if found==0  
{
/*4*/  
/*5*/  
đánh du v đã được tô màu;  
thêm v vào Newclr;  
}
}
}
Hình I.5: Biu din tp hp các đỉnh như là mt danh sách (LIST)  
GRAPH và SET ta coi như tp hp. Có nhiu cách để biu din tp hp trong ngôn ngữ  
lp trình, để đơn gin ta xem các tp hp như là mt danh sách (LIST) các snguyên biu  
din chsca các đỉnh và kết thúc bng mt giá trị đặc bit NULL (hình I.5). Vi nhng  
qui ước như vy ta có thtinh chế gii thut GREEDY mt bước na như sau:  
void GREEDY ( GRAPH *G, LIST *Newclr )  
{
int found;  
int v,w ;  
Newclr= ;  
v= đỉnh đầu tiên chưa được tô màu trong G;  
while (v<>null) {  
found=0;  
w=đỉnh đầu tiên trong newclr;  
while( w<>null) && (found=0) {  
16  
Trang  
Cu trúc dliu  
Chương I: Mở đầu  
if có cnh ni gia v và w  
found=1;  
else w= đỉnh kế tiếp trong newclr;  
}
if found==0 {  
Đánh du v đã được tô màu;  
Thêm v vào Newclr;  
}
v= đỉnh chưa tô màu kế tiếp trong G;  
}
}
4. Tóm tt  
Tnhng tho lun trên chúng ta có thtóm tt các bước tiếp cn vi mt bài toán bao  
gm:  
1. Mô hình hoá bài toán bng mt mô hình toán hc thích hp.  
2. Tìm gii thut trên mô hình này. Gii thut có thmô tmt cách không hình  
thc, tc là nó chnêu phương hướng gii hoc các bước gii mt cách tng quát.  
3. Phi hình thc hoá gii thut bng cách viết mt thtc bng ngôn nggi, ri  
chi tiết hoá dn ("mn hoá") các bước gii tng quát trên, kết hp vi vic dùng  
các kiu dliu tru tượng và các cu trúc điu khin trong ngôn nglp trình để  
mô tgii thut. bước này, nói chung, ta có mt gii thut tương đối rõ ràng, nó  
gn ging như mt chương trình được viết trong ngôn nglp trình, nhưng nó  
không phi là mt chương trình chy được vì trong khi viết gii thut ta không  
chú trng nng đến cú pháp ca ngôn ngvà các kiu dliu còn mc tru  
tượng chkhông phi là các khai báo cài đặt kiu trong ngôn nglp trình.  
4. Cài đặt gii thut trong mt ngôn nglp trình cth(Pascal,C,...). bước này ta  
dùng các cu trúc dliu được cung cp trong ngôn ng, ví dArray, Record,...  
để thhin các kiu dliu tru tượng, các bước ca gii thut được thhin  
bng các lnh và các cu trúc điu khin trong ngôn nglp trình được dùng để  
cài đặt gii thut.  
Tóm tt các bước như sau:  
17  
Trang  
 
Cu trúc dliu  
Chương I: Mở đầu  
Mô hình toán hc  
Kiu dliu tru tượng  
Cu trúc dliu  
Gii thut không hình thc Chương trình ngôn nggiả  
Chương trình Pascal,  
C,...  
II. KIU DLIU TRU TƯỢNG (ABSTRACT DATA TYPE -ADT)  
1. Khái nim tru tượng hóa  
Trong tin hc, tru tượng hóa nghĩa là đơn gin hóa, làm cho nó sáng sa hơn và dhiu  
hơn. Cthtru tượng hóa là che đi nhng chi tiết, làm ni bt cái tng th. Tru tượng hóa  
có ththc hin trên hai khía cnh là tru tượng hóa dliu và tru tượng hóa chương trình.  
2. Tru tượng hóa chương trình  
Tru tượng hóa chương trình là sự định nghĩa các chương trình con để to ra các phép  
toán tru tượng (stng quát hóa ca các phép toán nguyên thy). Chng hn ta có thto  
ra mt chương trình con Matrix_Mult để thc hin phép toán nhân hai ma trn. Sau khi  
Matrix_mult đã được to ra, ta có thdùng nó như mt phép toán nguyên thy (chng hn  
phép cng hai s).  
Tru tượng hóa chương trình cho phép phân chia chương trình thành các chương trình  
con. Sphân chia này sche du tt ccác lnh cài đặt chi tiết trong các chương trình con.  
cp độ chương trình chính, ta chthy li gi các chương trình con và điu này được gi  
là sbao gói.  
Ví dnhư mt chương trình qun lý sinh viên được viết bng tru tượng hóa có thlà:  
void Main() {  
Nhap( Lop);  
Xu_ly (Lop);  
Xuat (Lop);  
}
Trong chương trình trên, Nhap, Xu_ly, Xuat là các phép toán tru tượng. Chúng che du  
bên trong rt nhiu lnh phc tp mà cp độ chương trình chính ta không nhìn thy được.  
Còn Lop là mt biến thuc kiu dliu tru tượng mà ta sxét sau.  
V
Chương trình được viết theo cách gi các phép toán tru tượng có lthuc vào  
cách cài đặt kiu dliu không?  
18  
Trang  
 
Cu trúc dliu  
Chương I: Mở đầu  
3. Tru tượng hóa dliu  
Tru tượng hóa dliu là định nghĩa các kiu dliu tru tượng  
Mt kiu dliu tru tượng là mt mô hình toán hc cùng vi mt tp hp các phép toán  
(operator) tru tượng được định nghĩa trên mô hình đó. Ví dtp hp snguyên cùng vi  
các phép toán hp, giao, hiu là mt kiu dliu tru tượng.  
Trong mt ADT các phép toán có ththc hin trên các đối tượng (toán hng) không chỉ  
thuc ADT đó, cũng như kết qukhông nht thiết phi thuc ADT. Tuy nhiên phi có ít  
nht mt toán hng hoc kết quphi thuc ADT đang xét.  
ADT là stng quát hoá ca các kiu dliu nguyên thu.  
Để minh hota có thxét bn phác tho cui cùng ca thtc GREEDY. Ta đã dùng mt  
danh sách (LIST) các snguyên và các phép toán trên danh sách newclr là:  
¾ To mt danh sách rng.  
¾ Ly phn tử đầu tiên trong danh sách và trvgiá trnull nếu danh sách rng.  
¾ Ly phn tkế tiếp trong danh sách và trvgiá trnull nếu không còn phn tkế  
tiếp.  
¾ Thêm mt snguyên vào danh sách.  
Nếu chúng ta viết các chương trình con thc hin các phép toán này, thì ta ddàng thay  
các mnh đề hình thc trong gii thut bng các câu lnh đơn gin  
Câu lnh  
Mnh đề hình thc  
MAKENULL(newclr)  
w=FIRST(newclr)  
newclr= ∅  
w=phn tử đầu tiên trong newclr  
w=phn tkế tiếp trong newclr  
Thêm v vào newclr  
w=NEXT(w,newclr)  
INSERT( v,newclr)  
Điu này cho thy sthun li ca ADT, đó là ta có thể định nghĩa mt kiu dliu tuý  
cùng vi các phép toán cn thiết trên nó ri chúng ta dùng như là các đối tượng nguyên  
thu. Hơn na chúng ta có thcài đặt mt ADT bng bt kcách nào, chương trình dùng  
chúng cũng không thay đổi, chcó các chương trình con biu din cho các phép toán ca  
ADT là thay đổi.  
19  
Trang  
 
Cu trúc dliu  
Chương I: Mở đầu  
Cài đặt ADT là sthhin các phép toán mong mun (các phép toán tru tượng) thành  
các câu lnh ca ngôn nglp trình, bao gm các khai báo thích hp và các thtc thc  
hin các phép toán tru tượng. Để cài đặt ta chn mt cu trúc dliu thích hp có trong  
ngôn nglp trình hoc là mt cu trúc dliu phc hp được xây dng lên tcác kiu dữ  
liu cơ bn ca ngôn nglp trình.  
V
Skhác nhau gia kiu dliu và kiu dliu tru tượng là gì?  
III. KIU DLIU - CU TRÚC DLIU VÀ KIU DLIU TRU  
TƯỢNG (DATA TYPES, DATA STRUCTURES, ABSTRACT DATA  
TYPES)  
Mc dù các thut ngkiu dliu (hay kiu - data type), cu trúc dliu (data structure),  
kiu dliu tru tượng (abstract data type) nghe như nhau, nhưng chúng có ý nghĩa rt khác  
nhau.  
Kiu dliu là mt tp hp các giá trvà mt tp hp các phép toán trên các giá trị đó. Ví  
dkiu Boolean là mt tp hp có 2 giá trTRUE, FALSE và các phép toán trên nó như  
OR, AND, NOT …. Kiu Integer là tp hp các snguyên có giá trt-32768 đến 32767  
cùng các phép toán cng, tr, nhân, chia, Div, Mod…  
Kiu dliu có hai loi là kiu dliu sơ cp và kiu dliu có cu trúc hay còn gi là  
cu trúc dliu.  
Kiu dliu sơ cp là kiu dliu mà giá trdliu ca nó là đơn nht. Ví d: kiu  
Boolean, Integer….  
Kiu dliu có cu trúc hay còn gi là cu trúc dliu là kiu dliu mà giá trdliu  
ca nó là skết hp ca các giá trkhác. Ví d: ARRAY là mt cu trúc dliu.  
Mt kiu dliu tru tượng là mt mô hình toán hc cùng vi mt tp hp các phép toán  
trên nó. Có thnói kiu dliu tru tượng là mt kiu dliu do chúng ta định nghĩa mc  
khái nim (conceptual), nó chưa được cài đặt cthbng mt ngôn nglp trình.  
Khi cài đặt mt kiu dliu tru tượng trên mt ngôn gnlp trình cth, chúng ta phi  
thc hin hai nhim v:  
1. Biu din kiu dliu tru tượng bng mt cu trúc dliu hoc mt kiu dliu tru  
tượng khác đã được cài đặt.  
2. Viết các chương trình con thc hin các phép toán trên kiu dliu tru tượng mà ta  
thường gi là cài đặt các phép toán.  
20  
Trang  
 
Tải về để xem bản đầy đủ
pdf 151 trang baolam 09/05/2022 6800
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Cấu trúc dữ liệu - Đại học Cần Thơ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_cau_truc_du_lieu_dai_hoc_can_tho.pdf