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 1CHƯƠNGII _ GIẢI THUẬT VÀ _ CẤU TRÚC DỮ LIỆU
Trang 2- Với mỗi bài toán, làm thế nào để:
— Thiết kế giải thuật nhằm giải quyết bài toán đó
— Cài đặt giải thuật bằng một chương trình máy tính
Trang 3Mở đầu
¢ Cac bai toá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 toá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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 4Ví dụ: Bài toán quản lý nhân viên của một cơ quan
— Thông tin vê nhân ? viên; tên, ngày sinh, - Tạo ra hồ sơ cho
phòng ban làm VIỆC, làm > nhân viên ảo - Cập nhật một số
- Tìm kiếm thông tin về
Trang 5cout << ` vào n ` ; cin << n;
cout << ` vào m ` ; cin << m;
sum =0;
for(i = m; i < m+n; i++) sum += i;
cout << ` vào m ` ; cin << m;
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 9Phần tử dữ liệu có cấu trúc và khóa |
¢ Phan tử dữ liệu có cấu trúc:
— Thường là số
‹ Trích khóa từ các phần tử dữ liệu có cấu trúc:
Trang 10đầ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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 112 Sắp xếp
Chương Ms
trình — Đầu ra: danh sách có thứ tự tăng (hoặc
1 Giải thuật giảm) theo khóa
Trang 12Các giải thuật sắp xếp phổ biến
Trang 133 Độ phức tap tinh toàn
Trang 14Độ tăng của các hàm chung
Trang 15f(n) has the same order of magnitude as g(n)
is finite and nonzero then:
Trang 17II CAU TRUC DU LIEU
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 18a 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
I Giải thuật ex
liệu -Ổ Các dữ liệu cấu thành
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 19b 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
* Thường được các ngôn ° Có thê được các ngôn
— C/C++: int, long, char, nghia boolean, v.v
— Thao tac trén các số nguyên: + - */
CuuDuongThanCong.com https://fb.com/tailieudientucntt
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
(Abstract data type)
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
hash table tree
Trang 22— 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
Ngược lại: mảng không thuần nhất sizeOf(element)
——¬
Index: chỉ số chỉ thứ tự Element: phần tử
CuuDuongThanCong.com https://fb.com/tailieudientucntt
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)
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 24Bài tập: Khởi tạo giá trị cho mảng
y[5] = {3.2,1.2,4.5,6.0,3.6};
m[6][2] = {{1,1},{1,2},{2,1}, {2,2}, {3,1}, {3,2}};
char si[6] ={“H?,?a?,?n?,?o?,?i1?,?\@?};
//Hoac char si[] = “DH Bach Khoa Hanoi”; //length =
Trang 25+ Có phần tử đầu tiên, phần tử cuối cùng
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
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)
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 27
CuuDuongThanCong.com https://fb.com/tailieudientucntt
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
synonyml 7” | synonym2 synonyml
Trang 29struct silly struct { /* This doesn't work */
struct silly struct sl;
}7
struct good struct { /* This does work */
struct *good_ struct s2;
be
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 30Danh 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
information —”| information | —?| information
" nextptr oo nextptr= NULL
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 */
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 324 Cây nhị phân (binary tree)
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)
CuuDuongThanCong.com https://fb.com/tailieudientucntt
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 38Các phép toán
- Tạo cây
¢ Tim kiém Thém nut /cay con
‹Ổ Xóa nút /cây con
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 39Đầ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)
Có khả năng trùng khóa (đụng độ), ví dụ f(x) = x % m;
Cần tìm hàm băm sao cho khả năng đụng độ là nhỏ nhất (luôn luôn tìm ra đúng giá trị phần tử đầu vào khi sử dụng khóa) Đảm bảo O(1)
Ví dụ:
+ f(x)=x%m;
* f(‘abc’) = (char_index(‘a’)*base_number2 +
char_index(‘b’)*base_number1 + char_index(‘c’)*base_number0O) % hash_size
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 40
hash(x) = char_index(x) % 10
Tim V Tim F
char_ index: Spa