Tài liệu này thể hiện được tính ưu việt hơn so với các tài liệu hiện có trên thị trường: 1Nội dung được viết rất cô đọng và sát với đề cương môn học thuộc chương trình đào tạo đã được Ba
BẢNG BĂM
Nhóm biên soạn chân thành cảm ơn sự hỗ trợ của ban lãnh đạo Trường Đại học Ngân hàng Tp Hồ Chí Minh, cảm ơn các nhà khoa học đã dành thời gian đóng góp các ý kiến và kinh nghiệm quý báu trong quá trình biên soạn cuốn tài liệu này.
Bài viết này được biên soạn với nỗ lực của cả nhóm, tuy nhiên không thể tránh khỏi những thiếu sót Nhóm biên soạn chân thành mong muốn nhận được những ý kiến đóng góp quý báu từ độc giả, các nhà giáo dục và các bạn sinh viên Nhờ đó, lần tái bản tiếp theo sẽ được hoàn thiện hơn, mang lại nội dung hữu ích và chính xác cho người đọc.
Mọi thắc mắc và đóng góp về tài liệu, Quý độc giả vui lòng gửi mail theo địa chỉ: thonv@hub.edu.vn hoặc dangph@hub.edu.vn
Xin chân thành cảm ơn
Một số định nghĩa về cấu trúc dữ liệu và giải thuật 2 Định nghĩa giải thuật 2
Giải thuật ứng dụng trong kinh doanh 2 Định nghĩa cấu trúc dữ liệu và cấu trúc lưu trữ 2
Vai trò của tổ chức dữ liệu và mối quan hệ giữa cấu trúc dữ liệu và giải thuật 3
Các kiểu dữ liệu cơ bản 4
Các kiểu dữ liệu có cấu trúc 6
Phân tích và thiết kế giải thuật 7
Phương pháp chia để trị (divide- and-conquer) 8
Phương pháp quy hoạch động 10
Phương pháp quay lui (backtracking) 10
Ký hiệu BigO (Big-Oh Notation) 10
Giới thiệu về ngôn ngữ lập trình Python 15
Một số câu hỏi và bài tập có lời giải 16
Một số câu hỏi và bài tập tự rèn luyện 17
Giải thuật đệ quy và hàm đệ quy 19
Cơ chế hoạt động của giải thuật đệ quy 20
Thiết kế giải thuật đệ quy 21 Ưu điểm và nhược điểm của giải thuật đệ quy 22
Phân loại giải thuật đệ quy 22 Đệ quy tuyến tính 22 Đệ quy nhị phân 23 Đệ quy phi tuyến 24 Đệ quy tương hỗ 24
Giải một số bài toán phổ biến bằng giải thuật đệ quy 25
Bài toán tháp Hà Nội [9] 25
Bài toán tìm kiếm với đệ quy nhị phân 27
Một số câu hỏi và bài tập có lời giải 30 Ứng dụng giải thuật đệ quy để giải bài toán trong kinh doanh 34
Sử dụng đệ quy để tính tiền lãi gửi tiết kiệm ngân hàng 34 ii
Sử dụng đệ quy để tính tiền thưởng 35
Sử dụng đệ quy để tính tiền lãi phải trả hàng tháng khi vay ngân hàng 36
Một số câu hỏi và bài tập tự rèn luyện 37
Danh sách đặc 39 Định nghĩa 39 Ưu và nhược điểm của danh sách đặc 40
Khai báo danh sách đặc 40
Các thao tác trên danh sách đặc 40
Danh sách liên kết 45 Định nghĩa và phân loại 45
Danh sách liên kết đơn 45
Danh sách liên kết đôi 53
Danh sách liên kết vòng 58
Danh sách đa liên kết 58 Ứng dụng của danh sách liên kết 59
Khai báo cấu trúc ngăn xếp 60
Các thao tác trên ngăn xếp 61 Ứng dụng của ngăn xếp 63
Khai báo cấu trúc của hàng đợi 66
Các thao tác trên hàng đợi 67 Ứng dụng của hàng đợi 69
Một số câu hỏi, bài tập có lời giải 71 Ứng dụng danh sách để giải một số bài toán trong kinh doanh 72
Chương trình quản lý sinh viên bằng cấu trúc danh sách đặc 72
Chương trình quản lý sách sử dụng cấu trúc danh sách liên kết đơn 77
Chương trình quản lý bệnh nhân sử dụng cấu trúc hàng đợi 80
Chương trình đảo ngược danh sách các cuốn sách sử dụng ngăn xếp 84
Một số câu hỏi và bài tập tự rèn luyện 86
Các khái niệm cơ bản 89
Một số tính chất của cây nhị phân 91
Cây nhị phân tìm kiếm 95 Định nghĩa 95
Khai báo cấu trúc cây nhị phân tìm kiếm 96
Các thao tác trên cây nhị phân tìm kiếm 96
Cấu trúc dữ liệu Heap 103
Minh họa thao tác nhập xuất cây nhị phân tìm kiếm 104
Một số câu hỏi và bài tập có lời giải 107 Ứng dụng cấu trúc cây để giải bài toán trong kinh doanh 108
Chương trình quản lý sinh viên bằng cấu trúc cây 108
Chương trình quản lý hàng hóa bằng cấu trúc cây 112
Chương trình quản lý sách bằng cấu trúc cây 115
Một số câu hỏi và bài tập tự rèn luyện 118
CHƯƠNG 5 ĐỒ THỊ 119 Định nghĩa về đồ thị 120 Đường đi 122
Bậc của đỉnh 122 Đồ thị liên thông 123 Đồ thị có trọng số 123
Biểu diễn đồ thị bằng ma trận kề 123
Biễu diễn đồ thị bằng danh sách kề 124
Duyệt theo chiều sâu - DFS 125
Duyệt theo chiều rộng - BFS 127
Cây khung và cây khung nhỏ nhất 128
Thuật toán Prim tìm cây khung nhỏ nhất 130 iv
Thuật toán Krusal tìm cây khung nhỏ nhất 133
Thuật toán Dijkstra tìm đường đi ngắn nhất 138
Chương trình minh họa giải thuật Dijkstra 141 Ứng dụng của đồ thị 142
Một số câu hỏi và bài tập có lời giải 143 Ứng dụng đồ thị để giải bài toán trong kinh doanh 148
Bài toán vận chuyển hàng hóa 149
Lắp đặt hệ thống điện văn phòng 152
Một số câu hỏi và bài tập tự rèn luyện 153
CHƯƠNG 6 SẮP XẾP VÀ TÌM KIẾM 155
Giới thiệu về bài toán sắp xếp 156
Khái niệm và vai trò của tìm kiếm dữ liệu 188
Một số câu hỏi, bài tập có lời giải 193 Ứng dụng giải thuật sắp xếp và tìm kiếm để giải bài toán trong kinh doanh 194
Chương trình quản lý sinh viên sử dụng giải thuật InterChange Sort 194
Chương trình quản lý hóa đơn bán hàng 196
Chương trình quản lý hàng hóa 200
Tính thời gian tối thiểu để vận chuyển hàng 202
Một số câu hỏi và bài tập tự rèn luyện 203
Tìm hiểu về bảng băm 205
Các kỹ thuật xử lý va chạm 208
Kỹ thuật tạo dây chuyền (separated chaining) 208
Kỹ thuật định địa chỉ mở (open addressing) 208 Ứng dụng bảng băm 210
Một số câu hỏi và bài tập có lời giải 211
Một số câu hỏi và bài tập tự rèn luyện 214
Hình 1 1- Từ bài toán thực tế đến chương trình trên máy tính 3
Hình 1 2-Mối quan hệ giữa cấu trúc dữ liệu và giải thuật 4
Hình 1 3- Quá trình từ bài toán thực tế đến chương trình 8
Hình 1 4- Đồ thị mô tả độ phức tạp của giải thuật 11
Hình 1 5- Độ phức tạp giải thuật qua các hàm 14
Hình 2 1- Cơ chế hoạt động của giải thuật đệ quy 20
Hình 2 2 - Cơ chế hoạt động của bài toán tính giai thừa 21
Hình 2 3 – Mô tả đệ quy tương hỗ 24
Hình 2 4- Minh họa đệ quy bài toán Tháp Hà Nội 25
Hình 2 5- Quá trình thực hiện bài toán Tháp Hà Nội 26
Hình 2 6- Cơ chế tìm kiếm với đệ quy nhị phân 27
Hình 2 7- Cấu trúc của mảng một chiều 40
Hình 3 1-Cấu trúc danh sách liên kết với con trỏ pHead và pTail 45
Hình 3 2- Danh sách liên kết đơn 45
Hình 3.3-Thêm một phần tử vào vị trí ở đầu danh sách 47
Hình 3 4-Thêm một phần tử vào vị trí ở cuối danh sách 47
Hình 3 5- Thêm một phần tử vào sau nút q 48
Hình 3 6-Xóa một phần tử ở vị trí đầu danh sách 48
Hình 3 7- Xóa một phần tử đứng sau nút q 49
Hình 3 8- Xóa một phần tử có giá trị X 49
Hình 3 9-Danh sách liên kết đôi 53
Hình 3 10-Thêm một phần tử vào danh sách liên kết đôi 54
Hình 3 11-Thêm một phần tử vào vị trí cuối danh sách 54
Hình 3 12-Thêm một phần tử sau phần tử q 55
Hình 3 13-Xóa một phần tử ở vị trí đầu danh sách trong danh sách liên kết đôi 56
Hình 3 14-Xóa một phần tử đứng sau vị trí phần tử q trong danh sách liên kết đôi 56
Hình 3 15-Xóa một phần tử có giá trị X trong danh sách liên kết đôi 57
Hình 3 16-Danh sách liên kết vòng là một danh sách liên kết đơn 58
Hình 3 17-Danh sách liên kết vòng là một danh sách liên kết đôi 58
Hình 3 18-Cấu trúc của danh sách đa liên kết 58
Hình 3 19- Minh họa về một ngăn xếp 59
Hình 3 20-Hai tác vụ Push và Pop của ngăn xếp 59
Hình 3 21-Các tác vụ trong ngăn xếp 60
Hình 3 22-Quá trình chuyển đổi cơ số thập phân sang nhị phân 64 vii
Hình 3 23- Minh họa thao tác Push và Pop trong bài toán đổi cơ số 64
Hình 3 24- Minh họa cơ chế của hàng đợi qua việc xếp hàng tính tiền tại quầy 65
Hình 3 25-Cấu trúc của hàng đợi 65
Hình 3 26-Minh họa thao tác thêm phần tử vào hàng đợi 65
Hình 3 27-Minh họa tác vụ xóa phần tử trong hàng đợi 66
Hình 3 28-Quá trình cài đặt giải thuật Radix Sort bằng hàng đợi 70
Hình 4 1- Sơ đồ tổ chức của một công ty 89
Hình 4 2-Cây biểu diễn biểu thức 89
Hình 4 4-Biểu diễn cây bằng đồ thị 90
Hình 4 5-Biểu diễn cây bằng giản đồ 90
Hình 4 6-Biểu diễn cây bằng phương pháp indentatio 91
Hình 4 7- Cấu trúc của một cây nhị phân 91
Hình 4 8-Cây nhị phân hoàn chỉnh 92
Hình 4 9-Cây nhị phân đầy đủ 92
Hình 4 10-Quá trình duyệt cây theo thứ tự trước của biểu thức toán học 93
Hình 4 11-Kết quả duyệt cây nhị phân theo thứ tự trước với các số nguyên 93
Hình 4 12-Quá trình duyệt cây theo thứ tự giữa của biểu thức toán học 93
Hình 4 13-Kết quả duyệt cây nhị phân theo thứ tự giữa với các số nguyên 94
Hình 4 14-Kết quả duyệt cây nhị phân theo thứ tự sau của biểu thức toán học 94
Hình 4 15-Kết quả duyệt cây nhị phân theo thứ tự sau với các số nguyên 94
Hình 4 16- Chuyển cây tổng quát thành cây nhị phân 95
Hình 4 17-Cấu trúc cây nhị phân tìm kiếm 95
Hình 4 18-Xóa phần tử là nút lá 99
Hình 4 19-Xóa phần tử có một nút con 100
Hình 4 20-Nút nhỏ nhất của cây con bên phải 100
Hình 4 21-Nút nhỏ nhất của cây con bên trái 100
Hình 4 22-Cây Trie biểu diễn cho tập S gồm các chuỗi {bear, bell, bid, bull, buy, hear, see, sell, stock, stop} 102
Hình 4 23-Cấu trúc dữ liệu Heap 103
Hình 5 1-Cấu trúc của đồ thị 120
Hình 5 2- Một số ví dụ về đồ thi trong thực tế 121
Hình 5 7-Đồ thị liên thông và đồ thị không liên thông 123 viii
Hình 5 8-Đồ thị có trọng số 123
Hình 5 9-Đồ thị không có trọng số 123
Hình 5 10-Biểu diễn đồ thị bằng ma trận kề 123
Hình 5 11-Biểu diễn đồ thị bằng danh sách kề 124
Hình 5 12-Biểu diễn đồ thị không có trọng số với danh sách kề 125
Hình 5 13-Kết quả duyệt đồ thị theo DFS 126
Hình 5 14-Duyệt đồ thị theo chiều rộng 127
Hình 5 15-Đồ thị gồm cá đỉnh 128
Hình 5 16-Đồ thị và cây khung 129
Hình 5 17-Cây khung nhỏ nhất 129
Hình 6 1- Minh họa giải thuật Bubble Sort 157
Hình 6 2- Minh họa giải thuật Insertion Sort 166
Hình 6 3-Quá trình sắp xếp của giải thuật Merge Sort 173
Hình 6 5-Quá trình sắp xếp của giải thuật Radix Sort 184
Hình 6 6-Minh họa giải thuật Topo Sort 185
Hình 6 7- Minh họa phương pháp tìm kiếm nhị phân với cuốn danh bạ điện thoại 191
Hình 7 1-Mô tả kỹ thuật băm 205
Hình 7 2-Hàm băm với phép chia dư cho 10 206
Hình 7 3-HIện tượng va chạm 208
Hình 7 4-Kỹ thuật tạo dây chuyền 208 ix
Bảng 1-Các kiểu dữ liệu định sẳn trong Python 5
Bảng 2- Kiểu dữ liệu và ví dụ minh họa cho kiểu dữ liệu 6
Bảng 3- Mô tả giải thuật duyệt theo chiều sâu (DFS) 126
Bảng 4- Quá trình duyệt theo chiều rộng (BFS) 128
Bảng 5-Mô tả quá trình thăm dò tuyến tính 209
Bảng 6-Mô tả quá trình chèn giá trị khóa theo phương pháp băm kép 210 x
ASCII (American Standard Code for
Information Interchange) Chuẩn mã trao đổi thông tin Hoa Kỳ
BFS (Breadth First Search) Tìm kiếm theo chiều rộng
Circular linked list Danh sách liên kết vòng
Connected Liên thông (đồ thị)
CPU (Central Processing Unit) Bộ xử lý trung tâm
Data structure Cấu trúc dữ liệu
DB Indexing (Data Base Indexing) Chỉ mục cơ sở dữ liệu
Devide-and-conquer Chia để trị
Double linked list Danh sách liên kết kép
DFS (Depth First Search) Tìm kiếm theo chiều sâu
Dynamic programming Quy hoạch động
Edge list Danh sách cạnh
Input Đầu vào (dữ liệu)
Inorder traversal Duyệt theo thứ tự giữa
Heap Đống (trong cấu trúc dữ liệu)
Output Đầu ra (dữ liệu)
LIFO (Last In First Out) Vào sau ra trước
FIFO (First In First Out) Vào trước ra trước
Linked list Danh sách liên kết
Minimum spanning tree Cây khung nhỏ nhất
Multi-linked lists Danh sách đa liên kết
NULL Không tồn tại, không xác định
Postorder traversal Duyệt theo thứ tự sau
Preorder Duyệt theo trung tự
Quick sort Sắp xếp nhanh
Selection sort Sắp xếp chọn lựa
Single linked list Danh sách liên kết đơn xi
Top-Down Design Thiết kế từ trên - xuống
T rong quá trình giải quyết các bài toán trên máy tính, việc lập trình đóng vai trò rất quan trọng, điều đó đòi hỏi phải phân tích và thiết kế các giải thuật để giải quyết bài toán một cách hiệu quả nhất
Chương tổng quan, người học sẽ làm quen với một số khái niệm cơ bản về cấu trúc dữ liệu và giải thuật, phân tích mối quan hệ giữa cấu trúc dữ liệu và giải thuật có ảnh hưởng đến đề án tin học như thế nào Ngoài ra, chương 1 còn trình bày cách đánh giá độ phức tạp của thuật toán
- Khái niệm cấu trúc dữ liệu và giải thuật
- Mối quan hệ giữa cấu trúc dữ liệu và giải thuật
- Các kiểu dữ liệu cơ bản
- Phân tích và thiết kế giải thuật
- Xác định độ phức tạp của giải thuật
- Câu hỏi và bài tập
Một số định nghĩa về cấu trúc dữ liệu và giải thuật Để giải quyết bài toán trên máy tính bao gồm nhiều bước Đầu tiên là xác định được yêu cầu của bài toán sau đó tìm ra mô hình, tức là chuyển các yêu cầu tổng quát thành các cấu trúc cụ thể và chặt chẽ, chúng sẽ được thể hiện ở mô hình toán học hay nói cách khác là việc mô hình hóa bài toán Mô hình này là nền tảng để thực hiện các giai đoạn tiếp theo như lựa chọn cấu trúc dữ liệu, thiết kế giải thuật, môi trường triển khai… Định nghĩa giải thuật
Giải thuật (Algorithms) là tập hợp các câu lệnh được thể hiện chặt chẽ và rõ ràng bao gồm một trình tự các thao tác thực hiện trên một số đối tượng nào đó, sao cho sau khi thực thi với một số hữu hạn bước sẽ cho kết quả mong muốn Với mỗi thuật toán sẽ có dữ liệu vào (input) và dữ liệu ra (output) tương ứng [3]
Thuật ngữ “giải thuật” dùng để chỉ một thủ tục hay cách thức có thể được thực hiện trên máy tính, điều này có thể có một số hạn chế trong quá trình lập trình, do vậy cần phải có các yêu cầu về giải thuật:
Các lệnh hay tập lệnh phải có tính xác định
Các lệnh này cần phải được tổ chức sao cho máy tính hiểu được
Sau một số hữu hạn các phép tính thì các lệnh phải dừng để cho kết quả Trong việc phân tích và thiết kế giải thuật, có ba cấu trúc cần được sử dụng là: cấu trúc tuần tự; cấu trúc chọn lựa và cấu trúc lặp
Giải thuật ứng dụng trong kinh doanh
Giải thuật hay còn gọi là thuật toán được áp dụng rộng rãi trong mọi lĩnh vực nhằm mục đích giải quyết các bài toán cụ thể trong lĩnh vực áp dụng Trong lĩnh vực kinh doanh, giải thuật được sử dụng nhằm giúp doanh nghiệp ứng dụng Công nghệ thông tin vào trong quá trình hoạt động của doanh nghiệp như quản trị nhân sự, quản trị tài chính, quản trị bán hàng,…
Giải thuật ứng dụng trong kinh doanh tập trung giúp người học tìm ra các giải thuật phù hợp nhằm giải quyết các bài toán cụ thể trong kinh doanh trong bối cảnh chuyển đổi số mạnh mẽ như hiện nay Định nghĩa cấu trúc dữ liệu và cấu trúc lưu trữ
Cấu trúc dữ liệu (data structure) là cách lưu trữ, tổ chức dữ liệu có hệ thống để dữ liệu có thể được sử dụng một cách hiệu quả Có các loại cấu trúc dữ liệu phổ biến sau đây: mảng (array); ngăn xếp (stack); hàng đợi (queue); danh sách liên kết đơn (singly linked list); danh sách liên kết vòng (circularity linked list); danh sách liên kết kép (double linked list); cấu trúc cây (tree); cấu trúc đồ thị (graph) [3]
Cấu trúc lưu trữ (storage structure) là phương thức biểu diễn một cấu trúc dữ liệu trong bộ nhớ máy tính của cấu trúc dữ liệu đó Có nhiều cấu trúc lưu trữ khác nhau cho cùng một cấu trúc dữ liệu [3] Ví dụ, cấu trúc dữ liệu mảng hai chiều sẽ có hai cấu trúc lưu trữ là lưu trữ theo dòng và lưu trữ theo cột nhưng cũng có loại cấu trúc dữ liệu chỉ có thể có một cấu trúc lưu trữ duy nhất Ví dụ cấu trúc ngăn xếp, hàng đợi, cây chỉ có một cách lưu trữ duy nhất là lưu trữ theo dạng kế tiếp
Vai trò của tổ chức dữ liệu và mối quan hệ giữa cấu trúc dữ liệu và giải thuật
Việc triển khai một dự án trên máy tính có nghĩa là biến một vấn đề thực tế thành một vấn đề mà máy tính có thể giải quyết được Một bài toán bất kỳ trên máy tính đều bao gồm các đối tượng dữ liệu và các yêu cầu xử lý của các đối tượng đó
Dữ liệu là những số liệu mô tả tính chất của đối tượng, dữ liệu này rời rạc vì vậy cần được quản lý chặt chẽ Ví dụ: Thông tin của một nhân viên gồm: mã nhân viên, họ tên, địa chỉ, số điện thoại, mức lương, hệ số lương v.v…; Thông tin của một sản phẩm gồm: Mã sản phẩm, tên sản phẩm, giá, xuất xứ, ngày sản xuất…
Thao tác xử lý trên dữ liệu là các kỹ thuật xử lý trên dữ liệu đã được lưu trữ, các kỹ thuật này bao gồm: Tìm kiếm thông tin, sửa đổi thông tin, xóa thông tin, biến đổi dữ liệu, lập báo cáo Ví dụ:
- Tìm nhân viên có tên: “Nguyễn Văn A”
- Liệt kê sách nhân viên có lương trên 10 triệu theo thứ tự tăng/giảm dần
- Liệt kê sách nhân viên có thâm niên công tác trên 20 năm
Hình 1 1- Từ bài toán thực tế đến chương trình trên máy tính
Vì vậy, để tạo ra một mô hình máy tính phản ánh được các vấn đề trong thế giới thực, chúng ta cần tập trung vào hai vấn đề: