OI中的二分查找

简介: 简要介绍二分查找的优势,思想与做法。

二分查找

  • 引入
    试想这么一个场景:你在翻阅花名册(按照字母顺序排列)中寻找一位姓氏首字母为P的同学的名字时,是会从花名册的第一行开始寻找,还是会从花名册大约中间部位开始寻找?
    相信所有人都会选择后者的方法,因为这种方法的时间复杂度会低很多,其实这就运用了二分查找的思想。

  • 正文
    再次分析一下上文引入的例子,具体化我们要做的事:首先从中间将花名册分为两部分,比较要找的对象和分割处的名字。如果分割处的名字就是要找的对象,那么寻找过程结束。如果名字在分割点的前面,那么对前面那一部分再进行寻找,反之则反。

  • 核心代码

    int name_find(int q){
    int l=1,r=n+1;//根据实际情况判定范围区间
    while(l<=r){ //这里是判定条件,要根据实际情况进行调整
      int mid=l+(r-1)/2; //避免数据溢出,当然如果确定不会溢出也可以直接用算数平均值
      if(a[mid]>=q) r=mid+1; //同理需要根据实际情况判定
      else l=mid+1;
      }
    if(a[l]==q) return l;
    else return -1;
    }
    
目录
相关文章
|
机器学习/深度学习 存储
[路飞]_leetcode-1508-子数组和排序后的区间和
leetcode-1508-子数组和排序后的区间和
|
搜索推荐 算法