1. Trang chủ
  2. » Công Nghệ Thông Tin

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

29 1,6K 8
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 164,5 KB

Nội dung

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

Trang 1

Môn: CẤU TRÚC DỮ LIỆU

Chương 2: KỸ THUẬT TÌM KIẾM

(SEARCHING)

Trang 2

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)

BÀI TẬP

Trang 3

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

Trang 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

Trang 5

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)

Trang 6

2.2 Các giải thuật tìm kiếm nội (tt)

Tìm tuyến tính (Linear Seach)

Ngược lại: Lặp lại B2

B3: Nếu k <= N Thì Tìm thấy phần tử có giá trịX ở vị trí k

Trang 7

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 toán:

int LinearSearch (T M[], int N, T X)

Trang 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 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)

Trang 9

2.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 = 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

Trang 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 toán cải tiến:

int LinearSearchCaiTien (T M[], int N, T X)

Trang 11

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)

Trang 12

2.2 Các giải thuật tìm kiếm nội (tt)

Ví dụ: Tìm tuyến tính

Trang 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 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

Trang 14

2.2 Các giải thuật tìm kiếm nội (tt)

B5: Nếu (X = M[Mid])

Tìm thấy tại vị trí MidNgược lại: Thực hiện B6B6: Nếu (X<M[Mid]) Tìm đệ quy từ First đến Last = Mid -1

Trang 15

2.2 Các giải thuật tìm kiếm nội (tt)

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;

Trang 16

2.2 Các giải thuật tìm kiếm nội (tt)

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)

Trang 17

2.2 Các giải thuật tìm kiếm nội (tt)

B5: Nếu (X = M[Mid])

Tìm thấy tại vị trí MidNgược lại: Thực hiện B6B6: Nếu (X<M[Mid])

Last = Mid –1 và Lặp lại B3B7: Nếu (X>M[Mid]) First = Mid + 1 và lặp lại B3

Trang 18

2.2 Các giải thuật tìm kiếm nội (tt)

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 <= Last)

{ int Mid = (First + Last)/2;

if (X == M[Mid]) return Mid;

if (X < M[Mid])

Last = Mid –1 ;else

First = Mid + 1;

Trang 19

2.2 Các giải thuật tìm kiếm nội (tt)

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)

Trang 20

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)

Trang 21

2.3 Các 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 và 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 và chưa hết tập tin (!eof(F))

Lặp lại B3B6: 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 FB7: ELSE

Không tìm thấy phần tử có giá trị X trong tập tin F

B8: Kết thúc

Trang 22

2.3 Các giải thuật tìm kiếm ngoại

Tìm tuyến tính (tt) Cài đặt Thuật toán:

long FLinearSearch (char * FileName, T X)

{ FILE * Fp;

Fp = fopen(FileName, “rb”);

if (Fp == NULL) return (-1);

long k = 0; T a; int SOT = sizeof(T);

while (!feof(Fp)) { if (fread(&a, SOT, 1, Fp) == 0) break;

k = k+ SOT;

if (a == X) break;

}fclose (Fp);

Trang 23

2.3 Các giải thuật tìm kiếm ngoại

Tìm tuyến tính (tt) Phân tích Thuật toán:

 Trường hợp tốt nhất (phần tử đầu tiên trong tập tin có giá trị = X)

Trang 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 theo một khóa chỉ mục (Index Key).

 Tập tin chỉ mục sẽ chứa các phần tử gồm 2 thành phần tương ứng với cấu trúc DL:

typedef struct IdxElement

{

long Pos;

} IdxType

Trang 25

2.3 Các giải thuật tìm kiếm ngoại

Tìm kiếm theo chỉ mục (tt)

Ý tưởng

Đọc từ đầu tập tin chỉ mục, so sánh phần tử khóa chỉ mục với giá

trị X cho đến khi đọc đến phần tử có khóa chỉ mục >= giá trị X hay đọc đến cuối tập tin

Nếu trong quá trình trên tìm kiếm được phần tử có giá trị = X, truy xuất tập tin F tại vị trí này để đọc dữ liệu, tránh mất thời gian

Trang 26

2.3 Các giải thuật tìm kiếm ngoại

Tìm kiếm theo chỉ mục (tt)

Thuật toán

B1: Trở về đầu tập tin chỉ mục IDX(rewind(IDX))

B2: Đọc 1 phần tử trong tập tin (read(IDX, ai))

B3: Kiểm tra Nếu ai.IdxKey < X và chưa hết tập tin (!eof(IDX))

Trang 27

2.3 Các giải thuật tìm kiếm ngoại

Tìm kiếm theo chỉ mục (tt)

Cài đặt Thuật toán:

long IndexSearch (char * IdxFileName, T X)

{ FILE * IDXFp;

IDXFp = fopen(IdxFileName, “rb”);

if (IDXFp == NULL) return (-1);

IdxType ai; int SOIE = sizeof(IdxType);

while (!feof(IDXFp)) { if (fread(&ai, SOIE, 1, IDXFp) == 0)

break;

if (ai >= X) break;

}fclose (IDXFp);

if (ai.IdxKey == X) return (ai.Pos);

return (-1);

}

Trang 28

2.3 Các giải thuật tìm kiếm ngoại

Tìm kiếm theo chỉ mục (tt) Phân tích Thuật toán:

Trang 29

Bài tập

 Cài đặt các thuật toán trong lý thuyết

 Bài tập trong giáo trình chương 2

 Bài tập thực hành tuần 2, 3

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

w