1. Trang chủ
  2. » Tất cả

Tìm kiếm &Sắp xếp

27 0 0
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

Tiêu đề Tìm kiếm & Sắp xếp
Trường học Trường Đại Học
Chuyên ngành Cấu trúc dữ liệu và giải thuật
Thể loại Giáo trình
Năm xuất bản N/A
Thành phố Hà Nội
Định dạng
Số trang 27
Dung lượng 291 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Tìm kiếm &Sắp xếp CácCác giảigiải thuậtthuật tìmtìm kiếmkiếm nộinội TìmTìm kiếmkiếm tuyến tínhtuyến tính TìmTìm kiếmkiếm nhịnhị phânphân Caáu truùc Döõ lieäu Tìm kieám vaø Saép xeáp 2  Tìm kieám la[.]

Trang 1

Các giải thuật

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

Tìm kiếm nhị phân

Trang 2

 Tìm kiếm là thao tác thường được thực hiện nhất.

 Dữ liệu đã được sắp xếp => tìm nhanh hơn.

- => Vấn đề:

- Tìm kiếm nhanh.

- Sắp xếp nhanh.

Nhu cầu tìm kiếm và sắp xếp dữ liệu trong

một hệ thống thông tin

Trang 3

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

Bài toán:

- Chọn cấu trúc dữ liệu mảng (a) để lưu trữ dãy số a1,

a2 ,…,an

- Tìm một số nguyên x trong mảng a

Có 2 giải thuật tìm kiếm:

- Tìm kiếm tuyến tính.

- Tìm kiếm nhị phân.

Trang 4

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

Trang 5

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

Trang 6

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

 Bước 1: i = Vị trí đầu;

 Bước 2: Nếu a[i] = x : Tìm thấy Dừng, vị trí xuất hiện:

i

 Bước 3 : i = Vị trí kế(i);// xét tiếp phần tử kế trong mảng

 Bước 4: Nếu i >Vị trí cuối: //Hết mảng

Không tìm thấy Dừng

Ngược lại: Lặp lại Bước 2

Trang 9

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

int LinearSearch ( int a[], int n, int x)

{

int i=0;

while (i<n && a[i]!=x) i++;

if (i<n) return i; // a[i] là phần tử có khoá x

return -1; // tìm hết mảng nhưng không có x

}

Trang 10

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

 Cải tiến cài đặt: dùng phương pháp “lính canh”

 Đặt thêm một phần tử có giá trị x vào cuối mảng

 Bảo đảm luôn tìm thấy x trong mảng

 Sau đó dựa vào vị trí tìm thấy để kết luận

Trang 11

a[n] = x; // thêm lính canh vào cuối dãy

while( a[i]!=x) i++;

if (i<n) return i; // a[i] là phần tử có khoá x

return -1; // tìm hết mảng nhưng không có x

}

Trang 12

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

Đánh giá giải thuật:

 Vậy giải thuật tìm tuần tự có độ phức tạp tính toán cấp

n: T(n) = O(n)

Trang 13

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

Nhận xét:

 Giải thuật tìm tuyến tính không phụ thuộc vào thứ tự của các phần tử trong danh sách, do vậy đây là phương pháp tổng quát nhất để tìm kiếm trên một danh sách bất kỳ

 Một thuật toán có thể được cài đặt theo nhiều cách khác nhau, kỹ thuật cài đặt ảnh hưởng đến tốc độ thực hiện của thuật toán

Trang 14

Tìm kiếm nhị phân

Trang 15

Tìm kiếm nhị phân

 Đối với những dãy đã có thứ tự (giả sử thứ tự tăng ), các phần

tử trong dãy có quan hệ

a[i-1]  a[i]  a[i+1]

 Nếu x > a[i] thì x chỉ có thể xuất hiện trong đoạn [a[i+1] ,a[N]] của dãy

 Nếu x < a[i] thì x chỉ có thể xuất hiện trong đoạn [a[0] ,a[i-1]] của dãy

Trang 16

Tìm kiếm nhị phân

 Ý 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

Trang 17

Tìm kiếm nhị phân

Bước 1: left = VTĐ ; right = VTC ;

Bước 2: Trong khi left  right lặp: //đoạn tìm kiếm chưa rỗng

Bước 21: mid = (left+right)/2; // lấy mốc so sánh Bước 22: Nếu a[mid] = x: //Tìm thấy

Dừng, vị trí xuất hiện: mid Bước 23: Nếu a[mid] > x: //tìm x trong dãy con aleft amid -1 right = mid - 1;

Ngược lại // tìm x trong dãy con amid +1 aright left = mid + 1;

//Hết lặp

Trang 18

Ví d : Tìm nh phân ụ ị

Ví d : Tìm nh phân ụ ị

10Target key

Trang 19

Tìm kiếm nhị phân

{

int left =0, right = n-1, mid;

while (left <= right) {

mid = (left + right)/2;

if (x == a[mid]) return mid;//Tìm thấy x tại mid

if (x < a[mid]) right = mid -1;

else left = mid +1;

}

Trang 20

Tìm kiếm nhị phân

Đánh giá giải thuật:

 Giải thuật tìm nhị phân có độ phức tạp tính toán cấp logn:

T(n) = O(log 2 n)

Trang 21

Tìm kiếm nhị phân

Nhận xét:

 Giải thuật tìm nhị phân dựa vào quan hệ giá trị của các phần tử mảng để định hướng trong quá trình tìm kiếm, do vậy chỉ áp dụng được cho những dãy đã có thứ tự

 Giải thuật tìm nhị phân tiết kiệm thời gian hơn rất nhiều so với giải thuật tìm tuần tự do

Tnhị phân (n) = O(log 2 n) < Ttuần tự (n) = O(n)

Trang 22

 Cần cân nhắc nhu cầu thực tế để chọn một trong hai giải thuật tìm kiếm trên sao cho có lợi nhất

Trang 23

Bài tập tổng hợp

nhất của từng phương pháp sắp xếp đã học.

mảng a gồm 1000 số nguyên Trong trường hợp sau, hãy cho biết số phần tử tối đa có thể được duyệt trong quá trình tìm kiếm:

Trang 24

Bài tập tổng hợp(tt)

phương pháp đã học.(ghi rõ số so sánh, số phép hoán vị)

Trang 25

Bài tập tổng hợp(tt)

 Định nghĩa một mảng gồm 10.000 phần tử kiểu int

 Thực hiện 3 lần các thao tác sau:

 Gán giá trị ngẫu nhiên (từ 0 10.000)lần lượt cho các

phần tử mảng

 Thực hiện việc sắp xếp theo thứ tự tăng dần bằng 5

phương pháp(in ra số lần hoán vị)

 Tìm kiếm phần tử ngẫu nhiên(từ 0 10.000)(in ra số

phép gán) bằng pp nhị phân

Trang 26

Bài tập tổng hợp(tt)

 Bt2: viết chương trình:

trong danh sách.

bản(Toán, Lý, Hóa, TB) của mỗi sv, điểm là số thực:

cấu trúc như trên.

điểm trung bình, và ghi vào file BDSAPXEP.TXT.

Ngày đăng: 31/12/2022, 14:08

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w