Trước khi chọn thuật toán
Giả sử cửa hàng học cụ hư cấu lưu mã hộp trong dãy `[14, 8, 21, 8, 5]` và cần tìm mã `8`. **Miền dữ liệu** là năm mã đang có; **điều kiện khớp** là giá trị bằng 8. Nếu yêu cầu “tìm một hộp”, kết quả có thể là chỉ số 1. Nếu yêu cầu “tìm mọi hộp”, phải trả cả chỉ số 1 và 3. Nếu mã cần tìm không có, chương trình phải có kết quả báo không tìm thấy. Hai yêu cầu cho đầu ra khác nhau dù cùng dữ liệu.
Trong các bài toán khác, miền tìm kiếm có thể là tệp trên một thư mục, bản ghi trong CSDL hay các vị trí trên bản đồ. Tiêu chí cũng có thể là tên bằng một chuỗi, điểm vượt ngưỡng hoặc đường đi thỏa điều kiện. Thuật toán phù hợp phụ thuộc cấu trúc miền dữ liệu và mục tiêu cụ thể; phần tiếp theo xét dãy có chỉ số để tập trung vào hai cách tìm.
Quy ước kết quả trong chương này
Với hàm tìm **một** phần tử của dãy Python, dùng chỉ số `0..len(a)-1` khi thấy và `-1` khi không thấy, theo SGK. Với hàm tìm **tất cả**, trả về một danh sách chỉ số; danh sách rỗng `[]` nghĩa là không có vị trí nào. Không dùng `0` làm dấu hiệu không thấy, vì 0 là chỉ số hợp lệ của phần tử đầu.
Bài luyện
Trong dãy `[14, 8, 21, 8, 5]`, nếu yêu cầu tìm **mọi** vị trí của mã 8 theo chỉ số Python, kết quả nào đúng?
Chỉ nêu vị trí đầu, thiếu vị trí sau.
Hai giá trị 8 ở chỉ số 1 và 3.
Đây là số thứ tự từ 1, không phải chỉ số Python.
-1 dùng khi không có kết quả.
Lời giải
Dãy đánh chỉ số 0,1,2,3,4. Giá trị 8 nằm ở chỉ số 1 và 3, nên tìm mọi vị trí trả `[1,3]`.
Bài luyện
Muốn tìm một mã hộp, phát biểu nào xác định đủ bài toán tìm kiếm?
Chưa có dữ liệu, tiêu chí và đầu ra.
Thiếu giá trị cần đối chiếu.
Đã rõ miền dữ liệu, tiêu chí và dạng kết quả.
Phần mềm không thay mô tả bài toán.
Lời giải
Một bài toán tìm kiếm cần biết tìm trong dãy nào, giá trị nào được coi là khớp và cần trả một chỉ số hay báo không thấy.
Bài luyện
Vì sao không dùng chỉ số 0 làm dấu hiệu “không tìm thấy”?
Dùng 0 sẽ lẫn với kết quả tìm thấy ở đầu dãy.
Python list đánh chỉ số từ 0.
Dãy ví dụ không rỗng.
Giá trị cần tìm có thể khác 0.
Lời giải
Nếu a[0] đúng bằng giá trị cần tìm, hàm phải trả 0. Vì vậy SGK dùng -1 cho trường hợp không thấy.
Đang học