STL二分算法

1.头文件

#include <algorithm>

2.使用方法

1.binary_search:查找某个元素是否出现。(范围包括前, 不包括尾)

函数模板:普通数组: binary_search(arr[], arr[] + size, val)

vector: binary_search(arr.begin(), arr.end(), val)

​ binary_search(arr.begin(), arr.begin() + cnt, val)

函数功能: 在数组中以二分法检索的方式查找,若在数组(要求数组元素升序)中查找到val元素则返回true,若查找不到则返回false

如果数组是降序怎么办?

bool cmp(int a, int b) return a > b;
binary_search(arr.begin(), arr.end(), val, cmp);

重新定义二分规则

#include<bits/stdc++.h>
using namespace std;
vector<int>x = {
    0, 2, 3, 3, 4, 5, 6, 9, 10, 11 };
vector<int>y = {
    11, 10, 9, 6, 5, 4, 3, 3, 2, 0 };
vector<int>z = {
    0, 2, 3, 3, 4, 5, 9, 7, 6, 11 };
bool cmp(int a, int b) {
    //从左往右找数组第一个小于等于val的
	return a > b;		 //规则是传入的val大于数组中的值, 但是函数要找第一个违反规则的
}
int main()
{
   
	for(int i = 0;i <= 11; i++)cout << binary_search(x.begin(), x.end(), i); 
	puts("      升序结果");
	for (int i = 0; i <= 11; i++)cout << binary_search(y.begin(), y.end(), i, cmp);
	puts("      降序+规则结果");
	for (int i = 0; i <= 11; i++)cout << binary_search(z.begin(), z.end(), i);
	puts("      半升序结果, 5之前满足升序可以正常判断, 后面部分都不能正常判断");
}

在这里插入图片描述

binary_search 算法底层实现

//第一种语法格式的实现
template <class ForwardIterator, class T>
bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)
{
   
    first = std::lower_bound(first,last,val);
    return (first!=last && !(val<*first));
}
//第二种语法格式的底层实现
template<class ForwardIt, class T, class Compare>
bool binary_search(ForwardIt first, ForwardIt last, const T& val, Compare comp)
{
   
    first = std::lower_bound(first, last, val, comp);
    return (!(first == last) && !(comp(val, *first)));
}

其使用的lower_bound() 查找第一个大于等于val的元素, 如果lower_bound() 返回值有解且等于val 那就找到了

这里传入的规则, 其实是传入给lower_bound()一个规则, 更改二分查找方式, 如果lower_bound()返回值有解, 并且结果不满足规则 (这里为什么是不满足规则, 是因为lower_bound函数就是找首个不满足规则的数据, 具体看后面)


2.lower_bound:查找第一个大于或等于某个元素的位置。

函数模板:普通数组: lower_bound(arr[], arr[] + size, val)

vector: lower_bound(arr.begin(), arr.end(), val)

​ lower_bound(arr.begin(), arr.begin() + cnt, val)

函数功能: 函数lower_bound()firstlast中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置(注意是地址)。如果所有元素都小于val,则返回last的位置

这里同样也只支持升序, 不支持降序数组

解决方法: 使用自定义规则

#include<bits/stdc++.h>
using namespace std;
vector<int>x = {
    0, 2, 3, 3, 4,
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值