二分查找算法介绍及实现-程序员宅基地

技术标签: 算法  数据结构与算法  二分查找法  数据结构  

一、基本概念

二分查找法(Binary Search)算法,也叫折半查找算法。二分查找针对的是一个有序的数据集合,查找思想有点类似于分治思想。每次都通过跟区间的中间元素对比,将带查找的区间缩小为之前的一半,知道找到要查找的元素,或者区间被缩小为0。二分查找是一种非常非常高效的查询算法,时间复杂度未O(logn)。

 

二、算法实现

二分查找法Java实现:

非递归方法:

public int bsearch(int[] a, int n, int value) {

  int low = 0;

  int high = n - 1;

  while (low <= high) {

    int mid = (low + high) / 2;

    if (a[mid] == value) {

      return mid;

    } else if (a[mid] < value) {

      low = mid + 1;

    } else {

      high = mid - 1;

    }

  }

  return -1;

}

实际上,mid=(low+high)/2 这种写法是有问题的。因为如果 low 和 high 比较大的话,两者之和就有可能会溢出。改进的方法是将 mid 的计算方式写成 low+(high-low)/2。更进一步,如果要将性能优化到极致的话,我们可以将这里的除以 2 操作转化成位运算 low+((high-low)>>1)。因为相比除法运算来说,计算机处理位运算要快得多。

 

递归实现

public int bsearch(int[] a, int n, int val) {

  return bsearchInternally(a, 0, n - 1, val);

}

private int bsearchInternally(int[] a, int low, int high, int value) {

  if (low > high) return -1;

  int mid =  low + ((high - low) >> 1);

  if (a[mid] == value) {

    return mid;

  } else if (a[mid] < value) {

    return bsearchInternally(a, mid+1, high, value);

  } else {

    return bsearchInternally(a, low, mid-1, value);

  }

}

 

三、局限性

二分查找算法的局限性:

1、二分查找法依赖的是顺序表结构,简单点来说就是数组。主要原因是二分查找方法需要按照下标随机访问元素。如果使用其他数据结构,时间复杂度就会提高。

2、二分查找针对的是有序数据。所以二分查找只能在插入、删除操作不频繁,一次排序多次查找的场景中;

3、数据量太小不适合二分查找,如果要处理的数据量很小,顺序遍历就够了。不过,如果元素直接的比较操作非常耗时,例如字符串之间的比较,不管数据量大小,都推荐使用二分查找算法。

4、数据量太大也不适合用二分查找,因为二分查找依赖于顺序存储结构,要求内存空间连续,如果数据量很大的情况下,可能存在空间不够分配的困难。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/haochajin/article/details/101050294

智能推荐

thinkphp隐藏index.php-程序员宅基地

文章浏览阅读290次。将下列几行代码添加至public/.htaccess中。最后重启小皮就可以成功隐藏index.php。找到对应要隐藏的网址的文件。_thinkphp隐藏index.php

安全态势感知之我见_企业安全态势感知-程序员宅基地

文章浏览阅读1.3k次。上世纪九十年代,“态势感知”带着它引以为傲的军方(美国空军)血统,空降到信息安全领域。经过几十年的演进,态势感知已经“身居高位”,在美国的国家安全和其他个别行业得到了极大的发展和应用。其目前的标准定义是“在一定的时间和空间范围内,企业的安全态势及其威胁环境的感知。理解这两者的含义以及意味的风险,并对他们未来的状态进行预测。”该定义决定了安全态势感知平台不应该是一个传统的安全攻防产品,而是一个兼具数据分析和异常检测的发现预警平台。在国内,最近几年,尤其是随着2018年国家《网络安全法》的出台,安全态势感知迅_企业安全态势感知

论道攻防|内网防护三大神器带你“行兵布阵”_内网横向威胁感知解决方案-程序员宅基地

文章浏览阅读554次。近年来,随着全球范围内网络实战发生的频率越高,采用的技术难度越高,各国之间也加大对攻防演练的重视。不管是网络实战还是攻防演练的对抗过程中,防守方不仅要防止外部突破,也要。在网络安全形势日趋复杂的环境下,攻击手段层出不穷,攻击工具日益先进。比如,黑客在取得外网可访问的单台服务器权限后,下一步往往以所控制的服务器为跳板向未直接暴露在公网的内网服务器进行进一步渗透。此外,。为了防止企业或机构的内网被攻击者当做后花园畅游,乃至被拖库后还不自知等情况发生,。_内网横向威胁感知解决方案

《LeetCode之每日一题》:88.最长湍流子数组-程序员宅基地

文章浏览阅读108次。最长湍流子数组有关题目题解题目链接:最长湍流子数组有关题目当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组:若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。也就是说,如果比较符号在子数组中的

hdu 6712 sakura_av6712-程序员宅基地

文章浏览阅读338次。公式的话官方题解已经非常详细,这里就不再写公式了,大致推导为n步有x+y步是j,k两维移动,有n-x-y步是在i轴上移动。 在x+y的两维中,有y步是在y轴上移动,x步在x轴上移动。然后算上C(n,x+y)*C(x+y,x)*t1^(x/p)*t2(y/p)。就是每个点的贡献。这题卡常卡的太恶心了。#include"bits/stdc++.h"using namespace std;ty..._av6712

解决navigator.geolocation.getCurrentPosition 百度地图定位不准的问题-程序员宅基地

文章浏览阅读1.5w次。最近在做Vue项目中定位时,发现定位总有偏差,查阅资料后发现用navigator.geolocation.getCurrentPosition取到的经纬度属于WGS84坐标,并不能直接用在百度地图的 构建map的point中,需要做转换。转换前代码(贴上主要代码):navigator.geolocation.getCurrentPosition((position) => { const lat = position.coords.latitude; const lng...

随便推点

博客导航技术索引-程序员宅基地

文章浏览阅读484次。一 读书分享微信读书/知乎严选/京东读书…方法论《如何高效学习》《番茄工作法图解》《刻意练习》《你一年的8760小时》…素质提升《逆商:我们该如何应对坏事件》《关键对话》《非暴力沟通》《逆商》…人物传记《特斯拉》《达芬奇》…IT技术书籍笔记后台《Java编程的逻辑》前端Android《Android进阶之光》《第一行代码》…小程序官方文档数据《python》二 资源分享好的学习资料 = 技术文档 + 源代码 + 视频三 个人博客导航M_博客导航

【Java二十周年】Delphi转行java的一些小感触-程序员宅基地

文章浏览阅读9.2k次。本文纯属一届小码农对java使用过程的体验感触 目录:初遇java编程语言与java的擦肩深入java跨平台性开源支持web的支撑初遇java编程语言刚上大学的时候,完全是个电脑盲。刚入学学的计算机普及知识就是visual basic语言,可视化的组件编程语言,这个语言跟我第一份工作Delphi语言的是一个性质的,都是拖放控件,实现可视化开发,跟现在用着的extjs 中architec

OPC服务器开发之WtOPCSvr(2)_wtopcsvr.dll 安装-程序员宅基地

文章浏览阅读1.7k次。在物联网兴起之前,OPC这玩意就出来了,但是知道和用的人并不多。 OPC技术从某些角度来说,可以说还是掌握在比较少数的一部分人手中。这可能也是由于工控行业相对闭塞和保守的原因造成的。 就目前来说关于OPC开发的SDK或者开源项目还是比较多的,我就说几个基于C++的主流项目,LightOPC、OpcWorkshop、WtopcSvr,国内的也还有一些公司就是基于这几个主流项目然后发布..._wtopcsvr.dll 安装

计算机网络(Computer Networking)基础知识--第二章--应用层_计算机网络外文第二章-程序员宅基地

文章浏览阅读914次。第二章 应用层(Application Layer)首先在这里再次声明一下,本系列博客内容参考北京交通大学软件学院计算机网络课程的教学资料,参考教材为英文教材:《Computer Networking- A Top-Down Approach》。编者英文水平有限,如有部分翻译不准确的地方,还请大家帮忙指正。本系列博客仅供计算机爱好者学习交流使用,未经允许禁止任何形式二改二传及任何个人或商业用途。本章将介绍应用层的内容,应用层主要是为了提供网络功能的一个层,网络应用是计算机网络存在的理由。本章中,我们会_计算机网络外文第二章

zz 圣诞丨太阁所有的免费算法视频资料整理-程序员宅基地

文章浏览阅读125次。 首发于太阁实验室关注专栏 写文章 圣诞丨太阁所有的免费算法视频资料整理Ray Cao · 12 小时前感谢大家一年以来对太阁实验室的支持,我们特地整理了在过去一年中我们所有的原创算法类视频,均为免费观看,方便大家学习。先放一个ACM大神讲解的算法题视频(国外传优酷真的是太不容易了……)。..._太阁ccie版本视频下载

Linux root初始密码设置_ubuntu设置root用户密码时密码不通过字典检查吧-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏7次。Ubuntu刚安装后,不能在terminal中运行su命令,因为root没有默认密码,需要手动设定.以安装ubuntu时输入的用户名登陆,该用户在admin组中,有权限给root设定密码.给root用户设置密码的具体步骤:1. 打开一个terminal,然后输入下面的命令  sudo passwd root回车后会出现让你输入原始密码,新密码和确认密_ubuntu设置root用户密码时密码不通过字典检查吧

推荐文章

热门文章

相关标签