Bài giảng Kỹ thuật lập trình - Chương 2: Giải thuật và cấu trúc dữ liệu cung cấp cho người học các kiến thức: Đặc trưng của giải thuật, giải thuật tìm kiếm, sắp xếp, độ phức tạp tính toán, cấu trúc dữ liệu, kiểu dữ liệu,... Mời các bạn cùng tham khảo nội dung chi tiết.
Trang 2- Với mỗi bài toán, làm thế nào để:
Trang 3Mở đầu
¢ Cac bai tốn thực tế thường phức tạp
- Hiểu bài toán đặt ra == để giải quyết bài toán,
cần làm gì, không cần làm gì Do đó, phải xác
định được:
— Các dữ liệu liên quan đến bài toán
— Các thao tác cần thiết để giải quyết bài tốn
- Làm chủ ngơn ngữ lập trình để cài đặt giải pháp
thành chương trình máy tính
Trang 4
Ví dụ: Bài toán quản lý nhân viên của một cơ quan
° Cần quản lý những ° Cần thực hiện những
thông tin nào ? thao tác quản lý nào
— Thông tin vê nhân ?
viên; tên, ngày sinh, - Tạo ra hồ sơ cho
số bảo hiểm xã hội, nhân viên mới vào
phòng ban làm VIỆC, làm
> nhân viên ảo - Cập nhật một số
— thống tin trong hồ sơ
Trang 5Ví dụ: tính tổng của n số tự nhiên kể từ m void main() { long n,m,i, sum;
cout << ` vào n ` ; cin << n; cout << ` vào m ` ; cin << m; sum =0; for(i = m; i < m+n; i++) sum += i; cout << ‘ Tổng = ` <<sum; } void main() long n,m, sum ;
Trang 7
Đặc trưng của giải thuật
Đầu vào (Input): dữ liệu nào, lấy từ đâu
Đầu ra (Output): dữ liệu đầu ra tương ứng với dữ liệu đầu vào và các bước xử lý
Độ chính xác (Precision): các bước xử lý được mô tả chính xác
Hữu hạn (Finiteness): tạo ra đầu ra sau một số
hữu hạn các bước xử lý
Đơn trị (Uniqueness): Các kết quả trung gian của
từng bước xử lý là duy nhất, không thể thay đổi
Tổng quát (Generality): có thể áp dụng cho các bài toán đồng dạng
Trang 9
Phần tử dữ liệu có cấu trúc và khóa |
Trang 10
Các giải thuật tìm kiếm phổ biến Tìm kiếm tuân tự
¢ Cac phan tu trong tap đầu vào không được sắp xếp theo khóa tìm kiếm Quá trình xử lý — Duyệt tập đầu vào — So sánh với khóa cần
tìm tới khi tìm thấy khóa hoặc duyệt qua
hết tập đầu vào mà
chưa tìm thấy
Tìm kiếm nhị phân
-_ Các phần tử trong tập
đầu vào được sắp xếp
theo khóa tìm kiếm
° Quá trình xử lý
— So sánh khóa cần tìm với phần tử giữa — Nếu nó nhỏ hơn thì tìm
bên trái tập đầu vào — Ngược lại tìm bên phải
tập đầu vào
- Lặp lại động tác này
Trang 11
2 Sắp xếp
Chương Ms
4 0 V uv ,
Na thuật, cấu ¢ Sap thu tu:
tric gữ lập — Đầu vào: tập các phần tử dữ liệu
trình — Đầu ra: danh sách có thứ tự tăng (hoặc
Trang 15Độ phức tạp tính bằng tiệm cận mm = 0 then: DEFINITION If lim n—>oo gín f(n) has strictly smaller order of magnitude than g(n) If lim 1” noo g(n)
f(n) has the same order of magnitude as g(n)
Trang 17II CAU TRUC DU LIEU
Trang 18
a Cấu trúc dữ liệu
Chương th
4 ao V v , ~ 2A ` z n , `
viải thuật, cấu - Cấu trúc dữ liệu là cách tổ chức và rr nar lap thao tác có hệ thống trên dữ liệu
n :
trình =- ° 1 cầu trúc dữ liệu :
I Giải thuật ex
II Cấu trúc dữ — Mô tả
liệu -Ổ Các dữ liệu cấu thành
1 Các khái - Mối liên kết về mặt cấu trúc giữa các dữ liệu
niệm cơ bản đó
— Cung cấp các thao tác trên dữ liệu đó
— Đặc trưng cho 1 kiểu dữ liệu
Trang 19
b Kiểu dữ liệu
Kiểu dữ liệu cơ bản Kiểu dữ liệu có cấu trúc
(primitive data type) (structured data type) °Ổ Đại diện cho các dữ liệu s Được xây dựng từ các
giống nhau, không thể ‘Bip dev liên 2
phan chia nhỏ hơn được kiểu dữ liệu (co ban,
nữa có cầu trúc) khác
* Thường được các ngôn ° Có thê được các ngôn
ngữ lập trình định nghĩa ngữ lập trình định
sản nghĩa sẵn hoặc do lập
> Vi du: trinh vién tu dinh
Trang 20
1 ADT là một kiểu dữ liệu đi kèm với các thao tác trên các dữ liệu kiểu
O
1 ADT mô hình hóa các dữ liệu cùng kiểu theo cách không phụ thuộc vào ngôn ngữ lập trình hay môi trường cài đặt Các ngôn ngữ lập trình hướng đối tượng cho phép cài đặt 1 ÄDT dưới dạng 1 lớp (class)
c Kiểu dữ liệu trừu tượng
Trang 21Dữ liệu, kiểu dữ liệu, cấu trúc dữ liệu Machine Level Data Storage 0100110001101001010001
w®
Primitive Data Types 28 3.1415 ‘A
:
Basic Data Structures array
High-Level Data Structures stack queue list
Trang 222 Mảng (Array) * Tap cac cap (index, element) tae x = 7 ? ~ , ˆ #* *# ? ° - Với môi giá trị của index sẽ có một giá trị tương ứng cua element * Cai đặt:
— Sử dụng một không gian nhớ liên tiếp
— index: kiểu giá trị phụ thuộc vào ngôn ngữ lập trình
C, Java : kiểu số nguyên, tăng liên tục, bắt đầu từ 0 Pascal : kiểu số nguyên
Perl: chỉ số không nhất thiết phải là kiểu số
- element: kiểu giá trị bất kỳ (kiểu dựng sẵn hoặc kiểu có cấu trúc)
+ Tat ca các phần tử cùng kiểu: mảng thuần nhất
Trang 232 Mang (Array)
‹ Các kiểu mang
— Mang 1 chiều — Mang 2 chiều
¢ Thao tac trén mang:
Khdi tao mang (create) Tính kích thước (sizeOf)
Lấy một phần tử tại một vị trí cụ thể (retrieve) Thay thế giá trị của một phần tử tại một vị trí cụ thể
(replace)
Trang 25
3 Danh sách (List) * Danh sách : — Tập hợp các phần tử cùng kiểu —_ Số lượng các phần tử của danh sách không cố định * Phan loai: — Danh sách tuyến tính:
+ Có phần tử đầu tiên, phần tử cuối cùng
-_ Thứ tự trước / sau của các phần tử được xác định rõ ràng, ví dụ sắp theo thứ tự
tăng dần, giảm dần hay thứ tự trong bảng chữ cái
* Cac thao tác trên danh sách phải không làm ảnh hưởng đến trật tự này
—_ Danh sách không tuyến tính: các phần tử trong danh sách không được sắp thứ tự
* (C6 nhiéu hình thức lưu trữ danh sách
—_ Danh sách kế tiếp: Sử dụng vùng các ô nhớ liên tiếp trong bộ nhớ — Danh sách liên kết: Sử dụng vùng các ô nhớ không liên tiếp trong bộ nhớ
- Danh sách nối đơn - _ Danh sách nối kép - Danh sách nối vòng
Trang 26
3 Danh sách (List) Thao tác trên danh sách tuyến tính
Khởi tạo danh sách (create)
Kiểm tra danh sách rỗng (isEmpty) Kiểm tra danh sách đầy (isFull)
Tính kích thước (sizeOf)
Xóa rỗng danh sách (clear)
Thêm một phần tử vào danh sách tại một ví trí cụ thể (insert) Loại bỏ một phần tử tại một vị trí cụ thể khỏi danh sách (remove) Lấy một phần tử tại một vị trí cụ thể (retrieve)
Thay thế giá trị của một phần tử tại một vị trí cụ thể (replace) Duyệt danh sách và thực hiện một thao tác tại các vị trí trong danh sách (traverse)
Trang 27
sách - Sử dụng vùng các ô nhớ liên tiếp: thích hợp khi — Kích thước từng phần tử là rất nhỏ — Kích thước của cả danh sách (số phần tử) đã biết khi lập trình
— Có ít sự thêm vào hay loại bỏ ở giữa danh sách — Hình thức truy cập trực tiếp là quan trọng So sánh các hình thức lưu trữ danh - Sử dụng vùng các ô nhớ không liên tiếp: thích hợp khi — Kích thước từng phần tử là lớn
Trang 28
Cấu trúc dữ liệu đệ quy
¢ Đơi khi LTV cần đến các cấu trúc dữ liệu đệ quy (cấu trúc chứa chính nó)
- Vi du: từ điển điện tử, mỗi từ trong từ điển được
biểu diễn bằng một cấu trúc dữ liệu, trong đó, mục từ đồng nghĩa cũng là từ có cùng cấu trúc wordl : run
word2: sprint *| synonym1 ¬ | inom jog
Trang 29C: làm thế nào để một cấu trúc có thể chứa chính nó ° Trong ngôn ngữ lập trình C, một cấu trúc (struct) không thể chứa chính nó - Nhưng một cấu trúc có thể chứa con trỏ trỏ đến cấu trúc cùng kiểu
struct silly struct { /* This doesn't work */
struct silly struct sl;
}7
struct good struct { /* This does work */ struct *good_ struct s2;
be
Trang 30
Danh sách liên kết: cách biểu diễn đơn
giản cấu trúc dữ liệu đệ quy
- _ Ví dụ: cần đọc các dòng trong một tệp tin, nhưng không biết cần đọc bao nhiêu dòng > cần một cấu trúc có thể tự mở rộng
head_of list
Trang 31Sổ địa chỉ cài đặt bằng danh sách nối
đơn
typedef struct list {
char name [MAXLEN] ; char address [MAXLEN] ; char phone [MAXLEN] ; struct list *next; } ADDRESS;
ADDRESS *hol= NULL;
/* Set the head of the list */
Trang 32
4 Cây nhị phân (binary tree)
° Định nghĩa - Cây rỗng
Trang 33Phép duyệt cây
- Duyệt qua từng nút của cây (mỗi nút 1 lần)
° Cách duyệt:
— Thu tu truGc (preorder hay NLR) - Thứ tự giữa (inorder hay LNR) — Thu tu sau (postorder hay LRN)
Trang 37
Các loại cây nhị phan
‹ Cây nhị phân liên kết
R # ˆ aA tA ~Y ~~ # nv ? aA ˆ
— Môi nút trên cây liên kết đến nút gốc của cây con bên trái và bên phải
* Cay nhi phan tim kiém (BST)
— Khoa của nút gốc lớn (hay nhỏ) hơn khóa của tất cả các nút của cây con bên trái (hay bên phải)
— Các cây con (bên trái, phải) là BST
- Cây cân bằng (AVL)
— BST
- Tại nút bất kỳ, chiêu cao nhánh trái và nhánh phải
chênh nhau không quá 1
Trang 38
Các phép tốn
- Tạo cây ¢ Tim kiém
Thém nut /cay con ‹Ổ Xóa nút /cây con
Trang 39
5, Bảng băm (hash table) Bảng băm Bảng Vị trí của 1 phần tử được tính bằng hàm băm Hàm băm:
Đầu vào: giá trị cần băm (giá trị phần tử đầu vào)
Đầu ra: giá trị băm (khóa, giúp xác định vị trí của giá trị cần băm)