二分查找以及数组下标的移动规律
二分查找算法
复杂度log2N\log_2Nlog2N
二分查找的前提是待查找的序列必须是有序的。另外一点,C++中的序列都是前闭后开的。如果使用STL,默认是递增顺序,递减的顺序需要自定义比较函数。二分查找可以自己实现或者使用STL的std::binary_search()
实现,后者只能给出需要查找的元素是否在某序列中,返回bool
值。然而,当我们需要知道元素的具体位置时,需要自己写一个二分查找算法。一下给出了两种方式,注意自定义函数的区间调整。
如果一个容器是有序的,而且元素可以使用==
运算符进行比较,那么完全可以使用库函数lower_bound()
执行二分查找,函数返回第一个大于等于目标元素的位置,如果所有元素都小于目标元素的迭代器,则返回尾后替代器;同时注意upper_bound()
函数,该函数也是执行二分查找,不过是返回第一个大于目标元素的迭代器。利用upper_bound
和lower_bound
之差可以记录相等元素的个数。。
不过,我们要自己掌握这种算法,自己写这种算法时,与STL的区别在于右侧也是闭区间,这样比较好记,而且容易寻找下标的规律。算法终止条件的核心是下界大于上界。下面给出代码:
#include <iostream>
#include <vector>
using namespace std;template<typename T>
int BinSearch(vector<T>vec, T key) {if(vec.empty()) {return -1;}int low = 0, high = vec.size() - 1;while(low <= high) {int mid = low + (high - low) / 2;if(vec[mid] == key) {return mid;} else if(vec[mid] > key) {high = mid - 1;} else {low = mid + 1;}}return -1;
}int main() {return 0;
}
二分查找下标的规律总结:
- 如果可以找到目标,分为两种情况,这两种情况对于子区间同样适用:
- 区间的两侧是目标:low=high=midlow=high=midlow=high=mid
- 恰好是mid=low+(low+high)/2mid=low+(low+high)/2mid=low+(low+high)/2,此时三者都不变
- 如果找不到目标,则low=high+1low=high+1low=high+1,此时的 midmidmid等于lowlowlow或者highhighhigh,由具体的运算情景决定
- 如果high=low+1high=low+1high=low+1时,在这里先不论是否有目标值,此时一定有:mid=lowmid=lowmid=low。假设我们此时还没找到元素,那么如果目标值小于midmidmid指示值,则highhighhigh移动向lowlowlow;否则lowlowlow移动向highhighhigh;最终mid=high=lowmid=high=lowmid=high=low。
二分查找以及数组下标的移动规律相关推荐
- 挑战程序设计竞赛部分题目选择排序、二分查找找出下标、深度优先算法、求三角形max周长、蚂蚁算法、操作excel
首先提供帮助类 可能这个类还需要更新 .求最大值.求最小值.选择排序.二分查找找出下标.二分查找排好序列里面是否有那个值 public class Util {//求最大值public static ...
- java 二分查找_Java数组之Arrays方法
Java数组之Arrays方法,拉勾IT课小编为大家分析,JAVA数组的一些方法,提升开发水平,增强技术开发水平,不断提升个人的技术能力,在对于java开发领域,很多人都从基础做起. 1. 数组的工具 ...
- 【leetcode】644 最大子段和 II(二分查找,数组)
题目链接:https://leetcode-cn.com/problems/maximum-average-subarray-ii/ 题目描述 给定一个包含 n 个整数的数组,找到最大平均值的连续子序 ...
- Java的Arrays类常用方法#冒泡排序#二分查找法#数组转换集合
数组高级冒泡排序 方法一:(冒泡排序) /** 冒泡排序* 1,返回值类型,void* 2,参数列表,int[] arr* * 第一次:arr[0]与arr[1],arr[1]与arr[2],arr[ ...
- 开花(在b数组中二分查找a数组元素)
注意: 代码一:二层循环暴力查找超时 代码二(最棒):借用STL set中的count()方法快速搞定,且没有超时so,集合查询应该很快注意:count()时间复杂度是线性变换的最坏的情况为O(n)s ...
- 使用选择排序和二分查找在数组中查找数据
<Java实用教程(第5版)微课版> ISBN 978-7-302-46425-9 p29 例子5 能判断用户输入的一个整数是否在已知的数组中.程序效果如下图: 输入整数,程序判断该整数是 ...
- 二分查找 —— 有序数组不小于(不大于)某数的第一个(最后一个)元素
1. 不小于某数的第一个元素 def bisearch(l, e, lo, hi):while lo < hi:mi = (lo + hi)//2if e > l[mi]: lo = mi ...
- leetcode算法算题记录-数组--二分查找
public class 二分查找 {//注: 数组为有序数组且数组中无重复元素是使用二分法的前提//704.二分查找 简单//给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 ta ...
- leetcode练习一:数组(二分查找、双指针、滑动窗口)
文章目录 一. 数组理论基础 二. 二分查找 2.1 解题思路 2.2 练习题 2.2.1 二分查找(题704) 2.2.2 搜索插入位置(题35) 2.2.3 查找排序数组元素起止位置(题34) 2 ...
最新文章
- java课设推荐,《Java程序设计》课程设计报告推荐.docx
- jquery通过val()取不到textarea中的值
- 数据库集群和高可用解决方案
- 快速搭建 Serverless 人脸识别离线服务
- Python 优先级
- [三]RabbitMQ-客户端源码之ChannelManager
- if判断用户名 linux,linux shell 之if-------用if做判断
- sharepointa嵌入HTML网页,显示存储在SharePoint文档文件夹中的HTML页面
- 2020 中国开源年会(COSCon'20)再启程:开源向善(Open Source for Good)
- 太原市中考计算机考试系统,太原中考报名系统
- idea(mac) 使用收集
- A few thoughts about Open Source Software
- delphi 调试控件代码_机器人调试(六十七)
- (转)两大量化交易巨头“抱团取暖”:Virtu14亿美元收购骑士资本
- python 执行py文件_python入门篇:python怎么运行?python如何运行py文件?
- 专业抠图软件Super PhotoCut Pro for Mac
- 高级钟点秘书——会议安排
- Rope3d数据集分析
- 网站一直不被收录怎么办,让网站收录更好的五个方法
- lucas–kanade_Lucas–Kanade光流算法学习
热门文章
- C语言编程规范(排版)
- 【已解决】ffmpy3.FFExecutableNotFoundError: Executable ‘ffmpeg‘ not found
- windows下编写dll
- Python3.x中set()集合的使用方法
- AttributeError: module ‘cv2.cv2‘ has no attribute ‘bgsegm‘
- SQL server 数据库基础知识之数据类型
- 洛谷P2881 [USACO07MAR]排名的牛Ranking the Cows(bitset Floyd)
- 计算机图形学(一) 视频显示设备_3_随机扫描显示器
- 《程序是怎样跑起来的》读书笔记
- java 8-6 抽象的练习