二分查找(Binary search)

二分查找

概念
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二分查找有着惊人的查找速度 O(logn)

我们假设数据大小是n,每次查找后数据都会缩小为原来的一半。最坏情况下,直到查找区间被缩小为空才停止。
在这里插入图片描述
可以看出,这是一个等比数列。其中n/2k=1时,k的值就是总共缩小的次数。而每一次缩小操作只涉及两个数据大小的比较,所以,经过了k次区间的缩小操作,时间复杂度就是O(k)。我们可以求得k=logn,所以时间复杂度是O(logn)。
举个例子:我们在42亿个数据中超找一个数,用二分查找最多只需要比较32次(感觉不可思议吧)。

二分查找应用有什么局限性呢

首先二分查找依赖的是顺序表结构,简单点说就是数组
那二分查找是否可以依赖于其它的数据结构呢? 比如链表。答案肯定是不可以的,主要是二分查找算法要按照下表随机访问元素。而链表的随机访问复杂度是O(n)。所以,如果数据使用链表存储,二分查找的时间复杂度就会很高。

二分查找只能用于在数据是通过顺序表来存储的数据结构上。并且已经是进行过排序的顺序结构。如果使用其它数据结构存储,则无法应用二分查找。

其次,二分查找针对的是有序的数据。
二分查找对这一点要求比较苛刻,数据必须是有序的。如果数据无序,我们首先就是需要进行排序。排序最低的时间复杂度是O(nlogn)。所以,我们针对的是一组静态的数据,没有过多的插入删除操作,我们可以进行一次排序,多次二分查找。这样排序的成本就会降低。
如果经常需要插入删除,那我们就要频繁的排序,这样维护有序的数据结构成本就非常高。

下面的代码是实现了一些常见的二分查找的题目。
此篇博客参考于王争老师的课
代码和思想是自己理解后的实现。
在这里插入图片描述

#include<iostream>
#include<array>
#include<memory>
class search
{
   
public:
    int s1(int arr[], int len, int ser); //二分查找查找一个数
    int s2(int arr[], int len, int ser); //二分查找 找出第一个值等于给定的元素
    int s3(int arr[], int len, int ser);//查找最后一个值等于给定的元素
    int s4(int arr[], int len, int ser);//查找第一个大于等于给定元素的值
    int s5(int arr[], int len, int ser);//查找最后一个小于等于给定元素的值
};

int search::s1(int arr[], int len, int ser)
{
   
    int low = 0;
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值