Professional Documents
Culture Documents
Bài 1
***
TỔNG QUAN
Giới thiệu
Giới thiệu
1
BG CTDL> - Trang 2
Giới thiệu
1 2 3
Giới thiệu
2
BG CTDL> - Trang 3
Kiểu dữ liệu
Kiểu số nguyên
Kiểu số thực
Kiểu ký tự
Kiểu luận lý
Kiểu dữ liệu
Kiểu mảng
Kiểu dữ liệu
3
BG CTDL> - Trang 4
10
11
4
BG CTDL> - Trang 5
Cách tính
Tỷ suất tăng f(n) = ni
c, n0 sao cho T(n) c * f(n) n n0
14
Cách tính
Tỷ suất tăng f(n)
c, n0 sao cho T(n) c * f(n) n n0
15
5
BG CTDL> - Trang 6
Cách tính
Độ phức tạp
O(f(n))
16
Cách tính
Độ phức tạp
Tính độ phức tạp của chương trình tính Cnk?
17
Cách tính
Độ phức tạp
Tính độ phức tạp của chương trình tìm giá trị
lớn nhất của n số?
18
6
BG CTDL> - Trang 7
19
20
Bài tập
Cho đa thức
f(x) = a0 + a1x1 + a2x2 + … + anxn
Chọn cấu trúc dữ liệu có thể lưu trữ đa thức
trên.
Viếtchương trình con cho phép nhập đa thức.
Tính độ phức tạp.
Viếtchương trình con cho phép xuất đa thức.
Tính độ phức tạp.
21
7
BG CTDL> - Trang 8
Bài 2
***
KỸ THUẬT TÌM KIẾM
Giới thiệu
Nhu cầu tìm kiếm
Nhu cầu lớn
Kết quả tìm kiếm
Tốc độ tìm kiếm
Bài toán
Cho mảng arr có n phần tử lần lượt là arr[0],
arr[1], …, arr[n-1]. Có phần tử nào mang giá trị x
hay không? Nếu có thì đó là phần tử thứ mấy?
Ý tưởng
Lần lượt so sánh giá trị x với các phần tử trong
mảng arr bắt đầu từ phần tử đầu tiên.
Bài toán kết thúc khi tìm được phần tử có giá trị
bằng x hoặc khi hết mảng.
1
BG CTDL> - Trang 9
Giải thuật
B1: i = 0
Chương trình
int LinearSearch(int arr[ ], int n, int x)
{ int i = 0;
while (arr[i] != x && i < n)
i++;
if (i < n)
return i;
return (-1);
}
Đánh giá
Số phép so sánh
Số phép gán
Độ phức tạp
2
BG CTDL> - Trang 10
3
BG CTDL> - Trang 11
Bài toán
Cho mảng arr gồm n phần tử có thứ tự tăng,
nghĩa là arr[0] arr[1] … arr[n-1]. Có phần
tử nào mang giá trị x hay không? Nếu có thì đó
là phần tử thứ mấy?
Ý tưởng
So sánh giá trị x với phần tử giữa dãy gọi là
arr[mid]. Nếu x = arr[mid] thì tìm thấy, nếu x <
arr[mid] thì nếu có x chỉ có thể ở nửa dãy trái,
nếu x > arr[mid] thì x chỉ có thể ở nửa dãy phải.
10
Chương trình
int BinarySearch(int arr[], int n, int x)
{ int left = 0; int right = n-1;
int mid = (left+right)/2;
while(left <= right && arr[mid] != x)
{ if(x < arr[mid]) right = mid – 1;
else left = mid + 1;
mid = (left+right)/2;
}
if(left > right) return (-1);
return(mid);
}
12
4
BG CTDL> - Trang 12
Đánh giá
Thời gian chạy: T(n) = T(n/2) + 7 = C * log2n
Độ phức tạp: O(log2n)
13
Bài tập
14
Bài tập
15
5
BG CTDL> - Trang 13
Bài tập
16
Bài tập
17
18
6
BG CTDL> - Trang 14
Bài 3
***
KỸ THUẬT SẮP XẾP
Giới thiệu
Nhu cầu sắp xếp
Nhu cầu
Thứ tự sắp xếp
Giới thiệu
1
BG CTDL> - Trang 15
Giới thiệu
Giới thiệu
Shell Sort
Merge Sort
Quick Sort
Heap Sort
2
BG CTDL> - Trang 16
Giải thuật
Bước 1: khởi tạo các giá trị
left = 0;
right = n-1;
k = right;
Giải thuật
Bước 3: Lặp lại bước 2
Kiểm tra chiều dài đoạn cần sắp xếp
3
BG CTDL> - Trang 17
Chương trình
void ShakerSort(int arr[], int n)
{ int left = 0; int right = n-1; int k = n-1;
while(left < right)
{ for(int i = right; i > left; i--)
if (a[i-1] > a[i])
{ hoanvi(a[i-1],a[i]); k=i; }
left = k;
for(int j = left; j < right; j++)
if (a[j] > a[j+1])
{ hoanvi(a[j],a[j+1]); k=j; }
right = k;
}
} 10
Minh họa
0 8 2 9 3 5 4
1a 2 8 3 9 4 5
1b 2 3 8 4 5 9
2a 2 3 4 8 5 9
2b 2 3 4 5 8 9
11
Đánh giá
T(n) =?
f(n) =?
O(n) =?
Trong while gồm 4 đoạn chương trình
Xét cả đoạn chương trình
12
4
BG CTDL> - Trang 18
Ý tưởng
Chọn phần tử nhỏ nhất trong mảng
Đưa phần tử này về đầu mảng
(Lặp) Tiếp tục sắp xếp mảng từ vị trí thứ 2
8 2 9 3 5 4
2 8 9 3 5 4
13
Giải thuật
Bước 1:
i = 0;
Bước 2:
Tìm phần tử nhỏ nhất trong mảng từ i đến n
Hoán vị arr[i] và arr[min]
Bước 3:
i = i+1
Nếu i < n thì lặp B2 ngược lại thì ngưng
14
5
BG CTDL> - Trang 19
Minh họa
0 8 2 9 3 5 4
1 2 8 9 3 5 4
2
3
4
16
Đánh giá
T(n) =?
f(n) =?
O(n) =?
17
6
BG CTDL> - Trang 20
Giải thuật
Bước 1:
i = 0;
Bước 2:
Tìm các nghịch thế với arr[i] từ i+1 đến n-1
và thực hiện hoán vị nếu gặp
Bước 3:
i = i+1
Nếu i < n thì lặp B2 ngược lại thì ngưng
19
Chương trình
void InterchangeSort(int arr[], int n)
{
for(int i = 0; i < n -1; i++)
for(int j = i+1; j < n; j++)
if (arr[i] > arr[j])
hoanvi(arr[i], arr[j]);
}
20
Minh họa
0 8 2 9 3 5 4
1
2
3
4
5
21
7
BG CTDL> - Trang 21
Đánh giá
T(n) =?
f(n) =?
O(n) =?
22
Giải thuật
Bước 1:
i = 0;
Bước 2:
j=n-1
nếu arr[j] < arr[j-1] thì hoán vị
Bước 3:
j=j-1
Nếu j > i thì lặp B2.2 ngược lại thì ngưng
24
8
BG CTDL> - Trang 22
Giải thuật
Bước 4:
i=i+1
Nếu i < n thì lặp B2 ngược lại thì ngưng
25
Chương trình
void BubbleSort(int arr[ ], int n)
26
Minh họa
0 8 2 9 3 5 4
1
2
3
4
5
27
9
BG CTDL> - Trang 23
Đánh giá
T(n) =?
f(n) =?
O(n) =?
28
10
BG CTDL> - Trang 24
Minh họa
0 8 2 9 3 5 4
1
2
3
4
5
32
Đánh giá
T(n) =?
f(n) =?
O(n) =?
33
11
BG CTDL> - Trang 25
Bài 4
***
SẮP XẾP HIỆU QUẢ CAO
Quick Sort
Ý tưởng
Phân chia mảng ban đầu thành ba mảng con
Mảng con 1: gồm các phần tử nhỏ hơn x
Mảng con 2: gồm một phần tử x
Mảng con 3: gồm các phần tử lớn hơn x
8 6 9 12 19 13 15
Tiếp tục áp dụng Quick Sort cho dãy con 1 và
dãy con 3
Quick Sort
Giải thuật
Bước 1: Chia mảng ban đầu thành 3 mảng con
Chọn tùy ý phần tử a[k] làm mốc
Phát hiện và hoán vị cặp phần tử a[i], a[j] nằm
sai vị trí
Lặp lại bước 1.2 cho đến khi hết
8 16 17 14 6 10 19
1
BG CTDL> - Trang 26
Quick Sort
Giải thuật
Bước 2: Đệ quy trên hai mảng con
Số phần tử của mảng con trái > 1?
Đúng: dùng Quick Sort trên mảng này
Số phần tử của mảng con phải > 1?
Quick Sort
Chương trình
void QuickSort(int arr[], int left, int right)
{ int i = left, j = right, x = arr[(left+right)/2];
do
{ while (arr[i] < x) i++;
while (arr[j] > x) j--;
if (i <= j)
{ hoanvi(arr[i],arr[j]); i++; j--;}
}while (i < j);
if (left < j) QuickSort(arr, left, j);
if (i < right) QuickSort(arr, i, right);
} 5
Quick Sort
Minh họa
0 12 2 8 5 1 6 4 15
1
2
3
4
5
2
BG CTDL> - Trang 27
Quick Sort
Đánh giá
T(n) =?
f(n) =?
O(n) =?
Ý tưởng
Mảng gồm một phần tử là mảng có thứ tự
Mỗi mảng a1, a2, …, an là một tập hợp n mảng
con có thứ tự
8 16 17 14 6 10 19
Sắp xếp mảng là thao tác giảm số dãy con
của mảng cho đến khi số dãy con = 1
Ý tưởng
Merge Sort được chia thành 2 phần
Phân hoạch mảng ban đầu thành các mảng
con rồi chia thành hai mảng phụ theo
nguyên tắc phân phối luân phiên
Trộn từng cặp mảng con của 2 mảng phụ
thành một mảng con của dãy ban đầu
Lặp lại cho đến khi xong
3
BG CTDL> - Trang 28
Minh họa
0 9 5 4 7 3 8 2 10
1a 9 4 3 2
5 7 8 10
1b 5 9 4 7 3 8 2 10
2a 5 9 3 8
4 7 2 10
2b 4 5 7 9 2 3 8 10
10
Minh họa
2b 4 5 7 9 2 3 8 10
3a 4 5 7 9
2 3 8 10
3b 2 3 4 5 7 8 9 10
11
4
BG CTDL> - Trang 29
Chương trình
13
Đánh giá
T(n) =?
f(n) =?
O(n) =?
14
Ý tưởng
“Đường chạy” là một dãy con có thứ tự của
một mảng
Mỗimảng a1, a2, …, an là một tập hợp các
đường chạy
8 16 17 14 6 10 19
15
5
BG CTDL> - Trang 30
Ý tưởng
Merge Sort được chia thành 2 phần
Phân hoạch mảng ban đầu thành các mảng
con rồi chia thành hai dãy phụ theo nguyên
tắc phân phối luân phiên
Trộn từng cặp dãy con của 2 dãy phụ thành
một dãy con của dãy ban đầu
Lặp lại cho đến khi xong
16
Minh họa
0 9 5 4 7 3 8 2 10
1a 9 4 7 2 10
5 3 8
1b 5 9 3 4 7 8 2 10
2a 5 9 2 10
3 4 7 8
2b 3 4 5 7 8 9 2 10
17
Minh họa
2b 3 4 5 7 8 9 2 10
3a 3 4 5 7 8 9
2 10
3b 2 3 4 5 7 8 9 10
18
6
BG CTDL> - Trang 31
Bài tập
Quick Sort
Sắp xếp mảng 14, 12, 6, 10, 8, 16, 18
Sắp xếp mảng 12, 2, 8, 5, 1, 5, 4
Merge Sort (trộn trực tiếp)
Sắp xếp mảng 32, 72, 87, 83, 41, 24, 14, 27
Sắp xếp mảng 25, 2, 29, 16, 18, 26, 89
Merge Sort (trộn tự nhiên)
Sắp xếp mảng 6, 60, 36, 92, 29, 28, 77
Sắp xếp mảng 5, 59, 31, 85, 10, 88, 32
19
7
BG CTDL> - Trang 32
Bài 5
***
CẤU TRÚC DỮ LIỆU ĐỘNG
Nội dung
Stack
Queue
Nhu cầu
Kiểu cơ bản
Cấu trúc cơ bản
typedef struct sv
{ char mssv[8];
int sotc;
float dtbtl;
}
sv qlsv[1000];
3
1
BG CTDL> - Trang 33
Biến động
Giới thiệu
Không khai báo tường minh
Được quản lý bởi biến con trỏ
Được tạo ra theo yêu cầu của người sử dụng
Kích thước có thể thay đổi
2
BG CTDL> - Trang 34
Biến động
Hủy biến động
Từ khóa delete
delete p1;
delete []p2;
Thao tác
o Tạo danh sách
o Thêm phần tử
o Xóa phần tử
o Đếm số phần tử/Liệt kê danh sách
o Tìm kiếm
o Sắp xếp 8
3
BG CTDL> - Trang 35
Giới thiệu
Định nghĩa phần tử danh sách
Giới thiệu
Định nghĩa danh sách
tydedef struct
{ NodeType *head;
NodeType *tail;
}LList;
11
12
4
BG CTDL> - Trang 36
5
BG CTDL> - Trang 37
6
BG CTDL> - Trang 38
19
Sắp xếp
Selection Sort
// Tìm min
min = p;
while (q != NULL)
{ if(q->infor.key < min->infor.key)
min = q;
q = q->next;
}
21
7
BG CTDL> - Trang 39
Sắp xếp
Quick Sort
//Tách list thành l1 và l2
while (list->head != NULL)
{ p = list->head;
list->head = p->next;
p->next = NULL;
if(p->infor->key <= x->infor->key)
AddLast(l1, p);
else
AddLast(l2, p);
}
23
Sắp xếp
Quick Sort
//Nối l1, x và l2 thành chuỗi ban đầu
if(l1->head != NULL)
{ list->head = l1->head;
l1->tail->next = x;
}else
list->head = x;
x->next = l2;
if(l2->head != NULL)
list->tail = l2->tail;
else
list->tail = x;
24
8
BG CTDL> - Trang 40
Giới thiệu
Giới thiệu
Stack là vật chứa dữ liệu
Cơ chế LIFO (Last In First Out)
25
26
DataType sa[n];
int t;
t = 0;
27
9
BG CTDL> - Trang 41
10
BG CTDL> - Trang 42
31
LList *sL;
sL->head = NULL;
sL->tail = NULL;
32
33
11
BG CTDL> - Trang 43
34
12
BG CTDL> - Trang 44
37
r f r f r f
38
DataType qa[n];
int f, r;
f = 0;
r = 0;
39
13
BG CTDL> - Trang 45
42
14
BG CTDL> - Trang 46
43
LList *qL;
qL->head = NULL;
qL->tail = NULL;
44
15
BG CTDL> - Trang 47
16
Bài thực hành Cấu trúc dữ liệu và Giải thuật
1.1 Viết chương trình con thực hiện các yêu cầu. Sau đó tính toán thời gian chạy của chương
trình.
b. Tính tổng 2 số nguyên trong phạm vi từ 0 đến 100. Nếu số không hợp lệ thì kết quả = -1.
1.2 Viết chương trình con thực hiện các yêu cầu. Tính toán thời gian chạy của chương trình.
b. Nhập đa thức
c. Xuất đa thức
2.2 Viết chương trình con nhập mảng số nguyên có n phần tử (5 <= n <= 100)
2.3 Viết chương trình con xuất mảng số nguyên có n phần tử, mỗi phần tử cách nhau 1 tab
2.4 Viết chương trình con tìm kiếm phần tử x trong mảng số nguyên có n phần tử (dùng LS)
2.5 Viết chương trình con tìm kiếm phần tử x trong mảng số nguyên có n phần tử (dùng BS)
2.6 Viết chương trình con sắp xếp mảng số nguyên có n phần tử (dùng Shaker Sort)
2.7 Viết chương trình con sắp xếp mảng số nguyên có n phần tử (dùng Selection Sort)
2.8 Viết chương trình con sắp xếp mảng số nguyên có n phần tử (dùng Interchange Sort)
2.9 Viết chương trình con sắp xếp mảng số nguyên có n phần tử (dùng Bubble Sort)
2.10 Viết chương trình con sắp xếp mảng số nguyên có n phần tử (dùng Insertion Sort)
2.11 Viết chương trình con sắp xếp mảng số nguyên có n phần tử (dùng Quick Sort)
2.12 Viết chương trình con sắp xếp mảng số nguyên có n phần tử (dùng Merge Sort)
1
Bài thực hành Cấu trúc dữ liệu và Giải thuật
3.1 Định nghĩa cấu trúc Sinh viên gồm: MSSV, Họ, Tên, Số TC, ĐTBTL
3.2 Cài đặt mảng cấu trúc Sinh viên (mảng SV) gồm 100 phần tử
3.3 Viết chương trình con nhập mảng SV có n phần tử (5 <= n <= 100)
3.5 Viết chương trình con tìm thông tin SV có mã số x trong mảng SV có n phần tử (dùng LS)
3.6 Viết chương trình con tìm thông tin SV có mã số x trong mảng SV có n phần tử (dùng BS)
3.7 Viết chương trình con tìm thông tin SV có điểm cao nhất trong mảng SV có n phần tử
3.8 Viết chương trình con sắp xếp theo MSSV của mảng SV có n phần tử (dùng Shaker Sort)
3.9 Viết chương trình con sắp xếp theo MSSV của mảng SV có n phần tử (dùng Selection Sort)
3.10 Viết chương trình con sắp xếp theo Tên của mảng SV có n phần tử (dùng Interchange Sort)
3.11 Viết chương trình con sắp xếp theo Số TC của mảng SV có n phần tử (dùng Bubble Sort)
3.12 Viết chương trình con sắp xếp theo ĐTBTL của mảng SV có n phần tử (dùng Insertion Sort)
3.13 Viết chương trình con sắp xếp theo MSSV của mảng SV có n phần tử (dùng Quick Sort)
3.14 Viết chương trình con sắp xếp theo MSSV của mảng SV có n phần tử (dùng Merge Sort)
4.1 Cài đặt DSLK hỗ trợ quản lý danh sách Nhân viên (MSNV, Tên, Tuổi, Lương)
4.2 Viết chương trình con nhập danh sách Nhân viên
4.3 Viết chương trình con xuất danh sách Nhân viên
4.4 Viết chương trình con tìm kiếm thông tin NV có mã số x trong danh sách (dùng LS)
4.5 Viết chương trình con tìm kiếm thông tin NV có mã số x trong danh sách (dùng BS)
4.6 Viết chương trình con tìm kiếm thông tin NV có tuổi cao nhất trong danh sách
4.7 Viết chương trình con sắp xếp danh sách theo MSNV (dùng Shaker Sort)
4.8 Viết chương trình con sắp xếp danh sách theo MSNV (dùng Selection Sort)
4.9 Viết chương trình con sắp xếp danh sách theo Tên (dùng Interchange Sort)
4.10 Viết chương trình con sắp xếp danh sách theo Tuổi (dùng Bubble Sort)
2
Bài thực hành Cấu trúc dữ liệu và Giải thuật
4.11 Viết chương trình con sắp xếp danh sách theo Lương (dùng Insertion Sort)
4.12 Viết chương trình con sắp xếp danh sách theo MSNV (dùng Quick Sort)
4.13 Viết chương trình con sắp xếp danh sách theo MSNV (dùng Merge Sort)
5.1 Cài đặt Stack1 sử dụng mảng 5 phần tử hỗ trợ lưu trữ đa thức bậc n (Bậc, Các hệ số)
5.5 Cài đặt Stack2 sử dụng DSLK hỗ trợ lưu trữ đa thức bậc n
6.1 Cài đặt Queue1 sử dụng mảng 5 phần tử hỗ trợ lưu trữ thông tin hàng hóa (Mã hàng, Tên,
Giá)
6.5 Cài đặt Queue2 sử dụng DSLK hỗ trợ lưu trữ thông tin hàng hóa
HẾT