Tải bản đầy đủ (.ppt) (198 trang)

Tìm kiếm và sắp xếp docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (16.86 MB, 198 trang )

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).

×