微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

二分查找需要维护高低变量吗?

如何解决二分查找需要维护高低变量吗?

我只使用 n 来实现它,因为无论如何低都会是 0,但是谈论“正确的算法方式”是否有必要存在高和低变量?我的实现:

public class ArrayBinarySearch {


    static int binarySearch(int[] a,int n,int key) {
        int mid = n / 2;

        if (key >= a[mid]) {
            for (int i = mid; i < n; i++) {
                if (a[i] == key)
                    return i;
            }
        }

        if (key < a[mid]) {
            for (int i = 0; i < mid; i++) {
                if (a[i] == key)
                    return i;
            }
        }

        return -1;
    }


    public static void main(String[] args) {
        int[] a = {
            1,2,3,6,8,10,29
        };
        int find = 29;

        int posn = binarySearch(a,a.length,find);

        if (posn == -1) {
            System.out.println("Not Found");
        } else {
            System.out.println("Found at " + (posn + 1));
        }

    }
}

解决方法

您没有实现适当的二分查找。

或者换一种说法:“真正的”二分搜索会多次递归搜索空间的一半,直到找到该值(或决定找不到该值)。

您的代码仅将搜索空间减半一次:您决定数组的哪一半可能包含相关数据,然后对该一半进行线性搜索。

对于小型数组,您实现的代码将非常接近相同的性能(在某些极端情况下甚至可能会快一点),但对于大型数组,您将拥有比实际更多的访问权限必要的。

例如,如果您有一个包含 4000 个元素的数组,那么正确的二分搜索最多需要 12 次比较才能找到该元素(因为每次比较都将可能的位置数量减半)。

您的实现最多需要 2001 次比较才能找到元素。

并回答您的具体问题:是的,适当的二进制搜索需要两端,否则您将无法区分要搜索数组的哪一部分。可能是数组的前半部分,第二部分,第三部分 1/8,...

只有极少数所有可能的子集从数组的开头(或正好中间)开始搜索。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。