- vừa được xem lúc

Python: Jump Search

0 0 35

Người đăng: Nguyen Huu Hai

Theo Viblo Asia

Search là một từ khóa khá là quen thuộc đối với chúng ta. Hiểu theo đúng nghĩa đen của nó chính là "Tìm kiếm". Và có 2 loại chúng ta thường nghe, hoặc làm việc với chúng đó là Binary SearchLinear Search. Nhưng có thể mọi người ít nghe, hoặc chưa từng nghe đến từ khóa Jump Search đúng không nào?
Vậy thì trong bài viết này mình sẽ cùng với các bạn tìm hiểu xem Jump Search là gì và nó hoạt động như thế nào nhé. Let's go!

1. Jump Search

Với Jump Search, các mảng dữ liệu đã được sort được chia thành các phần tử nhỏ được gọi là blocks. Chúng ta sẽ tìm kiếm các search key hay còn gọi là giá trị input bằng cách so sánh các phần tử trong mỗi block. Khi mảng được sắp xếp, vị trí cần tìm là giá trị khớp nhất trong một block.

Khi so sánh search key với các "ứng viên", thuật toán sau đó có thể thực hiện 1 trong 3 điều:

  • Nếu "ứng viên" cần tìm nhỏ hơn search key, chúng ta sẽ kiểm tra block tiiếp theo.
  • Nếu "ứng viên" cần tìm lớn hơn search key, chúng ta sẽ thực hiện linear search ở chính block hiện tại.
  • Nếu "ứng viên" cần tìm giống với search key, lúc đó chúng ta đã tìm được ra "ứng viên" cần tìm rồi.

Kích thước của một block sẽ bằng căn bậc hai của mảng. Do đó các mảng có độ dài là n thì kích thước của 1 khối sẽ là √n, điều này sẽ mang lại cho chúng ta hiệu suất tốt nhất cho hầu hết các mảng.

Nói lý thuyết thì dài dòng, mình sẽ ví dụ ngắn hơn bằng 1 ví dụ nhé.

Ở ví dụ này, có 5 bước để tìm kiếm phần tử, trong đó có 2 bước sử dụng Linear Search. Chúng ta đã hình dung ra được cách hoạt động của "nó" rồi đúng không nào. Giờ hãy cùng đi vào chi tiết hơn các bước hoạt động của "nó" nha.

2. Các bước thực hiện Jump Search

Giả sử chúng ta có bài toán:

Input: list A có size là n
Output: Vị trí phù hợp với search key hoặc -1 nếu không tìm thấy.

Các bước thực hiện:

Bước 1 Xác định size của list đã được sort: n = len(A) Bước 2 Xác định size của một block: m = √n Bước 3 Từ vị trí đầu tiên: i = 0, chúng ta lặp lại với mỗi bước là m cho đến khi đến kết thúc. Bước 4 So sánh A[i+m] với item (i+m là vị trí cuối cùng của một block) :

  • Nếu A[i+m] == item, thì return i+m và kết thúc.
  • Nếu A[i+m] > item, thực hiện Linear Search trong một block được gọi là list B = A[i+m]. Tiếp tục lặp lại cho đến khi tìm thấy và return về kết quả phù hợp i nếu tìm thấy rồi sau đó kết thúc.
  • Nếu A[i+m] < item, tiếp tục bước lặp tiếp theo cho Bước 4.
    Bước 5 Đến khi tìm được i phù hợp thì return và kết thúc. Nếu không tìm thấy kết quả phù hợp nào, trả về -1.

Các bước chỉ có như vậy, giờ chúng ta hãy triển khai nó bằng code Python nha.

3. Implementation

Trước khi thực hiện Jump Search, chúng ta hãy implement function linear_search trước để phục vụ cho bước 4b và 5 nha.

'''
Linear Search function
Arguments:
B - The derived list
item - Element for which the index needs to be found
loc - The Index where the remaining block begins
''' def linear_search(B, item, loc): print("\t Entering Linear Search") i = 0 while i != len(B): if B[i] == item: return loc+i i += 1 return -1

Sau khi có được function linear_search rồi, chúng ta tiếp tục đến "món chính" nào. Function jump_search sẽ nhận 2 tham số là list A và phần tử cần tìm. Hàm math.sqrt() sử dụng để tìm kích thước của block.

'''
Jump Search function
Arguments:
A - The source list
item - Element for which the index needs to be found
'''
import math def jump_search(A, item): print("Entering Jump Search") n = len(A) # Length of the array m = int(math.sqrt(n)) # Step length i = 0 # Starting interval while i != len(A)-1 and A[i] < item: print("Processing Block - {}".format(A[i: i+m])) if A[i+m-1] == item: # Found the search key return i+m-1 elif A[i+m-1] > item: # Linear search for key in block B = A[i: i+m-1] return linear_search(B, item, i) i += m B = A[i:i+m] # Step 5 print("Processing Block - {}".format(B)) return linear_search(B, item, i)

Kết luận

Trong bài viết này, mình chỉ đề cập đến cách hoạt động của Jump Search cũng như cách triển khai chúng trên phương diện code của Python.
Cảm ơn các bạn đã đọc bài. Nếu chưa hài lòng về bài viết, hãy comment phía dưới. Còn nếu bài viết này hữu ích, đừng ngần ngại cho mình xin 1 upvote để lấy động lực viết những bài tiếp theo nha.

Thank you!

Related links:

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thuật toán quay lui (Backtracking)

Quay lui là một kĩ thuật thiết kế giải thuật dựa trên đệ quy. Ý tưởng của quay lui là tìm lời giải từng bước, mỗi bước chọn một trong số các lựa chọn khả dĩ và đệ quy.

0 0 38

- vừa được xem lúc

Các thuật toán cơ bản trong AI - Phân biệt Best First Search và Uniform Cost Search (UCS)

Nếu bạn từng đọc các thuật toán trong AI (Artificial Intelligence - Trí tuệ nhân tạo), rất có thể bạn từng nghe qua về các thuật toán tìm kiếm cơ bản: UCS (thuộc chiến lược tìm kiếm mù) và Best First Search (thuộc chiến lược tìm kiếm kinh nghiệm). Khác nhau rõ từ khâu phân loại rồi, thế nhưng hai th

0 0 152

- vừa được xem lúc

Sử dụng vector trong lập trình C++ - giải bài toán lập trình muôn thủa

Chào buổi tối mọi người, hôm nay lang thang trên mạng bắt gặp bài toán quen thuộc một thời của quãng đường sinh viên IT. Đấy chính là câu số 1 trong đề thi dưới đây:.

0 0 35

- vừa được xem lúc

MÔ PHỎNG THUẬT TOÁN VƯƠNG HẠO TRONG PROLOG

. 1. Các luật suy diễn trong thuật toán Vương Hạo. Luật 1: Chuyển vế các giả thuyết và kết luận ở dạng phủ định. Ví dụ: p v q, !(r ^ s), !q, p v r -> s, !p <=> p v q, p v r, p -> s, r ^ s, q.

0 0 76

- vừa được xem lúc

A* Search Algorithm

What is A* Search Algorithm. How it works. . Explanation.

0 0 42

- vừa được xem lúc

Thuật toán tính nhanh nghịch đảo căn bậc 2.

Mở đầu. Vào khoảng những năm 2002, 2003, khi mã nguồn của tựa game Quake 3 Arena được chuyển thành mã nguồn mở, người ta đã tìm ra một hàm tính ra được giá trị nghịch đảo của căn bậc 2 một cách nhanh chóng, được biết đến rộng rãi với cái tên Fast inverse square root.

0 0 48