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

CAC THUAT TOAN TIM KIEM pdf

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 (1.44 MB, 37 trang )


1
CHƯƠNG 6
CÁC THU T TOÁN TÌM KI MẬ Ế

2/37
NỘI DUNG

Khái niệm tìm kiếm

Các phương pháp tìm kiếm

Phương pháp tìm kiếm tuần tự

Phương pháp tìm kiếm nhị phân

Phương pháp tìm kiếm trên cây nhị phân tìm kiếm

3/37
KHÁI NIỆM TÌM KIẾM
Đặt vấn đề
CHÌA KHÓA
CỦA TA ĐÂU?

4/37
KHÁI NIỆM TÌM KIẾM

Khái niệm

Tìm kiếm là việc kiểm tra xem có hay không
một đối tượng có một số thông tin cho trước


(đối tượng cần tìm) trong một tập các đối
tượng cho trước (không gian tìm kiếm)

Ví dụ: Tìm một chùm chìa khóa trong một
gian phòng

Ta có hình ảnh của chùm chìa khóa

Gian phòng gồm nhiều đồ đạc

5/37
BÀI TOÁN TÌM KIẾM
-
Dãy a, có n đối tượng, mỗi đối tượng có một
“khóa tìm kiếm”
-
Khóa của đối tượng cần tìm (Key)
- Nếu tìm thấy đối tượng có khóa ‘Key’ trong
dãy a trả lại giá trị 1, ngược lại trả lại giá trị 0.
Dữ liệu vào:
Dữ liệu ra:
Ví dụ:
5 1 6 8 2
Dữ liệu vào:
a0 a1 a2 a3 a4
Số x=6
Dữ liệu ra:
1 (Tìm thấy x trong mảng a)

6/37

CÁC THUẬT TOÁN TÌM KIẾM

Tìm kiếm tuần tự

Tìm kiếm nhị phân

Tìm kiếm trên cây nhị phân tìm kiếm

7/37
CÁC THUẬT TOÁN TÌM KIẾM

Tùy theo dữ liệu vào ta có thể phân chia bài
toán tìm kiếm thành hại loại

Tìm kiếm trên dãy chưa sắp: dãy tìm kiếm
chưa được sắp xếp theo thứ tự khóa tìm
kiếm

Tìm kiếm trên dãy đã sắp: dãy tìm kiếm đã
sắp theo thứ tự tăng dần của khóa tìm kiếm

8/37
TÌM KIẾM TRÊN DÃY CHƯA SẮP

Với một dãy chưa được sắp xếp thì cách
tìm kiếm đơn giản nhất là tìm kiếm tuần tự

Tìm kiếm tuần tự là một phương pháp tìm
kiếm khá phổ biến và hết sức đơn giản
??


9/37
TÌM KIẾM TUẦN TỰ

Ý tưởng :

So sánh khóa của đối tượng cần tìm với khóa của
đối tượng đầu tiên trong dãy.

Nếu bằng nhau, kết thúc tìm kiếm (thành công)

Nếu không bằng, chuyển sang đối tượng kế tiếp

Lặp lại công việc trên cho đến khi gặp một đối tượng
có khóa bằng với khóa cần tìm (thành công) hoặc đã
hết các đối tượng trong dãy (không thành công)

10/37
TÌM KIẾM TUẦN TỰ
Ví dụ 1 :
5 1 6 8 2
a0 a1 a2 a3 a4
Tìm số x=6 trong dãy
Cho dãy số
i=0
5 1 6 8 2
x
6
i=1 i=2
Tìm thấy x


11/37
TÌM KIẾM TUẦN TỰ
Việc tìm kiếm có thể minh họa như sau

i=0; a0=5 <> x=6; i=i+1;

i=1; a1=1 <> x=6; i=i+1;

i=2; a2=6 = x; Tìm thấy x
Tìm kiếm kết thúc thành công
Chuyển sang đối tượng kế tiếp
Chuyển sang đối tượng kế tiếp

12/37

Ví dụ 2
TÌM KIẾM TUẦN TỰ
3 48 11 36 25 23 42 7
a0 a1 a2 a3 a4
- Cho dãy số
- Minh họa việc tìm số x1=42 và số x2=43 trong
dãy bằng phương pháp tìm kiếm tuần tự
a5 a6 a7

Ví dụ 2
a1
- Minh họa việc tìm số x1=42 và số x2=43 trong
dãy bằng phương pháp tìm kiếm tuần tự


13/37
Giải thuật
TÌM KIẾM TUẦN TỰ
i=0
(i<n && a[i]!=x)
i=i+1
Yes
(i<n)
No
No
return 0
Yes
return 1
end
begin

14/37
TÌM KIẾM TUẦN TỰ
int tktt(int x, int a[], int n)
{ int i=0;
while(i<n&&a[i]!=x) i++;
if (i<n) return 1;
return 0;
}

Độ phức tạp của thuật toán : O(n)

15/37
TÌM KIẾM TUẦN TỰ CẢI TIẾN


Nhận xét : mỗi lần so sánh đều phải kiểm tra xem
dãy đã hết chưa (i<n), nên tốn thêm thời gian.

Để tránh điều đó người ta thêm đối tượng x vào
cuối dãy a (gán a[n]=x)
5 1 6 8 2
a0 a1 a2 a3 a4
5 1 6 8 2 6
a0 a1 a2 a3 a4 a5
Ví dụ

16/37
Giải thuật
TÌM KIẾM TUẦN TỰ CẢI TIẾN
i=0; a[n]=x
(x!= a[i])
i=i+1
Yes
(i<n)
No
No
return 0
Yes
return 1
end
begin

17/37
TÌM KIẾM TUẦN TỰ CẢI TIẾN
int tktt2(int x, int a[], int n)

{ int i=0; a[n]=x;
while(a[i]!=x) i++;
if (i<n) return 1;
return 0;
}

Độ phức tạp của thuật toán : O(n)

18/37

Với một dãy đã sắp xếp theo theo thứ tự của
khóa tìm kiếm thì việc tìm kiếm về cơ bản sẽ
nhanh hơn

Việc tìm kiếm có thể thực hiện bằng một trong
hai phương pháp

Tìm kiếm tuần tự hoặc

Tìm kiếm nhị phân
TÌM KIẾM TRÊN DÃY ĐÃ SẮP

19/37

Việc tìm kiếm giống như tìm kiếm trên dãy chưa sắp

Quá trình tìm kiếm kết thúc khi gặp một trong 3 điều
kiện

Gặp đối tượng có khóa bằng với khóa của đối tượng

cần tìm (tìm kiếm thành công)

Gặp đối tượng có khóa “lớn hơn” khóa của đối
tượng cần tìm (tìm kiếm không thành)

Đã duyệt hết dãy (tìm kiếm không thành)
TÌM KIẾM TUẦN TỰ TRÊN DÃY ĐÃ SẮP

20/37
TÌM KIẾM TUẦN TỰ TRÊN DÃY ĐÃ SẮP
Ví dụ:
1 2 5 6 8
a1 a1 a2 a3 a4
Tìm số x=4 trong dãy
Cho dãy số được
sắp tăng
i=0
x
4
i=1 i=2
1 2 5 6 8
Không tìm thấy x

21/37
Giải thuật
TÌM KIẾM TUẦN TỰ TRÊN DÃY ĐÃ SẮP
i=0; a[n]=x
( a[i]<x )
i=i+1
Yes

(i<n&&a[i]==x)
No
No
return 0
Yes
return 1
end
begin

22/37
TÌM KIẾM TUẦN TỰ TRÊN DÃY ĐÃ SẮP
int tktt3(int x, int a[], int n)
{ int i=0; a[n]=x;
while ( a[i]<x) i++;
if (i<n && a[i]==x) return 1;
return 0;
}

Độ phức tạp của thuật toán : O(n)

23/37

Ý tưởng

So sánh khóa cần tìm với khóa của đối tượng ở
trung tâm của dãy đang xét m=(l+r)/2

Tìm kiếm kết thúc thành công nếu a[m]==x

Nếu a[m] > x, tìm kiếm được thực hiện với dãy trái

a[l], , a[m-1]

Nếu a[m] < x, tìm kiếm được thực hiện với dãy phải
a[m+1], , a[r]

Quá trình tìm kiếm tiếp tục cho đến khi gặp đối
tượng mong muốn (thành công) hoặc dãy khóa đang
xét trở nên rỗng
TÌM KIẾM NHỊ PHÂN

24/37

Ví dụ
TÌM KIẾM NHỊ PHÂN
1 2 5 6 8
a0 a1 a2 a4 a4
- Cho dãy số được sắp tăng
- Tìm số x=4 trong dãy
Quá trình tìm kiếm được minh họa như sau

25/37
TÌM KIẾM NHỊ PHÂN
Dãy đang xét
1 2 5 6 8
l=0, r=4, m=2
x
4
<
a[m]=5
1 2 5 6 8

l=0, r=1, m=0
x
4
>
a[m]=1
1 2 5 6 8
l=1, r=1, m=1
x
4
>
a[m]=2
x
4
1 2 5 6 8
l=2, r=1
Trường hợp dãy đang xét trở nên rỗng vì thế tìm kiếm kết
thúc không thành công

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×