Bài giảng môn Cấu trúc dữ liệu - Chương 2: Kỹ thuật tìm kiếm (searching)
lượt xem 5
download
Bài giảng môn "Cấu trúc dữ liệu - Chương 2: Kỹ thuật tìm kiếm (searching)" trình bày các nội dung: Khái quát về tìm kiếm, các giải thuật tìm kiếm nội - Tìm kiếm trên mảng (tìm tuyến tính - Linear Search; tìm nhị phân - Binary Search); Các giải thuật tìm kiếm ngoại - Tìm kiếm trên tập tin (tìm kiến tuyến tính, tìm kiếm nhị phân). Mời các bạn cùng tham khảo nội dung chi tiết.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng môn Cấu trúc dữ liệu - Chương 2: Kỹ thuật tìm kiếm (searching)
- Chương 2: KỸ THUẬT TÌM KIẾM (SEARCHING) 19
- 20 NỘI DUNG CHƯƠNG 2 2.1. Khái quát về tìm kiếm 2.2. Các giải thuật tìm kiếm nội (Tìm kiếm trên mảng) • Tìm tuyến tính (Linear Search) • Tìm nhị phân (Binary Search) 2.3. Các giải thuật tìm kiếm ngoại (Tìm kiếm trên tập tin) • Tìm tuyến tính (F Linear Search) • Tìm nhị phân (Binary Search)
- 21 2.1. Khái quát về tìm kiếm • Trong các hệ lưu trữ và quản lý dữ liệu, thao tác tìm kiếm được thực hiện nhiều nhất để khai thác thông tin một các dễ dàng. • Số lượng thông tin trong một hệ thống thông tin là đáng kể nên việc xây dựng các giải thuật tìm kiếm nhanh sẽ có ý nghĩa quan trọng. • Nếu tìm kiếm trong một hệ thống đã tổ chức thì việc tìm kiếm dễ dàng hơn. • Các giải thuật tìm kiếm được xây dựng nhằm mục tiêu hỗ trợ ứng dụng có hiệu quả hơn. • Các giải thuật phụ thuộc vào vào cấu trúc dữ liệu mà nó tác động đến. Dữ liệu được lưu trữ trên bộ nhớ chính và bộ nhớ phụ.
- 22 2.1. Khái quát về tìm kiếm • Giả sử mỗi phần tử được xem xét có một thành phần khóa (Key) để nhận diện có kiểu dữ liệu T, các thành phần còn lại là thông tin (Info), như vậy mỗi phần tử có cấu trúc như sau: typedef struct DataElement { T Key; InfoData Info; } DataType; • Để đơn giản, quan tâm thành phần dữ liệu chỉ là khóa nhận diện
- 23 2.2. Các giải thuật tìm kiếm nội Bài toán đặt ra: Giả sử có một mảng M gồm N phần tử. Cần xác định có hay không phần tử có giá trị bằng X trong mảng M?? Nếu có phần tử X thì phần tử bằng phần tử X là phần tử thứ mấy trong mảng X? Các giải thuật tìm kiếm nội đưa ra 2 cách tìm kiếm • Tìm kiếm tuần tự hay (Sequential Search) còn gọi tìm kiếm tuyến tính (Linear Search) • Tìm kiếm nhị phân (Binary Search)
- 24 2.2. Các giải thuật tìm kiếm nội Tìm tuyến tính (Linear Seach) Ý tưởng: So sánh lần lượt các phần tử của mảng M với giá trị X cần tìm bắt đầu từ phần tử đầu tiên cho đến khi tìm ra phần tử có giá trị X hoặc đã duyệt hết tất cả các phần tử của mảng M thì kết thúc. Thuật toán B1: k = 1 B2: Nếu M[k] X và k
- 25 2.2. Các giải thuật tìm kiếm nội Tìm tuyến tính (tt) Cài đặt thuật toán: int LinearSearch (T M[], int N, T X) { int k = 0; while (M[k] != X && k
- 26 2.2. Các giải thuật tìm kiếm nội Tìm tuyến tính (tt) Phân tích, đánh giá thuật toán: • Trường hợp tốt nhất (phần tử đầu tiên của mảng có giá trị = X) • Số phép gán Gmin = 1 • Số phép so sánh Smin = 3 • Trường hợp xấu nhất (không có phần tử nào của mảng có giá trị = X) • Số phép gán Gmax = 1 • Số phép so sánh Smax = 2N + 1 • Trung bình • Số phép gán Gavg = 1 • Số phép so sánh Savg = N + 2
- 27 2.2. Các giải thuật tìm kiếm nội Tìm tuyến tính (tt) Cải tiến thuật toán: • Mỗi bước lặp với thuật toán trên cần thực hiện 2 phép so sánh ý tưởng giảm bớt phép so sánh bằng cách thêm vào mảng một phần tử cầm canh (sentinel/stand by) có giá trị bằng X để nhận diện ra sự hết mảng khi duyệt. B1: k = 1 B2: M[N+1] = X B3: Nếu M[k] X Thì k++ Ngược lại: Lặp lại B3 B4: Nếu k < N Thì Tìm thấy phần tử có giá trịX ở vị trí k B5: Nguợc lại: Thì không tìm thấy phần tử có giá trị X B6: Kết thúc
- 28 2.2. Các giải thuật tìm kiếm nội Tìm tuyến tính (tt) Cài đặt thuật toán cải tiến: int LinearSearchCaiTien (T M[], int N, T X) { int k = 0; M[N] = X; // phần tử mảng M tính từ 0 while (M[k] != X) k++; if (k < N) return (k); return (-1); }
- 29 2.2 Các giải thuật tìm kiếm nội (tt) Tìm tuyến tính (tt) Phân tích, đánh giá thuật toán cải tiến: • Trường hợp tốt nhất (phần tử đầu tiên của mảng có giá trị = X) • Số phép gán Gmin = 2 • Số phép so sánh Smin = 2 • Trường hợp xấu nhất (không có phần tử nào của mảng có giá trị = X) • Số phép gán Gmax = 2 • Số phép so sánh Smax = (N + 1) + 1 • Trung bình • Số phép gán Gavg = 2 • Số phép so sánh Savg = N/2 + 2
- 30 2.2. Các giải thuật tìm kiếm nội Ví dụ: Tìm tuyến tính
- 31 2.2. Các giải thuật tìm kiếm nội Tìm nhị phân (Binary Seach) Tìm nhị phân đơn giản và thuận tiện trong trường hợp số phần tử của chuỗi lớn có thứ tự (tăng hay giảm dần) có nghĩa là phần tử trước nhỏ (lớn) hơn phần tử sau. Nếu trường hợp X nhỏ hơn phần tử đứng giữa thì X chỉ có thể tìm trong nửa đầu của dãy, ngược lại tìm trong nửa sau của dãy. Ý tưởng: • Phạm vi tìm kiếm là từ phần tử đầu tiên của dãy (First = 1) cho đến phần tử cuối cùng (Last = N) • So sánh giá trị X với giá trị phần tử ở giữa của dãy M là M[Mid] • Nếu X = M[Mid] Tìm thấy • Nếu X < M[Mid] rút ngắn phạm vi tìm kiếm và Last = Mid –1 • Nếu X > M[Mid] rút ngắn phạm vi tìm kiếm và First = Mid +1 • Lặp lại quá trình cho đến khi tìm thấy phần tử có giá trị = X
- 32 2.2. Các giải thuật tìm kiếm nội Tìm nhị phân (tt) Thuật toán đệ quy (Recursion Algorithm) B1: First = 1 B2: Last = N B3: Nếu (First > Last) // hết phạm vi tìm kiếm Không tìm thấy Ngược lại: Thực hiện B8 B4: Mid = (First + Last )/2 B5: Nếu (X = M[Mid]) Tìm thấy tại vị trí Mid Ngược lại: Thực hiện B6 B6: Nếu (XM[Mid]) Tìm đệ quy từ First = Mid +1 đến Last B8: Kết thúc
- 33 2.2. Các giải thuật tìm kiếm nội Tìm nhị phân (tt) Cài đặt Thuật toán đệ quy (Recursion Algorithm) int RecursiveBinarySearch (T M[], int First, int Last, T X) { if (First > Last) return (-1); int Mid = (First + Last)/2; if (X == M[Mid]) return Mid; if (X < M[Mid]) return RecursiveBinarySearch (M, First, Mid -1,X); else return RecursiveBinarySearch (M, Mid +1, Last,X); }; int BinarySearch (T M[], int N, T X) { return RecursiveBinarySearch (M, 0, N-1,X); }
- 34 2.2. Các giải thuật tìm kiếm nội Tìm nhị phân (tt) Phân tích, đánh giá thuật toán đệ quy: • Trường hợp tốt nhất (phần tử đầu tiên của mảng có giá trị = X) • Số phép gán Gmin = 1 • Số phép so sánh Smin = 2 • Trường hợp xấu nhất (không có phần tử nào của mảng có giá trị = X) • Số phép gán Gmax = log2N +1 • Số phép so sánh Smax =3log2N +1 • Trung bình • Số phép gán Gavg = 1/2log2N +1 • Số phép so sánh Savg = ½(3log2N + 3)
- 35 2.2. Các giải thuật tìm kiếm nội Tìm nhị phân (tt) Thuật toán không đệ quy (Non-Recursion Algorithm) B1: First = 1 B2: Last = N B3: Nếu (First > Last) // hết phạm vi tìm kiếm Không tìm thấy Ngược lại: Thực hiện B8 B4: Mid = (First + Last )/2 B5: Nếu (X = M[Mid]) Tìm thấy tại vị trí Mid Ngược lại: Thực hiện B6 B6: Nếu (XM[Mid]) First = Mid + 1 và lặp lại B3 B8: Kết thúc
- 36 2.2. Các giải thuật tìm kiếm nội Tìm nhị phân (tt) Cài đặt Thuật toán không đệ quy (Non-Recursion Algorithm) int NRBinarySearch (T M[], int N, T X) { int First = 0; int Last = N-1; while (First
- 37 2.2. Các giải thuật tìm kiếm nội Tìm nhị phân (tt) Phân tích, đánh giá thuật toán không đệ quy: • Trường hợp tốt nhất (phần tử đầu tiên của mảng có giá trị = X) • Số phép gán Gmin = 3 • Số phép so sánh Smin = 2 • Trường hợp xấu nhất (không có phần tử nào của mảng có giá trị = X) • Số phép gán Gmax = 2log2N +4 • Số phép so sánh Smax =3log2N +1 • Trung bình • Số phép gán Gavg = log2N +3.5 • Số phép so sánh Savg = ½(3log2N + 3)
- 38 2.3. Các giải thuật tìm kiếm ngoại • Các giải thuật tìm kiếm ngoại là giải thuật tìm kiếm trên tập tin lưu trữ trên đĩa. • Giả sử có tập tin F lưu trữ N phần tử. Tìm xem có hay không phần tử có giá trị X được lưu trong F. Nếu có phần tử có giá trị X nằm ở vị trí nào trong tập tin F? • Xét 2 giải thuật tìm kiếm ngoại: • Tìm tuyến tính • Tìm kiếm theo chỉ mục (Index Search)
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Cấu trúc dữ liệu - Mở đầu
10 p | 187 | 74
-
Tài liệu hướng dẫn thực hành môn Cấu trúc dữ liệu và giải thuật - Bài 2: Danh sách liên kết
5 p | 181 | 12
-
Bài giảng môn Cơ sở dữ liệu - Bài 5: Ngôn ngữ SQL (ĐH Công nghệ Thông tin)
41 p | 128 | 11
-
Tài liệu hướng dẫn thực hành môn Cấu trúc dữ liệu và giải thuật - Bài 4: Cây nhị phân tìm kiếm
8 p | 105 | 10
-
Bài giảng môn học Cấu trúc Dữ liệu và Giải thuật: Phần 2
63 p | 147 | 10
-
Bài giảng môn Cấu trúc dữ liệu - Chương 4: Danh sách (list)
112 p | 98 | 9
-
Bài giảng môn Cấu trúc dữ liệu - Chương 1: Tổng quan về cấu trúc dữ liệu và giải thuật
18 p | 121 | 8
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Ôn tập - ThS. Nguyễn Hà Giang
37 p | 82 | 8
-
Bài giảng Cấu trúc dữ liệu: Chương Giới thiệu - Nguyễn Xuân Vinh
8 p | 112 | 7
-
Bài giảng môn Cấu trúc dữ liệu và giải thuật: Các thuật toán sắp xếp
46 p | 28 | 6
-
Bài giảng môn Cấu trúc dữ liệu - Chương 5: Cây (tree)
40 p | 83 | 5
-
Bài giảng môn Cấu trúc dữ liệu và giải thuật: Các cấu trúc dữ liệu cơ bản
75 p | 13 | 5
-
Bài giảng môn Cấu trúc dữ liệu - Chương 3: Kỹ thuật sắp xếp
29 p | 67 | 4
-
Bài giảng môn Cơ sở dữ liệu: Chương 4 - ThS. Thái Bảo Trân
35 p | 49 | 4
-
Bài giảng môn Cấu trúc dữ liệu và giải thuật: Các khái niệm cơ bản
45 p | 12 | 4
-
Bài giảng Cấu trúc dữ liệu và thuật toán: Chương 0 - Giới thiệu tổng quan môn học
7 p | 13 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Giới thiệu môn học - Đỗ Ngọc Như Loan
6 p | 52 | 1
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn