các thuật toán tìm kiếm

35 4 0
các thuật toán tìm kiếm

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài 8 Các thuật toán tìm kiếm Bài 8 Các thuật toán tìm kiếm Chuyên đề tiếp theo và cũng là chuyên đề cuối cùng ta xem xét trong giáo trình là bài toán tìm kiếm trong tin học Cùng với bài toán sắp xếp,[.]

Bài Các thuật tốn tìm kiếm 8.1 Bài tốn tìm kiếm  Bài tốn tìm kiếm phát biểu sau: Cho dãy gồm n ghi r[0…n1] Mỗi ghi r[i] tương ứng với khoá k[i] Hãy tìm ghi có giá trị khố X cho trước  X gọi khố tìm kiếm  Kết trình tìm kiếm:  Thành cộng: Tìm ghi có khố X  Thất bại: Khơng tìm ghi có khố X 8.1 Bài tốn tìm kiếm  Ta coi khoá ghi đại diện cho ghi  Kiểu liệu: khố #define n … // Số khoá dãy khoá typedef … TKey // Kiểu liệu typedef TKey[n+1] TArray; TArray k; // Dãy khố  Bài tốn tìm kiếm: tìm số i phần tử có giá trị X mảng k 8.2 Tìm kiếm  Thuật toán: ghi đầu tiên, so sánh khố tìm kiếm với khố tương ứng ghi danh sách, tìm thấy ghi mong muốn duyệt hết danh sách mà chưa thấy int SequentialSearch(TKey X) { int i = 0; while ((i < n)&&(k[i]!=X)) i++; if (i >= n) return -1; else return i; } 8.2 Tìm kiếm  Trong cài đặt, ta sử dụng kỹ thuật “lính cầm canh” để giảm số thao tác so sánh: thêm phần tử có giá trị = X vào cuối dãy, để đảm bảo tìm kiếm ln thành cơng int SequentialSearch(TKey X) { k[n] = X; int i = 0; while (k[i] != X) i++; if (i >= n) return -1; else return i; }  Dễ thấy độ phức tạp thuật tốn tìm kiếm trường hợp tốt O(1), trường hợp xấu O(n) trường hợp trung bình O(n) 8.3 Tìm kiếm nhị phân  Trên thực tế, có nhiều trường hợp mà dãy khóa xếp, ta có phương án tìm kiếm tốt  Giả sử ta cần tìm khóa X đoạn k[l h], trước hết ta xét khoá nằm dãy k[m] với m = (l + h) / 2;  Nếu k[m] = X  tìm kiếm thành cơng, kết thúc  Nếu k[m] < X X phải nằm đoạn sau (k[m+1 h] Tiếp tục tìm kiếm đoạn  Nếu k[m] > X X phải nằm đoạn đẩu (k[0 m-1]) Tiếp tục tìm kiếm đoạn  Quá trình tìm kiếm thất bại đến bước đó, đoạn tìm kiếm rỗng (l > h) 8.3 Tìm kiếm nhị phân – cài đặt  Cài đặt: int BinarySearch(TKey X) { int L, H, m; L = 0; H = n-1; while (L ≤ H) { m = (L + H) / 2; if (k[m] == X) return m; if (k[m] < X) L = m + 1; else H = m - 1; } return -1; }  Dễ thấy độ phức tạp tính tốn thuật tốn tìm kiếm nhị phân trường hợp tốt O(1), trường hợp xấu O(logn) trường hợp trung bình O(logn) 8.3 Tìm kiếm nhị phân – cải tiến  Một chút cải tiến: phép cài đặt trên, vòng lặp ta rẽ nhánh, tức cần phép so sánh (== X < X), ta giảm bớt phép so sánh sau: int BinarySearch(TKey X) { int L, H, m; L = 1; H = n-1; while (L < H) { m = (H - L) / + L; if (k[m] < X) L = m + 1; else H = m; } if ((L==H) && (k[L] == X)) return L; else return -1; } 8.3 Tìm kiếm nhị phân – ví dụ  Trị chơi đốn số: có người chơi  Người thứ nghĩ đầu số tự nhiên X từ đến 100  Người thứ cần đoán số cách hỏi người thứ câu hỏi mà người thứ trả lời “Đúng” “Sai”  Bài toán: người thứ hỏi để số câu hỏi Đáp án:  “Số có < 50 khơng?”  Nếu “đúng”, hỏi tiếp “Số có < 25 khơng?”, ngược lại, hỏi tiếp “Số có < 75 khơng?”  … sau log2100 = câu hỏi ta có kết 8.3 Tìm kiếm vs tìm kiếm nhị phân  Tìm kiếm  Chậm  Làm việc dãy (chưa xếp)  Làm việc danh sách liên kết (khơng có thao tác truy cập ngẫu nhiên)  Tìm kiếm nhị phân  Nhanh nhiều  Danh sách phải xếp trước tìm kiếm  Khơng dùng cho danh sách truy cập (danh sách liên kết) 10 ... phân tìm kiếm (Binary Search Tree - BST)  Các thao tác nhị phân tìm kiếm:  Tìm kiếm khóa X  Thêm khóa vào  Loại bỏ nút khỏi 12 8.4.1 Tìm kiếm nhị phân tìm kiếm  Thuật tốn: khố tìm kiếm X... phép tìm kiếm thất bại  X trùng với khố gốc – tìm kiếm thành cơng  X nhỏ khố gốc, phép tìm kiếm tiếp tục trái gốc với cách làm tương tự  X lớn khố gốc, phép tìm kiếm tiếp tục phải gốc với cách... tốn tìm kiếm  Bài tốn tìm kiếm phát biểu sau: Cho dãy gồm n ghi r[0…n1] Mỗi ghi r[i] tương ứng với khố k[i] Hãy tìm ghi có giá trị khoá X cho trước  X gọi khố tìm kiếm  Kết q trình tìm kiếm:

Ngày đăng: 20/11/2022, 15:26

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan