Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 2: Giải thuật tìm kiếm cung cấp các kiến thức giúp người học có thể: Xác định được vai trò của tìm kiếm và sắp xếp trong hệ thống thông tin, nắm vững và minh họa được giải thuật tìm kiếm tuyến tính và tìm kiếm nhị phân trên mảng một chiều, cài đặt được giải thuật tìm kiếm bằng ngôn ngữ C#.
Chương 2.1 Giải thuật tìm kiếm Trần Minh Thái Email: minhthai@huflit.edu.vn Website: www.minhthai.edu.vn Mục tiêu Xác định vai trị tìm kiếm xếp hệ thống thông tin Nắm vững minh họa giải thuật tìm kiếm tuyến tính tìm kiếm nhị phân mảng chiều Cài đặt giải thuật tìm kiếm ngơn ngữ C# Nhu cầu tìm kiếm xếp Tìm kiếm: Có hầu hết hệ thống thơng tin Muốn tìm kiếm nhanh hiệu liệu có thứ tự xếp Vấn đề tìm kiếm Dựa vào phần thơng tin gọi khố (key) tìm mẫu tin (record) chứa thông tin khác liên quan với khố Có thể có nhiều mẫu tin khơng có mẫu tin chứa khố cần tìm Đánh giá giải thuật tìm kiếm Tìm kiếm thường tác vụ tốn nhiều thời gian chương trình Tổ chức cấu trúc liệu giải thuật cho việc tìm kiếm ảnh hưởng lớn đến hiệu suất hoạt động chương trình Thơng số đo chủ yếu số lần so sánh khố cần tìm với mẫu tin khác Phân loại Tìm kiếm nội tìm kiếm ngoại Dữ liệu lưu thiết bị lưu trữ đĩa hay băng từ: tìm kiếm ngoại Dữ liệu lưu trữ nhớ chính: tìm kiếm nội Các giải thuật tìm kiếm dãy Có giải thuật thường áp dụng: Tìm tìm nhị phân Đặc tả: Tập liệu lưu trữ dãy số a1, a2, ,aN a a4 int[N]; a5 … inta[]a Khai abáo: = new Khóa cần tìm: int x; an-1 aN Tìm kiếm (Linear Search) Ý tưởng Lần lượt so sánh x với phần tử thứ nhất, thứ hai, mảng a gặp phần tử cần tìm, hết mảng Tìm kiếm Minh họa tìm x =10 10 Đã tìm thấy Chưa hếttại 12 41 10 10 32 13 15 3 10 Minh họa tìm x =25 25 vịmảng trí Chưa hết mảng Đã hết mảng 12 41 10 32 13 15 3 10 Giải thuật Bước 1: i = 1; // phần tử dãy Bước 2: So sánh a[i] với x, có khả năng: a[i] = x : Tìm thấy Dừng a[i] != x : Sang Bước Bước 3: i = i+1; // xét tiếp phần tử kế 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 Bước 10 Cài đặt int LinearSearch(int []a, int N, int x) { int i=0; while ((i r: Kết thúc: Khơng tìm thấy m m 20 Giải thuật Bước 1: left = 1; right = N; //tìm kiếm tất phần tử Bước 2: mid = (left+right)/2; // lấy mốc so sánh So sánh a[mid] với x, có khả : a[mid] = x: Tìm thấy Dừng a[mid] > x: //tìm tiếp x dãy aleft amid -1 right =mid - 1; a[mid] < x: //tìm tiếp x dãy amid +1 aright left = mid + 1; Bước 3: Nếu left