二分查找:

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
  原理:假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成左、右(左边小一些)两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找左子表,否则进一步查找右子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

特征:1)序列有序;2)可以随机访问
争议:表必须有序,表可以顺序方式存储,也可以链表方式存储。有人说,表只能顺序存储;但也有人说,折半查找也可以用跳表实现,跳表即不是顺序存储。跳表维基百科

时间复杂度: O(log2N)

我们首先来看一下实现代码:
非递归方式

int
BinarySearch(const ElementType A[ ], ElementType X, int N)
{int Low, Mid, High;Low = 0; High = N - 1;while( Low <= High ){Mid = ( Low + High ) / 2;if( A[Mid] < X )Low = Mid + 1;elseif( A[Mid] > X )High = Mid - 1;elsereturn Mid;  /* Found */}return NotFound;   /* NotFound is defined as -1 */
}

时间复杂度分析Tworst(N)

显然,每次迭代在循环内的所有工作花费为O(1)。
二分查找每次排除掉一半的不适合值,所以对于N个元素的情况:

一次二分剩下:N/2
两次二分剩下:N/2/2 = N/4

M次二分剩下:N/(2M)

在最坏情况下是在排除到只剩下最后一个值之后得到结果,即

N/(2M)=1

所以由上式可得 : 2M=N ⇒ \Rightarrow ⇒ T(N) = log2(N)

递归方式

int
BinarySearchRecursion(const ElementType A[ ], ElementType X, int Start, int End)
{/* 1 */ if( Start > End )return NotFound;   /* NotFound is defined as -1 *//* 2 */   int Mid = ( Start + End ) / 2;
/* 3 */ if(X == A[Mid])return Mid;     /* Found */elseif(X < A[Mid])
/* 4 */     BinarySearchRecursion(A, X, Start, Mid - 1);else if(X > A[Mid])
/* 5 */     BinarySearchRecursion(A, X, Mid + 1, End);
}

T(N)是求解大小为N的二分法排序问题所花费的时间。如果N = 1,则上面算法执行程序第1行到第3行,花费某个时间常量,我们称之为一个时间单元.于是,T(1) = 1。其余就是第4行,第5行上的运行工作。这两行求解大小为N/2的二分法排序问题。假设N为偶数,因此这两行花费之和**总是T(N/2)**个时间单位,于是我们得到方程组:
{ T ( 1 ) = 1 T ( N ) = T ( N / 2 ) + O ( 1 ) \begin{cases} T(1) = 1 \\ T(N) = T(N/2) + O(1) \end{cases} {T(1)=1T(N)=T(N/2)+O(1)​
为了简化计算,我们可以用1代替上面方程中的O(1)项;由于T(N)最终还是要用大O来丧示的,因此这么做并不影响答案。
至于现在,T(N) = T(N/2) + 1,且T(1) = 1,那么T(2) = 1+1,T(4) = 2+1,T(8) = 3+1,T(16) = 4+1。
其形式是显然的并且可以得到T(N) = log2N + 1 = O(log2N)

附:
算法时间复杂度比较图

《数据结构与算法分析》-----Mark Allen Weiss
二分查找时间复杂度计算与分析

二分查找与时间复杂度计算分析相关推荐

  1. 二分查找法时间复杂度计算

    1.直接由公式进行计算,当然也可以直接从程序推导

  2. 二分查找的时间复杂度分析

    话不多说,先上代码 : public int binarysearch (int []array,int value ){int begin =0;int end = array.length -1; ...

  3. 算法 二分查找的时间复杂度为O(log2N)的原因推理

    时间复杂度概念还不清楚的可以先看我的下面这个文章: https://blog.csdn.net/u010452388/article/details/80875958 由于二分查找每次查询都是从数组中 ...

  4. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  5. 二分查找的时间复杂度以及算法

    ​ 给定一个规模为n的按照数字从小到大排序的数组,快速查询x元素在数组中的位置 示例: 数组:[1,3,6,9,14,35,67] 查找的值:9输出:3 1.计算数据规模为n二分查找的时间复杂度 循环 ...

  6. 二分查找的时间复杂度

    计算二分查找函数的时间复杂度,我们需要对代码进行分析:我们用二分查找法查找数据时,查找一次后可以筛去一半的数据,经过一次次的筛选,最后会使得待查数据只剩一个,那么我们查找的次数就是while循环执行的 ...

  7. php二分查找算法时间复杂度,一个运用二分查找算法的程序的时间复杂度是什么...

    一个运用二分查找算法的程序的时间复杂度是"对数级别".二分查找是一种效率较高的查找方法,算法复杂度即是while循环的次数,时间复杂度可以表示"O(h)=O(log2n) ...

  8. C++二分查找,时间复杂度是O(logn)

    二分查找属于一种简单却高效的算法,时间复杂度是O(logn),在二分查找之前需要先对其进行排序,C++里面的默认是升序,如果需要降序,需要进行一下修改: //C++排序是升序还是降序 //a>b ...

  9. 二分查找及时间复杂度

    1.搜索 搜索是在一个项目集合中找到一个特定项目的算法过程.搜索通常的答案是真或假,因为该项目是否存在.搜索的几种常见方法:顺序查找.二分法查找.二叉树查找.哈希查找. 2.二分法查找 二分法查找又称 ...

最新文章

  1. Apache Tomcat 7.0.93 发布,开源 Java Web 应用服务器
  2. Java的新项目学成在线笔记-day12(六)
  3. 半径为r的均匀带电球体_半径为R的均匀带电球面,总带电量为Q,设无穷远处的电势为零,则距离球心为r(r=R)的P点处的电场强度的大小和电势为...
  4. 七天入门图像分割(1):图像分割综述
  5. 带用户名和密码的GitHub链接
  6. 自然语言处理中的预训练模型 —— 邱锡鹏老师的演讲记录
  7. iOS-关于一些手势冲突问题(scrollView 嵌套 tableView)
  8. BASE64学习小记
  9. 后端传到前端的字符串如何在pre标签中实现换行
  10. 多点温度检测上位机显示_多点温度检测系统设计(论文)
  11. 携程景区爬取 + 保存Excel
  12. Eclipse 设置护眼背景色
  13. AIRPLAY镜像音频数据的处理
  14. 教程 | 阿克曼结构移动机器人的gazebo仿真(一)
  15. 前端 纯源生js 数字流(全代码)
  16. Blender齿轮制作
  17. 关于SaaS运营的不成熟的小建议
  18. 听运营者们分享背后的故事 2017网易易盾成就内容安全王道
  19. UnityShader——挺进体积光
  20. 我的贝尔宾团队角色。

热门文章

  1. 软件工程实践2017——软件产品案例分析
  2. 迅雷大乱,突现“两个迅雷”
  3. 江开计算机应用基础第二次形考,江开计算机应用基础第二次形考作业
  4. Objective_C学习笔记
  5. Redis持久化——AOF机制详解
  6. win7 台式电脑怎么调节屏幕亮度
  7. python学习之——综合小游戏
  8. [学习][笔记]C++/WinRT入门 01Hello world
  9. [文档和源码分享]C++实现的基于α-β剪枝算法的井字棋游戏
  10. 电脑快捷键快速打开截图快捷方法