Bài giảng Cấu trúc dữ liệu và giải thuật - Các chiến lược tìm kiếm - Văn Chí Nam

Tóm tắt Bài giảng Cấu trúc dữ liệu và giải thuật - Các chiến lược tìm kiếm - Văn Chí Nam: ...3 17  Với dãy A được sắp xếp thứ tự (ví dụ: tăng dần), độ phức tạp của thuật toán tìm kiếm tuần tự không đổi.  Tận dụng thông tin của mảng đã được sắp xếp để giới hạn vị trí của giá trị cần tìm trong mảng. -> Thuật toán tìm kiếm nhị phân. Cấu trúc dữ liệu và giải thuật – HCMUS 2...3 25  Phân tích thuật toán tuyến tính: Mỗi lần lặp thì chiều dài của mảng con giảm khoảng ½ so với mảng trước đó.  n = 2k + m (0  m<2)  2k  n k  log2 n k = log2n => mảng A ban đầu được chia nửa khoảng k lần.  Số lần thực hiện vòng while là khoảng k lần, mỗi vòng lặp...àm biến đổi khóa k của phần tử thành địa chỉ trong bảng băm.  Tổng quát về phép biến đổi khóa: Là 1 ánh xạ thích hợp từ tập các khóa U vào tập các địa chỉ A. H: U  A k  a = h(k)  Tập các giá trị khóa (U) có thể lớn hơn rất nhiều so với số khóa thực tế (K) rất nhiều. Tập U T...

pdf54 trang | Chia sẻ: havih72 | Lượt xem: 302 | Lượt tải: 0download
Nội dung tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật - Các chiến lược tìm kiếm - Văn Chí Nam, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
G i ả n g v i ê n : 
Văn Chí Nam – Nguyễn Thị Hồng Nhung – Đặng Nguyễn Đức Tiến 
Giới thiệu 
Tìm kiếm tuần tự 
Tìm kiếm nhị phân 
Tổng kết 
2 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
3 
 Thao tác tìm kiếm rất phổ biến trong cuộc sống 
hàng ngày. 
 Tìm kiếm hồ sơ, tập tin. 
 Tìm kiếm tên người trong danh sách. 
 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
4 
 Có nhiều loại: 
 Tìm kiếm tuần tự (Sequential/ Linear Search) 
 Tìm kiếm nhị phân (Binary Search) 
  
 Mục tiêu: 
 Tìm hiểu về 2 thuật toán tìm kiếm cơ bản. 
 Phân tích thuật toán để lựa chọn thuật toán phù hợp khi 
áp dụng vào thực tế. 
Sequential Search 
Linear Search 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
5 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
6 
 Input: 
Dãy A, n phần tử 
Giá trị x cần tìm 
 Output: 
Nếu x xuất hiện trong A: trả về vị trí xuất hiện đầu tiên 
của x 
Nếu không: trả về n hoặc -1 
 Thuật toán: 
Vét cạn (exhaustive) 
Dùng lính canh (sentinel) 
7 
 Thuật toán: 
 Lần lượt so sánh x với các phần tử của mảng A cho đến 
khi gặp được phần tử cần tìm, hoặc hết mảng. 
Ví dụ: A = {1, 25, 6, 5, 2, 37, 40}, x = 6 
1 25 6 5 2 37 40 
x = 6 
x = 6 
Dừng 
1 25 6 5 2 37 40 
1 25 6 5 2 37 40 
x = 6 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
8 
Thuật toán: LinearExhaustive 
• Bước 1. Khởi tạo biến chỉ số: i = 0 
• Bước 2. Kiểm tra xem có thực hiện hết mảng hay 
chưa: So sánh i và n 
• Nếu chưa hết mảng (i < n), sang bước 3. 
• Nếu đã hết mảng (i >= n), thông báo không tìm thấy 
giá trị x cần tìm. 
• Bước 3. So sánh giá trị a[i] với giá trị x cần tìm 
• Nếu a[i] bằng x: Kết thúc chương trình và thông báo 
đã tìm thấy x. 
• Nếu a[i] khác x, tăng i thêm 1 và quay lại bước 2. 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
9 
 Nhận xét: Phép so sánh là phép toán sơ cấp 
được dùng trong thuật toán. Suy ra, số lượng 
các phép so sánh sẽ là thước đo độ phức tạp 
của thuật toán. 
 Mỗi vòng lặp có 2 điều kiện cần kiểm tra: 
Kiểm tra cuối mảng (bước 2) 
Kiểm tra phần tử hiện tại có bằng x? (bước 3) 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
10 
 Trường hợp x nằm ở 2 biên của mảng A: rất 
hiếm khi xuất hiện. 
 Ước lượng số vòng lặp trung bình sẽ hữu ích 
hơn. 
 Số phép so sánh trung bình: 
 2(1+2+  + n)/n = n+1 
=> Số phép so sánh tăng/giảm tuyến tính theo số 
phần tử 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
11 
 Vậy độ phức tạp của thuật toán là: 
 Tốt nhất: O(1). 
 Trung bình: O(n). 
Xấu nhất: O(n). 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
12 
 Trong thuật toán vét cạn, có 2 điều kiện được 
kiểm tra. 
 Có thể bỏ việc kiểm tra điều kiện cuối mảng 
bằng cách dùng “lính canh”. 
 Lính canh là phần tử có giá trị bằng với phần tử 
cần tìm và đặt ở cuối mảng. 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
13 
 Ví dụ: A = {1, 25, 5, 2, 37}, x = 6 
1 25 5 2 37 6 
x = 6 
x = 6 
return 5; 
x = 6 
1 25 5 2 37 6 
1 25 5 2 37 6 
1 25 5 2 37 6 
1 25 5 2 37 6 
1 25 5 2 37 6 
x = 6 
x = 6 
x = 6 
(a) 
(b) 
(c) 
(d) 
(e) 
(f) 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
14 
Thuật toán: LinearSentinel 
• Bước 1. Khởi tạo biến chỉ số: i = 0 
• Bước 2. So sánh giá trị a[i] với giá trị x cần tìm 
• Nếu a[i] bằng x: 
• Nếu i < n: Kết thúc chương trình và thông báo đã tìm 
thấy x. 
• Nếu i >= n: Thông báo không tìm thấy x trong mảng. 
• Nếu a[i] khác x, tăng i thêm 1 và quay lại bước 2. 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
15 
 Thực nghiệm cho thấy trong trường hợp n lớn, 
thời gian tìm kiếm giảm khi dùng phương pháp 
lính canh. 
Với n =15000: nhanh hơn khoảng 20% (0.22s so với 
0.28s) 
Binary Search 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
16 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
17 
 Với dãy A được sắp xếp thứ tự (ví dụ: tăng 
dần), độ phức tạp của thuật toán tìm kiếm tuần 
tự không đổi. 
 Tận dụng thông tin của mảng đã được sắp xếp 
để giới hạn vị trí của giá trị cần tìm trong mảng. 
-> Thuật toán tìm kiếm nhị phân. 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
18 
 Input: 
Dãy A, n phần tử đã được sắp xếp 
Giá trị x cần tìm 
 Output: 
Nếu x xuất hiện trong A: trả về một vị trí xuất hiện của 
x 
Nếu không: trả về n hoặc -1 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
19 
 Ý tưởng: 
 So sánh x với phần tử chính giữa mảng A. 
 Nếu x là phần tử giữa thì dừng. 
Nếu không: xác định xem x có thể thuộc nửa trái hay 
nửa phải của A. 
 Lặp lại 2 bước trên với nửa đã được xác định. 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
20 
Thuật toán: BinarySearch(A[], n, x) 
 Bước 1. Khởi gán left = 0 và right = n – 1. 
 Bước 2. Trong khi left <= right, thực hiện: 
 2.1. Đặt mid = (left + right)/2 
 2.2. So sánh giá trị x và a[mid]: 
 Nếu x < a[mid], gán right = mid – 1. 
 Nếu x > a[mid], gán left = mid + 1. 
 Nếu x = a[mid], thông báo đã tìm thấy x và kết thúc. 
 Kết quả trả về không tìm thấy x nếu left > right*. 
* Điều này có nghĩa là không còn phần tử nào trong mảng: x không có trong mảng 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
21 
Cài đặt đệ quy: BinarySearch(A[], left, right, x) 
 Bước 1. Nếu left > right: thông báo không tìm 
thấy x và thoát khỏi hàm. 
 Bước 2. 
 2.1. Đặt mid = (left + right)/2 
 2.2. So sánh giá trị x và a[mid]: 
 Nếu x < a[mid], Gọi BinarySearch(A, left, mid – 1, x) 
 Nếu x > a[mid], Gọi BinarySearch(A, mid + 1, right, x) 
 Nếu x = a[mid], thông báo đã tìm thấy x và kết thúc 
(trả lại giá trị mid) 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
22 
 Minh họa: 
A[] = {1, 2, 6, 26, 28, 37, 40}, x = 2 
index 0 1 2 3 4 5 6 
A[i] 1 2 6 26 28 37 40 
Vòng 1 left mid right 
Vòng 2 left mid right 
x = a[1] -> return 1 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
23 
 Minh họa: 
A[] = {1, 2, 6, 26, 28, 37, 40}, x = 40 
 index 0 1 2 3 4 5 6 
A[i] 1 2 6 26 28 37 40 
Vòng 1 left mid right 
Vòng 2 left mid right 
Vòng 3 left 
mid 
right 
x = a[6] -> return 6 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
24 
 Minh họa: 
A[] = {1, 2, 6, 26, 28, 37, 40}, x = -7 
index 0 1 2 3 4 5 6 
A[i] 1 2 6 26 28 37 40 
Vòng 1 left mid right 
Vòng 2 left mid right 
Vòng 3 left 
mid 
right 
Vòng 4 right = -1, left = 0 
 => right thoát khỏi while, 
return -1 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
25 
 Phân tích thuật toán tuyến tính: 
Mỗi lần lặp thì chiều dài của mảng con giảm khoảng ½ 
so với mảng trước đó. 
 n = 2k + m (0  m<2) 
 2k  n k  log2 n k = log2n 
=> mảng A ban đầu được chia nửa khoảng k lần. 
 Số lần thực hiện vòng while là khoảng k lần, mỗi vòng 
lặp thực hiện 1 phép so sánh. 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
26 
 Phân tích thuật toán tuyến tính: 
 Trường hợp tốt nhất: k = 1  x là phần tử chính giữa 
của mảng. 
 Trường hợp xấu nhất: k= log2n + 1  x không 
thuộc mảng hoặc x là phần tử cuối cùng của mảng 
=> Số phép so sánh tăng theo hàm logarit 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
27 
 Độ phức tạp của tìm kiếm nhị phân 
 Trường hợp tốt nhất: O(1) 
 Trường hợp trung bình: O(log2n) 
 Trường hợp xấu nhất: O(log2n) 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
28 
 So sánh trường hợp xấu nhất của 2 thuật toán: 
Kích thước mảng Trường hợp xấu nhất 
Tuần tự Nhị phân 
100.000 100.000 16 
200.000 200.000 17 
400.000 400.000 18 
800.000 800.000 19 
1.600.000 1.600.000 20 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
29 
 Có nhiều thuật toán tìm kiếm, ước lượng số 
phép so sánh của mỗi thuật toán cho biết hiệu 
suất của thuật toán. 
 Thuật toán tuần tự tìm kiếm cho đến khi tìm 
thấy giá trị cần tìm hoặc hết mảng 
 Hiệu suất của tìm kiếm tuần tự trong trường 
hợp xấu nhất là 1 hàm tuyến tính theo số phần 
tử mảng. 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
30 
 Nếu mảng đã được sắp xếp thì nên dùng tìm 
kiếm nhị phân. 
 Tìm kiếm nhị phân dùng kết quả của phép so 
sánh để thu hẹp vùng tìm kiếm kế tiếp. 
 Hiệu suất của tìm kiếm nhị phân là một hàm 
logarit theo số phần tử mảng. 
Hash Table 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
31 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
32 
 Vấn đề: Cho trước 1 tập S gồm các phần tử 
được đặc trưng bởi giá trị khóa. Trên giá trị các 
khóa này có quan hệ thứ tự. Tổ chức S như thế 
nào để tìm kiếm 1 phần tử có khóa k cho trước 
có độ phức tạp ít nhất trong giới hạn bộ nhớ 
cho phép? 
 Ý tưởng: Biến đổi khóa k thành một số (bằng 
hàm hash) và sử dụng số này như là địa chỉ để 
tìm kiếm trên bảng dữ liệu. 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
33 
VCNam 
NTHNhung 
ĐNĐTiến 
+84.91.2345678 
+84.90.9345678 
+84.95.8345678 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
34 
 Chi phí tìm kiếm trung bình: O(1) 
 Chi phí tìm kiếm trong trường hợp xấu nhất: 
O(n) (rất ít gặp). 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
35 
 Định nghĩa: Hàm băm (hash function) là hàm biến 
đổi khóa k của phần tử thành địa chỉ trong bảng 
băm. 
 Tổng quát về phép biến đổi khóa: Là 1 ánh xạ 
thích hợp từ tập các khóa U vào tập các địa chỉ A. 
 H: U  A 
 k  a = h(k) 
 Tập các giá trị khóa (U) có thể lớn hơn rất nhiều so 
với số khóa thực tế (K) rất nhiều. 
Tập U 
Tập K 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
36 
1 . 2 . 
3 . 
10 . 
9 . 8 . 
7 . 
6 . 5 . 
4. 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
3 
4 
8 
10 
T 
Key Data 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
37 
 Chọn số (Digit-selection): 
 Chọn một vài chữ số trong khóa và ghép lại tạo thành 
giá trị băm. 
Ví dụ: 
 h(001364825) = 35 
Ưu điểm: Đơn giản, tính toán nhanh 
Khuyết điểm: Không thể hiện tính chất của khóa, 
không phân bố đều 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
38 
 Gấp số (folding) 
 Cộng các chữ số của khóa 
Nhóm các chữ số thành số và cộng lại 
Ví dụ: 
 h(001364825) = 0 + 0 + 1 + 3 + 6 + 4 + 8 + 2 + 5 = 29 
 h(001364825) = 001 + 364 + 825 = 1190 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
39 
 Lấy dư (modulo arithmetic) 
 Sử dụng phép tính lấy dư 
 h (Key) = Key mod tableSize 
Ví dụ: 
 h(Key) = Key mod 101 
 h(001364825) = 12 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
40 
 k1, k2  K: 
 k1 ≠ k2, H(k1) = H(k2) 
Tập U 
Tập K 
1 . 
2 . 
3 . 
10 . 
9 . 
8 . 
7 . 
6 . 5 . 
4. 
T 
H(3) 
H(4) 
H(2) = H(8) 
H(10) 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
41 
Tính 
toán 
nhanh. 
Các khóa 
phân bố đều. 
Ít xảy ra 
đụng 
độ. 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
42 
 Phương pháp nối kết (separate chaining) 
 Phương pháp địa chỉ mở (Open-addressing) 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
43 
 Ứng với mỗi địa chỉ của bảng, ta có một danh 
sách liên kết chứa các phần tử có khóa khác 
nhau mà có cùng địa chỉ đó. 
 Ta sẽ có danh sách (bảng băm) gồm M phần tử 
chứa địa chỉ đầu của các danh sách liên kết. 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
44 
VCNam 
NTHNhung 
ĐNĐTiến 
+84.91.2345678 
+84.90.9345678 
+84.95.8345678 
ĐTMHậu +84.95.6543210 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
45 
 Tên gọi khác: 
 Phương pháp dò 
 Phương pháp thử 
 Ý tưởng: 
Khi đụng độ xảy ra, ta sẽ thử tìm đến vị trị kế tiếp nào 
đó trong bảng cho đến khi tìm thấy vị trí nào còn trống. 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
46 
 Phương pháp dò tuyến tính (Linear probing) 
 Phương pháp dò bậc 2 (Quadratic probing) 
 Phương pháp băm kép (Double hashing) 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
47 
 Phương pháp dò tuyến tính: 
H(k, i) = (h(k) + i) mod M 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
48 
 Phương pháp dò bậc 2: 
H(k, i) = (h(k) + i2) mod M 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
49 
 Phương pháp băm kép: 
H(k, i) = (h1(k) + i*h2(k)) mod M 
h1(key) = key mod 11 
h2(key) = 7 – (key mod 7) 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
50 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
51 
 Phương pháp địa chỉ mở: 
Đơn giản khi cài đặt. 
 Sử dụng cấu trúc dữ liệu cơ bản. 
Giải quyết được đụng độ nhưng lại có thể gây ra đụng 
độ mới. 
 Phương pháp nối kết: 
Không bị ảnh hưởng về tốc độ khi mảng gần đầy. 
 Ít tốn bộ nhớ khi mảng thưa (ít phần tử). 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
52 
1. Cho bảng băm có kích thước M = 11. Hàm 
băm: h(k) = k mod M. Dùng phương pháp địa 
chỉ mở. Cho biết kết quả sau khi thêm vào 
bảng băm các khóa 10, 22, 31, 4, 15, 28, 17, 
88, 59, với 3 phương pháp xử lý đụng độ: 
 a. Dò tuyến tính. 
 b. Dò bậc 2. 
 c. Băm kép h2(k) = (k mod 19)+1. 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 
53 
2. Cho từ điển Anh – Việt có 15.000 từ, hãy tổ 
chức cấu trúc dữ liệu bảng băm và cho biết hàm 
băm thích hợp giúp cho việc tra từ hiệu quả 
nhất. 
54 
Cấu trúc dữ liệu và giải thuật – HCMUS 2013 

File đính kèm:

  • pdfbai_giang_cau_truc_du_lieu_va_giai_thuat_cac_chien_luoc_tim.pdf