intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Chương 2.1. Giải thuật tìm kiếm

Chia sẻ: Batman_1 Batman_1 | Ngày: | Loại File: PPT | Số trang:20

55
lượt xem
5
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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 *Cài đặt được giải thuật tìm kiếm

Chủ đề:
Lưu

Nội dung Text: Chương 2.1. Giải thuật tìm kiếm

  1. Chương 2.1. Giải thuật tìm kiếm 1
  2. *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/C++ 2
  3. ? Hãy liệt kê những phần mềm trên máy tính có dùng chức năng tìm kiếm và sắp xếp? 3
  4. *Thao tác tìm kiếm được sử dụng nhiều nhất trong các hệ lưu trữ và quản lý dữ liệu. *Do dữ liệu lớn nên tìm ra giải thuật tìm kiếm nhanh chóng là mối quan tâm hàng đầu. Để đạt được điều này dữ liệu phải được tổ chức theo một thứ tự nào đó thì việc tìm kiếm sẽ nhanh chóng và hiệu quả hơn, vì vậy nhu cầu sắp xếp dữ liệu cũng được lưu ý. *Tóm lại, bên cạnh những giải thuật tìm kiếm thì các giải thuật sắp xếp dữ liệu không thể thiếu trong hệ quản lý thông tin trên máy tính. 4
  5. *Có 2 giải thuật thường được áp dụng: Tìm tuyến tính và tìm nhị phân. *Để đơn giản cho việc minh họa, ta đặc tả như sau: a1 a2 a3 a4 a5 … an-1 aN *Tập dữ liệu được lưu trữ là dãy số a1, a2, ... ,aN. *Giả sử chọn cấu trúc dữ liệu mảng để lưu trữ dãy số này trong bộ nhớ chính, có khai báo: int a[N]; *Khoá cần tìm là x, được khai báo như sau: int x; 5
  6. *Ý tưởng Tiến hành so sánh x lần lượt với phần tử thứ nhất, thứ hai, ... của mảng a cho đến khi gặp được phần tử có khóa cần tìm, hoặc đã tìm hết mảng mà không thấy x. *Minh họa tìm x =10 Chưa 10 Đã tìm hế thấy t ại 7 5 12 41 10 32 13 9 15 3 vị ảng m trí 5 1 2 3 4 5 6 7 8 9 10 *Minh họa tìm x =25 Chưa Đã hết hết 25 mảng mảng 7 5 12 41 10 32 13 9 15 3 6 1 2 3 4 5 6 7 8 9 10
  7. *Giải thuật Bước 1: // bắt đầu từ phần tử đầu tiên i = 1; của dãy Bước 2: 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 Bước 3. Bước 3: * i = i+1; // xét tiếp phần tử kế 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 Bước 2. 7
  8. Cài đặt int LinearSearch(int a[], int N, int x) { int i=0; while ((i
  9. Cải tiến (dùng lính canh) giúp giảm bớt một phép so sánh *Minh họa tìm x =10 10 7 5 12 41 10 32 13 9 15 3 10 1 2 3 4 5 6 7 8 9 10 11 *25 Minh họa tìm x = 25 7 5 12 41 10 32 13 9 15 3 25 9 11 1 2 3 4 5 6 7 8 9 10
  10. Cài đặt int LinearSearch2(int a[],int N,int x) { int i=0; // mảng gồm N phần tử từ a[0]..a[N-1] a[N] = x; // thêm phần tử thứ N+1 while (a[i]!=x ) i++; if (i==N) // tìm hết mảng nhưng không có x return -1; else // tìm thấy x tại vị trí i return i; } Ðánh giá giải thuật Độ phức tạp tính toán cấp10n: T(n)=O(n)
  11. Ý tưởng *Áp dụng đối với những dãy số đã có thứ tự. *Giải thuật tìm cách giới hạn phạm vi tìm kiếm sau mỗi lần so sánh x với một phần tử trong dãy. Ý tưởng của giải thuật là tại mỗi bước tiến hành so sánh x với phần tử nằm ở vị trí giữa của dãy tìm kiếm hiện hành, dựa vào kết quả so sánh này để quyết định giới hạn dãy tìm kiếm ở bước kế tiếp là nửa trên hay nửa dưới của dãy tìm kiếm hiện hành. 11
  12. Minh họa tìm x = 41 x x x 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 Tìm thấy x tại vị trí 6 l m m r m 12
  13. Minh họa tìm x = 45 x x x x 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 l m m r l > r: Kết thúc: Không tìm thấy m m 13
  14. Giải thuật Bước 1: left = 1; right = N; // tìm kiếm trên tất cả các phần tử Bước 2: // lấy mốc so sánh mid = (left+right)/2; So sánh a[mid] với x, có 3 khả năng : a[mid] = x: Tìm thấy. Dừng a[mid] > x: //tìm tiếp x trong dãy con aleft .. amid -1 right =mid - 1; a[mid] < x: //tìm tiếp x trong dãy con amid +1 .. aright left = mid + 1; Bước 3: Nếu left
  15. Cài đặt int BinarySearch(int a[],int N,int x ) { int left =0; right = N-1; int mid; do{ mid = (left + right)/2; if (x == a[mid]) return mid;//Thấy x tại mid else if (x < a[mid]) right = mid -1; else left = mid +1; }while (left
  16. 16
  17. #include #include #include #define MAX 1000 void TaoMang(int a[], int N); void XuatMang(int a[], int N); int LinearSearch(int a[], int N); void main() { srand((usigned int) time (NULL)); int a[MAX], N = 20, x, kq; TaoMang(a, N); XuatMang(a, N); coutx; kq=LinearSearch(a, N, x); if(kq==-1) cout
  18. void TaoMang(int a[], int N) { for(int i=0; i
  19. int LinearSearch(int a[], int N, int x) { int i=0; while ((i
  20. *LT1_1: Cho dãy số sau: 3 4 6 6 12 16 21 34 41 80 0 1 2 3 4 5 6 7 8 9 Cho biết vị trí tìm thấy và số lần so sánh để tìm được phần tử có giá trị x = 6 khi áp dụng giải thuật tìm kiếm: tuyến tính và nhị phân. *LT1_2: Xây dựng giải thuật tìm kiếm phần tử có giá trị nhỏ nhất trong dãy số: Dùng mã giả và lưu đồ. 20
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2