Giáo trình Cấu trúc dữ liệu và giải thuật (Bản đẹp)

UBND TỈNH HẢI PHÒNG  
TRƯỜNG CAO ĐẲNG CÔNG NGHIỆP HẢI PHÒNG  
...................................................  
GIÁO TRÌNH  
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT  
(Lưu hành nội bộ)  
HẢI PHÒNG  
LỜI GIỚI THIỆU  
Giáo trình “Cấu trúc dữ liệu và giải thuật” biên soạn dựa theo chương trình  
môn học Cấu trúc dữ liệu và giải thuật thuộc chương trình đào tạo trình độ Cao  
đẳng và Trung cấp nghề Quản trị mạng máy tính của trường Cao đẳng Công  
nghiệp Hải Phòng.  
Giáo trình gồm 7 chương, đề cập đến những kiến thức cơ bản về cấu trúc dữ  
liệu và các giải thuật có liên quan. Từng chương trong giáo trình cũng cố gắng gắn kết  
và phát triển nội dung có liên quan ở các môn học trước hay ở các chương trong giáo  
trình với nhau, giúp sinh viên nâng cao về kỹ thuật lập trình, về chọn cấu trúc dữ liệu  
phù hợp và xây dựng các giải thuật giải các bài toán cơ bản.  
Giáo trình cố gắng trình bày để phục vụ cho đối tượng sinh viên năm thứ hai  
vừa học qua một ngôn ngữ lập trình. Trong mỗi chương đều có ví dụ diễn giải làm rõ  
những định nghĩa, khái niệm và đặc biệt với mỗi giải thuật đều có mô tả và cài đặt  
giải thuật hoặc ví dụ áp dụng. Cuối mỗi chương là những câu hỏi về lý thuyết và bài  
tập ở mức độ dễ, vừa, giúp sinh viên củng cố kiến thức.  
Cùng với giáo trình này, giáo viên có thể yêu cầu sinh viên tự đọc một số  
phần, như vậy sẽ có nhiều thời gian giảng kỹ những phần chính, khó hoặc luyện được  
nhiều bài tập. Bên cạnh đó cũng giúp sinh viên rèn luyện khả năng tự học của bản  
thân.  
Nhóm tác giả chân thành cảm ơn những đồng nghiệp trong khoa Công nghệ  
thông tin trường Cao đẳng nghề Công nghệ Việt - Hàn Bắc Giang đã tham gia xây  
dựng, đóng góp ý kiến và hoàn thiện giáo trình này.  
TỔ BỘ MÔN TIN HỌC  
3
 
MỤC LỤC  
LỜI GIỚI THIỆU................................................................................................................3  
MỤC TIÊU:..................................................................................................................8  
CHƯƠNG 1..........................................................................................................................9  
1.  
2.  
Cấu trúc dữ liệu .....................................................................................................12  
3.  
3.2. Biểu diễn giải thuật ...........................................................................................15  
3.4. Đánh giá độ phức tạp của giải thuật..................................................................19  
3.4.1. Đặt vấn đề ................................................................................................19  
CHƯƠNG 2........................................................................................................................24  
1.  
2.  
Khái niệm đệ qui....................................................................................................24  
2.1. Giải thuật đệ qui................................................................................................25  
3.  
4.  
Thiết kế giải thuật đệ qui .......................................................................................27  
3.1. Giải thuật đệ qui đơn giản.................................................................................27  
CHƯƠNG 3. DANH SÁCH..............................................................................................34  
1.  
1.1. Khái niệm danh sách tuyến tính........................................................................34  
1.3. Danh sách liên kết .............................................................................................48  
4
 
5
6
3.5. Toán tử so sánh: ..............................................................................................136  
3.6. Hằng con trỏ:...................................................................................................136  
4.  
4.5. Con trỏ và kiểu cấu trúc ..................................................................................148  
PHỤ LỤC 2 ......................................................................................................................156  
cài đặt bằng mảng.........................................................................................................166  
7
CHƯƠNG TRÌNH MÔN HỌC  
Tên môn học: Cấu trúc dữ liệu và giải thuật  
Mã môn học: MH 12  
Thời gian thực hiện môn học: 77 giờ; (Lý thuyết: 22 giờ; Thực hành , thí nghiệm,  
thảo luận, bài tập: 49 giờ, Kiểm tra: 6 giờ)  
I. Vị trí, tính chất của môn học:  
Vị trí: sau các môn học tin học, lập trình căn bản.  
Tính chất: Là môn học kỹ thuật cơ sở.  
II. Mục tiêu môn học:  
Kiến thức:  
Trình bày được mối quan hệ giữa cấu trúc dữ liệu và giải thuật trong việc  
xây dựng chương trình;  
Trình bày được ý nghĩa, cấu trúc, cách khai báo, các thao tác của các loại  
cấu trúc dữ liệu (mảng, danh sách liên kết, cây) và các giải thuật cơ bản xử lý các  
cấu trúc dữ liệu đó.  
Kỹ năng:  
Xây dựng được cấu trúc dữ liệu cho một số bài toán ứng dụng cụ thể (Tạo,  
hiển thị, tính toán, sắp xếp, tìm kiếm …);  
Thực hiện được một số giải thuật bằng ngôn ngữ lập trình C hoặc Pascal. Về  
năng lực tự chủ và trách nhiệm: Nghiêm túc và tích cực trong việc học lý thuyết và  
làm bài tập, chủ động tìm kiếm các nguồn tài liệu liên quan đến môn học.  
III. Nội dung môn học:  
Thời gian (giờ)  
TT  
Tên chương/mục  
Tổng  
số  
TH/TN/  
TL/BT  
LT  
KT  
Chương 1: Phân tích và thiết kế giải thuật  
1.1. Tổng quan về cấu trúc dữ liệu và giải  
thuật  
1.1.1. Cấu trúc dữ liệu  
1.1.2. Giải thuật  
1.1.3. Mối liên hệ giữa cấu trúc dữ liệu và  
I. giải thuật  
3
3
3
1.2. Phân tích giải thuật  
1.2.1. Tính toán thời gian thực hiện giải  
thuật  
1.2.2. Kết luận và lưu ý  
Luyện tập chương 1: Phân tích và thiết kế  
giải thuật  
3
II.  
Chương 2: Đệ quy  
8
2.1. Khái niệm  
2.1.1. Điều kiện để viết được chương  
trình đệ quy  
2.1.2. Khi nào không nên sử dụng đệ quy  
2.2.Thiết kế giải thuật đệ quy  
2.2.1. Chương trình tính hàm n!  
2.2.2. Thuật toán Euclid tính ước số  
chung  
3
9
3
3
3
2.2.3. Các giải thuật đệ quy dạng chia để  
trị  
Luyện tập chương 2: Đệ quy  
9
Chương 3: Mảng, danh sách và các kiểu dữ  
liệu trừu tượng  
3.1. Cấu trúc dữ liệu kiểu mảng  
3.2. Danh sách liên kết  
3.2.1 Khái niệm  
3.2.2 Cac thao tac cơ ban trên danh sach  
liên kêt  
3
3
3.2.3 Môt sô danh khac cua danh sach  
liên kêt  
3.3. Ngăn xếp và hàng đợi  
3.3.1 Ngăn xếp (stack)  
3.3.2 Hàng đợi (Queue)  
Luyện tập chương 3: Mảng, danh sách và  
các kiểu dữ liệu trừu tượng  
Bài kiểm tra số 1  
11  
1
11  
1
IV  
Chương 4: Cấu trúc dữ liệu kiểu cây  
4.1 Khái niệm, cài đặt cây  
4.1.1 Khái niệm cây  
4.1.2 Một số khái niệm cơ bản  
4.2 Duyệt cây  
3
3
4.2.1 Duyệt cây thứ tự trước  
4.2.2 Duyệt cây thứ tự giữa  
4.2.3 Duyệt cây thứ tự sau  
4.2.4 Cài đặt cây  
4.2.5 Cài đặt cây thông qua danh sách  
các nút con  
4.3 Cây nhị phân  
4.3.1 Khái niệm  
4.3.2 Duyệt cây nhị phân  
4.3.3 Cài đặt cây nhị phân  
Luyện tập chương 4: Cấu trúc dữ liệu kiểu  
cây  
5
5
9
Bài kiểm tra số 2  
Chương 5: Đồ thị  
5.1 Các khái niệm cơ bản  
5.1.1 Đồ thị có hướng  
5.1.2 Đồ thị vô hướng  
5.1.3 Đồ thị có trọng số  
5.2 Biểu diễn đồ thị  
5.2.1 Biểu diễn đồ thị bằng ma trận kề  
5.2.2 Biểu điễn đồ thị bằng danh sách kề  
5.3 Duyệt đồ thị  
1
3
1
V
3
5.3.1 Duyệt theo chiều sâu  
5.3.2 Duyệt theo chiều rộng  
Chương 6: Sắp xếp  
VI  
Chương 6 Sắp xếp  
2
2
2
6.1 Bài toán sắp xếp  
6.2 Các giải thuật sắp xếp đơn giản  
Luyện tập chương 6: Sắp xếp  
Bài kiểm tra số 3  
Chương 7: Tìm kiếm  
Chương 7: Tìm kiếm  
11  
2
11  
10  
2
2
VII  
7.1 Bài toán tìm kiếm  
2
7.2 Cây nhị phân tìm kiếm  
7.3. Cây tìm kiếm nhị phân  
Luyện tập chương 7: Tìm kiếm  
10  
2
VII  
I
Kiểm tra hết môn  
10  
CHƯƠNG 1  
PHÂN TÍCH VÀ THIẾT KẾ GIẢI THUẬT  
Muc tiêu:  
Trình bày được khái niệm vê câu truc dư liêu, giải thuật, mối quan  
hệ giữa cấu trúc dữ liệu và giải thuật. Đánh giá được độ phức tạp của giải thuật.  
Trình bày được các kiểu dữ liệu cơ bản, các kiểu dữ liệu cấu trúc  
và kiểu dữ liệu trừu tượng.  
Khái niệm cấu trúc dữ liệu và giải thuật, cấu trúc lưu trữ và cấu trúc dữ liệu.  
Khái niệm cấu trúc dữ liệu và giải thuật  
Algorithms + Data Structures = Programs  
" Giai thuật + Cấu trúc dữ liệu = Chương trình "  
Đo la nhan đê cuốn sách đươc xuât ban năm 1975, bơi nha khoa hoc may tinh  
Thuy sy Niklaus Wirth Emil, cuôn sach đa đươc công nhân rông rai va vân con  
hưu dung đên ngay nay. Năm vưng câu truc dư liêu va giai thuât la cơ sơ giup sinh  
viên có khả năng đi sâu thêm vào các môn học chuyên ngành.  
Giải thuật(Algorithms): Đó là một dãy các câu lệnh (statements) chặt chẽ và  
rõ ràng xác định một trình tự các thao tác trên một số các đối tượng nào đó, sao  
cho sau một số hữu hạn bước thực hiện ta đạt đươc kết quả mong muốn.  
Dữ liệu (Data): Là đối tượng của giải thuật để khi tác động bởi các thao tác  
của giải thuật ta nhận được kết quả mong muốn.  
Giải thuật chỉ phản ánh các phép xử lí, còn đối tượng để xử lí trên MTĐT,  
chính là dữ liệu (data) chúng biểu diễn các thông tin cần thiết cho bài toán: Các dữ  
kiện đưa vào, các kết quả trung gian va kêt qua đâu ra cua bai toan.  
Ví dụ 1.1: Chương trinh tìm ươc chung lớn nhất của 2 số nguyên dương a và b.  
Dư kiên đưa vao (input): a, b nguyên dương  
Phep xư ly (Process) : Dưa theo thuât toan Euclid, thuât toan nôi tiêng nhât co  
tư thơi cô đai.  
Bươc 1: Tim r, la phân dư cua phep chia a cho b.  
Bươc 2:  
Nêu r = 0.  
Thi: Gan gia tri cua b cho E (E←b) va dưng lai  
Nêu ngươc lai (r ≠ 0).  
Thi: Gan gia tri b cho a ( a←b).  
Gan gia tri r cho b (b←r) va quay lai bươc 1.  
11  
 
Kêt qua ra (Output): E, Ươc chung lơn nhât cua a va b.  
Cấu trúc dữ liệu (Data Structures): Cách sắp xếp, tổ chức dữ liệu, tạo quan  
hệ nội tại giữa các phần tử dữ liệu, tạo thuận lợi cho các phép xử lý và nâng cao  
hiệu quả của chúng.  
Bản thân các phần tử của dữ liệu có mối quan hệ với nhau, ngoài ra nếu lại  
biết “tổ chức” theo các cấu trúc thích hợp thì việc thực hiện các phép xử lí trên các  
dữ liệu càng thuận lợi hơn, đạt hiệu quả cao hơn.  
Vi du 1.2: Viêt chương trinh thưc hiên công viêc sau:  
Nhâp vao tư ban phim n sô nguyên bât ky  
Tinh tông cac sô vưa nhâp va đưa kêt qua ra man hinh  
Dư kiên đưa vao (input): so, tong la 2 biên sô nguyên và n là số lượng số nguyên.  
Phep xư ly (Process) : Thưc hiên n lân công viêc sau:  
Nhâp gia tri cho biên so  
-
-
Công gia tri biên so vao biên tong  
Kêt qua ra (Output): tong, tông n sô nguyên vưa nhâp  
Vơi 2 yêu câu (a, b) cua bai toan, ta chi cân môt biên so đê lưu gia tri tưng sô  
nguyên nhâp vao va công gôp dân gia tri ngay vao môt biên tong.  
Vi du 1.3: Viêt chương trinh thưc hiên công viêc sau:  
Nhâp vao tư ban phim n sô nguyên bât ky.  
Tinh tông cac sô vưa nhâp va đưa kêt qua ra man hinh.  
Săp xêp day sô theo chiều tăng dần va đưa day đa săp xêp ra man  
hinh.  
Dư kiên đưa vao (input):  
tong la biên sô nguyên.  
M la môt biên mang kiểu phân tư là kiêu sô nguyên.  
n là số lượng số nguyên.  
Phep xư ly (Process:  
Bươc 1: Thưc hiên n lân công viêc sau:  
-
-
Nhâp gia tri cho tưng phân tư mang M[i]  
Bươc 2: Thưc hiên n lân công viêc sau:  
Công gia tri tưng biên M[i] vao biên tong  
Bươc 3: Thưc hiên săp xêp day sô theo chiêu tăng dân  
Kêt qua ra (Output):  
-
tong, tông n sô nguyên vưa nhâp  
12  
-
M, Day sô đa săp xêp theo chiều tăng dần  
ꢁ vi du nay co thêm yêu câu thư 3 (c), ta không thê dung môt biên so, hay  
khai bao n biên so đươc (vi không biêt n la bao nhiêu 10, 100 hay 10000,…). Phai  
cân môt biên mang M đê lưu gia tri n sô nguyên nhâp vao tư ban phim va day sô  
nguyên đa đươc săp xêp. (nhiều ngôn ngư lâp trinh đêu đinh nghia sꢀn kiêu dư  
liêu mang (array): gôm môt tâp hơp hưu han cac phꢁn tư cꢂ cꢃng kiêu dư liêu, ta  
chꢄ cꢁn khai bao tên kiêu mang, sô lương phꢁn tư va kiêu dư liêu cua phꢁn tư khi  
cꢁn  
̀
sử dụng.)  
So sanh 2 vi du trên ta nhân thây co sư khac biêt sau :  
Ví dụ  
Dữ kiện đưa vào  
Phép xử lý  
Kết quả đưa ra  
Ví dụ 1.2 Chi cân môt biên Viêc tinh tông Gia tri biên tong  
so đê lưu giư tưng được thực hiện  
sô nguyên  
ngay sau mỗi lần  
nhâp sô nguyên  
Ví dụ 1.3 Phai cân  
biên Co thê tach riêng Gia tri biên tong va  
M để lưu viêc tinh tông sau biên mꢀ  
̉
ng M chứa n  
khi nhâp giá trị sô nguyên đa đươc  
cho n sô nguyên sắp xếp tăng dần  
mꢀng  
giư n sô nguyên  
Tom lai, giữa cấu trúc dữ liệu và giải thuật có mối quan hệ mật thiết, không  
thể nói tới giải thuật mà không nghĩ tới: Giải thuật đꢂ được tác động trên dữ liệu  
nào, còn khi xét tới dữ liệu thì cũng phải hiểu: Dữ liệu ấy cꢁn được tác động bởi  
́
̀
giải thuật gì để đưa tới kết quả mong muốn. Với một cấu trúc dư liệu đã chọn ta sẽ  
có giải thuật xử ly tương ứng. Cấu trúc dữ liệu thay đổi, giải thuật cũng có thể thay  
đổi theo.  
1.2. Cấu trúc dữ liệu và cấu trúc lưu trữ  
Cách biểu diễn một câu truc dư liêu (CTDL) trong bộ nhớ được gọi là cấu  
trúc lưu trữ (storage sructures). Đó chính là cách cài đặt cấu trúc ấy trên may tinh  
điên tư và trên cơ sở cấu trúc lưu trữ này mà thực hiện các phép xử lí. Sự phân biệt  
giữa CTDL và cấu trúc lưu trữ tương ứng, cần phải được đặt ra. Cꢂ  
cấu trúc lưu trữ khác nhau cho cꢃng một CTDL, cũng như cꢂ thể cꢂ  
khác nhau mà được thể hiện trong bộ nhớ bởi cꢃng một kiểu cấu trúc lưu trữ  
́
thể cꢂ  
́ nhiều  
̀
́
́ những CTDL  
̀
13  
 
(thường khi xử lí, mọi chú ý đều hướng tới cấu trúc lưu trữ nên ta dễ quên mất  
CTDL tương ứng).  
Phân biệt lưu trữ trong và lưu trữ ngoài:  
Lưu trữ trong: Là lưu trữ ở bộ nhớ trong.  
Lưu trữ ngoài: Là lưu trữ ở bộ nhớ ngoài (đĩa từ, đĩa quang,.....).  
Ví dụ 1.4: CTDL kiểu mảng và Stack cùng được lưu trữ trong bộ nhớ bởi vectơ  
lưu trữ  
a[0] A[1] a[2]  
....  
..... a[n-1]  
Đỉnh  
a[n-1]  
....  
....  
a[1]  
a[0]  
Đáy  
Cấu trúc dữ liệu  
Trong môi bài toán, Lưạ chọn một CTDL thích hợp để tổ chức dữ liệu vào và  
trên cơ sở đó xây dựng được giải thuật xử ly hữu hiệu đưa tới kết quả mong muốn  
cho bài toán, đó là một khâu rất quan trọng. Muốn vậy cần nắm vững đặc điểm và  
các phép toán cơ bản của từng kiểu dữ liệu được sử dụng trong mỗi ngôn ngữ lập  
trình là yêu cầu cần thiết.  
2.1. Các kiểu dữ liệu cơ bản  
Các loại dữ liệu cơ bản là các loại dữ liệu đơn giản, cơ sở. Chúng thường là  
các giá trị vô hướng như các số nguyên, số thực, các ký tự, các giá trị logic ... Các  
loại dữ liệu này, do tính thông dụng và đơn giản của mình, thường được các ngôn  
ngữ lập trình (NNLT) cấp cao xây dựng sẵn như một thành phần của ngôn ngữ để  
giảm nhẹ công việc cho người lập trình. Thông thường, các kiểu dữ liệu cơ bản  
bao gồm:  
Kiểu cꢂ́ thứ tự rời rạc: số nguyên, ký tự, logic , liệt kê, miền con …  
Kiểu không rời rạc: số thực.  
Ví dụ: Các kiểu dữ liệu định sẵn trong C gồm:  
Tên kiểu Sô bytes  
Miền giá trị  
-128 đến 127  
Ghi chú  
Char  
1
Có thể dùng như số nguyên 1  
byte có dấu hoặc kiểu ký tự  
Số nguyên 1 byte không dấu  
unsigned char  
Enum  
1
2
0 đến 255  
-32,768 đến 32,767  
14  
 
Int  
2
2
4
4
4
-32738 đến 32767  
0 đến 65335  
unsigned int  
Long  
Có thể gọi tắt là unsigned  
-232 đến 231 -1  
0 đến 232-1  
unsigned long  
Float  
3.4E-38 ÷ 3.4E38  
Giới hạn chỉ trị tuyệt đối.Các  
giá trị <3.4E-38 được coi = 0.  
Tuy nhiên kiểu float chỉ có 7  
chữ số có nghĩa.  
Double  
8
1.7E-308 ÷ 1.7E308  
3.4E-4932 ÷  
long double  
10  
1.1E4932  
2.2. Các kiểu dữ liệu cấu trúc.  
Đó là CTDL tiên định rất hay dùng đã được cài đặt sẵn trong các ngôn ngữ  
lập trình, người lập trình chỉ việc dùng như: Tập hợp, mảng, bản ghi, tệp,...và cung  
cấp cơ chế cho lập trình viên tự định nghĩa kiểu dữ liệu mới. (Khi nghiên cứu  
đến môt ngôn ngữ nào đꢂ́ cꢁ̀n phải nghiên cứu kỹ cac kiêu dư liêu câu truc của  
nꢂ.)  
́
Kiểu tập hợp : Một tập hợp bao gồm một số các đối tượng nào đó có  
cùng bản chất, được mô tả bởi cùng một kiểu, kiểu này là kiểu cơ bản (kiểu vô  
hướng đếm được hay đoạn con, liệt kê), không được là kiểu số thực. Các đối tượng  
này được gọi là các phần tử của tập hợp. Số lượng phần tử của tập hợp thông  
thường là từ 0 (gọi là tập rỗng) đến tối đa là 255 phần tử.  
Kiểu Mảng : Là một tập hợp gồm một số cố định các phần tử có cùng kiểu  
dữ liệu. Mỗi phần tử của mảng ngoài giá trị còn được đặc trưng bởi chỉ số (Index)  
thể hiện thứ tự của phần tử đó trong mảng (Vectơ là mảng 1 chiều, mỗi phần tử ai  
của nó ứng với một chỉ số i. Ma trận là mảng 2 chiều mỗi phần tử aij của nó ứng  
với 2 chỉ số i và j,..).  
Kiểu bản ghi (kiểu cấu trúc): là một tập hợp các phần tử dữ liệu (field), mỗi  
phần tử dữ liệu có thể được mô tả bởi một kiểu dữ liệu khác nhau nhưng có liên kết  
với nhau, dùng để mô tả một đối tượng (Record).  
Tệp tin (File): Là một tập hợp các dữ liệu có liên quan với nhau và có cùng  
kiểu dữ liệu được nhóm lại tạo thành một dãy. Chúng thường được chứa trong môt  
thiết bị nhớ ngoài của máy tính với một cái tên nào đó.  
Ví dụ 1.5 : Để mô tả một đối tượng sinh viên, cần quan tâm đến các thông tin sau:  
Mã sinh viên: chuỗi ký tự.  
Tên sinh viên: chuỗi ký tự.  
15  
 
Ngày sinh: kiểu ngày tháng.  
Điểm thi: số thực.  
Các kiểu dữ liệu cơ sở cho phép mô tả một số thông tin như  
: float Diemthi;  
Các thông tin khác đòi hỏi phải sử dụng các kiểu có cấu trúc như :  
char masv[15];  
char tensv[25];  
Để thể hiện thông tin về ngày tháng năm sinh cần phải xây dựng một kiểu bản ghi.  
typedef struct Date  
{
unsigned char ngay;  
unsigned char thang;  
unsigned int nam;  
};  
Cuối cùng, ta có thể xây dựng kiểu dữ liệu thể hiện thông tin về một sinh viên:  
typedef struct SinhVien  
{
char masv[15];  
char tensv[25];  
Date ngsinh;  
float Diemthi;  
};  
Giả sử đã có cấu trúc phù hợp để lưu trữ một sinh viên, nhưng thực tế lại cần  
quản lý nhiều sinh viên, lúc đó nảy sinh nhu cầu xây dựng kiểu dữ liệu mới (kiểu  
mảng bản ghi,…).  
2.3. Các kiểu dữ liệu trừu tượng.  
Do người sử dụng tự tạo lập để giải quyết bài toán riêng của mình mà CTDL  
tiền định, cơ sở không phù hợp hoặc không đủ linh hoạt để giải quyết các bài toán  
đó.  
Như: Danh sách liên kết, cây, đồ thị,... Chúng ta sẽ tìm hiểu ở các chương sau  
của giáo trình.  
2.4. Cac tiêu chuꢀn đanh gia câu truc dư liêu.  
Một cấu trúc dữ liệu tốt phải thỏa mãn các tiêu chuꢀ  
̉n sau:  
Phản ánh đúng thực tế: Đây là tiêu chuꢀn quan trọng nhất, quyết  
̉
định tính đúng đắn của toàn bộ bài toán. Cần xem xét kỹ lưỡng cũng như dự trù  
các trạng thái biến đổi của dữ liệu trong chu trình sống để có thể chọn cấu trúc dữ  
liệu lưu trữ thể hiện chính xác đối tượng thực tế.  
Phꢃ̀ hợp với các thao tác trên đꢂ́: Tiêu chuꢀ̉n này giúp tăng tính hiệu  
quả của giải thuật, giúp việc phát triển các giải thuật đơn giản, tự nhiên hơn;  
chương trình đạt hiệu quả cao hơn về tốc độ xử lý.  
Tiết kiệm tài nguyên hệ thống: Cấu trúc dữ liệu chỉ nên sử dụng tài  
nguyên hệ thống vừa đủ để đảm nhiệm được chức năng của nó.Thông thường có 2  
loại tài nguyên cần lưu tâm nhất : CPU và bộ nhớ. Tiêu chuꢀn̉ này nên cân nhắc  
tùy vào tình huống cụ thể khi thực hiện đề án . Nếu tổ chức sử dụng đề án cần có  
16  
 
những xử lý nhanh thì khi chọn cấu trúc dữ liệu, yếu tố tiết kiệm thời gian xử lý  
phải đặt nặng hơn tiêu chuꢀn sử dụng tối ưu bộ nhớ, và ngược lại.  
̉
2.5. Các thao tác cơ bản trên một cấu trúc dữ liệu.  
Mỗi khi chọn một CTDL phải nghĩ ngay tới các phép toán tác động trên cấu  
trúc đó. Và ngược lại, nói tới phép toán thì phải chú ý tới phép toán đó được tác  
động trên cấu trúc nào. Cho nên cũng không có gì lạ khi người ta quan niệm: Nói  
tới CTDL là bao hàm luôn cả phép toán tác động trên cấu trúc ấy.  
Thông thường mỗi cấu trúc dữ liệu đều có các phép toán (thao tác) sau:  
Tạọ lập  
Huỷ bỏ  
Chèn một phần tử vào CTDL  
Loại bỏ một phần tử khỏi CTDL  
Tìm kiếm một phần tử  
Duyệt CTDL  
Các phép này sẽ có những tác dụng khác nhau đối với từng CTDL. Có phép  
hữu hiệu đối với cấu trúc này nhưng lại tỏ ra không hữu hiệu đối với cấu trúc khác.  
Ví dụ: Phép loại bỏ và phép bổ sung một phần tử rất hữu hiệu với cấu trúc  
danh sách liên kết nhưng lại rất bất tiện với cấu trúc mảng.  
Giải thuật và đánh giá độ phức tạp của giải thuật  
3.1. Giải thuật.  
Moi chương trinh khi đươc cai đăt trong may tinh, ngươi sư dung chi cân  
cung câp dư liêu vao (input), may tinh tư đông xư ly va đưa ra kêt qua (output). Đê  
co kêt qua đâu ra, ngươi lâp trinh phai cung câp cho may tinh môt giai thuât (Cac  
phep xư ly).  
Trong thưc tê, co bai toan đơn gian (dê), nhưng co bai toan phưc tap (kho) đê  
tim đươc lơi giai đa kho nhưng diên ta lơi giai đo sao cho tương minh, mach lac, ro  
rang đê nhiêu ngươi co thê hiêu đươc cung không đơn gian. Thông thương giai  
thuât đươc biêu diên băng: Ngôn ngư tư nhiên, lưu đô giải thuật, …  
3.2. Biểu diễn giải thuật.  
3.2.1.  
Bằng ngôn ngữ tự nhiên.  
Dùng ngôn ngữ tự nhiên diễn tả ngắn gọn giải thuật. Cách này chỉ áp dụng với  
những giải thuật đơn giản.  
Ví dụ 1.6: Thuật giải nấu cơm có thể viết như sau:  
Bước 1: Lấy gạo theo định lượng cần thiết.  
Bước 2: Vo gạo và đổ gạo + nước vào nồi vơi lương vưa đu.  
Bước 3: Căm điên, đun sôi cạn nước (khoang 15 phut).  
Bước 4: Dung đua đao cơm cho tơi.  
Bước 5: Cách 5 phút một: Nếm cơm xem chín chưa  
Nếu chưa chín quay về bước 5  
Nếu chín cơm thì chuyển sang bước 6  
Bước 6: Rut điên. Kết thúc.  
3.2.2.  
Bằng lưu đồ giải thuật.  
17  
 
Dùng những hình khối cơ bản để xây dựng lưu đồ giải thuật. Cách này giải  
thuật được minh hoạ một cách trực quan nhất.  
Các hình cơ bản để xây dựng lưu đồ giải thuật là:  
A
A
Thực hiện công việc A  
Thực hiện chương trình con A  
Vào/Ra dữ liệu  
(Read/Write)  
Băt đâu  
Sai  
B
Kêt thuc  
Đúng  
Ví dụ 1.7: Tính tổng của n số nguyên đầu tiên. Thuật giải dưới đây chỉ là hai trong  
ba thuật giải có thể có của bài toán này. Qua đó cho thấy với một vấn đề ta có thể  
Băt đâu  
Băt đâu  
có nhiều thuật giải khác  
phải xây dựng  
có hiệu  
quả nhất (về thời gian chạy chương trình, bộ nhớ do chương trình chiếm,..).  
Lưu đồ tính tổng của  
đầu tiên với 2 thuật giải khác nhau:  
Đoc n  
Đoc n  
S=0; i =0  
S=N(N+1)/2  
S=S+i  
i= i+1  
In ra S  
Đúng  
i<n  
18  
Kết thúc  
Sai  
In ra S  
Kêt thuc  
3.2.3. Bằng ngôn ngữ diên đat giai thuât (mã giả).  
Như chúng ta đã biết, với những bài toán đơn giản thì chỉ cần biểu diễn giải  
thuật bằng ngôn ngữ tự nhiên, với bài toán lớn, phức tạp việc dùng lưu đồ khối để  
diễn tả giải thuật có những hạn chế nhất định (như khuôn khổ giấy, màn hình có  
hạn làm ảnh hưởng đến tầm quan sát của mắt, hoặc có giải thuật phức tạp gồm  
nhiều vòng lặp lồng nhau,…khi đó sẽ dẫn đến nhiều hạn chế). Chúng ta càng  
không nên dùng một ngôn ngữ cụ thể để diễn đạt giải thuật vì:  
Phải luôn tuân thủ các nguyên tắc chặt chẽ về cú pháp của ngôn ngữ  
đó, khiến cho việc trình bày về giải thuật và CTDL có thiên hướng nặng nề, gò bó.  
Phải phụ thuộc vào CTDL tiền định của ngôn ngữ nên có lúc không  
thể hiện đầy đủ các ý về cấu trúc mà ta mong muốn giới thiệu.  
Ngôn ngữ nào được chọn cũng không thể đã được mọi người ưa  
thích và muốn sử dụng.  
Giải thuật cần độc lập với ngôn ngữ cài đặt để có thể cài đặt nó  
bằng bất cứ ngôn ngữ nào.  
Một giải pháp cho vấn đề này là dùng ngôn ngữ diên đat giai thuât có đủ khả  
năng diễn đạt được giải thuật trên các cấu trúc đề cập đến với một mức độ linh hoạt  
nhất định , không quá gò bó , không câu nệ nhiều về cú pháp nhưng cũng gần gũi  
với các ngôn ngữ chuꢀn̉ để việc chuyển đổi, khi cần thiết được dễ dàng. Với cách  
này giải thuật vừa gần gũi với người, vừa gần gũi với ngôn ngữ lập trình chuꢀn  
̉
.
19  
 
Ngôn ngữ dùng để diễn đạt giải thuật thường được chọn là C hoặc Pascal vì 2  
ngôn ngữ này hay được sử dụng như là ngôn ngữ lập trình căn bản, và được gọi là  
ngôn ngữ tựa C hoặc tựa Pascal.  
Ví dụ 1.8: Giải thuật tìm USCLN của 2 số a, b theo thuât toan  
Euclid USCLN (a, b 2 số nguyên)  
{ số nguyên r;  
r ← a%b;  
while (r ≠ 0)  
{ a← b;  
b← r;  
r← a%b;  
}
return (b);  
}
Đoạn mã giả trên diễn đạt cho giải thuật tìm USCLN, có thiên về cú pháp  
ngôn ngữ C nhưng nó vẫn ở dạng thô, chưa sử dụng chính xác các câu lệnh trong  
C.  
Như vậy, các cách diễn tả giải thuât ở trên chỉ có ý nghĩa giữa người với  
người, để máy tính hiểu và thực hiện các thao tác của giải thuật cần phải cài đặt  
chúng bằng những câu lệnh, cú pháp của một ngôn ngữ lập trình cụ thể.  
3.3. Một số đặc trưng của giải thuật  
Tính đơn nghĩa: ꢁ̉ mỗi bước của giải thuật, các thao tác phải hết sức rõ  
ràng, không gây nên sự nhập nhằng, lộn xộn, tùy tiện, đa nghĩa.  
(Cần phân biệt với tính đơn định: Với hai bộ dữ liệu đầu vào giống nhau  
cho trước, giải thuật sẽ thi hành các mã lệnh giống nhau và cho kết quả giống  
nhau).  
Tính dừng: Sau một số hữu hạn bước thực hiện các thao tác sơ cấp đã chỉ  
ra thì giải thuật phải đi đến kết thúc để trả ra kết quả mong muốn. Không được rơi  
vào quá trình vô hạn.  
Tính đúng đắn: Với mọi bộ dữ liệu đầu vào, sau khi kết thúc giải thuật ta  
phải thu được kết quả mong muốn. Kết quả đó được kiểm chứng bằng yêu cầu bài  
toán.  
20  
 
Tải về để xem bản đầy đủ
pdf 178 trang yennguyen 24580 Free
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 và giải thuật (Bản đẹp)", để 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_va_giai_thuat_ban_dep.pdf