算法之二分查找(上)

文章来源:http://blog.seclibs.com/算法之二分查找上/算法

二分查找在平时的生活中也挺经常使用的,好比说之前玩的猜数游戏,每次都取中间数,而后得知是大了,仍是小了,这个例子也就是二分查找。数组

好比下面的这个例子,要查找有没有数值19,其中low和high是查找的区间的下标,mid是查找区域的中间值的下标。数据结构

二分查找的思想是比较容易理解的,并且它的时间复杂度也是比较低的。假设数据大小为n,每次查找完后都会缩小一半,即为除以2,最坏的状况也就是一直到查找空间为空的时候,因此它们的变化为n,n/2,n/4,n/8,…,n/2k,当n/2k=1时,k即为缩小的次数,由于每次都只涉及到两个数的大小比较,因此k次操做的时间复杂度为O(k),又由于n/2k=1,因此k=log2n,时间复杂度也就是O(logn),这是一个很是恐怖的数量级了,好比n为2的32次方,大约是四十多亿,用二分查找来查找里面的一个数的话,最多比较32次也就能够获得这个值了,这是一个很是恐怖的状况。blog

上面的原理已经很明确了,因此二分查找的实现并非很复杂,可是有一个前提条件,有序数组中不存在重复元素,只有在这个状况下,二分查找的实现才是相对简单的,具体的实如今下一篇文章里说起。排序


虽然二分查找时间复杂度低,查找起来很是高效,但它也有必定的适用条件的。游戏

首先,二分查找是依赖于数组的,若是使用其余的数据结构来实现的话,二分查找的时间复杂度将会变的很是高,由于数组在下标随机访问的时候,时间复杂度是O(1),而链表随机访问的时间复杂度是O(n)。内存

并且它必须是有序的,前面也说过排序算法,时间复杂度最低的为O(nlogn),若是使用的场景是没有大量的插入和删除操做,一次排序能够屡次查找的状况,那排序所的成本就能够被均摊,不然二分查找将再也不适用,动态数据集合的查找,咱们须要使用其余的算法才能够。文档

最后就是要注意要查找的数据量不能太大或者过小,过小的话,遍历就足以知足;太大的话,由于它是基于数组这种数据结构的,它所须要的连续的内存空间就是一个很是大的障碍。get


参考文档博客

极客时间-数据结构与算法之美

文章首发公众号和我的博客

公众号:无意的梦呓(wuxinmengyi)

博客:http://blog.seclibs.com/

相关文章
相关标签/搜索