Bài giảng cấu trúc dữ liệu và kỹ thuật tìm kiếm

29 1.6K 8
Bài giảng cấu trúc dữ liệu và kỹ thuật 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 giảng cấu trúc dữ liệu và kỹ thuật tìm kiếm

1Môn: CẤU TRÚC DỮ LIỆUChương 2: KỸ THUẬT TÌM KIẾM (SEARCHING) 2NỘI DUNG CHƯƠNG 22.1 Khái quát về tìm kiếm2.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)BÀI TẬP 32.1 Khái quát về tìm kiếm Trong các hệ lưu trữ 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 bộ nhớ phụ. 42.1 Khái quát về tìm kiếm (tt) 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 52.2 Các giải thuật tìm kiếm nộiBà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) 62.2 Các giải thuật tìm kiếm nội (tt)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ánB1: k = 1B2: Nếu M[k] ≠ X k<=NThì k++ Ngược lại: Lặp lại B2B3: Nếu k <= N Thì Tìm thấy phần tử có giá trịX ở vị trí kB4: Nếu không (k<=N): Thì không tìm thấy phần tử có giá trị XB5: Kết thúc 72.2 Các giải thuật tìm kiếm nội (tt)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 <N) // phần tử mảng M tính từ 0k++;if (k < N)return (k);return (-1);} 82.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: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 92.2 Các giải thuật tìm kiếm nội (tt)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 = 1B2: M[N+1] = XB3: Nếu M[k] ≠ XThì k++ Ngược lại: Lặp lại B3B4: Nếu k < N Thì Tìm thấy phần tử có giá trịX ở vị trí kB5: Nguợc lại: Thì không tìm thấy phần tử có giá trị XB6: Kết thúc 102.2 Các giải thuật tìm kiếm nội (tt)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ừ 0while (M[k] != X) k++;if (k < N)return (k);return (-1);} [...]... 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 bộ nhớ phụ. 13 2.2 Các giải thuật tìm kiếm nội (tt) Tìm nhị phân (Binary Seach) Tìm nhị phân đơn giản 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... kiếm  Trong các hệ lưu trữ 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... (X>M[Mid]) Tìm đệ quy từ First = Mid +1 đến Last B8: Kết thúc 12 2.2 Các giải thuật tìm kiếm nội (tt) Ví dụ: Tìm tuyến tính 5 2.2 Các giải thuật tìm kiếm nội Bài tố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  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) 10 2.2 Các giải thuật tìm kiếm nội (tt) Tìm tuyến tính (tt) Cài đặt thuật tố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); } 3 2.1 Khái quát về tìm kiếm  ... 24 2.3 Các giải thuật tìm kiếm ngoại Tìm kiếm theo chỉ mục (Index Search)  Vì lý do kích thước tập tin có thể lớn (có thể do các phần tử chứa trong tập tin lớn)  Thao tác đọc tập tin trên dữ liệu là lâu & không bảo đảm an toàn dữ liệu.  Để giúp an toàn dữ liệu, một tập tin thường được đi kèm theo tập tin chỉ mục (Index File) làm nhiệm vụ điều khiển thứ tự truy xuất dữ liệu trên tập tin... 4 2.1 Khái quát về tìm kiếm (tt)  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 8 2.2 Các giải thuật tìm kiếm nội (tt) Tìm tuyến tính (tt) Phân... giáo trình chương 2  Bài tập thực hành tuần 2, 3 14 2.2 Các giải thuật tìm kiếm nội (tt) 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 (X<M[Mid]) Tìm đệ quy từ First... 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 Last = Mid –1  Nếu X > M[Mid] rút ngắn phạm vi tìm kiếm First = Mid... giải thuật tìm kiếm ngoại Tìm tuyến tính Với Ý tưởng: Lần lượt đọc các phần trong tập tin X so sánh với giá trị X Thuật toán: B1: k = 0 B2: Trở về đầu tập tin (rewind(F)) B3: Đọc 1 phần tử trong tập tin (read(F, a)) B4: k = k + sizeof(T) B5: Kiểm tra Nếu a ≠ X chưa hết tập tin (!eof(F)) Lặp lại B3 B6: IF Nếu a = X Tìm thấy phần tử có giá trị X tại vị trí k bytes tính từ đầu F B7: ELSE Khơng tìm. .. Các giải thuật tìm kiếm nội (tt) Tìm nhị phân (tt) Cài đặt Thuật tốn khơng đệ quy (Non-Recursion Algorithm) int NRBinarySearch (T M[], int N, T X) { int First = 0; int Last = N-1; while (First <= Last) { int Mid = (First + Last)/2; if (X == M[Mid]) return Mid; if (X < M[Mid]) Last = Mid –1 ; else First = Mid + 1; } return (-1); } 29 Bài tập  Cài đặt các thuật toán trong lý thuyết  Bài tập . 1Môn: CẤU TRÚC DỮ LIỆUChương 2: KỸ THUẬT TÌM KIẾM (SEARCHING) 2NỘI DUNG CHƯƠNG 22.1 Khái quát về tìm kiếm2 .2 Các giải thuật tìm kiếm nội (Tìm kiếm trên. 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

Ngày đăng: 21/08/2012, 14:20

Từ khóa liên quan

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

Tài liệu liên quan