Chuong 3 Tim tuan tu+Nhi phan [Compatibility Mode] Tìm kiếm tuần tự Tìm kiếm nhị phân Nguyễn Tri Tuấn Khoa CNTT – ĐH KHTN Tp HCM Email nttuan@fit hcmus edu vn Spring 2009 Data Structure & Algorithm Ng[.]
Tìm kiếm Tìm kiếm nhị phân Nguyễn Tri Tuấn Khoa CNTT – ĐH.KHTN.Tp.HCM Email: nttuan@fit.hcmus.edu.vn 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 toán Đánh giá thuật toán Spring 2009 Data Structure & Algorithm - 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,… Spring 2009 Data Structure & Algorithm - 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) Spring 2009 Data Structure & Algorithm - 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 } Spring 2009 Data Structure & Algorithm - 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 ? Spring 2009 Data Structure & Algorithm - 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: Spring 2009 Data Structure & Algorithm - 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 10 12 16 18 [0] [1] [2] [3] [4] [5] [6] [7] Xét phần tử m = n/2 Nếu (a[m]==key) Kết thúc ! Nếu (key < a[m]) Xét ½ dãy bên trái Nếu (key > a[m]) Xét ½ dãy bên phải Spring 2009 Data Structure & Algorithm - 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 Spring 2009 Data Structure & Algorithm - 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