• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 二分查找算法及变种的编码实现

二分查找算法及变种的编码实现

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了忍者神龟变种时代,变种鲨鱼人,变种蛇患,变种食人鳄,变种特工等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:二分查找算法及变种的编码实现
描述:

二分查找问题是比较经典而且面试中常考的问题,实现起来还是容易出问题,能够过关的不多,请问实现一个二分查找有哪些容易错的地方(比如小数的处理、数据相加的范围等)?

变种一:(多个公司的面试都喜欢出)如果有序序列发生偏移即把序列的后面一部分截取放在前面,比如:

11 13 1 2 4 7 9

此时再给定一个数,查找其在序列中是否存在(返回其位置),请问如何实现?

变种二:同上题描述,找出序列中最小元素位置。

变种三:给定任意一个序列,找出其中的一个谷/峰,谷的定义为两边的数均大于某个数。

请问面试中还遇到过哪些二分查找的变种?


解决方案1:

个人总结的几个变种(只是为了描述算法本身,为了简单不考虑越界等等异常情况),欢迎补充。

/*  
    二分查找的前提是数组有序
    二分查找的时间复杂度:O(lgn)
    以下列出二分查找的三种动机:
    1、查找满足条件的关键字的位置
    2、查找满足条件的最小位置
    3、查找满足条件的最大位置
    找不到返回-1,找到了则返回位置
*/

//动机1(原始模型):查找满足条件的关键字的位置
int BinarySearch(int *a,int l,int r)
{
    int m;
    while(l<=r)
    {
        m=(l+r)/2;
        if(a[m]==key)
            return m;
        if(a[m]>key)
            r=m-1;
        else
            l=m+1;
    }
    return-1;
}

//动机2:找满足条件的最小位置
int BinarySearch(int *a,int l,int r)
{
    int m,ans=-1;
    while(l<=r)
    {
        m=(l+r)/2;
        //满足条件
        if(ok())
            ans=m,r=m-1;
        else
            l=m+1;
    }
    return ans;
}

//动机3:找满足条件的最大位置
int BinarySearch(int *a,int l,int r)
{
    int m,ans=-1;
    while(l<=r)
    {
        m=(l+r)/2;
        //满足条件
        if(ok())
            ans=m,l=m+1;
        else
            r=m-1;
    }
    return ans;
}

//动机2、3十分相似,举一种常用情况:找小于等于某数的最大位置
int BinarySearch(int *a,int l,int r,int key)
{
    int m,ans=-1;
    while(l<=r)
    {
        m=(l+r)/2;
        if(key>=a[m])
            ans=m,l=m+1;
        else
            r=m-1;
    }
    return ans;
}

//变型1:找满足条件的最小数(double)
double BinarySearch(double l,double r)
{
    double m,ans;
    //保留n位小数就让精度为n+1位,比如要求保留3位小数就让精度为4位
    while(r-l>=0.0001)
    {
        m=(l+r)*0.5;
        if(ok())
            ans=m,r=m;
        else
            l=m;
    }
    return ans;
}

解决方案2:

说下第三个
要用三分法
记 l , m , r 分别为左端点、中端点、右端点。f(x) 为在x点的函数的值
取 lm = (l + m ) / 2 , rm = (m + r) / 2 ;

然后 比较 f(lm) f(rm)的关系 , 相应的更新l , m , r 就可以了

解决方案3:

  1. 对于输入的所有单词,使用排序算法使得所有单词按照字典序排列,然后用BS算法找到给定的单词的下标。
  2. 在给定的字符串序列中(按照字典序排列好的)存在一些空串,请你找出给定字符串的位置,不在里面返回 -1.
  3. 在一个排序好的数组中,有一些元素是重复的。 我们写一个函数,对给定的数,我们返回这个数出现的次数。
  4. 在行列排序的矩阵中里面需找某个元素,例如如下输入:
1 5 7 10
2 6 8 15
4 9 11 16
12 13 19 21

输入满足按行来看,是递增排序,按列也是递增排序,现在要是否存在某个元素。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 二分查找算法及变种的编码实现

相关文章

  • 2017-06-07 (golang)Go:如何交换slice中的两个元素?
  • 2017-06-07 php开发工具PHP有没有不依赖其他工具的调试IDE
  • 2017-06-07 我想问下那些API是怎么调用的
  • 2017-06-07 pythonsdk分块上传出现mismatchedkeylength,detail:UP/400
  • 2017-06-07 python爬虫(python)App消息提示后台怎么处理。
  • 2017-06-07 函数调用的地址问题
  • 2017-06-07 求助:关于opencl中CPU和GPU对double的计算问题
  • 2017-06-07 做网页平面设计半年多了,能不能给也推荐一本平面的书
  • 2017-06-07 七牛使用JavaScript上传文件,没有设置Key,为什么没有重命名为hash?
  • 2017-06-07 python简单问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Rails项目中如何将devise的登录页面作为系统首页?
    • 编程出现2个警告不知道出在哪求指点小白求解
    • (python)使用phantomjs打开页面不完整,是哪里出了问题?
    • phpapi调用问题
    • 降低laravel的报错级别
    • flask的g和session怎样理解啊?
    • 怎样获取alexa的排名?
    • (python)使用WhooshAlchemy报错'function'objecthasnoattribute'config'
    • java正则表达式语法java中re正则表达式的一个疑惑
    • java使用ArrayList时提示超出索引范围,如图

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有