Jump Search

Giống như Binary Search Jump Search là một thuật toán tìm kiếm trên mảng đã được sắp xếp.

Ý tưởng của Jump Search là làm sao để giảm kiểm tra các phần tử ít hơn bằng cách nhảy về phía trước một khoảng các cố định để bỏ qua một số phần tử.

Jump Search

Ví dụ: Cho mảng arr[] có size là và bước nhảy là m. Chúng ta sẽ tìm các phần tử tại vị trí arr[0], arr[m], arr[2m]… arr[km] cứ thế cho đến khi chúng ta tìm được khoảng k (k >=0) thoả arr[km] < x < arr[(k + 1)m], chúng ta sẽ thực hiện Linear Search từ vị trí km đến (k+1)m để tìm ra phần tử X.

Thực hành: Chúng ta có mảng arr[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610)}, n = 16, X = 55. Giả sử bước nhảy là 4. Chúng ta có

B1: Nhảy từ 0 đến 4 -> không thoả arr[km] < x < arr[(k + 1)m]
B2: Nhảy từ 4 sang 8 -> không thoả arr[km] < x < arr[(k + 1)m]
B3: Nhảy từ 8 sang 12 -> thoả arr[km] < x < arr[(k + 1)m] 
B4: Thực hiện Linear Search từ 9 đến 12 để tìm X = 55

Implement 

import java.util.*;

public class Main {

    static int jumpSearch(int arr[], int x, int n)
    {
        // So khoang cach nhay
        int step = (int)Math.sqrt(n);

        // Tim kiem khoang k thoa arr[km] < x < a[(k+1)m]
        int prev = 0;
        while (arr[Math.min(step, n)-1] < x)
        {
            prev = step;
            step += (int)Math.sqrt(n);
            if (prev >= n)
                return -1;
        }

        // Thuc hien linear search
        while (arr[prev] < x)
        {
            prev++;
            // Neu khong tim thay trong khoang km -> (k+1)m
            if (prev == Math.min(step, n))
                return -1;
        }

        if (arr[prev] == x)
            return prev;

        return -1;
    }

    public static void main(String[] args) {
        int arr[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21,
                34, 55, 89, 144, 233, 377, 610 };
        int x = 55;
        int n = arr.length;


        int index = jumpSearch(arr, x, n);

        System.out.println(index != -1 ? index : "Khong tim thay");

    }
}

Output: 10

độ phức tạp: O(n)

Note: Kích thước tối ưu cho mỗi bước nhảy là n, với cách tính này sẽ làm cho độ phức tạp của Jump Search là O(n).

 
0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x