Bài giảng cấu trúc dữ liệu và giải thuật chương 2 tìm kiếm và sắp xếp trên mảng 1 chiều phần 1

32 501 2
Bài giảng cấu trúc dữ liệu và giải thuật chương 2 tìm kiếm và sắp xếp trên mảng 1 chiều phần 1

Đ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

Chương 2.1. Giải thuật tìm kiếm Trần Minh Thái Email: minhthai@itc.edu.vn Website: www.minhthai.edu.vn 1 Mục tiêu  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 Suy nghĩ 3 Tại sao hầu hết phần mềm phải có chức năng m kiếm và sắp xếp, mối quan hệ giữa m kiếm và sắp xếp? ? Nhu cầu tìm kiếm và sắp xếp  Tìm kiếm: Có trong hầu hết trong các hệ thống thông tin  Muốn tìm kiếm nhanh và hiệu quả  dữ liệu có thứ tự  sắp xếp 4 Các giải thuật tìm kiếm  Có 2 giải thuật thường được áp dụng: Tìm tuyến tính và tìm nhị phân.  Đặc tả:  Tập dữ liệu được lưu trữ là dãy số a 1 , a 2 , ,a N .  Khai báo: int a[N];  Khóa cần tìm: int x; 5 a 1 a 2 a 3 a 4 a 5 … a n-1 a N Tìm kiếm tuyến tính (Linear Search) Ý tưởng Lần lượt so sánh x 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ần tìm, hoặc hết mảng 6 Tìm kiếm tuyến tính  Minh họa tìm x =10  Minh họa tìm x =25 7 Chưa hết mảng 7 5 12 41 10 32 13 9 15 3 1 2 3 4 5 6 7 8 9 10 7 5 12 41 10 32 13 9 15 3 1 2 3 4 5 6 7 8 9 10 10 10 25 Chưa hết mảng Đã m thấy tại vị trí 5 Đã hết mảng Giải thuật Bước 1:  i=1;//bắtđầutừphầntửđầutiên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. 8 Nguyên tắc cài đặt hàm tìm kiếm  Nếu có xuất hiện phần tử có giá trị x thì trả về vị trí tìm được  Ngược lại thì trả về -1 9 Cài đặt intLinearSearch(inta[],intN,intx) { inti=0; while((i<N)&&(a[i]!=x)) i++; if(i==N)  return-1;//tìmhếtmảng else returni;//a[i]làphầntửcókhoáx } 10 [...]... tìm x =10 10 7 5 12 41 10 10 32 13 9 15 3 10 1 2 3 4 5 6 7 8 9 10 11 Minh họa tìm x = 25 25 7 5 12 41 10 32 13 9 15 3 25 25 1 2 3 4 5 6 7 8 9 10 11 11 Cài đặt int LinearSearch2(int a[],int N,int x) {  int i=0;  a[N] = x; // thêm phần tử x sau mảng while (a[i]!=x ) i++;  if (i==N)   return  -1;  // tìm hết mảng else  return i;  // tìm thấy x tại vị trí i  }  Độ phức tạp tính toán cấp n: T(n)=O(n) 12 . .. 3 4 6 6 12 16 21 34 41 80 1 2 3 4 5 6 7 8 9 10 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ã tự nhiên, mã giả và lưu đồ 25 Bài tập lý thuyết – Hướng dẫn LT1 _1: Tìm x = 6 3 4 6 6 12 16 21 34 41 80 1 2 3 4 5 6 7 8 9 10 Tìm x theo... T(n)=O(n) 12 Q&A 13 Tìm kiếm nhị phân (Binary Search) Ý tưởng Áp dụng đối với dãy số đã có thứ tự Mỗi bước tiến hành so sánh x với phần tử ở giữa của dãy hiện hành để quyết định phạm vi tìm kế tiếp 14 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 l m m Tìm thấy x tại vị trí 6 r m 15 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... với x Kết quả i =1 (a[i]=3) ≠ x Tăng vị trí i i =2 (a[i]=4) ≠ x Tăng vị trí i i=3 (a[i]=6) = x Dừng, trả về vị trí i (3) 26 Bài tập lý thuyết – Hướng dẫn LT1 _1: Tìm x = 6 3 4 6 6 12 16 21 34 41 80 1 2 3 4 5 6 7 8 9 10 Tìm x theo phương pháp nhị phân Xét đoạn So sánh giữa đoạn l =1, r =10 Vị trí với x m=(l+r) /2= 5 (a[m]= 12 ) ≠ x Kết quả Cập nhật r=m -1= 4 (a[m]>x  xét trái) l =1, r=4 m=(l+r) /2= 2 (a[m]=4) ≠ x... Không tìm thấy m m 16 Giải thuật Bước 1: left = 1; right = N; / /tìm kiếm tất cả các 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ó 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 . 71 1 2 3 4 5 6 7 8 9 10 x m 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 m x 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 r m x l 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 m x 3. 9 10 l m x 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 r m 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 Minh họa tìm x = 45 16 3 14 16 19 22 41 46 51 63 71 1. hết mảng 6 Tìm kiếm tuyến tính  Minh họa tìm x =10  Minh họa tìm x =25 7 Chưa hết mảng 7 5 12 41 10 32 13 9 15 3 1 2 3 4 5 6 7 8 9 10 7 5 12 41 10 32 13 9 15 3 1 2 3 4 5 6 7 8 9 10 10 10 25 Chưa

Ngày đăng: 04/09/2015, 15:14

Từ khóa liên quan

Mục lục

  • Slide 1

  • Mục tiêu

  • Suy nghĩ

  • Nhu cầu tìm kiếm và sắp xếp

  • Các giải thuật tìm kiếm

  • Tìm kiếm tuyến tính (Linear Search)

  • Tìm kiếm tuyến tính

  • Slide 8

  • Nguyên tắc cài đặt hàm tìm kiếm

  • Slide 10

  • Cải tiến

  • Slide 12

  • Q & A

  • Tìm kiếm nhị phân (Binary Search)

  • Slide 15

  • Slide 16

  • Slide 17

  • Slide 18

  • Q & A

  • Code minh họa

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

Tài liệu liên quan