二分查找时间复杂度计算与分析
2017-04-05 21:18
267 查看
二分查找:
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
概括之:1)序列有序;2)可以随机访问
争议:表必须有序,表可以顺序方式存储,也可以链表方式存储。有人说,表只能顺序存储;但也有人说,折半查找也可以用跳表实现,跳表即不是顺序存储。跳表维基百科
时间复杂度:T(logn)
我们首先来看一下实现代码:
分析:
因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:
一次二分剩下:n/2
两次二分剩下:n/2/2 = n/4
…….
m次二分剩下:n/(2^m)
在最坏情况下是在排除到只剩下最后一个值之后得到结果,即
n/(2^m)=1
所以由上式可得 : 2^m=n
进而可求出时间复杂度为: log2(n)
Any comments greatly appreciated.
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
概括之:1)序列有序;2)可以随机访问
争议:表必须有序,表可以顺序方式存储,也可以链表方式存储。有人说,表只能顺序存储;但也有人说,折半查找也可以用跳表实现,跳表即不是顺序存储。跳表维基百科
时间复杂度:T(logn)
我们首先来看一下实现代码:
public static int biSearch(int []array,int a){ int lo=0; int hi=array.length-1; int mid; while(lo<=hi){ mid=lo+(hi-lo)/2; if(array[mid]==a){ return mid+1; }else if(array[mid]<a){ lo=mid+1; }else{ hi=mid-1; } } return -1; }
分析:
因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:
一次二分剩下:n/2
两次二分剩下:n/2/2 = n/4
…….
m次二分剩下:n/(2^m)
在最坏情况下是在排除到只剩下最后一个值之后得到结果,即
n/(2^m)=1
所以由上式可得 : 2^m=n
进而可求出时间复杂度为: log2(n)
Any comments greatly appreciated.
相关文章推荐
- 二分查找时间复杂度分析
- 二分查找的时间复杂度计算
- 二分查找时间复杂度分析
- java 二分查找计算时间复杂度
- c语言实现线性表的建立,初始化,插入,删除,查找,遍历以及时间复杂度分析
- 分析时间复杂度&空间复杂度,以二分查找和斐波那契数的递归和非递归算法为例
- POJ2533, 最长上升子序列(贪心+二分查找时间复杂度O(nlogn))
- 三分查找的时间复杂度分析
- 二分查找 UVa 10487 - Closest Sums,时间复杂度为O(2nlogn)
- 二分查找时间复杂度的计算(转)
- 二分法时间复杂度计算分析
- 二分查找时间复杂度的计算
- 二分法查找时间复杂度计算
- 二分查找及其时间复杂度
- C++ 计算时间复杂度--斐波那契 --二分查找
- 二分查找时间复杂度的计算
- 二分查找以及二分查找的时间复杂度
- 从顺序查找窥探平均时间复杂度分析的一般化方法
- 二分查找时间复杂度的计算
- 二分法查找时间复杂度计算