• Sắp xếp là quá trình bố trí lại các phần tử của một tập đối tượng theo một thứ tự nhất định. • Trường tham gia quá trình tìm kiếm gọi là khoá (key)[r]
(1)GV : Văn Thị Thiên Trang Khoa : Cơng Nghệ Thơng Tin
(2)MƠ TẢ HỌC PHẦN
- Tìm hiểu phương pháp tổ chức và
những thao tác sở CTDL, kết hợp với việc phát triển tư giải thuật để hình thành nên chương trình máy tính.
- Hiểu tầm quan trọng giải thuật
và cách tổ chức liệu, hai thành tố
quan trọng cho chương trình.
- Củng cố phát triển kỹ lập trình
(3)NỘI DUNG HỌC PHẦN
- Bài Tổng quan cấu trúc liệu giải thuật - Bài Tìm kiếm
- Bài Sắp xếp
- Bài Danh sách liên kết - Bài Stack
- Bài Queue
- Bài Cây nhị phân
- Bài Cây nhị phân tìm kiếm - BST
(4)Bài TỔNG QUAN VỀ CTDL & GT
Nội dung
1.1 Vai trò CTDL trong một đề án tin học
1.2 Các tiêu chuẩn đánh giá CTDL
1.3. Trừu tượng hóa liệu
1.4. Kiểu liệu bản
1.5. Kiểu liệu có cấu trúc
(5)1.1 Vai trị CTDL đề án tin học
Bài toán giải trong máy tính
Xử lý đối tượng DL Bài toán thực tế
(6)1.1 Vai trò CTDL đề án tin học
• Dữ liệu thực tế:
– Mn hình vạn trạng, đa dạng, phong phú – Thường có chứa đựng quan hệ với
• Cần phải tổ chức biểu diễn thành cấu trúc
thích hợp nhất
– Phản ánh xác liệu thực tế – Dễ dàng xử lý máy tính
(7)1.1 Vai trò CTDL đề án tin học
Xây dựng thao tác xử lý
Dựa Y/C cụ thể, xác định trình tự giải vấn đề máy tính để đưa kết mong muốn
Đối tượng DL
Thao tác xử lý Kết quả mong muốn
(8)1.1 Vai trò CTDL đề án tin học
Giải thuật
Chương trình
Cấu trúc liệu
(9)1.2 Các tiêu chuẩn đánh giá CTDL
• Phản ánh thực tế:
– Thể đầy đủ thông tin nhập/xuất tốn
• Phù hợp với thao tác xử lý:
– Tăng tính hiệu chương trình → hiệu dự án tin học
• Tiết kiệm tài nguyên hệ thống:
(10)1.3. Trừu tượng hóa liệu
• Trừu tượng hố
– Làm đơn giản hóa, sáng sủa, dễ hiểu – Che phần chi tiết, làm bật tổng thể
• Trừu tượng hoá liệu: đưa kiểu liệu trừu tượng (Abstract Data Type)
• ADT: gồm
– Mô tả liệu
– Tác vụ liên quan
(11)1.3. Trừu tượng hóa liệu
• VD: mơ tả kiểu liệu trừu tượng số hữu tỉ a/b với tác vụ: +,*, /
– Mơ tả liệu • Tử số
• Mẫu số (≠0) – Mơ tả tác vụ
Cộng(Số_Hữu_Tỉ 1, Số_Hữu_Tỉ 2) • Nhập:
– a, b tử số mẫu số Số_Hữu_Tỉ – c, d tử số mẫu số Số_Hữu_Tỉ • Xuất:
(12)1.4. Kiểu liệu bản
• Thường đơn giản khơng có cấu trúc, NNLT
xây dựng sẵn, nên gọi kiểu liệu dựng sẵn
• Thường trị vơ hướng:
– số nguyên
– số thực
– ký tự
(13)1.4. Kiểu liệu (tt)
Tên kiểu KT Miền giá trị Ghi chú
char 1 -128 đến 127 Có thể dùng số nguyên byte có dấu hay kiểu ký tự unsigned char 1 đến 255 Số nguyên byte ko dấu
int 2 -32768 đến 32767
unsigned int 2 đến 65355 Gọi tắt unsigned long 4 -232 đến 231-1
unsigned long 4 đến 232-1
float 4 3.4E-38 … 3.4E38 Giới hạn trị tuyệt đối.Các giá trị <3.4E-38 coi = Tuy nhiên kiểu float có chữ số có nghĩa
(14)1.5. Kiểu liệu có cấu trúc
• Kết hợp nhiều kiểu liệu để phản ánh chất đối tượng thực tế
• Đa số ngơn ngữ cài đặt sẵn số kiểu có cấu trúc bản: mảng, chuỗi, tập tin, ghi…
(15)1.5. Kiểu liệu có cấu trúc
• Cấu trúc liệu Sinh viên
Mã SV: chuỗi kt
Tên SV: chuỗi kt
Ngày sinh: ngày tháng
Nơi sinh: chuỗi kt
(16)1.6. Độ phức tạp giải thuật
• Sự cần thiết phân tích giải thuật
GT A
GT B
GT C
Vấn đề cần giải
GT tốt
1 Giải thuật
2 Giải thuật đơn giản
(17)1.6. Độ phức tạp giải thuật
• Các độ phức tạp thường gặp:
– O(1) : Nếu T(n) số (T(n)=C) – O(log2n) : Độ phức tạp dạng logarit
– O( n) : Độ phức tạp tuyến tính
– O(nlog2n): Độ phức tạp tuyến tính logarit
– O( n2), O(n3),…,O(n ): Độ phức tạp đa thức – O(n!), O( nn)
• Thơng thường thuật giải có độ phức tạp đa thức cài đặt
(18)1.6. Độ phức tạp giải thuật
• Thường dựa vào số phép so sánh số phép gán • Một số công thức thường dùng
n n i = =1
1 1 1
1 + − = − = = = = a b a i b i b a i ) ( + = = n n i n i ) ( )
(n a a
n i n a i − − + = = ) ( 2 + = = n n i n i ) )( (
2 = + +
= n n n i n i ) ( 2
3 = +
n n
i
(19)CÂU HỎI ÔN TẬP BÀI 1
1 Viết chương trình C khai báo kiểu liệu mảng chiều, chương trình có chức sau:
– Nhập giá trị vào mảng
– Xuất phần tử mảng
2 Viết chương trình C có khai báo kiểu liệu mảng hai chiều, chương trình có chức sau:
– Nhập giá trị vào ma trận
– Xuất phần tử ma trận
3 Hãy xây dựng thực kiểu liệu trừu tượng cho thông tin sinh viên với thao tác nhập, xuất thông tin sinh viên
(20)Bài TÌM KIẾM
• Nội dung
2.1 Giới thiệu tốn tìm kiếm 2.2 Tìm kiếm tuyến tính
(21)2.1 Giới thiệu tốn tìm kiếm
• Tìm kiếm q trình xác định đối tượng tập đối tượng Kết trả về:
– Đối tượng tìm (nếu có)
– Chỉ số (nếu có) xác định vị trí đối tượng tập • Việc tìm kiếm dựa theo trường đối
tượng, trường khóa (key) việc tìm kiếm – VD: Tìm sinh viên có họ tên X DSSV
• SV {MaSV, HoTen, DiaChi,…} • Khố?
(22)2.1 Giới thiệu tốn tìm kiếm
• Bài tốn mơ tả sau:
– Tập liệu lưu trữ dãy a1, a2, ,an Giả sử chọn cấu trúc liệu mảng để lưu trữ dãy số nhớ chính, có khai báo: int a[n];
– Khóa cần tìm x: int x;
Tìm kiếm
Tìm kiếm tuyến tính Tìm kiếm nhị phân
Tập liệu xếp Tập liệu
(23)2.1 Giới thiệu toán tìm kiếm
• Ý tưởng: duyệt từ phần tử đầu tiên, so sánh khóa tìm kiếm với khoá tương ứng phần tử danh sách Cho đến gặp phần tử cần tìm đến duyệt hết danh sách
• Các bước tiến hành sau: i =
a[i] = x
i<n Khơng tìm thấy
Tìm thấy
Đ Đ
S
(24)1.1 Tìm kiếm tuyến tính
• Ví dụ: Cho dãy số a, giá trị tìm X = 8:
12
12 2 5 8 1 6 4
X = 8
Tìm thấy
12 2 5 8 1 6 4
X = 7
Khơng tìm thấy
(25)1.1 Tìm kiếm tuyến tính
• Thuật tốn tìm kiếm tuyến tính
/* Trả về: vị trí xuất x mảng a Trả về: -1 x khơng có mảng a */
int Search(int a[], int n, int key) {
int i =0;
while (i<n && key != a[i]) i++;
if (i < n)
return i; // tìm thấy vị trí i
return -1; // tìm khơng thấy
(26)1.1 Tìm kiếm tuyến tính
• Thuật tốn tìm kiếm tuyến tính cải tiến
int Search(int a[], int n, int key) {
int i =0;
a[n] =key; // thêm phần tử thứ n+1
while (key != a[i]) i++;
if (i == n)
return -1; // tìm hết mảng khơng có x
return i; // tìm thấy x vị trí i
(27)Nhận xét
• Giải thuật tìm kiếm tuyến tính khơng phụ thuộc vào thứ tự
các phần tử mảng, phương pháp tổng
quát để tìm kiếm dãy
(28)1.2 Tìm kiếm nhị phân
• Phép tìm kiếm nhị phân áp dụng
trên dãy khóa đã có thứ tự: k[1] k[2]
(29)1.2 Tìm kiếm nhị phân
• Giả sử ta cần tìm đoạn a[left, ,right] với khóa tìm kiếm X
• Chia đơi phạm vi tìm kiếm mid=(left+right)/2
• Xét phần tử a[mid]:
– Nếu a[mid]=X: Tìm thấy vị trí mid – Nếu a[mid]<X:
• Đoạn a[left, ,mid] chứa phần tử <X • Tìm X đoạn a[mid+1, , right]
– Nếu a[mid]>X:
• Đoạn a[mid, ,right] chứa phần tử >X • Tìm X đoạn a[left, , right-1]
(30)1.2 Tìm kiếm nhị phân
• Cho dãy số gồm phần tử bên X = 8:
1 12 15
1 2 4 5 6 8 12 15
Left = 0
X = 8
Right = 7 Mid = 3
1 2 4 5 6 8 12 15
Left = 4
X = 8
Right = 7 Mid = 5
Đoạn tìm kiếm
(31)1.2 Tìm kiếm nhị phân
int BinarySearch(int a[], int n, int key){ int left = 0, right = n-1, mid;
while (left <= right){
mid = (left + right)/ 2; // lấy điểm giữa
if (a[mid] == key) // tìm được
return mid;
if (a[mid] < key) // tìm đoạn bên phải mid
left = mid+1; else
right = mid-1; // tìm đoạn bên trái mid
}
return -1; // khơng tìm được
(32)CÂU HỎI ÔN TẬP BÀI 2
1 Sinh mảng ngẫu nhiên gồm N số nguyên có giá trị (-100, 100)
– Tìm phần tử có giá trị X mảng phương pháp: Tìm tìm nhị phân
2 Cho cấu trúc Sách (Mã sách: char[10], Tên sách: char[40], Giá: long) Viết chương trình thực hiện:
– Nhập, xuất danh sách gồm N sách
– Tìm sách có mã X phương pháp tìm kiếm (X nhập từ bàn phím)
– Tìm sách có mã X phương pháp tìm kiếm nhị phân (X nhập từ bàn phím)
(33)Bài SẮP XẾP
• Nội dung
3.1 Giới thiệu toán xếp 3.2 Các giải thuật xếp
3.2.1 Interchange Sort 3.2.2 Bubble Sort
3.2.3 Selection Sort 3.2.4 Insertion Sort 3.2.5 Quick sort
(34)3.1 Giới thiệu tốn xếp
• Sắp xếp q trình bố trí lại phần tử tập đối tượng theo thứ tự định
• Trường tham gia q trình tìm kiếm gọi khoá (key)
(35)3.1 Giới thiệu tốn xếp
• Mơ tả tốn:
– Cho tập N phần tử có m thuộc tính, biểu diễn dạng ghi Dựa vào (hoặc vài) thuộc tính để xếp phần tử theo trật tự
– Dựa theo khóa xếp định vị lại thứ tự ghi – Chuyển ghi vị trí
• Hai thao tác bản:
(36)3.2 Các giải thuật xếp
3.2.1 Interchange Sort 3.2.2 Bubble Sort
(37)3.2.1 Interchange Sort
• Ý tưởng
– Xuất phát từ đầu dãy, tìm phần tử cịn lại khơng thoả thứ tự với phần tử xét Với phần tử tìm mà khơng thoả thứ tự Thực hoán vị để thoả thứ tự
(38)3.2.1 Interchange Sort
• Các bước tiến hành
✓B1: i = 0; // bắt đầu từ đầu dãy ✓B2: j = i +1; // duyệt qua phần tử sau ✓B3: Chừng j < n thực hiện:
Nếu a[j] < a[i] Đổi chỗ a[i] a[j]; j = j +1;
✓B4: i = i +1;
(39)3.2.1 Interchange Sort
10 3 7 6 2 5 4 16
i
(40)3.2 Bubble Sort
• Ý tưởng chính
– Xuất phát từ cuối dãy, đổi chỗ cặp phần tử kế cận để đưa phần tử nhỏ đầu
– Sau bước khơng xét phần tử Do lần xử lý thứ i có vị trí đầu dãy i
(41)3.2 Bubble Sort
• Các bước tiến hành
– B1: i=0; // lần xử lý đầu tiên
– B2: j=n-1; // duyệt từ cuối dãy ngược vị trí i
Trong (j>i) thực hiện:
Nếu a[j] < a[j-1]: Hoán đổi a[j] a[j-1] j = j -1;
– B3: i = i+1; // lần xử lý
(42)3.2 Bubble Sort
12
i=0
2 8 5 1 6 4 15
j=6
12
i=0
2 8 5 1 4 6 15
j=4
12
i=0
2 8 1 5 4 6 15
j=3
j=7
(43)3.2 Bubble Sort
12
i=0
2 1 8 5 4 6 15
j=2
12
i=0
1 2 8 5 4 6 15
j=1
1
i=1
12 2 8 5 4 6 15
(44)3.2 Bubble Sort
1
i=2
2 12 4 5 8 6 15
j=3
1
i=3
2 4 12 5 8 6 15
j=6
1
i=3
2 4 12 5 6 8 15
(45)3.2 Bubble Sort
1
i=4
2 4 5 12 6 8 15
j=5
1
i=5
2 4 5 6 12 8 15
j=6
1
i=6
2 4 5 6 8 12 15
(46)3.2.3 Selection Sort
Ý tưởng chính
• Chọn phần tử có khóa nhỏ N phần tử ban đầu.
• Đổi chỗ phần tử vừa chọn với phần tử đầu dãy
• Xem dãy hành cịn N-1 phần tử
(không xét phần tử đầu)
– Bắt đầu từ vị trí thứ hai
(47)3.2.3 Selection Sort
• Các bước thực hiện:
–B1: i = 0
–B2: Tìm phần tử a[min] nhỏ trong
dãy hiện hành từ a[i] đến a[n-1]
–B3: Hoán vị a[i] a[min]
–B4: Nếu i < n -2 i = i+1 Lặp B2
(48)3.2.3 Selection Sort
12 2 8 5 1 6 4 15
i=0 Vt_min=4
1 2 8 5 12 6 4 15
i=1
1 8 5 12 6 4 15
(49)3.2.3 Selection Sort
1 2 4 5 12 6 8 15
i=3
1 2 4 5 12 6 8 15
i=4 Vt_min=5
1 2 4 5 6 8 12 15
i=6
(50)3.2.4 Insertion Sort
• Ý tưởng chính
– Cho dãy ban đầu a[0], a[1], , a[n-1], ta xem dãy gồm phần tử a[0]
– Sau thêm a[1] vào đoạn a[0] cho a[0] a[1]
được
– Tiếp tục thêm a[2] vào để có a[0] a[1] a[2]
– Cho đến thêm xong a[n-1] vào đoạn a[0] a[1] a[n-2]
đoạn a[0] a[1] a[n-2] a[n-1]
(51)3.2.4 Insertion Sort
• Các bước tiến hành
– B1: i = 1; //giả sử có đoạn a[0]
sắp
– B2: x= a[i];
Tìm được vị trí cần chèn x vào pos
– B3: Dời chỗ phần tử từ a[pos] a[i-1] sang phải vị trí để dành chỗ cho a[i]
– B4: a[pos] = x; // có đoạn a[0] a[i]
– B5: i = i +1;
Nếu i < n: Lặp lại B2
(52)3.2.4 Insertion Sort
2 5 8 12 1 6 4 15
i=4
1 2 4 5 6 8 12 15
(53)3.2.5 Quick Sort
• Thuật tốn Hoare đề xuất
– Tốc độ trung bình nhanh thuật tốn khác – Do Hoare dùng “quick” để đặt tên
• Ý tưởng chính
– QS phân hoạch dãy ban đầu thành hai phần dựa vào giá trị x
(54)3.2.5 Quick Sort
• Giải thuật sắp xếp dãy a[left], a[left+1], ,a[right] được phát biểu đệ quy
như sau:
• B1: Phân hoạch dãy a[left] a[right] thành các dãy con:
– Dãy 1: a[left] a[j] < x – Dãy 2: a[j+1] a[i-1] = x – Dãy 3: a[i] a[right] > x
• B2:
– Nếu (left < j) // dãy có nhiều phần tử
Phân hoạch dãy a[left] a[j]
– Nếu (i < right) // dãy có nhiều phần tử
(55)3.2.5 Quick Sort
• Sau phân hoạch dãy ban đầu phân thành ba phần:
– a[k] < x, với k = i – a[k] = x, với k = i j – a[k] > x, với k = j n
• Nếu đoạn 1, đoạn có phần tử dãy ban đầu
• Nếu đoạn đoạn có nhiều phần tử ta cần lại đoạn (áp dụng phân hoạch trên)
(56)3.2.5 Quick Sort
12 2 8 5 1 4 6 15
Left Right
0 1 2 3 4 5 6 7
i j
5
X
Stop
Not < X
Stop
(57)3.2.5 Quick Sort
4 2 1 5 8 12 6 15
Left Right
0 1 2 3 4 5 6 7
i j
i<right => xếp cách phân hoạch tiếp
(58)3.3 Một số giải thuật xếp khác
(59)CÂU HỎI ÔN TẬP BÀI 3
1 Viết chương trình minh hoạ phương pháp xếp, chương trình có chức sau:
– Sinh danh sách ngẫu nhiên gồm n số
– Chọn phương pháp xếp, sau chạy xong, chương trình có báo thời gian chạy
– Xem danh sách sau xếp
2 Viết chương trình nhập vào danh sách sinh viên, thông tin sinh viên bao gồm: mã số sinh viên, họ tên, điểm trung bình
– Sắp xếp danh sách sinh viên tăng dần theo họ tên – Sắp xếp danh sách sinh viên giảm dần theo điểm
(60)Bài 4 DANH SÁCH LIÊN KẾT
• Nội dung
4.1 Khái niệm
4.2 Phương pháp cài đặt danh sách 4.3 Hiện thực danh sách kề
4.4 Hiện thực danh sách liên kết đơn 4.5 Các loại danh sách liên kết khác
(61)4.1 Khái niệm danh sách
• Danh sách tập hợp phần tử cùng kiểu liệu, phần tử danh sách có tính thứ tự.
• Các thao tác bản
– Khởi tạo
– Nhập/xuất danh sách – Thêm
– Xóa
(62)4.2 Phương pháp cài đặt
2 cách cài đặt
Kiểu kế tiếp Kiểu liên kết
Danh sách liên kết -DSLK đơn
(63)4.2 Phương pháp cài đặt
• Mảng chiều
– Kích thước cố định (fixed size)
– Các phần tử theo số n-1 – Truy cập ngẫu nhiên (random access) – Chèn phần tử vào mảng khó
chèn
(64)4.2 Phương pháp cài đặt
• Danh sách liên kết
– Cấp phát động lúc chạy chương trình
– Các phần tử nằm rải rác nhiều nơi nhớ – Kích thước danh sách bị giới hạn RAM
– Thao tác thêm xoá đơn giản
(65)4.3 Hiện thực danh sách kề
(66)4.4 Hiện thực DSLK đơn
• 4.4.1 Định nghĩa
(67)4.4.1 DSLK Đơn - định nghĩa
• DSLK đơn danh sách node, mỗi node gồm thành phần:
– Phần chứa liệu - Info
– Phần vị trí (địa chỉ) phần tử danh sách – Next
• Phần next trỏ, trỏ đến node kế tiếp
Info Next
(68)4.4.1 DSLK Đơn - định nghĩa
• Khai báo node
typedef struct node {
DataType info;
struct node * next; }Node;
(69)4.4.1 DSLK Đơn - định nghĩa
• Mơ tả DSLK
A1
Header Node Node
Tail Node
NUL L
Data Next
A2 A3 An
Con trỏ đến node đầu tiên
(giữ địa node đầu tiên)
pHead
(70)4.4.1 DSLK Đơn - định nghĩa
• Ví dụ
‘A’ 500 ‘B’ 600
‘C’ 300 ‘D’ NULL 700
700 500
600 300
Địa chỉ
pHead
(71)4.4.2 DSLK đơn – Thao tác bản
• Các thao tác bản
1 Init IsEmpty InsertFirst InsertAfter DeleteFirst DeleteAfter DeleteAll ShowList Search 10.Sort Phần minh hoạ dùng DataType int
typedef struct node {
int info;
struct node * next; }Node;
(72)4.4.2 DSLK đơn – Thao tác bản
Khởi tạo Kiểm tra rỗng
void Init(Node * &pHead) {
pHead = NULL; }
//trả 1: danh sách rỗng //trả 0: danh sách không rỗng
int IsEmpty(Node* pHead) {
(73)4.4.2 DSLK đơn – Thao tác tạo nút
•Tạo nút chứa liệu X
Node* CreateNode(int X) {
Node* p=new Node; p->info=X;
p->next=NULL; return p;
}
p=new Node;
new
p->info=X;
p->next=NULL;
(74)4.4.2 DSLK đơn – Thêm đầu
pHead
pHead X
p=CreateNode(x);
new
pHead
1
2 3
pHead
p
p
p
(75)4.4.2 DSLK đơn – Thêm sau nút
p p
tam
new
p
tam tam
(76)4.4.2 DSLK đơn – Xóa đầu
pHead pHead
pHead
p = pHead
pHead
p
p p
(77)4.4.2 DSLK đơn – Xóa sau
• Xố phần tử sau node p danh sách
q p
(78)4.4.2 DSLK đơn – Xóa tồn bộ
pHead
p
pHead
p
pHead
p
pHead
(79)4.5 Các loại DSLK khác
(80)4.5.1 DSLK vịng
• Tương tự danh sách liên kết đơn.
• Trường next nút cuối đến đầu danh sách
Trường Next nút cuối ko trỏ đến
(81)4.5.1 DSLK vịng
• Mơ tả
– Sử dụng pList trỏ đến phần tử cuối danh sách
A1 A2 A3 An
pList
(82)4.5.1 DSLK vịng
• Khai báo & khởi tạo
typedef struct node {
DataType info; struct node * next;
}Node;
Node* pList;
(83)4.5.1 DSLK kép
• Cho phép di chuyển chiều đến nút trước sau
– Liên kết nút trước là: prev – Liên kết nút sau là: next
• Nút đầu có prev NULL • Nút cuối có next NULL
(84)4.5.1 DSLK kép
• Khai báo
typedef struct node {
DataType info; struct node * prev; struct node * next; }Node;
Node* pHead; pHead= NULL;
pHead quản lý ds kép Khởi tạo dslk
(85)CÂU HỎI ÔN TẬP BÀI 4
1 Nhập dãy số nguyên
– Tạo danh sách liên kết đơn, phần tử là số nguyên – Xuất dãy số
– Cài đặt thao tác thêm, xóa dãy số
2 Viết chương trình quản lý danh sách sinh viên (sử dụng DSLKĐ), thông tin sv gồm: mã sv, họ tên, điểm trung bình Chương trình có chức sau:
– Tạo danh sách gồm n SV (n nhập từ bàn phím, thơng tin sv nhập từ bàn phím)
– Xuất danh sách sinh viên
– Xuất thông tin sv có ĐTB>5 – Tìm sinh viên có tên là X
(86)CÂU HỎI ÔN TẬP BÀI (tt)
3 Viết chương trình thực danh sách liên kết đôi.
(87)Bài STACK
5.1 Giới thiệu Stack 5.2 Cài đặt Stack
(88)5.1 Giới thiệu Stack
• Stack là danh
sách đặc biệt mà việc thêm vào và loại bỏ thực đầu (gọi là đỉnh – top stack)
(89)5.1 Giới thiệu Stack
Cơ chế:
Last In First Out LIFO
(90)5.2 Cài đặt Stack
Mảng chiều Danh sách liên kết đơn
Kích thước stack thiếu, lúc thừa
Cấp phát động!
Push / Pop phức tạp
(91)5.2 Cài đặt Stack
• Dùng danh sách liên kết đơn
typedef struct node {
DataType info; struct node * next; }Node;
typedef Node * STACK;
//sử dụng
STACK s; s quản lý Stack
Đầu ds
(92)5.2 Cài đặt Stack
❖ InitStack
❖ IsEmpty
❖ Push
❖ Pop
Đầu ds
• Các thao tác
(93)5.2 Cài đặt Stack - Push
• Push: Thêm phần tử x vào Stack
– Tạo node có liệu x – Thêm vào đầu danh sách
2 1
3
s
New
1 2 3
s
(94)3
5.2 Cài đặt Stack - Pop
• Pop: Lấy phần tử khỏi ngăn xếp
– Lấy phần tử đầu danh sách
– Trả nội dung và giải phóng nút
1 2 3 s
s
X=
3 2 1
p
(95)5.3 Ứng dụng Stack
• Khử đệ quy
– Bài tốn đổi số, tháp Hà Nội
• Áp dụng cho toán dùng chế LIFO
– Chuyển biểu thức trung tố (Infix) sang biểu thức hậu tố (Postfix)
(96)5.3 Ứng dụng - Bài tốn đổi số
• Nhập số nguyên (VD: nhập n=13) số (VD: CoSo=2) , xuất biểu diễn số theo số 13 2
0 1 0 1 0 1 1 Ngưng chia 2 6 1 1 0
0 3 2
1 11
0
(97)CÂU HỎI ÔN TẬP BÀI 5
1. Hiện thực Stack tác vụ Stack
bằng danh sách liên kết.
2. Viết chương trình đổi số thập phân
sang cơ số vận dụng Stack.
(98)Bài QUEUE
6.1. Giới thiệu Queue
6.2 Cài đặt Queue
(99)6.1 Giới thiệu Queue
(100)6.2 Cài đặt Queue
• Dùng DSLK đơn
A1 A NULL
2 An
(101)6.2 Cài đặt Queue
typedef struct node {
DataType info;
struct node * next;
}Node;
typedef struct QUEUE {
Node* pHead; Node* pTail;
}Queue;
• Queue dùng DSLK
– Con trỏ pHead trỏ đầu danh sách
– Con trỏ pTail trỏ đến cuối danh sách
– Thao tác Remove diễn pHead
– Tháo tác Insert diễn pTail
(102)6.2 Cài đặt Queue
• Các thao tác bản
1 Init
2 IsEmpty Insert Remove
• Các thao tác bổ sung QueueFirst
(103)6.2 Cài đặt Queue - Insert
pHead pTail
5
pHead
5
pTail
new
X
p
(104)6.2 Cài đặt Queue - Remove
• TH: Hàng đợi có phần tử
pHead
5
pTail
p
(105)6.2 Cài đặt Queue - Remove
• TH: Hàng đợi có nhiều phần tử
pHead pTail
5
pHead
5
(106)6.3 Ứng dụng
• Ứng dụng Queue
– Trong toán hàng đợi “Vào trước trước” FIFO:
• Hệ thống print server
• Cơ chế thơng điệp, đệm, hàng đợi xử lý kiện…
(107)CÂU HỎI ÔN TẬP BÀI 6
1. Hiện thực hàng đợi tác vụ của
hàng đợi danh sách liên kết.
2. Viết chương trình quản lý kho hàng dùng
hàng đợi thực danh sách
(108)Bài CÂY NHỊ PHÂN
• Nội dung
7.1 Cấu trúc tổng quát 7.2 Cây nhị phân
7.3 Mô tả nhị phân 7.3.1 Mô tả liệu 7.3.2 Mô tả tác vụ
(109)(110)7.1 Cấu trúc tổng quát
• Tập hợp nút và cạnh nối nút đó • Có nút gọi là gốc
• Quan hệ one-to-many nút
• Có đường từ gốc đến một nút
• Các loại cây:
(111)7.1 Cấu trúc tổng qt
• Nút gốc : khơng có nút cha
• Nút lá : khơng có nút con
• Nút trong : khơng phải nút và nút gốc
• Bậc nút: số nút nút đó
• Bậc cây : là bậc lớn nút trong
cây
• Mức nút:
– Nút gốc có mức = 0
– Các nút khác nút gốc có mức = mức nút cha + 1;
(112)7.1 Cấu trúc tổng quát J Z A D R B L F A K Q Lá Nút Gốc Cạnh Mức Mức Mức Mức
(113)7.1 Cấu trúc tổng quát
Root
A
H
B
G F
E D
C
K J
L I
(114)(115)7.3 Mô tả nhị phân
7.3.1 Mô tả liệu 7.3.2 Mô tả tác vụ
(116)7.3.1 BT – Mơ tả liệu
• Cấu trúc đơn giản nhất, nút có tối đa nút
• Tại nút gồm thành phần
– Phần data: chứa giá trị, thông tin… – Liên kết đến nút trái (nếu có) – Liên kết đến nút phải (nếu có)
• Cây nhị phân rỗng (khơng có nút nào) • Cây NP khác rỗng có nút gốc
– Có đường từ gốc đến nút
(117)7.3.1 BT – Mô tả liệu
A
B C
D E F
I H
G
Độ sâu/chiều cao =
Kích thước = (số nút)
Cây trái Cây phải
Mức
Mức
(118)7.3.2 BT – Mô tả tác vụ
1 Khởi tạo Kiểm tra rỗng Tạo nút
4 Thêm trái Thêm phải
(119)7.3.3 BT- Duyệt cây
• Duyệt cây:
– Do cấu trúc khơng tuyến tính – cách duyệt NP
(120)7.3.3 BT- Duyệt cây
• Ví dụ: A
B C
D E G H
K
I L
(121)7.4 Hiện thực nhị phân
• Cài đặt NP dùng liên kết
typedef struct node {
DataType info; struct node * left; struct node * right;
} Node;
Node* pTree; Trỏ nút gốc NP
Chứa thông tin nút
(122)7.4 Hiện thực nhị phân
8
5 10
1
7
20
pTree
(123)7.4 Hiện thực nhị phân
• Các thao tác:
– CreateNode, FreeNode, Init, IsEmpty – InsertLeft, InsertRight
– DeleteLeft, DeleteRight
– PreOrder, InOrder, PostOrder – Search
– ClearTree
Phần minh hoạ dùng DataType
(124)7.4 Hiện thực nhị phân
• Các thao tác mở rộng khác:
– Đếm số nút lá: CountLeaf
– Đếm số nút cây: CountNode – Xác định độ sâu/chiều cao – Tìm giá trị nhỏ nhất/lớn – Tính tổng giá trị
(125)CÂU HỎI ÔN TẬP BÀI 7
Cho trước mảng a có n phần tử (mảng số nguyên/ hoặc mảng cấu trúc có trường là khóa), hãy tạo nhị phân có n node, mỗi nút lưu phần tử mảng.
1 Cài đặt hàm duyệt theo thứ tự: LNR, NLR, LRN, mức
2 Tìm node có giá trị X
3 Xác định chiều cao Đếm số node
(126)Bài CÂY NHỊ PHÂN TÌM KIẾM
• Binary Search Tree (BST) • Nội dung
8.1 Khái niệm
(127)8.1 BST – Khái niệm
• BST nhị phân mà mỗi nút thoả
– Giá trị tất nút trái < giá trị nút – Giá trị tất nút phải > giá trị nút
đó
5
3
1 4
10
8 20
(128)8.2 BST – Cài đặt
• Thao tác tìm kiếm
5
10
30
2 8 25 45
3 6 9 14 33 66
x = 9 9<10, left 9>5, right 9>8, right
9=9, Tìm thấy
5<9
8<9
(129)8.2 BST – Cài đặt
• Search
– Xuất phát từ gốc
• Nếu nút = NULL => ko tìm thấy
• Nếu khố x = khóa nút gốc => tìm thấy
• Ngược lại khố x < khố nút gốc => Tìm trên
cây bên trái
• Ngược lại => Tìm bên phải
(130)8.2 BST – Cài đặt
• Xây dựng BST
– Chèn – Xóa
• Ln trì tính chất
(131)8.2 BST – Cài đặt
• Thêm nút có liệu x vào • Nếu rỗng → thêm trực tiếp
• Ngoài ra:
– Thực tìm kiếm giá trị x
– Tìm đến cuối nút Y (nếu x ko tồn cây)
– Nếu x < y, thêm nút x bên trái Y – Nếu x > y, thêm nút x bên phải
Y
5
10
30
2 25 45
20
Y
X
(132)8.2 BST – Cài đặt
• Delete: xóa phải đảm bảo cây BST
– Thực tìm nút có giá trị x – Nếu nút nút lá, delete nút – Ngược lại
• Thay nút hai nút sau
– Y nút lớn bên trái – Z nút nhỏ bên phải
(133)8.2 BST – Cài đặt - Delete
• TH 1: nút p nút lá, xố bình thường
5
10
30
2 25 45
5
10
30
2 45
(134)8.2 BST – Cài đặt – Delete
• TH2: p chỉ có con
– Cho nút cha p trỏ tới nút nhất
của p
– Hủy p
5
10
30
2 25 45
Xóa X=5
10
30
(135)8.2 BST – Cài đặt – Delete
• TH3: nút p có con, chọn nút thay để
xóa theo cách sau
– Nút lớn bên trái (lp->right==NULL) – Nút nhỏ bên phải (rp->left==NULL)
lp - Nút lớn
bên trái
Rp - Nút nhỏ
(136)CÂU HỎI ÔN TẬP BÀI 8
1 Cài đặt cấu trúc liệu liên kết cho cây nhị phân tìm kiếm
2 Cài đặt thao tác xây dựng cây: Init,
IsEmpty, CreateNode
3 Cài đặt thao tác cập nhật: Insert,
Remove, ClearTree
(137)Bài 9 CÂY NHỊ PHÂN TÌM KIẾM CÂN BẰNG
• Do hai nhà tốn học người Nga là
Adelson Velski Landis xây dựng vào
năm 1962 nên cịn gọi AVL. • Nội dung
– 9.1 Định nghĩa
– 9.2 Các tác vụ xoay
(138)9.1 Định nghĩa
• Cây NPTK cân bằng
– Là nhị phân tìm kiếm
– Tại nút: số nút nhánh trái nhánh phải chênh lệch ko nút!
P
Cây bên trái
Cây bên phải
(139)9.2 Các tác vụ xoay
• Q trình cập nhật nhị phân tìm kiếm thường làm cân bằng
• Thao tác:
(140)9.2 Các tác vụ xoay
• RotateLeft
r
a p
b c
Xoay trái nút r
Cây a
Cây b
Cây c
(141)9.2 Các tác vụ xoay
• RotateLeft
r
a p
b c
p
c
r
a b
(142)9.2 Các tác vụ xoay
• RotateRight
r
c
p
a b
p
a r
b c
(143)9.3 Cài đặt AVL
• Cài đặt dùng liên kết
typedef struct node{ int info;
int bf; //balance factor
struct node *left, *right; } Node;
(144)CÂU HỎI ÔN TẬP BÀI 9
1 Xét tác vụ insert và remove để thêm nút và xoá nút AVL.
– Vẽ lại hình ảnh BST thêm nút vào theo thứ tự sau: 8, 3, 5, 2, 20, 11, 30, 9, 18,
– Vẽ lại hình ảnh ta lần lược xoá nút và 20
2 Cài đặt cấu trúc liệu liên kết cho cây AVL, với thao tác:
– Cài đặt thao tác xây dựng cây: Init, IsEmpty, CreateNode