1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Cấu trúc dữ liệu và giải thuật: Giải thuật tìm kiếm tuyến tính và nhị phân - TS. Trần Ngọc Việt

38 11 0

Đ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

Bài giảng Cấu trúc dữ liệu và giải thuật: Giải thuật tìm kiếm tuyến tính và nhị phân gồm các nội dung chính sau giới thiệu bài toán tìm kiếm; tìm kiếm tuyến tính; tìm kiếm nhị phân. Mời các bạn cùng tham khảo!

GIẢI THUẬT TÌM KIẾM TUYẾN TÍNH & NHỊ PHÂN  Giải thuật (algorithms): dãy câu lệnh (statements) chặt chẽ rõ ràng xác định trình tự thao tác số đối tượng cho sau số hữu hạn bước thực ta đạt kết mong muốn  Thuật toán: dãy hữu hạn bước, bước mô tả xác phép tốn hành động cần thực hiện, để giải vấn đề Niklous Wirth, cha đẻ ngơn ngữ lập trình Pascal kỹ thuật lập trình cấu trúc đúc kết ý nghĩa liệu mối quan hệ hữu với giải thuật mệnh đề tiếng: Chương trình = Thuật tốn + Cấu trúc liệu KHOA CƠNG NGHỆ THƠNG TIN Bài tốn mơ tả sau: • Tập liệu lưu trữ dãy a1, a2, ,an Giả sử chọn cấu trúc liệu mảng để lưu trữ dãy số nhớ chính, có khai báo: int a[n]; • Khóa cần tìm x: int x; Tìm kiếm KHOA CƠNG NGHỆ THƠNG TIN Tìm kiếm tuyến tính Tìm kiếm nhị phân Tập liệu Tập liệu xếp • Ý tưởng: duyệt từ phần tử đầu tiên, so sánh khóa tìm kiếm với khoá tương ứng phần tử danh sách Cho đến gặp phần tử cần tìm duyệt hết danh sách • Các bước tiến hành sau: i=0 i n: Hết mảng, khơng tìm thấy Dừng Ngược lại, quay lui Bước KHOA CƠNG NGHỆ THƠNG TIN Thuật tốn tìm kiếm tuyến tính //Trả về: vị trí xuất x mảng a Trả về: -1 x mảng a // int Search(int a[], int n, int key) { int i =0; while (i key= R = mid -1=4 -1 =3 (a[3] = 12) L=0 mid=1 KHOA CÔNG NGHỆ THÔNG TIN 12 R=3 16 24 +Khi L < = R mid = (0+3)/2 = (a[mid] = a[1] = 5) Nếu a[mid] =5 < key= L = mid +1= 1+1 =2 L=2 12 R=3 16 23 38 56 72 91 16 23 38 56 72 91 +Khi L < = R mid = (2+3)/2 = (a[mid] = a[2] = 8) Nếu a[mid] = key= Return mid Kết thúc KHOA CÔNG NGHỆ THÔNG TIN x= 12 25  Độ phức tạp tính tốn cấp n: T(n)=O(log 2n)  Nhận xét: Thuật toán nhị phân dựa vào quan hệ giá trị phần tử mảng để định hướng trình tìm kiếm, áp dụng với dãy có thứ tự Thuật tốn nhị phân tìm kiếm nhanh tìm kiếm tuyến tính Tuy nhiên áp dụng thuật tốn nhị phân cần phải quan tâm đến chi phí cho việc xếp mảng Vì mảng thứ tự tìm kiếm nhị phân KHOA CÔNG NGHỆ THÔNG TIN 26 Câu 1: Áp dụng giải thuật tìm kiếm nhị phân- Mảng phần tử xếp tăng dần a) x=38 = key , n=10 b) x=5 = key, n=10 i=0 i=1 i=2 KHOA CÔNG NGHỆ THÔNG TIN i=3 12 i=4 16 i=5 i=6 i=7 23 38 56 i=8 72 i=9 91 27 Câu Cho dãy số sau: 6 12 16 21 34 41 80 10 Cho biết vị trí tìm thấy số lần so sánh để tìm phần tử có giá trị x = áp dụng giải thuật tìm kiếm: tuyến tính nhị phân Câu Xây dựng giải thuật tìm kiếm phần tử có giá trị nhỏ dãy số: Dùng mã tự nhiên, mã giả lưu đồ KHOA CƠNG NGHỆ THƠNG TIN 28 Câu 1: Tìm x = 6 12 16 21 34 41 80 10 Tìm x theo phương pháp tuyến tính Vị trí i=1 i=2 i=3 KHOA CÔNG NGHỆ THÔNG TIN So sánh Kết với x (a[i]=3)  x Tăng vị trí i (a[i]=4)  x Tăng vị trí i (a[i]=6) = x Dừng, trả vị trí i (3) 29 Câu 1: Tìm x = 6 12 16 21 34 41 80 10 Tìm x theo phương pháp nhị phân Xét đoạn Vị trí So sánh Kết đoạn với x l=1, r=10 m=(l+r)/2=5 (a[m]=12)  x 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 Cập nhật l=m+1=3 (a[m]N trả giá trị vt, kết thúc; Bước 3: Nếu a[i] G (G nhập từ bàn phím) • Tìm sách có giá lớn KHOA CÔNG NGHỆ THÔNG TIN 33 #Bài Thực hành 01.1: >>> def tuyen_tinh(array, n, x): for i in range(0, n): if (array[i] == x): return i return -1 >>> >>> >>> >>> >>> array = [20, 30, 15, 5, 10, 40] x = 40 n = len(array) result = tuyen_tinh(array, n, x) print("Phan tu tim thay duoc tai vi tri la:", result) #Nhan xet: input & output cua Giai thuat tren?? #Nhắc lại kiến thức – Giải thuật tuyen tinh KHOA CÔNG NGHỆ THÔNG TIN 34 #Bài Thực hành 01.2: Input : array = [15, 25, 80, 30, 60, 50, 110, 100, 130, 180] x = 110; Output : Phan tu tim thay duoc tai vi tri la: -Input : array = [15, 25, 80, 30, 60, 50, 110, 100, 130, 180] x = 185; Output : -1 Phan tu ko duoc tim thay arr[] KHOA CÔNG NGHỆ THÔNG TIN 35 #Bài Thực hành 02.1: >>> import math >>> def binary_search(array, element): mid = start = end = len(array) step = while (start >> >>> >>> >>> array = [0, 4, 5, 9, 13, 15, 18, 24, 28, 29, 35] element = 28 result = binary_search(array, element) print("Phan tu tim kiem duoc la:", result) #Nhan xet: input & output cua Giai thuat tren ?? #Nhắc lại kiến thức – Giải thuật nhị phân KHOA CÔNG NGHỆ THÔNG TIN 36 #Bài Thực hành 02.2: >>> import math >>> def binary_search(arr, key): #?? mid = #?? left = right = len(arr) step = while (left >> >>> >>> >>> #?? #?? arr = [0, 4, 5, 9, 13, 15, 18, 24, 28, 29, 35] key = 40 result = binary_search(arr, key) print("Vi tri tim kiem thu i la:", result) #Nhan xet: input & output cua Giai thuat Nhị phân ?? #Yêu cầu – comment vào dấu note, bước lặp, vịng lặp giải thuật KHOA CƠNG NGHỆ THƠNG TIN 37 ... Khóa cần tìm x: int x; Tìm kiếm KHOA CƠNG NGHỆ THƠNG TIN Tìm kiếm tuyến tính Tìm kiếm nhị phân Tập liệu Tập liệu xếp • Ý tưởng: duyệt từ phần tử đầu tiên, so sánh khóa tìm kiếm với khoá tương ứng... 21 34 41 80 10 Cho biết vị trí tìm thấy số lần so sánh để tìm phần tử có giá trị x = áp dụng giải thuật tìm kiếm: tuyến tính nhị phân Câu Xây dựng giải thuật tìm kiếm phần tử có giá trị nhỏ dãy... tìm kiếm tuyến tính Tuy nhiên áp dụng thuật tốn nhị phân cần phải quan tâm đến chi phí cho việc xếp mảng Vì mảng thứ tự tìm kiếm nhị phân KHOA CÔNG NGHỆ THÔNG TIN 26 Câu 1: Áp dụng giải thuật tìm

Ngày đăng: 28/01/2023, 23:50

Xem thêm: