CÁC THUẬT TOÁN TÌM KIẾM TRÊN MẢNG VÀ CHUỖI Bùi Tiến Lên 01/01/2017 Bài toán tìm kiếm I Tìm kiếm (search) là một công việc hàng ngày trong cuộc sống I Tìm kiếm là một trong những bài toán quan trọng tr[.]
CÁC THUẬT TỐN TÌM KIẾM TRÊN MẢNG VÀ CHUỖI Bùi Tiến Lên 01/01/2017 Bài tốn tìm kiếm I I I I Tìm kiếm (search) cơng việc hàng ngày sống Tìm kiếm toán quan trọng ứng dụng tin học Một số thuật tốn tìm kiếm phổ biến cấu trúc liệu mảng I Tìm kiếm I Tìm kiếm nhị phân Tìm kiếm chuỗi xem tốn tìm kiếm mảng Spring 2017 Data structure & Algorithm TÌM KIẾM TRÊN MẢNG Bài tốn Định nghĩa Cho dãy a có n phần tử Hãy tìm xem phần tử x có dãy a hay khơng? Bài tốn u cầu thêm thơng tin: Tìm vị trí phần tử x mảng, có bao nhiều phần tử x mảng Spring 2017 Data structure & Algorithm Tìm kiếm Ý tưởng Duyệt phần tử mảng a so sánh với phần tử x Spring 2017 Data structure & Algorithm Tìm kiếm (cont.) int LinearSearch (int a[], int n, int x) { for (int i = 0; i < n; i++) if (a[i] == x) return i; return -1; } Spring 2017 Data structure & Algorithm Đánh giá độ phức tạp I Đánh giá chi phí thực dựa tham số n (số phần tử) Trường hợp tốt trung bình xấu Spring 2017 Hàm ước lượng O(g(n)) Data structure & Algorithm Tìm kiếm nhị phân Ý tưởng Nếu phần tử dãy có quan hệ thứ tự; nghĩa so sánh bằng, lớn hơn, nhỏ giứa chúng Ta tổ chức lại dãy a để tìm kiếm hiệu Sắp xếp lại dãy a theo thứ tự tăng dần Xét dãy {a0 , a1 , , an−2 , an−1 }, so sánh phần tử amid với x 2.1 Nếu amid = x tìm thấy 2.2 Nếu amid < x tiếp tục tìm dãy {amid+1 , , an−1 } 2.3 Nếu amid > x tiếp tục tìm dãy {a0 , , amid−1 } Spring 2017 Data structure & Algorithm Tìm kiếm nhị phân (cont.) Chương trình 1: Hàm cài đặt tìm nhị phân với giả thiết dãy a thứ tự tăng dần 10 11 12 13 14 15 int BinarySearch (int a[], int n, int x) { int left = 0, right = n - 1, mid; { mid = (left + right) / 2; if (x == a[mid ]) return mid; else if (x < a[mid ]) right = mid - 1; else left = mid + 1; } while (left