Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 32 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
32
Dung lượng
150 KB
Nội dung
1
Môn: CẤU TRÚC DỮ LIỆU
Chương 2: KỸTHUẬTTÌMKIẾM
(SEARCHING)
4 tiết LT
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ậttìmkiế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ậttìmkiế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
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ìmkiế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ậttìmkiếm nhanh sẽ có ý nghĩa quan
trọng.
Nếu tìmkiếm trong một hệ thống đã tổ chức thì việc tìmkiếm
dễ dàng hơn.
Các giải thuậttìmkiế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ụ.
4
2.1 Khái quát về tìmkiế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
5
2.2 Các giải thuậttìmkiếm nội
Bài toán đặt ra: Giả sử có một mảng A 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ậttìmkiế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ìmkiếm
tuyến tính (Linear Search)
Tìm kiếm nhị phân (Binary Search)
6
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 A với giá trị X
cần tìm bắt đầu từ phần tử đầu tiên cho đến khi tìm
thấy hoặc tìm hết mảng mà không tìm thấy X.
Thuật toán
B1: i = 1 ;// bắt đầu từ phần tử đầu tiên
B2: so sánh A[i] với X, có 2 khả năng :
A[i] =X : Tìm thấy. Dừng
A[i] <>X : Sang B3
B3: i=i+1 // Xét phần tử tiếp theo trong mảng
Nếu i>n : Hết mảng, không tìm thấy.Dừng
Ngược lại: lặp lại B2
7
Tìm tuyến tính (Linear Seach)
Ví dụ:
X=8
i=1
i=2
i=3
Dừng
12 2 8 5 1
12 2 8 5 1
X=8
12 2 8 5 1
X=8
12 2 8 5 1
X=8
8
Tìm tuyến tính (Linear Seach)
Cài đặt thuật toán:
int LinearSearch (int A[], int n, int X)
{
int i = 0;
while (A[i] != X && i <n) // phần tử mảng M tính từ 0
i++;
if (i < n)
return (i);
return (-1);
}
9
Tìm tuyến tính (Linear Seach)
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 G
min
= 1
Số phép so sánh S
min
= 2+1=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 G
max
= 1
Số phép so sánh S
max
= 2n + 1
Trung bình
Số phép gán G
avg
= 1
Số phép so sánh S
avg
= (3+2n + 1)/2=n+2
10
Tìm tuyến tính (Linear Seach)
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: i = 1
B2: A[i+1] = X
B3: Nếu A[i] ≠ X
Thì i++
Ngược lại: Lặp lại B3
B4: Nếu i < N Thì Tìm thấy phần tử có giá trịX ở vị trí i
B5: Nguợc lại: Thì không tìm thấy phần tử có giá trị X
B6: Kết thúc
[...]... giải thuậttìmkiếm ngoại Các giải thuậttìmkiếm ngoại là giải thuậttìmkiế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ậttìmkiếm ngoại: Tìm tuyến tính Tìmkiếm theo chỉ mục (Index Search) 23 2.3 Các giải thuậttìmkiếm ngoại Tìm. .. Các giải thuậttìmkiếm ngoại Tìmkiế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ìmkiế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 28 2.3 Các giải thuậttìmkiếm ngoại Tìmkiếm theo... 2 avg 12 Tìm tuyến tính (Linear Seach) Ví dụ: Tìm tuyến tính 13 Tìm nhị phân (Binary Seach) Ý tưởng: Phạm vi tìmkiếm là từ phần tử đầu tiên của dãy (Left = 1) cho đến phần tử cuối cùng (Right = n) So sánh giá trị X với giá trị phần tử ở giữa của dãy A là A[Mid] Nếu X = A[Mid] Tìm thấy Nếu X < A[Mid] rút ngắn phạm vi tìm kiếm và Right = Mid –1 Nếu X > A[Mid] rút ngắn phạm vi tìm kiếm và... + 1) 26 2.3 Các giải thuậttìmkiếm ngoại Tìmkiế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... (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)) Lặp lại B3 B4: IF Nếu ai.IdxKey = X Tìm thấy phần tử có giá trị X tại vị trí ai.Pos bytes tính từ đầu IDX B5: ELSE Không tìm thấy phần tử có giá trị X trong tập tin IDX B6: Kết thúc 29 2.3 Các giải thuậttìmkiếm ngoại Tìm kiếm. .. ½(3log2N + 3) 19 Tìm nhị phân (Binary Seach) 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ìmkiếm Không tìm thấy 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 20 Tìm nhị phân... khi tìm thấy phần tử có giá trị =X 14 Tìm nhị phân (Binary Seach) Thuật toán: B1: Left = 1; Right = n B2: Mid= (Left+ Right)/2 B3: so sánh A[Mid] với X có 3 khả năng xảy ra: A[mid]=X; // tìm thấy Dừng A[mid]>X; //Tiếp tục tìm trong dãy A[1]… A[mid-1] Right=mid-1 A[mid] . TRÚC DỮ LIỆU
Chương 2: KỸ THUẬT TÌM KIẾM
(SEARCHING)
4 tiết LT
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. 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ị