Tìm kieám &Saép xeáp
Tìm kieám &Saép xeáp
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 2
Tìm kiếm & Sắp xếp
Tìm kiếm & Sắp xếp
Mục tiêu:
Mục tiêu:
Giới thiệu một số thuật toán tìm kiếm
Giới thiệu một số thuật toán tìm kiếm
và sắp xếp nội.
và sắp xếp nội.
Phân tích, đánh giá độ phức tạp của
Phân tích, đánh giá độ phức tạp của
các giải thuật tìm kiếm, sắp xếp.
các giải thuật tìm kiếm, sắp xếp.
Nội dung:
Nội dung:
Nhu cầu tìm kiếm và sắp xếp dữ liệu
Nhu cầu tìm kiếm và sắp xếp dữ liệu
trong một hệ thống thông tin.
trong một hệ thống thông tin.
Các giải thuật tìm kiếm nội.
Các giải thuật tìm kiếm nội.
Các giải thuật sắp xếp nội.
Các giải thuật sắp xếp nội.
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 3
Nhu cầu tìm kiếm và sắp xếp
Nhu cầu tìm kiếm và sắp xếp
dữ liệu trong 1 hệ thống thông tin
dữ liệu trong 1 hệ thống thông tin
Trong hầu hết các hệ lưu trữ, quản lý
Trong hầu hết các hệ lưu trữ, quản lý
dữ liệu, thao tác tìm kiếm thường được
dữ liệu, thao tác tìm kiếm thường được
thực hiện nhất để khai thác thông tin.
thực hiện nhất để khai thác thông tin.
Do các hệ thống thông tin thường phải
Do các hệ thống thông tin thường phải
lưu trữ một khối lượng dữ liệu đáng
lưu trữ một khối lượng dữ liệu đáng
kể, nên việc xây dựng các giải thuật
kể, nên việc xây dựng các giải thuật
cho phép tìm kiếm nhanh sẽ có ý nghóa
cho phép tìm kiếm nhanh sẽ có ý nghóa
rất lớn.
rất lớn.
Nếu dữ liệu trong hệ thống đã được tổ
Nếu dữ liệu trong hệ thống đã được tổ
chức theo một trật tự nào đó, thì việc
chức theo một trật tự nào đó, thì việc
tìm kiếm sẽ tiến hành nhanh chóng và
tìm kiếm sẽ tiến hành nhanh chóng và
hiệu quả hơn
hiệu quả hơn
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 4
Nhu cầu tìm kiếm và sắp xếp
Nhu cầu tìm kiếm và sắp xếp
dữ liệu trong 1 hệ thống thông tin
dữ liệu trong 1 hệ thống thông tin
Có nhiều giải thuật tìm kiếm và sắp xếp
Có nhiều giải thuật tìm kiếm và sắp xếp
Mức độ hiệu quả của từng giải thuật phụ
Mức độ hiệu quả của từng giải thuật phụ
thuộc vào tính chất của cấu trúc dữ liệu
thuộc vào tính chất của cấu trúc dữ liệu
cụ thể mà nó tác động đến.
cụ thể mà nó tác động đến.
Dữ liệu được lưu trữ chủ yếu trong bộ nhớ
Dữ liệu được lưu trữ chủ yếu trong bộ nhớ
chính và trên bộ nhớ phụ, do đặc điểm
chính và trên bộ nhớ phụ, do đặc điểm
khác nhau của thiết bò lưu trữ, các thuật
khác nhau của thiết bò lưu trữ, các thuật
toán tìm kiếm và sắp xếp được xây dựng
toán tìm kiếm và sắp xếp được xây dựng
cho các cấu trúc lưu trữ trên bộ nhớ chính
cho các cấu trúc lưu trữ trên bộ nhớ chính
hoặc phụ cũng có những đặc thù khác nhau.
hoặc phụ cũng có những đặc thù khác nhau.
Chương này sẽ trình bày các thuật toán sắp
Chương này sẽ trình bày các thuật toán sắp
xếp và tìm kiếm dữ liệu được lưu trữ trên
xếp và tìm kiếm dữ liệu được lưu trữ trên
bộ nhớ chính - gọi là các giải thuật
bộ nhớ chính - gọi là các giải thuật
tìm
tìm
kiếm và sắp xếp nội
kiếm và sắp xếp nội
.
.
Các giải thuật
Các giải thuật
tìm kiếm nội
tìm kiếm nội
Tìm kiếm tuần tự
Tìm kiếm tuần tự
Tìm kiếm nhò phân
Tìm kiếm nhò phân
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 6
Các giải thuật tìm kiếm nội
Các giải thuật tìm kiếm nội
Bài toán: Tìm vò trí xuất hiện của phần
Bài toán: Tìm vò trí xuất hiện của phần
tử có giá trò x trên danh sách đặc a
tử có giá trò x trên danh sách đặc a
Tập dữ liệu được lưu trữ là dãy số
Tập dữ liệu được lưu trữ là dãy số
a
a
1
1
, a
, a
2
2
, ,a
, ,a
N
N
int
int
a[N];
a[N];
Khoá cần tìm là x
Khoá cần tìm là x
int
int
x;
x;
Tìm kieám tuaàn töï
Tìm kieám tuaàn töï
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 8
Tìm kiếm tuần tự
Tìm kiếm tuần tự
Bước 1: i = Vò trí đầu;
Bước 1: i = Vò trí đầu;
Bước 2: Nếu a[i] = x : Tìm thấy. Dừng,
Bước 2: Nếu a[i] = x : Tìm thấy. Dừng,
vò trí xuất hiện: i
vò trí xuất hiện: i
Bước 3 : i = Vò trí kế(i);// xét tiếp
Bước 3 : i = Vò trí kế(i);// xét tiếp
phần tử kế trong mảng
phần tử kế trong mảng
Bước 4: Nếu i >Vò trí cuối: //Hết mảng
Bước 4: Nếu i >Vò trí cuối: //Hết mảng
Không tìm thấy. Dừng.
Không tìm thấy. Dừng.
Ngược lại: Lặp lại Bước 2.
Ngược lại: Lặp lại Bước 2.
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 9
Tìm kiếm tuần tự
Tìm kiếm tuần tự
Ví dụ: Cho dãy số a
Ví dụ: Cho dãy số a
12
12
2
2
8
8
5
5
1
1
6
6
4
4
15
15
Giá trò cần tìm: 8
Giá trò cần tìm: 8
i = 1
i = 1
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 10
Tìm kiếm tuần tự
Tìm kiếm tuần tự
i = 2
i = 2
i = 3
i = 3
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 11
Tìm kiếm tuần tự
Tìm kiếm tuần tự
int
int
LinearSearch
LinearSearch
(
(
int
int
a[],
a[],
int
int
N,
N,
int
int
x)
x)
{
{
for
for
(
(
int
int
i=0;
i=0;
(i<N)&&(a[i]!=x ); i++);
(i<N)&&(a[i]!=x ); i++);
if
if
(i<N)
(i<N)
return
return
i;
i;
// a[i] là phần tử có
// a[i] là phần tử có
khoá x
khoá x
return
return
-1;
-1;
// tìm hết mảng nhưng
// tìm hết mảng nhưng
không có x
không có x
}
}
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 12
Tìm kiếm tuần tự
Tìm kiếm tuần tự
Cải tiến cài đặt: dùng phương pháp
Cải tiến cài đặt: dùng phương pháp
“lính canh”
“lính canh”
Đặt thêm một phần tử có giá trò x vào
Đặt thêm một phần tử có giá trò x vào
cuối mảng
cuối mảng
Bảo đảm luôn tìm thấy x trong mảng
Bảo đảm luôn tìm thấy x trong mảng
Sau đó dựa vào vò trí tìm thấy để kết
Sau đó dựa vào vò trí tìm thấy để kết
luận.
luận.
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 13
Tìm kiếm tuần tự
Tìm kiếm tuần tự
int
int
LinearSearch
LinearSearch
(
(
int
int
a[],
a[],
int
int
N,
N,
int
int
x)
x)
{
{
// mảng gồm N phần tử từ a[0] a[N-1]
// mảng gồm N phần tử từ a[0] a[N-1]
a[N] = x;
a[N] = x;
// thêm lính canh vào cuối
// thêm lính canh vào cuối
dãy
dãy
for
for
(
(
int
int
i=0; (
i=0; (
a[i]!=x); i++);
a[i]!=x); i++);
if
if
(i<N)
(i<N)
return
return
i;
i;
// a[i] là phần tử có khoá x
// a[i] là phần tử có khoá x
return
return
-1;
-1;
// tìm hết mảng nhưng không
// tìm hết mảng nhưng không
có x
có x
}
}
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 14
Tìm kiếm tuần tự
Tìm kiếm tuần tự
Đánh giá giải thuật:
Đánh giá giải thuật:
Vậy giải thuật tìm tuần tự có độ
Vậy giải thuật tìm tuần tự có độ
phức tạp tính toán cấp n: T(n) = O(n)
phức tạp tính toán cấp n: T(n) = O(n)
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 15
Tìm kiếm tuần tự
Tìm kiếm tuần tự
Nhận xét:
Nhận xét:
Giải thuật tìm tuyến tính không phụ thuộc
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ử trong danh
vào thứ tự của các phần tử trong danh
sách, do vậy đây là phương pháp tổng quát
sách, do vậy đây là phương pháp tổng quát
nhất để tìm kiếm trên một danh sách bất
nhất để tìm kiếm trên một danh sách bất
kỳ.
kỳ.
Một thuật toán có thể được cài đặt theo
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
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 thuật toán.
hưởng đến tốc độ thực hiện của thuật toán.
Tìm kieám nhò phaân
Tìm kieám nhò phaân
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 17
Tìm kiếm nhò phân
Tìm kiếm nhò phân
Đối với những dãy đã có thứ tự
Đối với những dãy đã có thứ tự
(giả sử thứ tự tăng ), các phần tử
(giả sử thứ tự tăng ), các phần tử
trong dãy có quan hệ
trong dãy có quan hệ
a
a
i -1
i -1
≤
≤
a
a
i
i
≤
≤
a
a
i+1
i+1
Nếu x >
Nếu x >
a
a
i
i
thì x chỉ có thể xuất hiện
thì x chỉ có thể xuất hiện
trong đoạn [
trong đoạn [
a
a
i+1
i+1
,a
,a
N
N
] của dãy
] của dãy
Nếu x <
Nếu x <
a
a
i
i
thì x chỉ có thể xuất hiện
thì x chỉ có thể xuất hiện
trong đoạn [
trong đoạn [
a
a
1
1
,a
,a
i-1
i-1
] của dãy .
] của dãy .
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 18
Tìm kiếm nhò phân
Tìm kiếm nhò phân
Ý tưởng của giải thuật là tại mỗi
Ý tưởng của giải thuật là tại mỗi
bước tiến hành so sánh x với phần tử
bước tiến hành so sánh x với phần tử
nằm ở vò trí giữa của dãy tìm kiếm
nằm ở vò trí giữa của dãy tìm kiếm
hiện hành, dựa vào kết quả so sánh
hiện hành, dựa vào kết quả so sánh
này để quyết đònh giới hạn dãy tìm
này để quyết đònh giới hạn dãy tìm
kiếm ở bước kế tiếp là nửa trên hay
kiếm ở bước kế tiếp là nửa trên hay
nửa dưới của dãy tìm kiếm hiện hành
nửa dưới của dãy tìm kiếm hiện hành
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 19
Tìm kiếm nhò phân
Tìm kiếm nhò phân
Bước 1: left = VTĐ; right = VTC;
Bước 1: left = VTĐ; right = VTC;
Bước 2: Trong khi left
Bước 2: Trong khi left
≤
≤
right lặp: //đoạn tìm kiếm
right lặp: //đoạn tìm kiếm
chưa rỗng
chưa rỗng
Bước 21: mid = (left+right)/2; // lấy mốc so sánh
Bước 21: mid = (left+right)/2; // lấy mốc so sánh
Bước 22: Nếu a[mid] = x:
Bước 22: Nếu a[mid] = x:
//Tìm thấy.
//Tìm thấy.
Dừng, vò trí xuất hiện: mid
Dừng, vò trí xuất hiện: mid
Bước 23: Nếu a[mid] > x:
Bước 23: Nếu a[mid] > x:
//tìm x trong dãy con
//tìm x trong dãy con
a
a
left
left
a
a
mid -1
mid -1
right = mid - 1;
right = mid - 1;
Ngược lại
Ngược lại
//tìm x trong dãy con a
//tìm x trong dãy con a
mid +1
mid +1
a
a
right
right
left = mid + 1;
left = mid + 1;
//Hết lặp
//Hết lặp
Bước 3: Dừng, không tìm thấy.
Bước 3: Dừng, không tìm thấy.
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 20
Tìm kiếm nhò phân
Tìm kiếm nhò phân
Ví dụ: Cho dãy số a gồm 8 phần tử:
Ví dụ: Cho dãy số a gồm 8 phần tử:
1
1
2
2
4
4
5
5
6
6
8
8
12
12
15
15
Giá trò cần tìm là 8
Giá trò cần tìm là 8
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 21
Tìm kiếm nhò phân
Tìm kiếm nhò phân
left = 1, right = 8, mid = 4
left = 1, right = 8, mid = 4
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 22
Tìm kiếm nhò phân
Tìm kiếm nhò phân
left = 5, right = 8, mid = 6
left = 5, right = 8, mid = 6
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 23
Tìm kiếm nhò phân
Tìm kiếm nhò phân
int
int
BinarySearch
BinarySearch
(
(
int
int
a[],
a[],
int
int
N,
N,
int
int
x )
x )
{
{
int
int
left =0, right = N-1, midle;
left =0, right = N-1, midle;
while
while
(left <= right)
(left <= right)
{
{
mid = (left + right)/2;
mid = (left + right)/2;
if
if
(x == a[midle])
(x == a[midle])
return
return
midle;
midle;
//Tìm thấy x tại mid
//Tìm thấy x tại mid
if
if
(x<a[midle])right = midle -1;
(x<a[midle])right = midle -1;
else
else
left = midle +1;
left = midle +1;
}
}
return
return
-1;
-1;
// trong dãy không có x
// trong dãy không có x
}
}
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 24
Tìm kiếm nhò phân
Tìm kiếm nhò phân
Đánh giá giải thuật:
Đánh giá giải thuật:
Giải thuật tìm nhò phân có độ phức
Giải thuật tìm nhò phân có độ phức
tạp tính toán cấp logn:
tạp tính toán cấp logn:
T(n) = O(log
T(n) = O(log
2
2
n)
n)
Cấu trúc Dữ liệu - Tìm kiếm và Sắp xếp 25
Tìm kiếm nhò phân
Tìm kiếm nhò phân
Nhận xét:
Nhận xét:
Giải thuật tìm nhò phân dựa vào quan hệ
Giải thuật tìm nhò phân dựa vào quan hệ
giá trò của các phần tử mảng để đònh
giá trò của các phần tử mảng để đònh
hướng trong quá trình tìm kiếm, do vậy chỉ
hướng trong quá trình tìm kiếm, do vậy chỉ
áp dụng được cho những dãy đã có thứ tự.
áp dụng được cho những dãy đã có thứ tự.
Giải thuật tìm nhò phân tiết kiệm thời gian
Giải thuật tìm nhò phân tiết kiệm thời gian
hơn rất nhiều so với giải thuật tìm tuần tự
hơn rất nhiều so với giải thuật tìm tuần tự
do
do
T
T
nhò phân
nhò phân
(n) = O(log
(n) = O(log
2
2
n) < T
n) < T
tuần tự
tuần tự
(n) = O(n).
(n) = O(n).