Tìm kiếm là đòi hỏi rất thường xuyên trong xử lý tin học. Bài toán tìm kiếm: “ Cho 1 bảng chính gồm n bản ghi R1, R2, …, Rn. Mỗi bản ghi Ri (1 ≤ i ≤ n) tương ứng với 1 khoá Ki. Hãy tìm bản ghi có giá trị khoá tương ứng bằng X cho trước.” – X được gọi là khoá tìm kiếm hay đối trị tìm kiếm.
1 BÀI 6: TÌM KIẾM 6.1 Tìm kiếm 6.2 Tìm kiếm nhị phân 6.3 Câu hỏi ơn tập 6.1 Tìm kiếm 6.1.1 Bài tốn tìm kiếm 6.1.2 Nguyên tắc tìm kiếm 6.1.3 Giải thuật 6.1.4 Phân tích đánh giá 6.1.1 Bài tốn tìm kiếm • • Tìm kiếm địi hỏi thường xun xử lý tin học Bài tốn tìm kiếm: “ Cho bảng gồm n ghi R1, R2, …, Rn Mỗi ghi Ri (1 ≤ i ≤ n) tương ứng với khố Ki Hãy tìm ghi có giá trị khố tương ứng X cho trước.” – X gọi khố tìm kiếm hay đối trị tìm kiếm – Cơng việc tìm kiếm hồn thành xảy tình sau: Tìm ghi có giá trị khố = X (thành cơng) Khơng tìm ghi có giá trị khố = X (khơng thành cơng) • Chú ý: Khoá coi đại diện ghi, GT ví dụ, ta nói tới khố Bài tốn tìm kiếm • Bài tốn tìm kiếm ghi có giá trị khố X bảng chứa ghi R1, R2, …, Rn coi đặt cách đơn giản với bảng khoá chứa khoá K1, K2, …, Kn Ki ≠ Kj i ≠ j Tìm kiếm khố X bảng khố K1, K2, …, Kn (Ki ≠ Kj i ≠ j) • Sau phép tìm kiếm khơng thành cơng, xuất yêu cầu bổ sung thêm ghi mới, GT gọi GT tìm kiếm có bổ sung • Giá trị khố số, ký tự, xâu ký tự,… tiện ta coi khoá số nguyên 5 6.1.2 Ngun tắc tìm kiếm • Tìm kiếm (sequential searching) kỹ thuật tìm kiếm đơn giản cổ điển • Nội dung tóm tắt sau: • Ngun tắc tìm kiếm: – Lần lượt so sánh X (khố tìm kiếm) với khố K1, K2, …, Kn bảng tìm thấy X (X = Km) hết bảng khố mà chưa tìm thấy X – Kết quả: Tìm vị trí m khố (đầu tiên) có giá trị X Khơng tìm khố có giá trị X 6.1.3 Giải thuật • Cho bảng khố k gồm n phần tử (0 ≤ n ≤ 250), khoá X số nguyên Integer nhập từ bàn phím sinh ngẫu nhiên (bằng random) • Giải thuật tìm kiếm thực tìm kiếm bảng xem có khố X khơng Nếu có đưa số khố Nếu khơng đưa giá trị Trong giải thuật có sử dụng khố phụ kn+1 mà giá trị X GT tìm kiếm Function Tuantu(X: Shortint) : Byte; Var i: Byte; Begin i := 1; k[n + 1] := X; {Tìm kiếm tuần tự} While k[i] X i := i + 1; {Khơng tìm thấy} If i = n + Then Tuantu := {Tìm thấy} Else Tuantu := i; End; 6.1.4 Phân tích đánh giá • Tìm kiếm (Tuantu): B1: Xác định phép tốn tích cực – Là phép so sánh: k[i] X B2: Xác định số lần thực phép tốn tích cực – Số lượng phép so sánh phụ thuộc vào tình trạng bảng khố (so với giá trị X) – T/h tốt (min) xảy k[1] = X, X số lần thực phép tốn tích cực là: Cmin 1 – T/h xấu (max) xảy k[n + 1] = X, X nghĩa khơng tìm thấy X, số lần thực phép tốn tích cực là: Cmax n Phân tích đánh giá – T/h trung bình (tb) xảy việc tìm thấy X vị trí đồng khả Số lần thực phép tốn tích cực t/h trung bình coi là: n 1 Ctb B3: Kết luận độ phức tạp GT tìm kiếm – T/h tốt nhất: Tmin (n) O(1) – T/h xấu trung bình: Tmax (n) Ttb (n) O(n) 10 6.2 Tìm kiếm nhị phân 6.2.1 Nguyên tắc tìm kiếm 6.2.2 Giải thuật 6.2.3 Phân tích đánh giá 11 6.2.1 Nguyên tắc tìm kiếm • • Phép tìm kiếm nhị phân ln chọn khố “ở giữa” bảng khố xét để thực so sánh với khố tìm kiếm X Ngun tắc tìm kiếm nhị phân: – – – – – – Giả sử bảng khoá xét kL, …, kR khố bảng L R ki với: i Tìm kiếm kết thúc X = ki Nếu X < ki tìm kiếm thực tiếp với kL, …, ki-1 Nếu X > ki tìm kiếm thực tiếp với ki+1, …, kR Với bảng khoá sau, sử dụng kỹ thuật tương tự Quá trình tìm kiếm bắt đầu với L = R = n đến tìm thấy X bảng khố xét rỗng (khơng tìm thấy) 6.2.2 Giải thuật • 12 Cho bảng khoá k gồm n phần tử (0 ≤ n ≤ 250) xếp theo thứ tự tăng dần, khoá X số nguyên Integer nhập từ bàn phím sinh ngẫu nhiên (bằng random) • Giải thuật tìm kiếm nhị phân thực tìm kiếm bảng xem có khố X khơng Nếu có đưa số khố Nếu khơng đưa giá trị • Có thể thể tìm kiếm nhị phân bằng: Giải thuật lặp Giải thuật đệ quy 13 GT lặp tìm kiếm nhị phân Function Nhiphan(X : Integer): Byte; Var L, R, m, vitri: Byte; Begin L := 1; R := n; vitri := 0; While L k[m] then L := m + 1; Else begin vitri := m; break; end; End; Nhiphan := vitri; End; 14 GT đệ quy tìm kiếm nhị phân Function Nhiphan(L, R: Byte; X : Integer): Byte; Var m, vitri: Byte; Begin If L > R then vitri := Else Begin m := (L + R) div 2; If X < k[m] then vitri := Nhiphan(L, m – 1, X) Else If X > k[m] then vitri := Nhiphan(m + 1, R, X); Else vitri := m; End; Nhiphan := vitri; End; 15 6.2.3 Phân tích đánh giá • Tìm kiếm nhị phân (Nhiphan): B1: Xác định phép tốn tích cực – Là phép so sánh: L