加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 试图证明二进制搜索的复杂性是O(log(n))

发布时间:2020-12-15 04:10:39 所属栏目:Java 来源:网络整理
导读:我试图证明二进制搜索的复杂性.维基百科说,最糟糕的情况是log(n).这意味着: 如果我有16个元素的数组,log(16)是4.我应该有最多4次调用来查找数组中的元素. 我的java代码: class Main{ int search(int[] array,int number,int start,int end) { System.out.p
我试图证明二进制搜索的复杂性.维基百科说,最糟糕的情况是log(n).这意味着:

如果我有16个元素的数组,log(16)是4.我应该有最多4次调用来查找数组中的元素.

我的java代码:

class Main{
      int search(int[] array,int number,int start,int end) {
            System.out.println("Method call");
            int half = (end - start) / 2;

            if (array[start + half] == number) {
                return array[start + half];
            }
            if (array[start + half] < number) {
                return search(array,number,start + half,end);
            } else {
                return search(array,start,end - half);
            }
        }

        public static void main(String[] args) {
            int[] array = new int[] { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
            for (int i : array) {
                System.out.println(i);
                new Main().search(array,i,array.length);
            }
        }
    }

Ideaone代码:http://ideone.com/8Sll9n

输出是:

1
Method call
Method call
Method call
Method call
Method call
2
Method call
Method call
Method call
Method call
3
Method call
Method call
Method call
4
Method call
Method call
Method call
Method call
5
Method call
Method call
6
Method call
Method call
Method call
Method call
7
Method call
Method call
Method call
8
Method call
Method call
Method call
Method call
9
Method call
10
Method call
Method call
Method call
Method call
11
Method call
Method call
Method call
12
Method call
Method call
Method call
Method call
13
Method call
Method call
14
Method call
Method call
Method call
Method call
15
Method call
Method call
Method call
16
Method call
Method call
Method call
Method call

一切都很好,除了搜索1.我有5个“方法调用”,这意味着5大于log(16).

我的假设是,我可能错了计算电话.有人能告诉我哪里错了吗?

解决方法

对于大小为n的输入的二进制搜索的复杂度是对于a> 0的O(loga n). 1.算法的本质表明a = 2,因为在每次迭代时搜索空间都减半.

您提供的代码也正常工作.关于算法复杂性的混淆已经发生,因为您忽略了Big-Oh表示复杂性中隐藏的常量.

陈述f(n)= O(g(n))表示f(n)≤cg(n).在你的情况下,你忘了承认这个常数c. c可能非常大到100000000000或小到0.000000001.这是与Big-Oh表示法相关的一个问题.对于许多实际目的,由于涉及非常大或小的常数,渐近更复杂的算法可能会执行渐近更简单的算法.

例如,与算法h = 0(n2)相比,算法g = 0(1000000000n)将给出差的性能,因为n <1. 10亿. 因此,结论是,由于隐藏常量的参与,您无法仅通过计算执行的指令数来证明算法的复杂性.你需要有严格的数学方法来获得证据. 例如,对于输入大小n = 10执行100条指令的算法f可以是,O(n)如果c为10,则f(n)= O(10 n). O(n2)如果c为1,则f(n)= O(1 n2). O(n3)如果c为0.1,则f(n)= O(0.1n3).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读