首页 > 其他分享 >rust二分搜索

rust二分搜索

时间:2024-09-28 13:46:28浏览次数:7  
标签:二分 point pred partition bound start 搜索 rust

如果要二分搜索某个特定值,可以用binary_search
https://doc.rust-lang.org/stable/std/primitive.slice.html#method.binary_search

如果要实现C++里的lower_bound和upper_bound类似的功能,可以用partition_point:
https://doc.rust-lang.org/stable/std/primitive.slice.html#method.partition_point

pub fn partition_point<P>(&self, pred: P) -> usize where
    P: FnMut(&T) -> bool, 

返回第一个使得pred返回false的元素的下标,与C++里的partition_point一样:
http://cplusplus.com/reference/algorithm/partition_point/?kw=partition_point

例子:

fn main() {
    let a = [1, 2, 3, 3, 4];
    // Lower bound
    println!("{}", a.partition_point(|x| *x < 3));
    // Upper bound
    println!("{}", a.partition_point(|x| *x <= 3));
}
2
4

相关:Add lower_bound, upper_bound and equal_range for slices where T: Ord to complement binary_search

但是要注意的是,如果要搜索某个符合条件的值,那么不要用collect做一个Vec再用partition_point,因为rust(目前)并不会将这个构建Vec的过程优化掉,时间复杂度和空间复杂度都是O(n)。例子:

fn main() {
    println!("{}", (0usize..2usize.pow(29)).collect::<Vec<usize>>().partition_point(|v| v < &233usize));
}

内存使用量会达到4GB。

自己写一个二分搜索就不存在这个问题了:

fn partition_point_addable<T, F>(mut start: T, mut end: T, pred: F) -> T
where
    T: Copy
        + Add<T, Output = T>
        + Sub<T, Output = T>
        + PartialEq
        + One
        + Shr<i8, Output = T>,
    F: Fn(&T) -> bool,
{
    while start != end {
        let mid = start + ((end - start) >> 1);
        if pred(&mid) {
            start = mid + T::one();
        } else {
            end = mid;
        }
    }
    start
}

标签:二分,point,pred,partition,bound,start,搜索,rust
From: https://www.cnblogs.com/searchstar/p/18437576

相关文章

  • Rust索引String
    Rust的String里其实是UTF-8编码的,而UTF-8是变长编码,因此会导致Rust索引String时,可能是索引第k个UTF-8字符(需要遍历字符串),也可能是索引第k个字节。因此,Rust不支持直接用下标来索引String。如果要找到第k个UTF-8字符:s.chars().nth(k)如果要找到第k个字节:letx:u8=s.as_bytes......
  • 折半搜索
    标题:正如标题所示当n=35时。爆搜的复杂度是$O(2^n)$,肯定是不能接受的,这时候就可以用折半搜索了。折半搜索的思想是:先搜一半数据的答案,在搜另一半数据的答案,最后合并这两个答案,得到最终的答案。例如此题:MaximumSubsequence可以先爆搜搜出前半段的答案,再搜出后半段的答案,得到......
  • pbootcms获取结果页面的搜索keyword值和tag值
    在PbootCMS中,如果你想获取结果页面(比如文章列表或详情页面)的搜索关键词(keyword)和标签(tag)值,可以通过查询字符串(URL参数)或者从系统全局变量中取得。具体方法如下:获取搜索关键词(Keyword)当用户通过搜索引擎进行搜索时,搜索关键词通常会作为URL的一部分传递。例如,一个典型的搜索URL可......
  • 使用二分法爆破数据库名
    这一篇是基于dvwa下的SQL盲注(SDLInjection(Blind),在已知数据库存在和SDL盲注可行的前提下进行更深一步的操作。这里,我们将会通过python来爆破数据库名。1.python连接数据库。(1)首先我们需要查看自己的python是否已经已经安装了pymysql库,如果没有安装,可以通过Win+R打开命令行......
  • 二分图
    定义两个点集,点集内部没有连边的图称为二分图。二分图最大匹配选中最多的边,满足每个点只被选到一次,即最大边匹配点。考虑网络流建模。每个点只能用一次,\(S\)向左边的点连一条流量为\(1\)的边,右边的点向\(T\)连一条流量为\(1\)的边,就可以保证这个要求。然后两个点集之间......
  • 二分图最大匹配/二分图最大权匹配
    二分图最大匹配匈牙利算法思路算法核心:找“增广路”遍历所有左侧点,每次进行一下流程:尝试去寻找一个右侧点来匹配;若该右侧点还没有匹配的左侧点,则找到了,回溯。否则进入改右侧点的匹配左侧点,回到1。代码constintN=505;intn,m,tag;vector<int>g[N];intmatch[N]......
  • python在word文档中搜索关键词,复制段落
    目录简介:打开原始word文档创建一个新的文档(存放摘抄内容)搜索关键词复制和粘贴匹配的段落简介:本文示例的流程:打开一个word文档,搜索关键词所在的段落,并将对应段落复制粘贴到新的word文档中,并标记出处文件名和页码。可以用来批量对word文档进行提取。打开原始word文......
  • CF1592F2-Alice and Recoloring 2-分析、二分图
    link:https://codeforces.com/contest/1592/problem/F2题意:给定一个\(n\)行\(m\)列的目标矩阵,矩阵元素只有W或B,并且你有一个初始矩阵,元素全为W。现在你可以矩阵实施以下操作:使用一块钱,选定一个包含\((1,1)\)的子矩阵,把矩阵中的元素全部反转(W变B,B变W)。使用......
  • codeforces round 971(div4)E(二分答案,禁用数学方法)
    解题历程:开始想的是用数学公式的方法,利用公式推出二次函数,再求出根,再用根求出答案,检查了一个小时,结果怎么改都有细微的偏差,最后发现答案先单调递减在单调递增,那么可以用二分答案的方法查找最小的答案,二分对细节的处理要求比较高,于是在二分中加入了一个限制,当二分的区间小于5时,就......
  • 信息学奥赛复赛复习04-CSP-J2019-04-加工零件-位运算、整数映射0或1、结构体、初始化
    PDF文档回复:20240926<12019CSP-J题目4加工零件[题目描述]凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有n位工人,工人们从1∼n编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带如果......