二分查找的实现及使用场景

2020-10-15  本文已影响0人  文景大大

一、二分查找的实现

对于给定的已经有序的数列,我们需要在该数列中查找是否存在某个元素。

每次都与数列最中间的元素进行比较,可以缩小一半的查找区间,直至找到目标元素或者区间被缩小为0,元素不存在。比如下面的数列中,我们想要查找元素19,那么大致的过程就是这样的:

二分查找过程示意图

使用代码实现如下:

    public static void main(String[] args) {
        int[] data = {8, 11, 19, 23, 27, 33, 45, 55, 67, 98};
        int result = binarySearch(data, data.length, 19);
        log.info("查找元素19的位置是:{}", result);
    }

    public static int binarySearch(int[] data, int size, int target) {
        int low = 0;
        int high = size - 1;

        while (low <= high) {
            int middle = (low + high) / 2;
            if (data[middle] == target) {
                return middle;
            } else if (data[middle] < target) {
                low = middle + 1;
            } else {
                high = middle - 1;
            }
        }

        log.info("元素{}查找不存在!", target);
        return -1;
    }

二分查找的时间复杂度是O(logn),对数阶时间复杂度的算法效率非常高。

二、二分查找的特点及使用场景

二分查找必须依赖以下条件才能发挥作用:

三、二分查找相关的变体

四、总结

在实际的查找业务场景中,凡是可以使用二分查找的问题都可以使用散列表和二叉查找树来完成,而且后面两者的使用频率要更高。

什么情况下才使用二分查找呢?用于求解近似查找的问题上,比如上面描述的四种二分查找变体问题,而这类问题使用散列表、二叉查找树或者别的数据结构和算法就不太好实现。

上一篇 下一篇

猜你喜欢

热点阅读