Professional Documents
Culture Documents
Chuong1 Tong Quan 1 Đã G P
Chuong1 Tong Quan 1 Đã G P
Chương 1
Tổng quan
GIẢI THUẬT ỨNG DỤNG
1 TRONG KINH DOANH
Giải thuật ứng dụng trong kinh doanh
Nội dung
Dữ liệu
Đối tượng
Cách thức
Giải Thuật
giải quyết
+ Giải
thuật = Chương
trình
i=0 3 4 5
i=1 5 9 3
i=2 4 4 6
i=3 4 3 8
4 4 6
Để in điểm thứ i của sv thứ j ta
sẽ dùng: diemj[i-1]
4 3 8
Mối quan hệ
Một cấu trúc đã chọn sẽ có những giải thuật
tương ứng
Khi cấu trúc dữ liệu thay đổi thì giải thuật cũng
thay đổi theo cho phù hợp
Cấu trúc dữ liệu tốt sẽ giúp giải thuật xử lý phát
huy tốt
Tổ chức cấu trúc dữ liệu trước, sau đó xây dựng
giải thuật xử lý.
Nói cách khác:
Cấu trúc dữ liệu quyết định giải thuật
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 14
Giải thuật ứng dụng trong kinh doanh
Cung :.
a=0 = b2 – 4ac
True
True True
=0 <0
Hai nghiệm
Nghiệm kép Vô nghiệm
phân biệt
End
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 18
Giải thuật ứng dụng trong kinh doanh
Kiểu cơ bản chỉ lưu các giá trị đơn, không lưu
được các đối tượng dữ liệu phức hợp.
Đối tượng dữ liệu phức hợp là những đối tượng
dữ liệu được tạo nên từ nhiều kiểu dữ liệu cơ bản
hoặc kiểu dữ liệu phức hợp khác.
Trong thực tế các đối tượng dữ liệu ngoài việc lưu
trữ dữ liệu còn có các thao tác xử lý trên đối
tượng dữ liệu này nữa.
Khuyết điểm của kiểu cơ bản là không đáp ứng
được đầy đủ các yêu cầu lưu trữ dữ liệu thực tế, vì
nó chỉ có thể: Lưu giá trị đơn, không có được các
thao tác nghiệp vụ trên dữ liệu này.
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 23
Giải thuật ứng dụng trong kinh doanh
Tiến trình phân tích thời gian thực hiện giải thuật
f(n) = 2n + 6
• Ví dụ : c g(n) = 4n
f(n) = 2n+6,
g(n) = n và c = 4 ,
n0=3
• f(n)= O(n)
g(n) = n
N0 = 3
n
GV: Nguyễn Văn Thọ - thonv@buh.edu.vn 45
Giải thuật ứng dụng trong kinh doanh
f ( n ) =O ( g ( n )) f ( n ) = ( g ( n ))
cg(n) f(n)
f(n)
cg(n)
n0 n0
f ( n ) =( g ( n ))
c2g(n)
f(n)
c1g(n)
n0
Một số ví dụ
• Ví dụ 1. Mảng A các số thực, cỡ n, cần tìm
xem mảng có chứa số thực x không.
(1) i = 0;
(2) while (i < n && x != A[i])
A=5: gán
(3) i++; A==5: lệnh logic
T(n)=O(n)
i=0 i=1 i=2 i=3 i=4
A= 5 8 2 1 5
Tìm x=5?
Một số ví dụ
Case1: for (i=0; i<n; i++) (i=0,j=0,j=1,j=2…n)i=1j=0,j=1,j=2..j=n)
for (j=0; j<n; j++)
k++; O(n2)
Case 2: for (i=0; i<n; i++)
k++;
for (i=0; i<n; i++)
for (j=0; j<n; j++) O(n2)
k++;
Case 3: for (int i=0; i<n-1; i++)
for (int j=0; j<i; j++)
int k+=1; O(n2)
Một số ví dụ
int MaxSubSum1(const int a[], int n) {
int maxSum=0;
Một số ví dụ
int MaxSubSum2(const int a[], int n) {
int maxSum=0;
if (thisSum>maxSum)
2
T(n)=O(n )
maxSum=thisSum;
}
}
return maxSum;
}
Một số ví dụ
int MaxSubSum4(const int a[], int n) {
int maxSum=0, thisSum=0;
}
thisSum=0;
O(n)
return maxSum;
}
Một số ví dụ
Sum=0
for (j=0;j<N;j++)
for (k=0;k<N*N;k++)
O(N3)
Sum++;
Một số ví dụ
Ví dụ: sắp xếp dãy
void BubbleSort(int a[], int n)
{ int i,j,temp;
(1) for(i= 1; i<n; i++)
(2) for(j=n-1; j>=i;j--)
(3) if (a[j] < a[j-1]) {
(4) temp=a[j-1];
(5) a[j-1] = a[j];
(6) a[j] = temp;
}
}
Một số ví dụ
• Lệnh (3), (4), (5) và (6) đều tốn O(1)
• Vòng lặp (2) thực hiện (n-i) lần, mỗi lần O(1) do đó vòng lặp
(2) tốn O((n-i)*1) = O(n-i).
• Vòng lặp {1},i chạy từ 1 đến n-1, thời gian thực hiện của
vòng lặp (1)
• Độ phức tạp của giải thuật là
n 1
n(n 1)
T(n) = (n i) = = O(n 2 )
i =1 2
• Logarithms:
– xa = b logx b = a
| k +1|
for large N and k -1
N
A N +1 1
i =0
A = i
A 1
Chương 2
ĐỆ QUY
& GIẢI THUẬT ĐỆ QUY
1
Khoa Hệ Thống Thông Tin Quản lý
Nội dung
Hàm đệ qui
❖Giải thuật đệ qui
▪ Giải bài toán bằng cách rút gọn liên tiếp bài toán
ban đầu thành bài toán cũng tương tự nhưng có
dữ liệu đầu vào nhỏ hơn.
▪ Ví dụ
• n! có thể được định nghĩa bằng cách qui nạp như sau:
• 0! = 1,
• n! = n*(n-1)!, với mọi n > 0.
→Bài toán tính N! bây giờ thành tính N*(N-1)!
Hàm đệ qui
➢ Hàm (phương thức) được gọi là đệ qui nếu trong
quá trình thực hiện nó tự gọi đến chính mình.
➢ Đệ qui trực tiếp : Lời gọi có thể nằm bên trong hàm
(phương thức).
➢ Đệ qui gián tiếp : Nếu hàm (phương thức) gọi tới
hàm (phương thức) khác, mà hàm (phương thức)
này lần lượt gọi tới hàm (phương thức) ban đầu.
Hàm đệ qui
➢ Như đã biết, một thuật toán được đòi hỏi phải thỏa
mãn các tính chất:
✓ Tính xác định.
✓ Tính hữu hạn (tính dừng).
✓ Tính đúng đắn.
Hàm đệ qui
Hàm đệ qui
Hàm đệ qui
Hàm đệ qui
void H10toH2(int n)
{
if (n <= 0) return;
int t = n % 2;
H10toH2(n / 2);
H10toH2(11);
printf(“%d”,t);
}
⚫ Tính 4!
24
Giaithua(4) 4*6=24
3*2=6
4*Giaithua(3)
2*1=2
3*Giaithua(2)
1
2*Giaithua(1)
2 1 1 0 1 0
1 1 1 1 1
1 0
1 1
Kết quả =8
Hàm đệ qui
Trong thân hàm có duy nhất một lời gọi hàm gọi lại chính nó
một cách tường minh:
<Kiểu dữ liệu hàm> TenHam (<danh sách tham số>)
{
if (điều kiện dừng)
{
...
//Trả về giá trị hay kết thúc công việc
}
//Thực hiện một số công việc (nếu có)
. . . TenHam (<danh sách tham số>);
//Thực hiện một số công việc (nếu có)
}
Ví dụ:
Tính S (n) = 1 + 2 + 3 + L + n
- Điều kiện dừng: S(0) = 0.
- Qui tắc (công thức) tính: S(n) = S(n-1) + n.
long TongS (int n)
{
if(n==0)
return 0;
return ( TongS(n-1) + n );
}
Đệ qui tương hỗ
Trong than củ a hà m nà y có lời goi hà m đé n hà m kia
và trong than củ a hà m kia có lời goi hà m tới hà m nà y.
Đệ qui tương hỗ
<Kiẻ u dữ lieu hà m> TenHam2 (<danh sá ch tham só >);
<Kiẻ u dữ lieu hà m> TenHam1 (<danh sá ch tham só >)
{
//Thưc hien mot só cong viec (né u có )
…TenHam2 (<danh sá ch tham só >);
//Thưc hien mot só cong viec (né u có )
}
<Kiẻ u dữ lieu hà m> TenHam2 (<danh sá ch tham só >)
{
//Thưc hien mot só cong viec (né u có )
…TenHam1 (<danh sá ch tham só >);
//Thưc hien mot só cong viec (né u có )
}
Đệ qui tương hỗ
Ví du: Tính só hang thứ n củ a hai dã y {Xn}, {Yn} đươc đinh nghĩa như sau:
X0 =Y0 =1 ;
Xn = Xn-1 + Yn-1; (n>0)
Yn = n2Xn-1 + Yn-1; (n>0)
- Điều kiện dừng:X(0) = Y(0) = 1.
long TinhXn (int n)
{
if(n==0)
return 1;
return TinhXn(n-1) + TinhYn(n-1);
}
long TinhYn (int n)
{
if(n==0)
return 1;
return n*n*TinhXn(n-1) + TinhYn(n-1);
}
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 25
Khoa Hệ Thống Thông Tin Quản lý
Khử đệ qui
A B C
A B C
A B C
}
3 Chuyển 1 đĩa từ A ==> C
}
A B C
Lần 4: 'A' ==> 'C'
A B C
A B C A B C
Lần 1: 'A' ==> 'C' Lần 5:'B' ==> 'A'
A B C A B C
Lần 2: 'A' ==> 'B' Lần 6: 'B' ==> 'C'
A B C A B C
Lần 3: 'C' ==> 'B' Lần 7:‘A' ==> ‘C'
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 38
Khoa Hệ Thống Thông Tin Quản lý
A B C
Chương 3
Nội dung
❖Giới thiệu
❖Phân loại: Danh sách đặc & danh sách liên kết
❖Khái niệm về danh sách liên kết
❖Sự khác biệt giữa danh sách liên kết và mảng
❖Một số loại danh sách liên kết thường gặp
❖Các thao tác trên danh sách liên kết đơn
❖Ngăn xếp
❖Hàng đợi
Phân loại
• Ưu điểm
– Mật độ sử dụng 100%
– Dễ dàng truy xuất đến từng phần tử
• Nhược điểm
– Độ phức tạp thuật toán thêm/bớt phần tử vào/ra danh sách
là khá cao T(n)max=O(n)
– Lãng phí khi trong danh sách có nhiều phần tử cùng giá trị
Bài tập
Viết chương trình quản lý sinh viên cài đặt bằng
danh sách đặc. Chương trình gồm các chức năng:
- Thêm danh sách SV
- Thêm 1 SV vào danh sách
- Xóa 1 SV khỏi danh sách
- Hiệu chỉnh sinh viên
- Sắp xếp danh sách SV theo mã sinh viên
- Tìm kiếm SV theo mã SV
- Xóa toàn bộ danh sách SV
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 16
Khoa Hệ Thống Thông Tin Quản lý
❖Trong danh sách liên kết, mỗi một Node (phần tử)
thường có ít nhất 2 thông số: Giá trị của Node và
mối liên kết tới Node khác.
pHead
pTail
pHead
pTail
❑ Danh sách liên kết đôi: mỗi phần tử liên kết với các phần
tử đứng trước và sau nó trong danh sách
pHead pTail
NULL pPre
pPre 8 pNext pPre 9 pNext pPre 5 pNext 10 pNext
NULL
A D I M N W
pHead
A B C D E NULL
X
p
pHead
A B C D E
ptemp
X p
ptemp->next=tam;
}
}
– Nếu (q != NULL)
• p=CreateNode(x)
• p>next = q->next;
• q->next = p ;
– Ngược lại: q = p;
q
pHead
A B C D E
p
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 34
Khoa Hệ Thống Thông Tin Quản lý
p
pHead
A B X Z Y
p
pHead
A B X Z Y
p q
pHead
A B C D E
p q
pHead
A B C D E
q
pHead
A B X Z Y
p
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 40
Khoa Hệ Thống Thông Tin Quản lý
p = pHead;
– Trong khi chưa hết danh sách
• Xử lý nút p ;
• p= p->pNext;
pHead
A B C D E
P
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 42
Khoa Hệ Thống Thông Tin Quản lý
Bài tập
• Dùng danh sách liên kết quản lý sinh viên trong lớp
(mssv, họ, tên, ngày sinh, điểm tổng kết học kỳ).
• Thực hiện các thao tác: thêm, bớt, sắp xếp sinh viên
(theo điểm tổng kết) trong danh sách
NGĂN XẾP
STACK
Nội dung
• Hình sau đây mô tả hình ảnh của Stack qua các tác vụ:
- push(s,A): hình a.
- push(s,B): hình b.
- pop(s): hình c.
- push(s,C): hình d.
Pop
Push
Top
• Mô tả Stack
Mô tả dữ liệu:
Stack là một kiểu dữ liệu trừu tượng có nhiều nút cùng kiểu
dữ liệu trải dài từ đáy Stack đến đỉnh Stack.
Mô tả các tác vụ:
- Tác vụ Init
Chức năng: khởi động Stack
Dữ liệu nhập: không
Dữ liệu xuất: Stack top trở về đầu Stack.
- Tác vụ IsEmpty
Chức năng: kiểm tra Stack có rỗng hay không.
Dữ liệu nhập: không.
Dữ liệu xuất: TRUE|FALSE.
• Mô tả Stack
- Tác vụ Push
Chức năng: thêm nút mới tại đỉnh Stack.
Dữ liệu nhập: nút mới
Dữ liệu xuất: không.
- Tác vụ Pop
Chức năng: xóa nút tại đỉnh Stack.
Dữ liệu nhập: không
Điều kiện: Stack không bị rỗng.
Dữ liệu xuất: nút bị xoá.
HÀNG ĐỢI
QUEUE
Nội dung
• Queue (hàng đợi) là một dạng danh sách đặt biệt, trong đó
chúng ta chỉ được phép thêm các phần tử vào cuối hàng
đợi và lấy ra các phần tử ở đầu hàng đợi. Vì phần tử thêm
vào trước được lấy ra trước nên cấu trúc hàng đợi còn được
gọi là cấu trúc FIFO (First In First Out).
• Hàng đợi là cấu trúc được sử dụng rộng rãi trong thực
tế: người ta dùng hàng đợi để giải quyết các vấn đề có
cấu trúc FIFO như xử lý các dịch vụ của ngân hàng, để
xử lý các tiến trình đang đợi phục vụ trong các hệ điều
hành nhiều người sử dụng, quản lý các yêu cầu in trên
máy print servers…
Front
Append Take
• Mô tả Queue
Mô tả dữ liệu
Hàng đợi là một kiểu dữ liệu trừu tượng có nhiều nút cùng kiểu dữ
liệu trải dài từ đầu hàng đợi đến cuối hàng đợi.
Mô tả các tác vụ cơ bản:
- Tác vụ init
Chức năng: khởi động hàng đợi
Dữ liệu nhập: không
Dữ liệu xuất: hai con trỏ front và rear được gán các giá trị phù hợp.
- Tác vụ IsEmpty
Chức năng: kiểm tra hàng đợi có bị rỗng hay không
Dữ liệu nhập: không
Dữ liệu xuất: TRUE|FALSE
• Tác vụ insert
Chức năng: Thêm nút mới vào hàng đợi.
Dữ liệu nhập: nút mới
Điều kiện: hàng đợi không bị đầy.
Dữ liệu xuất: không.
• Tác vụ remove
Chức năng: lấy nút tại đầu hàng đợi
Dữ liệu nhập: không
Điều kiện: hàng đợi không bị rỗng
Dữ liệu xuất: thông tin nút bị lấy ra.
• 6.2.2 Dùng danh sách liên kết hiện thực hàng đợi
Ta có thể cài đặt hàng đợi như một danh sách liên kết: con
trỏ đầu danh sách liên kết front chỉ nút tại đầu hàng đợi, con
trỏ rear trỏ đến nút cuối cùng của hàng đợi.
Hình vẽ sau thể hiện cách cài đặt hàng đợi bằng danh sách
liên kết.
• Với cách cài đặt này ta có thể hiện thực các tác vụ của hàng
đợi như: Insert, Remove, IsEmpty…trên danh sách liên kết.
• Hàng đợi hoạt động trên nguyên tắc nút nào vào trước được
lấy ra trước, nút nào vào sau được lấy ra sau là hàng đợi
không có ưu tiên.
• Trong thực tế có một dạng hàng đợi khác hoạt động theo cơ
chế: nút nào có độ ưu tiên cao hơn sẽ được lấy ra trước, nút
nào có độ ưu tiên thấp hơn thì lấy ra sau. Hàng
đợi lúc này gọi là hàng đợi có ưu tiên (priority queue).
• Có 2 loại hàng đợi có ưu tiên:
- Hàng đợi có ưu tiên tăng: nút có độ ưu tiên cao nhất được
lấy ra.
- Hàng đợi có ưu tiên giảm: nút có độ ưu tiên giảm sẽ được
lấy ra trước.
Tóm tắt
• Cấu trúc Queue là danh sách đặc biệt với thao tác thêm
vào được thực hiện ở cuối danh sách và lấy ra ở đầu
danh sách. Queue hoạt động theo cơ chế FIFO.
• Các thao tác cơ bản trên Queue: Init, isEmpty, Insert,
Remove
• Ứng dụng Queue trong bài toán hàng đợi “Vào trước ra
trước” FIFO: hệ thống print server, cơ chế thông điệp,
bộ đệm, hàng đợi xử lý sự kiện… Các ứng dụng đặt vé
tàu lửa, máy bay… Các hệ thống rút tiền.
Chương 4
CÂY - TREE
1
Khoa Hệ Thống Thông Tin Quản lý
Nội dung
Gốc
Lá
Nhánh
Nút
• Cây là tập hữu hạn các nút (tree node), sao cho
– Có một nút gọi là nút gốc (root)
– Các nút còn lại được phân hoạch thành n tập
riêng biệt T1, T2 , ... , Tn, mỗi tập Ti là một cây
– Giữa các nút có quan hệ phân cấp (hierarchical
relationship) gọi là “quan hệ cha con”
• Cây không có nút gọi là cây rỗng (null tree)
• Bằng đồ thị
• Bằng giản đồ
• Bằng danh sách (các dấu ngoặc lồng nhau)
• Bằng phương pháp Indentatio
• Bằng đồ thị
A
B C D
A B
C D E
E F G H
F G H I
J I J K
• Bằng giản đồ
D B
A
J
G H
I
E
C F
(/( A (C (F), D (G ( J ) ) ) ), (B (E ( H, I ) ) ) ) A
/
B C D
A B
C D E E F G H I J
F G H I
K L M
J
( A ( B ( E ( K, L ), F ), C ( G ), D ( H ( M ), I, J ) ) )
• Đường đi (path)
Chiều cao
2
(độ sâu) của
cây: 5
3
A B
C D I E
G J G
A B
C D I E
A B
C D E
I
J G G
Các nút ứng với các mức (trừ mức cuối) đều đạt tối đa,
ở mức cuối, các nút không đạt đều về phía trái
• Định nghĩa
– Là phép xử lý các nút trên cây, mỗi nút một lần
• Duyệt cây theo thứ tự trước (Preorder)
• Duyệt cây theo thứ tự giữa (Inorder)
• Duyệt cây theo thứ tự sau (Postorder)
• Định nghĩa:
44
18 88
13 37 59 108
15 23 40 55 71
• Tạo nút
NODEPTR CreateNode (int x){
NODEPTR p = new NODE;
p->data=x;
p -> pleft=NULL;
p ->pright=NULL;
return p;
}
18 X < 88 88
13 37 59 108
X < 59
15 23 40 55 71
X < 55
50
18 88
X < 88
13 37 59 108
X < 59
15 23 40 55 71
root
44
Xóa: X=40
18 88
Đơn giản : Xóa
nút X, vì nó
không móc nối
13 37 59 108
đến nút nào khác
15 23 40 55 71
44 root root
Xóa X=37 44
Xóa X=37
18 88
18 88
13 37 59 108 13 37 59 108
15 23 55 71 15 40 55 71
18 88
15
13 37 59 108
15 23 40 55 71
30
• Định nghĩa
– Cây m phân là cây mà mỗi nút có tối đa m nút
con (cây con)
– Biểu diễn cây m phân bằng liên kết động
• Mỗi nút có m+1 trường, với m mối nối
• Với cây m phân đầy đủ, có n(m-1)+1 mối liên kết
NULL
A D B A
C H I J G E C D
H I B
typedef struct TreeNode * PtrToNode;
struct TreeNode
{int info; J G
PtrToNode FirstChild; // con caả
PtrToNode NextSibling; //em kê E
};
Tóm tắt
Tóm tắt
BST là cây nhị phân mà mỗi nút thoả: Giá trị của tất cả nút con
trái < giá trị của nút đó. Giá trị của tất cả nút con phải > giá trị
của nút đó.
• Cây nhị phân tìm kiếm là một dạng đặc biệt của cây nhị
phân nên vẫn dùng các tác vụ trong phần trên hiện thực cho
cây nhị phân tìm kiếm, chỉ khác ở các tác vụ: tìm kiếm, thêm
vào cây một phần tử và xoá một phần tử ra khỏi cây nhị
phân tìm kiếm.
Câu 2: Cài đặt cấu trúc dữ liệu liên kết cho cây nhị phân tìm
kiếm, với các thao tác:
1. Nhập các nút trong cây
2. Duyệt cây theo 3 phương pháp
3. Đếm số nút lá/số nút lẻ/chẳn trong cây
4. Số nút có 1 con, số nút có 2 con
5. Đếm số nút ở mức lẻ/chẳn (mức lẻ: mức 1,3,5,7…; mức chẵn: mức 2,4,6…)
6. Đếm tổng số nút trong cây
7. Đếm tổng giá trị nút chẵn/lẻ trong cây
8. Tính chiều cao của cây
9. Tìm 1 nút có khóa x trong cây
10. Tìm nút có khóa lớn nhất/nhỏ nhất
11. Thêm 1 nút có khóa x vào cây
12. Xóa 1 nút có khóa x khỏi cây
13. Xóa toàn bộ cây
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 65
TRƯỜNG ĐẠI HỌC NGÂN HÀNG TPHCM
KHOA HỆ THỐNG THÔNG TIN QUẢN LÝ
Chương 5
ĐỒ THỊ - GRAPH
1
Khoa Hệ Thống Thông Tin Quản lý
Nội dung
Định nghĩa
Định nghĩa
• Đồ thị G = (V,E)
– V = tập hợp hữu hạn các phần tử (đỉnh hay nút)
– E V × V, tập hữu hạn các cạnh (cung)
a b Đỉnh
c Cung
d e
Định nghĩa
Định nghĩa
Định nghĩa
Định nghĩa
Định nghĩa
• SƠ ĐỒ ĐƯỜNG PHỐ
• Nếu (x,y) E
• x gọi là đỉnh gốc, y là ngọn
• Nếu x ≡ y, (x,y) gọi là khuyên
• Đường đi: Một dãy u1,u2,…,un, ui V (i=1,n) gọi
là một đường, nếu (ui-1,ui) E
(1, 2, 3, 4) là đường đi đơn độ dài bằng 3, đi từ đỉnh 1 tới đỉnh 4. Bởi (1, 2) (2, 3) và (3,
4) đều là các cạnh (hay cung)
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn
Khoa Hệ Thống Thông Tin Quản lý
A C
Đường đi đơn
D
A C
D Chu trình
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn
Khoa Hệ Thống Thông Tin Quản lý
0
10
20
1 1
2
4
5
3
A[i][j] 0 1 2 3
0 0 0 1 1 0
1 1 0 1 1
1 2 1 1 0 1
2
3 0 1 1 0
3 0 1 1 0
1 0 1 1
A= 1 1 0 1
0 1 1 0
A[i][j] 0 1 2 3
0 0 1 1 1
0 1 0 0 0 1
2 0 0 0 1
1
2 3 0 0 0 0
3 0 1 1 1
0 0 0 1
A=
0 0 0 1
0 0 0 0
x2 0 1 1 0 0
x1 x3 0 0 0 0 1
0 1 0 0 0
0 0 1 0 0
x5 x4 1 0 0 1 0
x2 0 1 1 0 0
x1 x3 0 0 0 1 1
0 1 0 0 0
0 1 1 0 0
x5 x4 1 0 0 1 1
A[i][j] 0 1 2 3
0 0 20 10 1
1 20 0 0 5
0
20 2 10 0 0 4
10
3 1 5 4 0
1 1
2
5 0 20 10 1
4 20 0 0 5
3 A=
10 0 0 4
1 5 4 0
• Chú ý
– Đối với đồ thị không định hướng, ma trận kề là
ma trận đối xứng
– Đối với đồ thị định hướng, số lượng phần tử 0
khá lớn
– Đối với đồ thị có trọng số, thay thế giá trị 1
bằng giá trị trọng số
0 1 2 3
0 1 3
1 2 3
2
3
3
x2 x[1] 2 3
x1 x3 x[2] 5
x[3] 2
x[4] 3
x5 x4
x[5] 1 4
0 1 10 2 20 3 1
0
10
20 1 0 10 3 4
1 1
2 2 0 20 3 5
4
5 3 0 1 1 4 2 5
3
• Chú ý
– Các nút đầu danh sách được lưu vào một mảng
(truy cập nhanh)
– Với đồ thị không định hướng có n đỉnh và e
cạnh, thì cần n nút đầu và 2e nút ‘trong’ danh
sách
– Với đồ thị định hướng có n đỉnh và e cạnh, thì
chỉ cần e nút ‘trong’ danh sách
– Thứ tự các nút không quan trọng
• Ý tưởng
– Tư tưởng cơ bản của thuật toán tìm kiếm
theo chiều sâu là bắt đầu tại một đỉnh v0
nào đó, chọn một đỉnh u bất kỳ kề với v0 và
lấy nó làm đỉnh duyệt tiếp theo.
– Cách duyệt tiếp theo được thực hiện tương
tự như đối với đỉnh v0 với đỉnh bắt đầu là u
x2
x1 x3
x34
x5 x4 x1523
x21
• Nhận xét
– Thời gian thực hiện giải thuật ~ (n+e), nếu G
được biểu diễn bằng danh sách kề
– Thời gian thực hiện giải thuật ~ n2, nếu G
được biểu diễn bằng ma trận kề
– Giải thuật này sử dụng để chứng minh một đồ
thị có liên thông hay không
– Với thuật toán tìm kiếm theo chiều sâu, đỉnh
thăm càng muộn sẽ trở thành đỉnh sớm được
duyệt xong. Đó là kết quả tất yếu vì các đỉnh
thăm được nạp vào stack trong thủ tục đệ quy.
• Tại điểm v bất kỳ, duyệt đỉnh v, thu được tập hợp
W gồm các đỉnh w xuất phát từ v
• Lặp lại thao tác trên đối với tất cả các đỉnh w
trong W, thu được tập hợp đỉnh Z
• Lặp lại thao tác trên đối với tất cả các đỉnh z
trong Z
• Lặp lại cho đến khi tất cả mọi đỉnh đều được
duyệt qua ít nhất một lần
x2 x1 x2 x3 x5 x2 x1 x4
x1 x3
x5 x4
Tham khảo
• Nhận xét
– Thời gian thực hiện giải thuật ~ (n+e), nếu
G được biểu diễn bằng danh sách kề
– Thời gian thực hiện giải thuật ~ n2, nếu G
được biểu diễn bằng ma trận kề
Cây khung T
Đồ thị G của đồ thị G
• Chú ý
– Một đồ thị G có thể có nhiều cây khung
– Cây khung theo chiều rộng, theo chiều sâu
– Các cung trong cây khung không tạo nên chu
trình
• Giữa hai đỉnh trong một cây khung chỉ tồn tại duy
nhất một đường đi từ đỉnh này đến đỉnh kia
– Nếu đồ thị có n đỉnh, thì cây khung có n-1 cạnh
6 10 6 10
1 1
7
20
5 5
Q&A
Chương 6
CÁC GIẢI THUẬT SẮP XẾP
1
Khoa Hệ Thống Thông Tin Quản lý
Nội dung
➢ Ý tưởng chính:
Xuất phát từ cuối (đầu) dãy, đổi chỗ các cặp phần
tử kế cận để đưa phần tử nhỏ (lớn) hơn trong cặp
phần tử đó về vị trí đúng đầu (cuối) dãy hiện hành,
sau đó sẽ không xét đến nó ở bước tiếp theo,
Ở lần xử lý thứ i có vị trí đầu dãy là i
Lặp lại xử lý trên cho đến khi không còn cặp phần
tử nào để xét.
3
5
1
6
12
7
4
10
2
Nguồn minh họa: Thầy Trương Hoài Phan
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 11
Khoa Hệ Thống Thông Tin Quản lý
3
5
i=0 1
6
12
7
4
10
2
j=8
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 12
Khoa Hệ Thống Thông Tin Quản lý
3
5
i=0 1
6
12
7
4
2
10
j=7
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 13
Khoa Hệ Thống Thông Tin Quản lý
3
5
i=0 1
6
12
7
2
4
j=6 10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 14
Khoa Hệ Thống Thông Tin Quản lý
3
5
i=0 1
6
12
2
7
4
j=5
10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 15
Khoa Hệ Thống Thông Tin Quản lý
3
5
i=0 1
6
2
12
2
7
j=5
j=4
4
10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 16
Khoa Hệ Thống Thông Tin Quản lý
3
5
i=0 1
2
6
j=3 12
2
7
4
10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 17
Khoa Hệ Thống Thông Tin Quản lý
3
5
i=0 1
2
6
j=2
12
2
7
4
10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 18
Khoa Hệ Thống Thông Tin Quản lý
3
1
i=0 5
2
j=1
6
12
2
7
4
10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 19
Khoa Hệ Thống Thông Tin Quản lý
1
3
5
2
i=1
6
12
2
7
4
10
J=8
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 20
Khoa Hệ Thống Thông Tin Quản lý
1
3
5
2
i=1
6
12
2
7
4
10
j=7
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 21
Khoa Hệ Thống Thông Tin Quản lý
1
3
5
2
i=1
6
12
2
4
7
j=6 10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 22
Khoa Hệ Thống Thông Tin Quản lý
1
3
5
2
i=1
6
4
12
7
j=5
10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 23
Khoa Hệ Thống Thông Tin Quản lý
1
3
5
2
i=1
4
6
12
j=4
7
10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 24
Khoa Hệ Thống Thông Tin Quản lý
1
3
5
2
i=1
4
j=3 6
12
7
10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 25
Khoa Hệ Thống Thông Tin Quản lý
1
3
2
5
i=1
4
j=2
6
12
7
10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 26
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
5
4
i=2
6
12
7
10
j=8
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 27
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
5
4
i=2
6
12
7
10
j=7
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 28
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
5
4
i=2
6
7
12
J=6 10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 29
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
5
4
i=2
6
7
12
J=5
10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 30
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
5
4
i=2
6
7
j=4
12
10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 31
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
4
5
i=2
J=3 6
7
12
10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 32
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
4
5
i=2
6
7
12
10
j=8
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 33
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
4
5
i=3 6
7
J=4
10
J=5
J=6 12
J=7
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 34
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
4
5
6
7
i=4
10
J=5
J=6 12
J=7
J=8
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 35
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
4
5
6
7
10
i=5
J=6 12
J=7
J=8
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 36
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
4
5
6
7
10
i=6 12
J=7
J=8
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 37
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
4
5
6
7
10
12
i=7
J=8
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 38
Khoa Hệ Thống Thông Tin Quản lý
1
2
3
4
5
6
7
10
12
i=8
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 39
Khoa Hệ Thống Thông Tin Quản lý
Phương pháp nổi bọt (Bubble Sort) Cài đặt giải thuật
void BubbleSort(int M[], int n)
{
int i, j;
for (i = 0; i < n - 1; i++)
{
for (j = n - 1; j > i; j--)
{
if (M[j] < M[j - 1])// nếu có nghịch thế
{
int temp = M[j];
M[j] = M[j - 1];
M[j - 1] = temp;
}
}
}
}
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 40
Khoa Hệ Thống Thông Tin Quản lý
Bài tập: Hãy giải thích từng bước quá trình chạy
Bubble Sort cho danh sách dưới đây:
int[] M = {10,15,2,8,7};
BubbleSort(M);
➢Khuyết điểm:
Không nhận diện được tình trạng dãy đã có thứ tự
hay có thứ tự từng phần.
Các phần tử nhỏ được đưa về vị trí đúng rất nhanh,
trong khi các phần tử lớn lại được đưa về vị trí đúng
rất chậm.
Bước 1 : i = 0;
Bước 2 : Tìm phần tử M[min] nhỏ nhất trong dãy
hiện hành từ M[i] đến M[N-1]
Bước 3 : Nếu min ≠ i, Hoán vị M[min] và M[i]
3 5 1 6 12 7 4 10 2
3 5 1 6 12 7 4 10 2
i=0 min=2
1 5 3 6 12 7 4 10 2
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 56
Khoa Hệ Thống Thông Tin Quản lý
1 5 3 6 12 7 4 10 2
i=1 min=8
1 2 3 6 12 7 4 10 5
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 57
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 6 12 7 4 10 5
i=min=2
1 2 3 6 12 7 4 10 5
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 58
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 6 12 7 4 10 5
i=3 min=6
1 2 3 4 12 7 6 10 5
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 59
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 12 7 6 10 5
i=4 min=8
1 2 3 4 5 7 6 10 12
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 60
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 5 7 6 10 12
i=5 min=6
1 2 3 4 5 6 7 10 12
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 61
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 5 6 7 10 12
i=min=6
1 2 3 4 5 6 7 10 12
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 62
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 5 6 7 10 12
i=min=7
1 2 3 4 5 6 7 10 12
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 63
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 5 6 7 10 12
i=min=8
1 2 3 4 5 6 7 10 12
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 64
Khoa Hệ Thống Thông Tin Quản lý
Bài tập: Hãy giải thích từng bước quá trình chạy
Selection Sort cho danh sách dưới đây:
Int M[] = {10,15,2,8,7};
SelectionSort(M);
n −1
n(n − 1)
i =1
n−i =
2
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 75
Khoa Hệ Thống Thông Tin Quản lý
3 5 1 6 12 7 4 10 2
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 82
Khoa Hệ Thống Thông Tin Quản lý
3 5 1 6 12 7 4 10 2
i=1
3 5 1 6 12 7 4 10 2
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 83
Khoa Hệ Thống Thông Tin Quản lý
i=2
3 5 1 6 12 7 4 10 2
1 3 5 6 12 7 4 10 2
1 3 5 6 12 7 4 10 2
1 3 5 6 12 7 4 10 2
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 84
Khoa Hệ Thống Thông Tin Quản lý
1 3 5 6 12 7 4 10 2
i=3
1 3 5 6 12 7 4 10 2
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 85
Khoa Hệ Thống Thông Tin Quản lý
1 3 5 6 12 7 4 10 2
i=4
1 3 5 6 12 7 4 10 2
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 86
Khoa Hệ Thống Thông Tin Quản lý
i=5
1 3 5 6 12 7 4 10 2
7 1 3 5 6 12 4 10 2
1 3 5 6 7 12 4 10 2
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 87
Khoa Hệ Thống Thông Tin Quản lý
Phương pháp chèn trực tiếp (Insertion Sort)
i=6
1 3 5 6 7 12 4 10 2
4 1 3 5 6 7 12 10 2
4 1 3 5 6 7 12 10 2
4 1 3 5 6 7 12 10 2
4 1 3 5 6 7 12 10 2
1 3 4 5 6 7 12 10 2
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 88
Khoa Hệ Thống Thông Tin Quản lý
i=7
1 3 4 5 6 7 12 10 2
10 1 3 4 5 6 7 12 2
1 3 4 5 6 7 10 12 2
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 89
Khoa Hệ Thống Thông Tin Quản lý
1 3 4 5 6 7 10 12 2
i=7
1 2 3 4 5 6 7 10 12
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 90
Khoa Hệ Thống Thông Tin Quản lý
Bài tập 1: Hãy giải thích từng bước quá trình chạy
Insertion Sort cho danh sách dưới đây:
int[] M = {10,8,20,81,25};
InsertionSort(M);
Bài tập 2: Cho danh sách Sinh viên, mỗi Sinh viên có
các thông số: Mã(int), tên(chuỗi), ngày sinh
(DateTime)
- Hãy xây dựng cấu trúc dữ liệu cho mô tả trên
- Hãy viết giải thuật Insertion Sort để: Sắp xếp theo
tên tăng dần, nếu tên trùng nhau thì sắp xếp theo
ngày sinh giảm dần.
❑Nhận xét:
• Khi tìm vị trí thích hợp để chèn M[i] vào đoạn M[0]
đến M[i-1], do đoạn đã được sắp, nên có thể sử dụng
giải thuật tìm nhị phân để thực hiện việc tìm vị trí
pos, khi đó có giải thuật sắp xếp chèn nhị phân
Binary Insertion Sort
➢ Để sắp xếp một dãy số, ta có thể xét các nghịch thế
có trong dãy và làm triệt tiêu dần chúng đi.
➢ Ý tưởng chính:
– Xuất phát từ đầu dãy, tìm tất cả nghịch thế chứa
phần tử này, triệt tiêu chúng bằng cách đổi chỗ
phần tử này với phần tử tương ứng trong cặp
nghịch thế.
– Lặp lại xử lý trên với các phần tử tiếp theo trong
dãy
Bước 3 :
3 5 1 6 12 7 4 10 2
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 107
Khoa Hệ Thống Thông Tin Quản lý
3 5 1 6 12 7 4 10 2
i=0 j=2
1 5 3 6 12 7 4 10 2
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 108
Khoa Hệ Thống Thông Tin Quản lý
1 5 3 6 12 7 4 10 2
i=1 j=2
1 3 5 6 12 7 4 10 2
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 109
Khoa Hệ Thống Thông Tin Quản lý
1 3 5 6 12 7 4 10 2
i=1 j=8
1 2 5 6 12 7 4 10 3
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 110
Khoa Hệ Thống Thông Tin Quản lý
1 2 5 6 12 7 4 10 3
i=2 j=6
1 2 4 6 12 7 5 10 3
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 111
Khoa Hệ Thống Thông Tin Quản lý
1 2 4 6 12 7 5 10 3
i=2 j=8
1 2 3 6 12 7 5 10 4
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 112
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 6 12 7 5 10 4
i=3 j=6
1 2 3 5 12 7 6 10 4
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 113
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 5 12 7 6 10 4
i=3 j=8
1 2 3 4 12 7 6 10 5
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 114
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 12 7 6 10 5
i=4 j=5
1 2 3 4 7 12 6 10 5
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 115
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 7 12 6 10 5
i=4 j=6
1 2 3 4 6 12 7 10 5
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 116
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 6 12 7 10 5
i=4 j=8
1 2 3 4 5 12 7 10 6
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 117
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 5 12 7 10 6
i=5 j=6
1 2 3 4 5 7 12 10 6
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 118
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 5 7 12 10 6
i=5 j=8
1 2 3 4 5 6 12 10 7
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 119
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 5 6 12 10 7
i=5 j=7
1 2 3 4 5 6 10 12 7
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 120
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 5 6 10 12 7
i=5 j=8
1 2 3 4 5 6 7 12 10
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 121
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 4 5 6 7 12 10
i=7 j=8
1 2 3 4 5 6 7 10 12
0 1 2 3 4 5 6 7 8
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 122
Khoa Hệ Thống Thông Tin Quản lý
}
} If: M[j] <M[i] M[1]<M[0]
} 3<100➔đúng➔ hoán đổi vị
}
trí 0 và 1 ta được mảng mới:
M = {3,100,60,35,2}
(for2- lần 2) j++➔j=2, kiểm tra j<n
2<5➔đúng:
}
}
If: M[j] <M[i] M[2]<M[1]
60<100➔đúng➔hoán đổi vị
trí 1 và 2 ta được mảng mới:
M = {2,60,100,35,3}
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 127
Khoa Hệ Thống Thông Tin Quản lý
}
}
If: M[j] <M[i] M[3]<M[2]
60<100➔đúng➔hoán đổi vị
trí 3 và 2 ta được mảng mới:
M = {2,3,60,100,35}
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 129
Khoa Hệ Thống Thông Tin Quản lý
Bài tập 1: Hãy giải thích từng bước quá trình chạy
Interchange Sort cho danh sách dưới đây:
int[] M = {90,95,20,27,30};
InterchangeSort(M);
Bài tập 2: Cho danh sách Sinh viên, mỗi Sinh viên có
các thông số: Mã(int), tên(chuỗi), ngày sinh
(DateTime)
- Hãy xây dựng cấu trúc dữ liệu bằng class cho mô
tả trên
- Hãy viết giải thuật Interchange Sort để: Sắp xếp
theo tên tăng dần, nếu tên trùng nhau thì sắp xếp
theo ngày sinh giảm dần.
➢ Ðể sắp xếp dãy M0, M1, ..., Mn-1 giải thuật QuickSort dựa
trên việc phân hoạch dãy ban đầu thành hai phần :
➢ Dãy con 1: Gồm các phần tử M0.. Mi có giá trị không lớn
hơn pivot
➢ Dãy con 2: Gồm các phần tử Mi .. Mn-1 có giá trị không nhỏ
hơn pivot
➢ với pivot là giá trị của một phần tử tùy ý trong dãy ban
đầu. Sau khi thực hiện phân hoạch, dãy ban đầu được phân
thành 3 phần:
1. Mk < pivot , với k = 0..i
2. Mk = pivot , với k = i..j
3. Mk > pivot , với k = j..N-1
0 i j N-1
Giải thuật phân hoạch dãy sắp xếp dãy Ml, Ml+1, ., Mr:
Có thể phát biểu giải thuật sắp xếp QuickSort một cách đệ qui
như sau :
➢ Bước 1 : Phân hoạch dãy Ml .. Mr thành các dãy con :
- Dãy con 1 : Ml.. Mj ≤ x
- Dãy con 2 : Mj+1.. Mi-1 = pivot
- Dãy con 3 : Mi.. Mr ≥ pivot
➢ Bước 2 :
Nếu ( l < j ) // dãy con 1 có nhiều hơn 1 phần tử
Phân hoạch dãy Ml.. Mj
Nếu ( i < r ) // dãy con 3 có nhiều hơn 1 phần tử
Phân hoạch dãy Mi.. Mr
1 5 3 6 7 12 4 10 2 9
0 1 2 3 4 5 6 7 8 9
1 5 3 6 7 12 4 10 2 9
i j
L=0 R=9
1 5 3 6 2 12 4 10 7 9
0 1 2 3 4 5 6 7 8 9
1 5 3 6 2 12 4 10 7 9
i j
L=0 R=9
Phân hoạch đoạn
l=0 r=9, pivot=M[4]=7
j i
1 5 3 6 2 4 12 10 7 9
0 1 2 3 4 5 6 7 8 9
1 5 3 6 2 4 12 10 7 9
J=i j i
1 2 3 6 5 4 9 7 10 12
0 1 2 3 4 5 6 7 8 9
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 145
Khoa Hệ Thống Thông Tin Quản lý
1 2 3 6 5 4 9 7 10 12
1 2 3 4 5 6 7 9 10 12
Bài tập: Hãy giải thích từng bước quá trình chạy
Quick Sort cho danh sách dưới đây:
int[] M = {5,2,27,200,2};
QuickSort(M,0,n-1);
❖Ví dụ 1
Nguồn : wikipedia
GV: ThS. Nguyễn Văn Thọ - thonv@buh.edu.vn 162
Khoa Hệ Thống Thông Tin Quản lý
100 3 60 35 2
1
3 100 60 35 2
2 3 60 100 35 2
3 3 60 100 2 35
4 2 3 35 60 100
Bài tập 1: Hãy giải thích từng bước quá trình chạy
Merge Sort cho danh sách dưới đây:
int[] M = {10,15,2,8,7};
MergeSort(M,0,n-1);
Bài tập 2: Cho danh sách Sinh viên, mỗi Sinh viên có
các thông số: Mã(int), tên(chuỗi), ngày sinh
(DateTime)
- Hãy xây dựng cấu trúc dữ liệu cho mô tả trên
- Hãy viết giải thuật Merge Sort để: Sắp xếp theo tên
tăng dần, nếu tên trùng nhau thì sắp xếp theo
ngày sinh giảm dần.
Chương 7
Tìm kiếm
1
Khoa Hệ Thống Thông Tin Quản lý
Nội dung
Đặt vấn đề
Minion
răng sún
đâu rồi nhỉ
Đặt vấn đề
Oh My God!
Đồ đạc tùm lum
thế này làm sao
tìm thấy chìa khóa
Đặt vấn đề
Số 6 ở
đâu nhỉ?
Khái niệm
15 22 9 … 100 30
Mã giả:
➢ Bước 1: i = 0 ➔ bắt đầu từ phần tử đầu tiên của dãy
➢ Bước 2: So sánh M[i] với x, có 2 khả năng :
+ M[i] = x : Tìm thấy. Dừng
+ M[i] ≠ x : Sang Bước 3.
➢ Bước 3 : i = i+1➔ xét tiếp phần tử kế trong mảng
Nếu i >=N: Hết mảng, không tìm thấy. Dừng
Ngược lại: Lặp lại Bước 2.
for (i=0;i<N;i++)
{
if(M[i]==x)
printf (“tìm thấy tại vị trí %d”,i);
}
if (i>=N)
printf (“không tìm thấy”);
(với x là biến khoá nhập vào cho tìm kiếm )
i=0
X=9
25 20 9 5 7 4 13 17
0 1 2 3 4 5 6 7
i=1
X=9
25 20 9 5 7 4 13 17
0 1 2 3 4 5 6 7
i=2
X=9
25 20 9 5 7 4 13 17
0 1 2 3 4 5 6 7
Vậy giải thuật tìm tuyến tính có độ phức tạp tính toán
cấp n: T(N) = O(N)
➢ Nhận xét:
✓ Giải thuật tìm tuyến tính không phụ thuộc vào thứ tự
của các phần tử 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 Giải thuật có thể được cài đặt theo nhiều cách
khác nhau, kỹ thuật cài đặt ảnh hưởng đến tốc độ
thực hiện của giải thuật.
❖ Bài tập: Cho danh sách sản phẩm gồm các thông
tin: Mã, tên, đơn giá. Hãy mô hình hóa dữ liệu và
viết các giải thuật tìm kiếm Tuần tự:
✓ Tìm sản phẩm có mã X
✓ Tìm các sản phẩm có đơn giá [A…B]
✓ Tìm các sản phẩm mà phần tên có chứa Z
Mi-1 Mi Mi+1
Mi>x Mi<x
Tìm phần tử X = 19
M
3 19
Middle=(3+5)/2=4
4 25 M[4]=25 > x= 19
5 27
➔Ta tìm phần nửa nhỏ hơn còn lại của M
(tức là từ 3→3)
Tìm phần tử X = 19
M
19 Middle=(3+3)/2=3
3
M[3]=19 = x =19
Tìm thấy X=19 ở vị trí thứ 3
Tìm X = 18
M
3 19
4 Middle=(3+5)/2=4
25
5 M[4]=25 > x= 18
27
➔Ta tìm phần nửa nhỏ hơn còn lại của M
(tức là từ 3→3)
Tìm X = 18
M
3 19 Middle=(3+3)/2=3
M[3]=19 > x= 18
➔không còn phần tử nào để so sánh.
Vậy giải thuật tìm Nhị Phân có độ phức tạp tính toán cấp n:
T(N) = O(log 2 N)