Các thuật toán tìm kiếm (Searching algorithms) Cấu trúc dữ liệu & Giải thuật (Data Structures and Algorithms) 09/2013 Nguyen Tri Tuan Khoa CNTT ĐH KHTN Tp HCM 1 Tìm kiếm Searching • Trình bày các thuậ[.]
Cấu trúc liệu & Giải thuật (Data Structures and Algorithms) Các thuật tốn tìm kiếm (Searching algorithms) 09/2013 Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM Tìm kiếm - Searching • Trình bày thuật tốn thơng dụng cho việc tìm kiếm (Tìm tuần tự, tìm nhị phân) • Minh họa thuật tốn • Đánh giá thuật toán 09/2013 Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM Cơng dụng • Tìm kiếm danh sách phần tử thao tác thường sử dụng máy tính • Ví dụ: – Cơ sở liệu (Database): tìm sinh viên, tìm tài khoản ngân hàng,… – Internet: Yahoo!, Google,… 09/2013 Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM Các phương pháp phổ biến • Tìm (Serial Search) – Đơn giản – Chi phí O(n) • Tìm nhị phân – Phải danh sách “đặc” – Dữ liệu cần thứ tự – Chi phí trung bình O(log2n) 09/2013 Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM Tìm (Serial Search) int SerialSearch(int a[], int n, int key) { for (int i=0; i < n; i++) if (a[i]==key) return i; // tìm thấy return –1; // khơng tìm thấy } 09/2013 Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM Serial Search Đánh giá thuật tốn • Kích thước dãy: n • Trường hợp tốt nhất: O(1), key==a[0] • Trường hợp xấu nhất: O(n), key==a[n-1] khơng tìm thấy • Trường hợp trung bình: – O(n) – Chính xác ? 09/2013 Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM Serial Search Trường hợp trung bình • Giả sử: – phần tử cần tìm key có dãy – xác suất xuất vị trí dãy • Chi phí trung bình: n n(n 1) / (n 1) n n 09/2013 Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM Tìm nhị phân (Binary Search) • Các phần tử – n=8 – key = 16 • Xét phần tử m = n/2 • Nếu (a[m]==key) Kết thúc ! • Nếu (key < a[m]) 10 12 16 18 [0] [1] [2] [3] [4] [5] [6] [7] Xét ½ dóy bờn trỏi ã Nu (key > a[m]) Xột ẵ dãy bên phải 09/2013 Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM Tìm nhị phân (Binary Search) 10 12 16 18 [0] [1] [2] [3] [4] [5] [6] [7] [5] [6] [7] 10 12 16 18 [0] [1] [2] [3] [4] [5] [6] [7] Tìm thấy 09/2013 Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM Binary Search (Minh họa chương trình int BinarySearch(int a[], int n, int key) { int Left = 0, Right = n-1; while (Left