GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
CẤU TRÚC DỮ LIỆU
DATA STRUCTURES
[214331]
TÌM KIẾM
1
/XX
12/3/15
Teacher: Nguyễn Xuân Vinh
Email:
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
2
Định nghĩa
Giải thuật tìm kiếm là một thuật toán trả về kết quả là một lời giải cho bài toán đó.
Trong giải thuật tìm kiếm người ta thường cân nhắc giữa các lời giải có thể và tìm ra lời giải tối ưu nhất.
Không gian tìm kiếm: tập hợp các lời giải có thể đối với 1 bài toán.
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
3
Phân loại tìm kiếm
Tìm kiếm không có thông tin
Tìm kiếm trên danh sách
TÌm kiếm trên cây
Tìm kiếm trên đồ thị
TÌm kiếm có thông tin
Tìm kiếm đối kháng
Thỏa mãn ràng buộc
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
4
Tìm kiếm không có thông tin
Một giải thuật không tính đến bản chất cụ thể của bài toán.
Ưu điểm:
Có thể được sử dụng cho nhiều bài toán.
Nhược điểm:
Không gian tìm kiếm rất lớn.
Thời gian tìm kiếm lâu.
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
5
Tìm kiếm trên danh sách
Tìm một khóa nào đó trong 1 tập hợp các phần tử nào đó.
Các thuật toán:
Tìm kiếm tuyến tính – linear search
Tìm kiếm nhị phân – binary search
Tìm kiếm nội suy – interpolation search
Fibonaccian search
Jump search
Secant search
Bảng băm – hashtable
Cây tìm kiếm nhị phân cân bằng – self-balancing binary search tree
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
6
Tìm kiếm tuyến tính – linear search
Ý tưởng của thuật toán: Thuật toán tiến hành kiểm tra từng phần tử trong danh sách theo thứ tự của danh sách đó.
Ưu điểm:
Đơn giản, dễ cài đặt
Có thể áp dụng cho 1 danh sách bất kỳ mà không cần tiền xử lý.
Nhược điểm:
Thời gian chạy lớn:
Trường hợp trung bình và xấu nhất O(n).
Trường hợp tốt nhất O(1).
GV: NGUYỄN XUÂN VINH
Tìm kiếm tuyến tính – linear search
•
/>
•
Minh họa tìm x =10
MÔN: CẤU TRÚC DỮ LIỆU
10
Đã tìm thấy tại
•
7
5
12
41
10
10
32
13
9
15
3
1
2
3
4
5
6
7
8
9
10
vị trí 5
Minh họa tìm x = 25
25
5
12
41
10
32
13
9
15
3
1
2
3
4
5
6
7
8
9
10
Đã hết mảng
7
/XX
12/3/15
7
7
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
8
Giải thuật
Bước 1: i = 1 //bắt đầu từ phần tử đầu tiên của dãy.
Bước 2: so sánh a[i] với x, có 2 khả năng:
a[i] = x: tìm thấy, dừng thuật toán.
a[i] != x: sang bước 3.
Bước 3:
i = i+1 //xét phần tử kế tiếp 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.
9
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Cài đặt
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
10
Độ phức tạp
Độ phức tạp trong thuật toán này chính là số lần thực hiện các phép so sánh.
Mỗi bước của vòng lặp cần 2 phép so sánh:
Đã hết danh sách chưa.
Có bằng phần tử cần tìm không
Do đó tại bước thứ i đã có 2i phép so sánh.
Trong trường hợp xấu nhất ta có 2n phép so sánh
độ phức tạp O(n)
GV: NGUYỄN XUÂN VINH
Tìm kiếm nhị phân – binary search
Ý tưởng của thuật toán: giả sử danh sách đã được sắp xếp, ta tiến hành chọn một phần tử ở giữa danh sách
(middle), sau đó so sánh phàn tử cần tìm kiếm (target) và phần tử middle.
11
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
Nếu target=middle: đã tìm thấy, kết thúc thuật toán.
Nếu target>middle: tiếp tục tìm kiếm nửa bên phải của danh sách cũ.
Nếu target
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
12
Tìm kiếm nhị phân – binary search
Ưu điểm:
Thời gian chạy nhanh:
Trường hợp tốt nhất O(1)
Trường hợp trung bình và xấu nhất O(logn).
Nhược điểm:
Danh sách phải được sắp xếp trước.
Danh sách phải có khả năng truy xuất ngẫu nhiên.
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
13
Tìm kiếm nhị phân – binary search
/>
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
Tìm kiếm nhị phân – binary search
Minh họa tìm x = 41
12/3/15
/XX
x
x
3
14
16
19
22
41
46
51
63
71
1
2
3
4
5
6
7
8
9
10
l
14
x
m
m
Tìm thấy x tại vị trí 6
r
m
14
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
Tìm kiếm nhị phân – binary search
Minh họa tìm x = 45
x
x
x
x
3
14
16
19
22
41
46
51
63
71
1
2
3
4
5
6
7
8
9
10
l
m
m
r
l > r: Kết thúc: Không tìm
thấy
15
/XX
12/3/15
m
m
15
GV: NGUYỄN XUÂN VINH
Giải thuật
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
Bước 2:
mid = (left+right)/2 //lấy mốc so sánh
So sánh a[mid] với x, có 3 khả năng:
a[mid] = x. Tìm thấy, dừng.
a[mid] > x //tìm tiếp trong dãy con aleft …amid-1
right = mid – 1;
a[mid] < x //tìm tiếp trong dãy con amid+1 …aright
left = mid+1
16
Bước 1: left = 1, right = N //tìm trên tất cả các phần tử
Bước 3:
left <= right = N //còn phần tử chưa xét lặp lại bước 2
Ngược lại, dừng, không tìm thấy
17
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Cài đặt
18
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
So sánh giữa TKTT & TKNP
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
19
Tìm kiếm nhị phân – binary search
Ý tưởng: là giải thuật tìm kiếm trên danh sách đã được sắp xếp bằng cách ước lượng vị trí tiếp theo để kiểm tra
bằng phép nội suy tuyến tính của khóa và giá trị của phần tử cuối cùng của danh sách.
Tức là sử dụng các vị trí đã biết để đoán ra các vị trí có thể.
Ưu điểm:
Thời gian chạy nhanh:
Trung bình: O(log log n)
Trường hợp xấu nhất: O(n)
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
20
Giải thuật
Bước 1: chọn l = 0, r = N-1
Bước 2:
m = l + (x – a[l])*(r-l)/(a[r]-a[l]) Hàm nội suy
Tiến hành so sánh, có 3 trường hợp xảy ra:
x = a[m]: Tìm thấy, dừng.
x < a[m]: đặt r = m-1
x > a[m]: đặt l = m + 1
Bước 3:
Nếu x<a[l] hay x>a[r] m>r hay m
Ngược lại quay lại bước 2.
GV: NGUYỄN XUÂN VINH
Ví dụ
Tìm x = 32
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 4 7 9 9 12 13 17 19 21 24 32 36 44 45 54 55 63 66 70
21
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
Lần 1:
l=0, r=19 m=0+(32-0)*(19-0)/(70-1) = 8
a[8]=19<32=x l=9
Lần 2:
l=9, r=19 m=9+(30-24)*(19-9)/(70-24) = 11
a[11]=32=x tìm thấy giá trị x= 32 tại vị trí m = 11
GV: NGUYỄN XUÂN VINH
Ví dụ
Tìm x = 30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
22
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
1 4 7 9 9 12 13 17 19 21 24 32 36 44 45 54 55 63 66 70
23
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Cài đặt
GV: NGUYỄN XUÂN VINH
MÔN: CẤU TRÚC DỮ LIỆU
12/3/15
/XX
24
So sánh giữa TKNP &TKNS
Tính về tốc độ thực hiện thì tìm kiếm nội suy nhanh hơn hẳn tìm kiếm nhị phân.
Ví dụ: với 1 tập hợp 232 (4 triệu) phần tử
Tìm kiếm nhị phân cần thực hiện 32 bước
Trong khi đó tìm kiếm nội suy chỉ cần 5 bước
Đối với các tập phần tử lớn thì tốc độ thực hiện của TKNS gần như là hàm hằng.
25
/XX
12/3/15
MÔN: CẤU TRÚC DỮ LIỆU
GV: NGUYỄN XUÂN VINH
Bảng băm – hashtable