1. Trang chủ
  2. » Tất cả

3 tim kiem

11 0 0

Đ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

3/26/2019 Mục Tiêu  Xác định phát biểu tốn tìm kiếm xếp CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Data Structures & Algorithms TÌM KIẾM  Hiểu số thuật tốn tìm kiếm xếp  Phân tích ưu điểm hạn chế thuật tốn tìm kiếm xếp  Triển khai, cài đặt thuật toán với C++  Biết thuật ngữ tiếng Anh tốn tìm kiếm xếp Nội dung Nhu cầu tìm kiếm thơng tin Nhu cầu tìm kiếm/sắp xếp Bài tốn tìm kiếm Tìm kiếm tuyến tính (Linear Search) Tuyến tính cải tiến Tìm kiếm nhị phân (Binary Search) Tìm kiến nội suy (Interpolation Search) Nhu cầu tìm kiếm thơng tin Nhu cầu tìm kiếm thơng tin 3/26/2019 Nhu cầu tìm kiếm thơng tin Bài tốn tìm kiếm - Searching PHÁT BIỂU BÀI TỐN • Cho danh sách A gồm n phần tử a0, a1, , an-1 • Tìm phần tử có giá trị khóa x A Nếu có giá trị khóa x trả số i Các Phương Pháp Tìm Kiếm Nội Tìm kiếm tuyến tính Tìm kiếm tuyến tính Tìm kiếm nhị phân Tìm kiếm tuyến tính Tìm kiếm tuyến tính X=10 X=6 Tìm thấy vị trí i 6 i=7, khơng tìm thấy i 6 3/26/2019 Tìm kiếm tuyến tính Từ khóa: Linear Search Điều kiện: Danh sách A = {a0, a1, , an-1} Phân tích: khơng có thơng tin ngồi thơng tin có so sánh x với giá trị khóa Ý tưởng: duyệt toàn danh sách A để xác định ai, trả i tồn Tìm kiếm tuyến tính Tìm kiếm tuyến tính Đầu vào: Danh sách A có n phần tử, giá trị khóa x cần tìm Đầu ra: Chỉ số i phần tử A có giá trị khóa x Trong trường hợp khơng tìm thấy i=-1 Thuật tốn: i while i < n if A[i] = x then return i end if i  i+1 end while return -1 Tìm kiếm tuyến tính Q trình tính tốn: Giả sử A = {1,3,2,9,7}, x = Quá trình xác định theo thuật tốn tìm tuyến tính Q trình tính tốn: Giả sử A = {1,3,2,9,7}, x = Quá trình xác định theo thuật tốn tìm tuyến tính i=0 i=0 x=9 x=9 Tìm kiếm tuyến tính Tìm kiếm tuyến tính Q trình tính tốn: Giả sử A = {1,3,2,9,7}, x = Q trình xác định theo thuật tốn tìm tuyến tính Q trình tính tốn: Giả sử A = {1,3,2,9,7}, x = Quá trình xác định theo thuật tốn tìm tuyến tính i=1 i=2 x=9 x=9 3/26/2019 Tìm kiếm tuyến tính Tìm kiếm tuyến tính Cài đặt: (trên mảng) int linearSearch(int A[], int n, int x) { int i = 0; while (i < n) { if (A[i] == x) return i; i++; } return -1; } Quá trình tính tốn: Giả sử A = {1,3,2,9,7}, x = Q trình xác định theo thuật tốn tìm tuyến tính i=3 x=9 i=3 A[i] = = x Tìm kiếm tuyến tính Tìm kiếm tuyến tính Cài đặt: (trên danh sách đơn) Node* linearSearch(List A, int x) { Node *p = A.pHead; while (!p) { if (p->info == x) return p; p = p->pNext; } return NULL; } Đánh giá: - Trường hợp tốt (best case): a0 chứa khóa x  số lần lặp  độ phức tạp số O(1) - Trường hợp xấu (worst case): A khơng có phần tử có khóa x  số lần lặp n  độ phức tạp tuyến tính O(n) - Trường hợp trung bình (average case): độ phức tạp tuyến tính O(n) Tìm kiếm tuyến tính CẢI TIẾN Điều kiện dừng ? int linearSearch(int A[], int n, int x) { int i = 0; while (i < n) { if (A[i] == x) return i; i++; } return -1; } Tìm kiếm tuyến tính CẢI TIẾN Phân tích: Theo thuật tốn tìm tuyến tính: - Cần phải kiểm tra điều kiện dừng xét hết danh sách (i < n) - Cần phải kiểm tra điều kiện dừng tìm thấy phần tử vòng lặp  Rút gọn điều kiện dừng 23 3/26/2019 Tìm kiếm tuyến tính CẢI TIẾN Tìm kiếm tuyến tính CẢI TIẾN Ý tưởng: - Thêm phần tử an có khóa x vào A, A có n+1 phần tử Phần tử thêm vào gọi phần tử cầm canh - Chỉ cần điều kiện dừng tìm thấy phần tử có khóa x Thuật tốn: Đầu vào: Danh sách A có n phần tử, giá trị khóa x cần tìm Đầu ra: Chỉ số i phần tử A có giá trị khóa x Trong trường hợp khơng tìm thấy i=-1 i  0, A[n] = x while A[i]  x i  i+1 end while if (i < n) then return i else return -1 end if Tìm kiếm tuyến tính CẢI TIẾN Tìm kiếm tuyến tính CẢI TIẾN Cài đặt: (trên mảng) int linearSearchA(int A[],int n,int x) { int i = 0; A[n] = x;//A có n phần tử while (A[i] != x) i++; if (i < n) return i; else return -1; } Tìm kiếm tuyến tính – Lưu ý Cài đặt: (trên danh sách đơn) Node* linearSearchA(List A, int x) { Node *p = A.pHead, *t = new Node(x); if (!t) throw "out of memory"; addTail(A, t); while (p->info != x) p = p->pNext; if (p == A.pTail) return p; else return NULL; } Tìm kiếm tuyến tính – Lưu ý 29 30 3/26/2019 Tìm kiếm tuyến tính – Lưu ý Tìm kiếm tuyến tính Bài Viết hàm tìm kiếm giá trị x mảng chiều số thực trả tìm thấy hay khơng Bài Viết hàm tìm vị trí giá trị nhỏ mảng chiều số thực Bài Viết hàm tìm tất vị trí có giá trị nhỏ mảng chiều số thực Bài tập: Viết chương trình với menu cho người dùng lựa chọn nhập mảng lựa chọn chức viết 1,2,3 31 32 Tìm kiếm nhị phân Đặt vấn đề Từ khóa: Binary Search Điều kiện: Danh sách A = {a0, a1, , an-1} có thứ tự  Phân tích: Khi so sánh với khóa x, dựa vào quan hệ thứ tự, định nên xét phần tử phần trước (hoặc phần sau) hay khơng 33 Tìm kiếm nhị phân Ý tưởng: - Chọn am A để tận dụng kết so sánh với khóa x A chia thành hai phần: trước sau am Chỉ số bắt đầu, kết thúc A l, r - Nếu x = am, tìm thấy dừng - Xét thứ tự x, a m Nếu thứ tự • Là , tìm x đoạn [l, r] với r=m-1; • Ngược lại, tìm x đoạn [l, r] với l=m+1 Tìm kiếm nhị phân Thuật tốn: Đầu vào: Danh sách A có n phần tử có thứ tự , giá trị khóa x cần tìm Đầu ra: Chỉ số i phần tử A có giá trị khóa x Trong trường hợp khơng tìm thấy i=-1 3/26/2019 Tìm kiếm nhị phân – Thuật giải Tìm kiếm nhị phân – Thuật giải 37 38 Tìm thấy vị trí X=-1 X=2 M L M L R 10 R 10 L=0 R=-1 => khơng tìm thấy X=-1 Tìm kiếm nhị phân Thuật toán: l  0, r  n-1 while l  r m  (l + r) div if x = A[m] then return m end if if x  A[m] then r  m – else l  m + end if end while return -1 Tìm kiếm nhị phân Q trình tính toán: Giả sử A = {1,2,3,4,5,7,9}, thứ tự 

Ngày đăng: 25/02/2023, 15:25

Xem thêm:

w