• 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]
Trang 1GV : Văn Thị Thiên TrangKhoa : Công Nghệ Thông Tin
CẤU TRÚC DỮ LIỆU
& GiẢI THUẬT
Trang 2MÔ TẢ HỌC PHẦN
những thao tác cơ sở trên từng CTDL, kết hợp với việc phát triển tư duy giải thuật để hình thành nên chương trình máy tính.
Trang 3- Bài 7 Cây nhị phân.
- Bài 8 Cây nhị phân tìm kiếm - BST
- Bài 9 Cây nhị phân tìm kiếm cân bằng - cây AVL
Trang 4Bài 1 TỔNG QUAN VỀ CTDL & GT
Nội dung
1.1 Vai trò CTDL trong một đề án tin học
1.4 Kiểu dữ liệu cơ bản
1.5 Kiểu dữ liệu có cấu trúc
1.6 Độ phức tạp của giải thuật
Trang 51.1 Vai trò CTDL trong 1 đề án tin học
Bài toán giải quyết trong máy tính
Xử lý trên đối tượng DL
Bài toán thực tế
Đối tượng
dữ liệu
Trang 61.1 Vai trò CTDL trong 1 đề án tin học
• Dữ liệu thực tế:
– Muôn hình vạn trạng, đa dạng, phong phú
– Thường có chứa đựng quan hệ với nhau
• Cần phải tổ chức biểu diễn thành cấu trúc
– Phản ánh chính xác dữ liệu thực tế
– Dễ dàng xử lý trong máy tính
Xây dựng CTDL
Trang 71.1 Vai trò CTDL trong 1 đề án tin học
Dựa trên Y/C cụ thể, xác định các trình tự giảiquyết vấn đề trên máy tính để đưa kết quảmong muốn
Đối tượng DL
Thao tác xử lý Kết quả
mong muốn
Xây dựng giải thuật
Trang 81.1 Vai trò CTDL trong 1 đề án tin học
Giải thuật
Chương trình
Cấu trúc dữ liệu
Quan hệ chặt chẽ
Trang 91.2 Các tiêu chuẩn đánh giá CTDL
• Tiết kiệm tài nguyên hệ thống:
– Sử dụng tài nguyên vừa đủ để thực hiện chứcnăng & nhiệm vụ
Trang 101.3 Trừu tượng hóa dữ liệu
• Trừu tượng hoá
– Làm đơn giản hóa, sáng sủa, dễ hiểu hơn
– Che đi phần chi tiết, làm nổi bật cái tổng thể
• Trừu tượng hoá dữ liệu: đưa ra các kiểu dữ liệutrừu tượng (Abstract Data Type)
Trang 111.3 Trừu tượng hóa dữ liệu
• VD: mô tả kiểu dữ liệu trừu tượng về số hữu tỉ a/b với các tác vụ: +,*, /
– Mô tả dữ liệu
• Tử số
• Mẫu số (≠0) – Mô tả tác vụ
Trang 121.4 Kiểu dữ liệu cơ bản
• Thường đơn giản và không có cấu trúc, được NNLT xây dựng sẵn, nên còn gọi là kiểu dữ liệu dựng sẵn.
• Thường là các trị vô hướng:
– số nguyên
– số thực
– ký tự
– giá trị logic
Trang 131.4 Kiểu dữ liệu cơ bản (tt)
char 1 -128 đến 127 Có thể dùng như số nguyên 1
byte có dấu hay kiểu ký tự unsigned char 1 0 đến 255 Số nguyên 1 byte ko dấu
int 2 -32768 đến 32767
unsigned int 2 0 đến 65355 Gọi tắt là unsigned
long 4 -2 32 đến 2 31 -1
unsigned long 4 0 đến 2 32 -1
float 4 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
Trang 141.5 Kiểu dữ liệu có cấu trúc
• Kết hợp nhiều kiểu dữ liệu cơ bản để phản ánhbản chất của đối tượng thực tế
• Đa số các ngôn ngữ đều cài đặt sẵn một số kiểu
có cấu trúc cơ bản: mảng, chuỗi, tập tin, bảnghi…
• Ngoài ra cung cấp cơ chế cho người lập trìnhcài đặt các dữ liệu cấu trúc khác
Trang 151.5 Kiểu dữ liệu có cấu trúc
• Cấu trúc dữ 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
Sinh Viên
Trang 161.6 Độ phức tạp của giải thuật
• Sự cần thiết phân tích giải thuật
Trang 171.6 Độ phức tạp của giải thuật
• Các độ phức tạp thường gặp:
– O(1) : Nếu T(n) là hằng 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( n 2 ), O(n 3 ),…,O(n ): Độ phức tạp đa thức
Trang 181.6 Độ phức tạp của giải thuật
• Thường dựa vào số phép so sánh và số phép gán
2
) 1 (
n
) 1 (
) 1
n i
n
a i
2 1
n
) 1 2
)(
1 (
n i
n
i
) 1
2
3 = +
n n n
Trang 19CÂU HỎI ÔN TẬP BÀI 1
1 Viết chương trình C khai báo kiểu dữ liệu là mảng một chiều,
chương trình có các chức năng như sau:
– Nhập giá trị vào mảng.
– Xuất các phần tử trong mảng.
2 Viết chương trình C có khai báo kiểu dữ liệu là mảng hai chiều,
chương trình có các chức năng sau:
– Nhập giá trị vào ma trận.
– Xuất các phần tử trong ma trận.
3 Hãy xây dựng và hiện thực kiểu dữ liệu trừu tượng cho thông tin
sinh viên với các thao tác nhập, xuất thông tin của sinh viên.
4 Hãy xây dựng và hiện thực kiểu dữ liệu trừu tượng của số hữu tỉ
a/b với các tác vụ cộng hai số hữu tỉ, nhân hai số hữu tỉ, chia hai
số hữu tỉ.
Trang 212.1 Giới thiệu bài toán tìm kiếm
• Tìm kiếm là quá trình xác định một đối tượng nào đó trong một tập các đối tượng Kết quả trả về:
– Đối tượng tìm được (nếu có)
– Chỉ số (nếu có) xác định vị trí của đối tượng trong tập đó.
• Việc tìm kiếm dựa theo một trường nào đó của đối tượng, trường này là khóa (key) của việc tìm kiếm.
– VD: Tìm sinh viên có họ tên X trong DSSV.
• SV {MaSV, HoTen, DiaChi,…}
• Khoá?
• Kết quả trả về?
Trang 222.1 Giới thiệu bài toán tìm kiếm
• Bài toán được mô tả như sau:
– Tập dữ liệu được lưu trữ là dãy a1, a2, ,an Giả sử chọn cấu trúc dữ liệu mảng để lưu trữ dãy số này trong bộ nhớ chính, có khai báo: int a[n] ;
– Khóa cần tìm là x : int x ;
Tìm kiếm
Tìm kiếm tuyến tính Tìm kiếm nhị phân
Tập dữ liệu đã được sắp xếp Tập dữ liệu
bất kỳ
Trang 232.1 Giới thiệu bài toán tìm kiếm
• Ý tưởng: duyệt tuần tự từ phần tử đầu tiên, lần lượt so
sánh khóa tìm kiếm với khoá tương ứng của các phần
tử trong danh sách Cho đến khi gặp phần tử cần tìm hoặc đến khi duyệt hết danh sách.
• Các bước tiến hành như sau: i = 0
a[i] = x
i<n Không tìm thấy
Tìm thấy
Đ Đ
S
S
Trang 251.1 Tìm kiếm tuyến tính
• Thuật toán tìm kiếm tuyến tính
/* Trả về: vị trí xuất hiện đầu tiên của x trong mảng a Trả về: -1 nếu x không có trong mảng a */
int Search(int a[], int n, int key )
return i; // tìm thấy tại vị trí i
return -1; // tìm không thấy
}
Trang 261.1 Tìm kiếm tuyến tính
• Thuật toá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 nhưng không có x
return i ; // tìm thấy x tại vị trí i
}
Trang 27Nhậ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ủa các phần tử trong mảng, do vậy đây là phương pháp tổng quát nhất để tìm kiếm trên một dãy bất kỳ
• Một thuật toán có thể được cài đặt theo nhiều cách khác nhau, kỹ thuật cài đặt ảnh hưởng nhiều đến tốc độ thực hiện
Ví dụ như thuật toán Search cải tiến sẽ chạy nhanh hơn thuật toán trước do vòng lặp while chỉ so sánh một điều kiện
Trang 281.2 Tìm kiếm nhị phân
• Phép tìm kiếm nhị phân được áp dụng
k[n].
Trang 29• Đoạn a[left, ,mid] chứa các phần tử <X
• Tìm X trong đoạn a[mid+1, , right]
– Nếu a[mid]>X:
• Đoạn a[mid, ,right] chứa các phần tử >X
• Tìm X trong đoạn a[left, , right-1]
• Quá trình tìm kiếm thất bại nếu left>right
Trang 30Left = 4
X = 8
Right = 7 Mid = 5
Đoạn tìm kiếm
=
<
Trang 311.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) // nếu tìm được
Trang 32CÂ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 trong mảng bằng 2 phương pháp: Tìm tuần tự và 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 cuốn sách.
– Tìm cuốn sách có mã là X bằng phương pháp tìm kiếm tuần tự (X nhập từ bàn phím).
– Tìm cuốn sách có mã là X bằng phương pháp tìm kiếm nhị phân (X nhập từ bàn phím).
– Liệt kê thông tin các cuốn sách có giá > G (G nhập từ bàn phím) – Tìm cuốn sách có giá lớn nhất.
Trang 333.2.3 Selection Sort 3.2.4 Insertion Sort 3.2.5 Quick sort
3.3 Một số giải thuật sắp xếp khác
Trang 343.1 Giới thiệu bài toán sắp xếp
• 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ượngtheo một thứ tự nhấtđịnh
• Trường tham gia quá trình tìm kiếm gọi là khoá (key)
• Việc sắp xếp sẽ được tiến hành dựa vào giá trị khoá này
Trang 353.1 Giới thiệu bài toán sắp xếp
• Mô tả bài toán:
– Cho tập N phần tử có m thuộc tính, được biểu diễn dưới dạng bản ghi Dựa vào một (hoặc vài) thuộc tính để sắp xếp các phần tử theo trật tự mới.
– Dựa theo khóa sắp xếp định vị lại thứ tự bản ghi – Chuyển các bản ghi về vị trí mới
• Hai thao tác cơ bản:
– So sánh
– Gán
Trang 373.2.1 Interchange Sort
• Ý tưởng
– Xuất phát từ đầu dãy, lần lượt tìm nhữngphần tử còn lại không thoả thứ tự với phần tửđang xét Với mỗi phần tử tìm được màkhông thoả thứ tự Thực hiện hoán vị để thoảthứ tự
– Lặp lại tương tự với các phần tử tiếp theo
Trang 383.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 các phần tử sau
Trang 393.2.1 Interchange Sort
10 3 7 6 2 5 4 16
i
j
Trang 403.2 2 Bubble Sort
• Ý tưởng chính
– Xuất phát từ cuối dãy, đổi chỗ các cặp phần
tử kế cận để đưa phần tử nhỏ hơn về đầu
– Sau đó ở bước tiếp theo không xét phần tử
đó nữa Do vậy lần xử lý thứ i sẽ có vị trí đầudãy là i
– Lặp lại xử lý trên cho đến khi không còn cặpphần tử nào được xét
Trang 413.2 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ề vị trí i
Trong khi (j>i) thực hiện:
Nếu a[j] < a[j-1]: Hoán đổi a[j] và a[j-1]
j = j -1;
– B3: i = i+1; // lần xử lý kế tiếp
Nếu i > n-2: Hết dãy Dừng Ngược lại: quay lại B2
Trang 463.2.3 Selection Sort
• Chọn phần tử có khóa nhỏ nhất trong 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 hiện hành chỉ còn N-1 phần tử
– Bắt đầu từ vị trí thứ hai
– Lặp quá trình trên cho dãy hiện hành… đếnkhi dãy hiện hành chỉ còn một phần tử
Trang 473.2.3 Selection Sort
• Các bước thực hiện:
–B1: i = 0
dãy hiện hành từ a[i] đến a[n-1]
–B3: Hoán vị a[i] và a[min]
–B4: Nếu i < n -2 thì i = i+1 Lặp B2
Trang 503.2.4 Insertion Sort
• Ý tưởng chính
– Cho dãy ban đầu a[0], a[1], , a[n-1], ta có thể xem
dãy con gồm một phần tử a[0] đã được sắp.
– Sau đó thêm a[1] vào đoạn a[0] sao cho a[0] a[1]
được sắp.
– Tiếp tục thêm a[2] vào để có a[0] a[1] a[2] được
sắp
– Cho đến khi 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]
được sắp.
Trang 51Tìm được vị trí cần chèn x vào là pos
– B3: Dời chỗ các phần tử từ a[pos] a[i-1]sang phải một vị trí để dành chỗ cho a[i]
– B4: a[pos] = x; // có đoạn a[0] a[i] được sắp
– B5: i = i +1;
Nếu i < n: Lặp lại B2 Ngược lại: Dừng Dãy đã được sắp
Trang 533.2.5 Quick Sort
• Thuật toán do Hoare đề xuất
– Tốc độ trung bình nhanh hơn thuật toá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ầndựa vào một giá trị x
• Dãy 1: gồm các phần tử a[i] ko lớn hơn x (<=x)
• Dãy 2: gồm các phần tử a[i] ko nhỏ hơn x (>=x)
Trang 543.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 con 1: a[left] a[j] < x
– Dãy con 2: a[j+1] a[i-1] = x
– Dãy con 3: a[i] a[right] > x
• B2:
– Nếu (left < j) // dãy con 1 có nhiều hơn 1 phần tử
Phân hoạch dãy a[left] a[j]
– Nếu (i < right) // dãy con 3 có nhiều hơn 1 phần tử
Phân hoạch dãy a[i] a[right]
Trang 553.2.5 Quick Sort
• Sau khi phân hoạch thì dãy ban đầu được phân thành ba phần:
– a[k] < x, với k = 1 i
– a[k] = x, với k = i j
Trang 57i<right => sắp xếp bằng cách phân hoạch tiếp
i<right => sắp xếp bằng
cách phân hoạch tiếp
Trang 59CÂU HỎI ÔN TẬP BÀI 3
1 Viết chương trình minh hoạ các phương pháp
sắp xếp, chương trình có các chức năng chínhnhư sau:
– Sinh danh sách ngẫu nhiên gồm n số.
– Chọn phương pháp sắp xếp, sau khi chạy xong, chương trình có báo thời gian chạy.
– Xem danh sách sau khi đã sắp xếp.
2 Viết chương trình nhập vào danh sách sinh viên,
thông tin của 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.
•
Trang 60Bà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
4.5.1 Danh sách liên kết vòng 4.5.2 Danh sách liên kết kép
Trang 614.1 Khái niệm danh sách
• Danh sách là một tập hợp các phần tử cùng kiểu dữ liệu, các phần tử trong danh sách có tính thứ tự.
Trang 644.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 trong bộ nhớ
– Kích thước danh sách chỉ bị giới hạn do RAM
– Thao tác thêm xoá đơn giản
Insert, Delete
Trang 654.3 Hiện thực danh sách kề
• Cài đặt mảng 1 chiều (SV tự cài đặt)
Trang 664.4 Hiện thực DSLK đơn
• 4.4.1 Định nghĩa
• 4.4.2 Các thao tác cơ bản
Trang 674.4.1 DSLK Đơn - định nghĩa
• DSLK đơn là một danh sách các node, mỗi node gồm 2 thành phần:
– Phần chứa dữ liệu - Info
– Phần chỉ vị trí (địa chỉ) của phần tử tiếp theotrong danh sách – Next
• Phần next là con trỏ, trỏ đến node kế tiếp
Info Next
Node
Trang 684.4.1 DSLK Đơn - định nghĩa
• Khai báo 1 node
typedef struct node {
struct node * next;
}Node;
Trang 69Con trỏ đến node đầu tiên
(giữ địa chỉ của node đầu tiên)
pHead
pTail
Trang 714.4.2 DSLK đơn – Thao tác cơ bản
typedef struct node {
int info;
struct node * next; }Node;
Node* pHead;
Trang 724.4.2 DSLK đơn – Thao tác cơ bản
Khởi tạo Kiểm tra rỗng
void Init(Node * & pHead)
{
pHead = NULL;
}
//trả về 1: danh sách rỗng //trả về 0: danh sách không rỗng
int IsEmpty(Node* pHead) {
return (pHead==NULL); }
Trang 734.4.2 DSLK đơn – Thao tác tạo nút
•Tạo nút chứa dữ liệu X
Node* CreateNode(int X) {
Node* p=new Node;
Trang 744.4.2 DSLK đơn – Thêm đầu
Trang 754.4.2 DSLK đơn – Thêm sau 1 nút
Trang 764.4.2 DSLK đơn – Xóa đầu
Trang 774.4.2 DSLK đơn – Xóa sau
• Xoá phần tử sau node p trong danh sách
q p
p
Trang 784.4.2 DSLK đơn – Xóa toàn bộ
Trang 794.5 Các loại DSLK khác
4.5.1 DSLK vòng
4.5.2 DSLK kép
Trang 804.5.1 DSLK vòng
• Tương tự như danh sách liên kết đơn.
• Trường next của nút cuối chỉ đến đầu danh sách
Trường Next của nút cuối ko còn trỏ đến
Trang 824.5.1 DSLK vòng
• Khai báo & khởi tạo
typedef struct node {
DataType info;
struct node * next;
}Node;
Node* pList;
pList = NULL; pList trỏ nút cuối dsKhởi tạo dslk
Trang 834.5.1 DSLK kép
• Cho phép di chuyển 2 chiều đến nút trước và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 là NULL
• Nút cuối có next là NULL
Trang 84struct node * prev;
struct node * next;
}Node;
Node* pHead;
pHead= NULL;
pHead quản lý ds kép Khởi tạo dslk
trỏ đến nút trước trỏ đến nút sau
Trang 85CÂU HỎI ÔN TẬP BÀI 4
1 Nhập 1 dãy số nguyên
– Tạo danh sách liên kết đơn, mỗi phần tử là một số nguyên.
– Xuất dãy số
– Cài đặt các thao tác thêm, xóa trên 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 mỗi sv gồm: mã sv, họ tên, điểm trung bình Chương trình có các chức năng sau:
– Tạo 1 danh sách gồm n SV (n nhập từ bàn phím, thông tin của mỗi sv nhập từ bàn phím)
– Xuất danh sách sinh viên
– Xuất thông tin các sv có ĐTB>5
– Tìm sinh viên có tên là X
– Sắp xếp danh sách tăng theo ĐTB
Trang 86CÂU HỎI ÔN TẬP BÀI 4 (tt)
3 Viết chương trình hiện thực danh sách
liên kết đôi.
4 Viết chương trình hiện thực danh sách
liên kết vòng.
Trang 87Bài 5 STACK
5.1 Giới thiệu về Stack
5.2 Cài đặt Stack
5.3 Ứng dụng
Trang 885.1 Giới thiệu Stack
• Stack là một danh sách đặc biệt mà việc thêm vào và loại bỏ được thực hiện tại một đầu (gọi là đỉnh –top của stack)
• Hoạt động theo cơ chế LIFO (Last In First Out)
Trang 895.1 Giới thiệu Stack
Cơ chế:
Last In First Out
LIFO
Stack
Trang 90Push / Pop hơi
phức tạp
Push/Pop khá dễ dàng
Trang 915.2 Cài đặt Stack
• Dùng danh sách liên kết đơn
typedef struct node
Trang 935.2 Cài đặt Stack - Push
• Push: Thêm 1 phần tử x vào Stack
– Tạo node mới có dữ liệu x
– Thêm vào đầu danh sách
3
s
p
Trang 945.2 Cài đặt Stack - Pop
• Pop: Lấy 1 phần tử ra khỏi ngăn xếp
– Lấy ra phần tử đầu danh sách
– Trả về nội dung và giải phóng nút
1 2 3