java – 试图证明二进制搜索的复杂性是O(log(n))
我试图证明二进制搜索的复杂性.维基百科说,最糟糕的情况是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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |