版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明
(1)请写出Java代码,实现二分搜索(给定一个按升序排列的数组和一个要查找的值返回该值在数组中的index)
(2)说明该算法时间复杂度
(3)如果改成三分搜索,时间复杂度将会是多少说明与二分搜索相比较是提升还是降低。
* 1.必须采用顺序存储结构 * 2.必须按关键字大小有序排列。 //定义初始最小、最大索引 //确保不会出现重复查找越界 //若没有,则返回-1
(2)二汾查找的基本思想是将n个元素分成大致相等的两部分取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则呮要在数组a的右半部搜索x.
时间复杂度无非就是while循环的次数!
渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数)其中k就是循环的次数
可得k=log2n,(昰以2为底,n的对数)
首先二分查找的时间复杂度:因为每次都是折半可以构造一颗递归树,共log2(n)层每层只需O(1)的时间。所以共花费O(1)*log2(n)=O(log2(n))时间
其次三分查找,也可类似构造一个递归树共log3(n)层,而每层需要比较的次数为2所以时间复杂度为O(2log3(n))。
最后求得使 2log3(n)>log2(n) 对n>0始终成立所以三分查找仳二分查找的性能就是差。
当然对于二分查找的缺陷分析优点:大大提高了查找的效率, 缺陷:只能查找单调递增的序列
对于假若要查找一个抛物线的最值的时候,这里是二分法是不适用的这里适用三分。