Bài giảng Cấu trúc dữ liệu và giải thuật: Các chiến lược tìm kiếm trình bày các kiến thức cơ bản về chiến lược tìm kiếm, tìm kiếm tuần tự, tìm kiếm theo bảng băm, tìm kiếm nhị phân,... Mời các bạn cùng tham khảo nội dung chi tiết.
Giảng viên: Văn Chí Nam – Nguyễn Thị Hồng Nhung – Đặng Nguyễn Đức Tiến Giới thiệu Tìm kiếm Tìm kiếm nhị phân Tìm kiếm theo bảng băm Tổng kết Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt Thao tác tìm kiếm phổ biến sống hàng ngày Tìm kiếm hồ sơ, tập tin Tìm kiếm tên người danh sách … Cấu trúc liệu giải thuật – HCMUS 2016 Có nhiều loại: Tìm kiếm (Sequential/ Linear Search) Tìm kiếm nhị phân (Binary Search) … Mục tiêu: Tìm hiểu thuật tốn tìm kiếm Phân tích thuật tốn để lựa chọn thuật toán phù hợp áp dụng vào thực tế Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt Sequential Search Linear Search Cấu trúc liệu giải thuật – HCMUS 2016 Input: n phần tử Giá trị x cần tìm Dãy A, Output: Nếu x xuất A: trả vị trí xuất x Nếu không: trả n -1 Thuật toán: cạn (exhaustive) Dùng lính canh (sentinel) Vét Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt Thuật toán: Lần lượt so sánh x với phần tử dãy A gặp phần tử cần tìm, hết dãy Ví dụ: A = {1, 25, 6, 5, 2, 37, 40}, x = x = 25 37 40 37 40 37 40 x = 25 x = 25 Dừng Thuật toán: LinearExhaustive • Bước Khởi tạo biến số: i = • Bước Kiểm tra xem có thực hết mảng hay chưa: So sánh i n • • • Nếu chưa hết mảng (i < n), sang bước Nếu hết mảng (i >= n), thông báo khơng tìm thấy giá trị x cần tìm Bước So sánh giá trị a[i] với giá trị x cần tìm • • Nếu a[i] x: Kết thúc chương trình thơng báo tìm thấy x Nếu a[i] khác x, tăng i thêm quay lại bước Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt Nhận xét: Phép so sánh phép toán sơ cấp dùng thuật toán Suy ra, số lượng phép so sánh thước đo độ phức tạp thuật tốn Mỗi vịng lặp có điều kiện cần kiểm tra: Kiểm tra cuối mảng (bước 2) Kiểm tra phần tử có x? (bước 3) Cấu trúc liệu giải thuật – HCMUS 2016 10 Trường hợp x nằm biên mảng A: xuất Ước lượng số vịng lặp trung bình hữu ích Số phép so sánh trung bình: 2(1+2+ … + n)/n = n+1 => Số phép so sánh tăng/giảm tuyến tính theo số phần tử Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 11 Vậy độ phức tạp thuật toán là: Tốt nhất: O(1) Trung bình: O(n) Xấu nhất: O(n) Cấu trúc liệu giải thuật – HCMUS 2016 12 Trong thuật toán vét cạn, có điều kiện kiểm tra Có thể bỏ việc kiểm tra điều kiện cuối mảng cách dùng “lính canh” Lính canh phần tử có giá trị với phần tử cần tìm đặt cuối dãy Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 13 Ví dụ: A = {1, 25, 5, 2, 37}, x = x = (a) x = 25 37 (d) 25 x = (b) 25 37 x = 37 (e) 25 37 x = (c) 25 6 x = 37 (f) 25 37 return 5; Cấu trúc liệu giải thuật – HCMUS 2016 14 Thuật tốn: LinearSentinel • Bước Khởi tạo biến số: i = • Bước So sánh giá trị a[i] với giá trị x cần tìm • Nếu a[i] x: • • • Nếu i < n: Kết thúc chương trình thơng báo tìm thấy x Nếu i >= n: Thơng báo khơng tìm thấy x dãy Nếu a[i] khác x, tăng i thêm quay lại bước Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 15 Thực nghiệm cho thấy trường hợp n lớn, thời gian tìm kiếm giảm dùng phương pháp lính canh Với n =15000: nhanh khoảng 20% Cấu trúc liệu giải thuật – HCMUS 2016 16 Binary Search Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 17 Với dãy A xếp thứ tự (ví dụ: tăng dần), độ phức tạp thuật tốn tìm kiếm khơng đổi Tận dụng thông tin dãy xếp để giới hạn vị trí giá trị cần tìm -> Thuật tốn tìm kiếm nhị phân Cấu trúc liệu giải thuật – HCMUS 2016 18 Input: n phần tử xếp Giá trị x cần tìm Dãy A, Output: Nếu x xuất A: trả vị trí xuất x Nếu khơng: trả n -1 Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 19 Ý tưởng: So sánh x với phần tử dãy Nếu x phần tử dừng Nếu khơng: xác định xem x thuộc nửa trái hay nửa phải A Lặp lại bước với nửa xác định Cấu trúc liệu giải thuật – HCMUS 2016 20 Thuật toán: BinarySearch(A[], n, x) Bước Khởi gán left = right = n – Bước Trong left a[mid], gán left = mid + Nếu x = a[mid], thơng báo tìm thấy x kết thúc Kết trả khơng tìm thấy x left > right* * Điều có nghĩa khơng cịn phần tử mảng: x khơng có mảng Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 10 25 Phân tích thuật tốn tuyến tính: Mỗi lần lặp chiều dài mảng giảm khoảng ½ so với mảng trước Gọi k số lần chia phân nửa mảng Ta 2k-1 < n < 2k => k-1 < log2 n < k => k = 1+ log2n Số lần thực vòng while khoảng k lần, vòng lặp thực phép so sánh Cấu trúc liệu giải thuật – HCMUS 2016 26 Phân tích thuật tốn tuyến tính: hợp tốt nhất: k = x phần tử mảng Trường hợp xấu nhất: k= log2n + x không thuộc mảng x phần tử cuối mảng => Số phép so sánh tăng theo hàm logarit Trường Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 13 27 Độ phức tạp tìm kiếm nhị phân Trường hợp tốt nhất: O(1) Trường hợp trung bình: O(log2n) Trường hợp xấu nhất: O(log2n) Cấu trúc liệu giải thuật – HCMUS 2016 28 So sánh trường hợp xấu thuật tốn: Kích thước mảng T/h xấu Tuần tự Nhị phân 100.000 100.000 16 200.000 200.000 17 400.000 400.000 18 800.000 800.000 19 1.600.000 1.600.000 20 Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 14 29 Có nhiều thuật tốn tìm kiếm, ước lượng số phép so sánh thuật toán cho biết hiệu suất thuật tốn Thuật tốn tìm kiếm tìm thấy giá trị cần tìm hết mảng Hiệu suất tìm kiếm trường hợp xấu hàm tuyến tính theo số phần tử mảng Cấu trúc liệu giải thuật – HCMUS 2016 30 Nếu mảng xếp nên dùng tìm kiếm nhị phân Tìm kiếm nhị phân dùng kết phép so sánh để thu hẹp vùng tìm kiếm Hiệu suất tìm kiếm nhị phân hàm logarit theo số phần tử mảng Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 15 31 Hash Table Cấu trúc liệu giải thuật – HCMUS 2016 32 Vấn đề: Cho trước tập S gồm phần tử đặc trưng giá trị khóa Trên giá trị khóa có quan hệ thứ tự Tổ chức S để tìm kiếm phần tử có khóa k cho trước có độ phức tạp giới hạn nhớ cho phép? Ý tưởng: Biến đổi khóa k thành số (bằng hàm hash) sử dụng số địa để tìm kiếm bảng liệu Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 16 33 ĐNĐTiến +84.95.8345678 VCNam +84.91.2345678 NTHNhung +84.90.9345678 Cấu trúc liệu giải thuật – HCMUS 2016 34 Chi phí tìm kiếm trung bình: O(1) Chi phí tìm kiếm trường hợp xấu nhất: O(n) (rất gặp) Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 17 35 Định nghĩa: Hàm băm (hash function) hàm biến đổi khóa k phần tử thành địa bảng băm Tổng quát phép biến đổi khóa: Là ánh xạ thích hợp từ tập khóa U vào tập địa A H: U A k a = h(k) Tập giá trị khóa (U) lớn nhiều so với số khóa thực tế (K) nhiều Cấu trúc liệu giải thuật – HCMUS 2016 36 T Tập U Tập K 10 7 10 Key Data 10 Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 18 37 Chọn số (Digit-selection): Chọn vài chữ số khóa ghép lại tạo thành giá trị băm Ví dụ: h(001364825) = 35 Ưu điểm: Đơn giản, tính tốn nhanh Khuyết điểm: Khơng thể tính chất khóa, khơng phân bố Cấu trúc liệu giải thuật – HCMUS 2016 38 Gấp số (folding) Cộng chữ số khóa Nhóm chữ số thành số cộng lại Ví dụ: h(001364825) = + + + + + + + + = 29 h(001364825) = 001 + 364 + 825 = 1190 Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 19 39 Lấy dư (modulo arithmetic) Sử dụng phép tính lấy dư h (Key) = Key mod tableSize Ví dụ: h(Key) = Key mod 101 h(001364825) = 12 Cấu trúc liệu giải thuật – HCMUS 2016 40 k1, k2 K: k1 ≠ k2, H(k1) = H(k2) Tập U T H(3) H(4) Tập K 10 H(2) = H(8) H(10) Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 20 41 Ít xảy đụng độ Tính tốn nhanh Các khóa phân bố Cấu trúc liệu giải thuật – HCMUS 2016 42 Phương pháp nối kết (separate chaining) Phương pháp địa mở (Open-addressing) Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 21 43 Ứng với địa bảng, ta có danh sách liên kết chứa phần tử có khóa khác mà có địa Ta có danh sách (bảng băm) gồm M phần tử chứa địa đầu danh sách liên kết Cấu trúc liệu giải thuật – HCMUS 2016 44 ĐNĐTiến +84.95.8345678 VCNam +84.91.2345678 ĐTMHậu +84.95.6543210 NTHNhung +84.90.9345678 Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 22 45 Tên gọi khác: Phương pháp dò Phương pháp thử Ý tưởng: Khi đụng độ xảy ra, ta thử tìm đến vị trị bảng tìm thấy vị trí cịn trống Cấu trúc liệu giải thuật – HCMUS 2016 46 Phương pháp dị tuyến tính (Linear probing) Phương pháp dò bậc (Quadratic probing) Phương pháp băm kép (Double hashing) Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 23 47 Phương pháp dị tuyến tính: H(k, i) = (h(k) + i) mod M Cấu trúc liệu giải thuật – HCMUS 2016 48 Phương pháp dò bậc 2: H(k, i) = (h(k) + i2) mod M Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 24 49 Phương pháp băm kép: H(k, i) = (h1(k) + i*h2(k)) mod M h1(key) = key mod 11 h2(key) = – (key mod 7) Cấu trúc liệu giải thuật – HCMUS 2016 50 Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 25 51 Phương pháp địa mở: Đơn giản cài đặt Sử dụng cấu trúc liệu Giải đụng độ lại gây đụng độ Phương pháp nối kết: bị ảnh hưởng tốc độ mảng gần đầy Ít tốn nhớ mảng thưa (ít phần tử) Khơng Cấu trúc liệu giải thuật – HCMUS 2016 52 Cho bảng băm có kích thước M = 11 Hàm băm: h(k) = k mod M Dùng phương pháp địa mở Cho biết kết sau thêm vào bảng băm khóa 10, 22, 31, 4, 15, 28, 17, 88, 59, với phương pháp xử lý đụng độ: a Dị tuyến tính b Dị bậc c Băm kép h2(k) = (k mod 19)+1 Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 26 53 Cho từ điển Anh – Việt có 15.000 từ, tổ chức cấu trúc liệu bảng băm cho biết hàm băm thích hợp giúp cho việc tra từ hiệu Cấu trúc liệu giải thuật – HCMUS 2016 56 Cấu trúc liệu giải thuật – HCMUS 2016 CuuDuongThanCong.com © FIT-HCMUS https://fb.com/tailieudientucntt 27 ... tác tìm kiếm phổ biến sống hàng ngày Tìm kiếm hồ sơ, tập tin Tìm kiếm tên người danh sách … Cấu trúc liệu giải thuật – HCMUS 2016 Có nhiều loại: Tìm kiếm (Sequential/ Linear Search) Tìm. .. tốn tìm kiếm tìm thấy giá trị cần tìm hết mảng Hiệu suất tìm kiếm trường hợp xấu hàm tuyến tính theo số phần tử mảng Cấu trúc liệu giải thuật – HCMUS 2016 30 Nếu mảng xếp nên dùng tìm kiếm. .. NTHNhung +84.90.9345678 Cấu trúc liệu giải thuật – HCMUS 2016 34 Chi phí tìm kiếm trung bình: O(1) Chi phí tìm kiếm trường hợp xấu nhất: O(n) (rất gặp) Cấu trúc liệu giải thuật – HCMUS 2016