含有重复元素的二分查找算法

MATLAB基础应用精讲-【数模应用】PPO算法(附python代码实现)(二) 表示为状态转移概率和动作选择概率的乘积,因为状态和动作决定轨迹。 阅读详情

1 实现

rust已经有binary_search了,但不能很好的处理有重复元素的查找。
下面这个是我按照网上查找到的原理自己实现的,这个处理重复元素比较好,如果key有重复,那么查找到的总是最小的那个index

fn main() {
    let s = [0, 0,0,0,0,1,1,1, 1, 1, 1, 2,2,3, 3, 5, 8, 13, 21, 34, 55];

    let seek = 1;
    let mut left = 0;
    let mut right = s.len()-1;
    let mut mid;
    while left < right {
        mid = (left + right) >> 1;
        assert!(mid < right);
        if s[mid] < seek {
            left = mid + 1;
        }else{
            right = mid;
        }
    }

    //自己实现的二分查找的结果
    println!("search value:{}\nleft:{},right:{}\nfind:\n  idx:{},value:{}",seek,left,right,left,s[left]);

    //调用rust实现的二分查找
    println!("{:?}",s.binary_search(&1));
}

Play地址:https://is.gd/1PJo67
运行结果:

search value:1
left:5,right:5
find:
  idx:5,value:1
Ok(10)

自己实现的二分查找找到了第一个”1”的位置了,而rust自带的binary_search找到的并不一定是第一个”1”

2 简单的性能测试

做了个简单的bench,可以看到我的这个实现与库实现的差别很小,估计库也没有做优化了,先贴结果:

test bench_binary_search … bench: 42 ns/iter (+/- 9)
test bench_binary_search_lib … bench: 41 ns/iter (+/- 11)

这几个全局变量控制测试长度的

static test_len:usize = 1000;
static test_linear_key:u32 = 500;
static test_binary_key:u32 = 200;

注:因为rust自带的binary_search不能很好的处理key重复的情况,所以就用不重复的数组进行测试

2.1 自己实现的算法:

#[bench]
fn bench_binary_search(b: &mut Bencher) {
    let mut v:Vec<u32> = Vec::with_capacity(test_len);
    for i in (0..test_len) {
        v.push(i as u32);
    }

    b.iter(|| {
        let mut left = 0;
        let mut right = test_len-1;
        let mut mid = 0;
        while left < right {
            mid = (left + right) >> 1;
            assert!(mid < right);
            if v[mid] < test_binary_key {
                left = mid + 1;
            }else{
                right = mid;
            }
        }
        assert!((left == right) && (v[left] == test_binary_key));
    });
}

2.2 使用库自带的二分查找:

#[bench]
fn bench_binary_search_lib(b: &mut Bencher) {
    let mut v:Vec<u32> = Vec::with_capacity(test_len);
    for i in (0..test_len) {
        v.push(i as u32);
    }

    b.iter(|| {
        if let Ok(idx) = v.binary_search(&test_binary_key) {
            assert!(v[idx] == test_binary_key);
        }else{
            assert!(false);
        }
    });
}
华为od 面试八股文_测试/测试开发_01_含答案 华为od面试八股文_测试/测试开发_01_含答案 阅读详情

相关推荐

从机械臂示教到厨房做饭:ACT模仿学习如何让机器人更“人性化”?

本文探讨了ACT(Action Chunking with Transformers)模仿学习技术如何让机器人更“人性化”,特别是在厨房等复杂场景中的应用。通过动作分块(Action Chunking)和时态融合(Temporal Ensemble)技术,机器人能够像人类一样记忆和执行复杂任务,如烹饪。文章还分析了ACT在家庭场景中的落地挑战及其在康复医疗、柔性制造等领域的跨领域应用潜力。

weixin_30613343的博客 255

二分查找

二分查找的大前提:数组有序。

喃灬疯的博客 872

【Python学习日记:PySide6】【持续更新】

说明:PySide6 是 Qt for Python 的一部分,是一个 Python 绑定库,可以用来创建跨平台的 GUI 应用程序。它将 Qt 框架的丰富功能带到了 Python 环境中,允许开发者使用 Python 编写 GUI 应用程序。

XLQ的博客 8043

5.二分查找--实现有重复数字的升序数组的

题目描述 请实现有重复数字的升序数组的二分查找 给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1 示例1 输入 复制 [1,2,4,4,5],4 返回值 复制 2 说明 从左到右,查找到第1个为4的,下标为2,返回2 import java.util.*; public class Solution { /** * 代码中的类名、方法名.

柠檬精 863

Raid5损坏两块盘

  以下为浪潮Inspur NF5460M4型号服务器故障处理过程: 设备raid5组损坏两块硬,并raid组处理离线状态,情况如图:     由于硬盘数据比较重要,面对此情况不要慌我们尽量做到安全保守的保证数据尽可能完整,以下为处理方法,(遇raid5两块盘出现问题处理方法)   以下截图均为遇相同问题的解决图案,并非现场截图。 Ctrl+H 进WebBios界面,发现两...

chen_lipeng的博客 2万+

FineReport V11.0安装避坑指南:从下载到激活的完整流程(附百度网盘链接)

本文提供FineReport V11.0从下载、安装到激活的完整避坑指南。详细解析了部署前的环境准备、安装过程中的JVM内存等核心配置、激活流程以及安装后的优化与常见问题排查,旨在帮助用户一次部署成功,确保企业级报表平台的稳定运行。

echo99的专栏 1192

4.二分查找(重复版)

之前数组都是有序且不重复,那么接下来就针对含有重复元素的数组进行分析,先看返回最左面的重复元素。

qq_53597372的博客 871

关于影响力最大化问题中贪心算法的一些理解

在影响力最大化问题中(Influence Maximization,以下简称IM),贪心算法是最早提出的一种解决方法,并且一直沿用至今。它基于IM问题所具有的单调性(Monotonicity)和子模性(Submodularity)使用一种Hill Climbing策略,不断使用Monte Carlo模拟来寻找在当前情况下的具有最大传播范围的节点,添加至种子集合,得到最终结果,算法伪代码如下所示: 这里算法1其实并没有使用MonteCarlo模拟,而只是使用了贪心的策略...

nianjuan1990的专栏 2851

二分查找的理解(有重复元素的查找)

二分查找的实现(C语言)

wyyyyyk的博客 1241

领域驱动新实践:COLA框架全解析——架构设计与实战案例解析

定义订单支付事件java代码解读复制代码} }Order定义Order类,继承并实现支付逻辑:java代码解读复制代码} }定义接口:java代码解读复制代码定义类,处理订单支付逻辑并持久化:java代码解读复制代码} }定义和处理订单支付事件:java代码解读复制代码} }java代码解读复制代码} }定义和接口及其实现:java代码解读复制代码java代码解读复制代码。

2401_89221445的博客 2659

PCL 改进快速欧式聚类【2025最新版】

在FEC: Fast Euclidean Clustering for Point Cloud Segmentation一文的基础上对算法进行改进。博客长期更新,本文最近更新时间为:2025年9月16日。

点云侠的博客 2568

二分查找重复元素的范围 Leetcode 34

如何用二分查找法在有序数组中搜索重复元素的范围呢?本文介绍了两种方法。

宁萌Julie的博客 1103

YOLOv8改进策略【独家融合改进】| StarNet + 小目标检测头,加强跨尺度的上下文特征融合,提高小目标检测能力

P3/8 - small检测头原始模型中的P3/8特征层对应的检测头主要用于检测相对较小的目标。其特征图大小相对较大,空间分辨率较高。适合检测尺寸大概在8x8到32x32像素左右的目标。P4/16 - medium检测头这个检测头对应的P4/16特征层经过了更多的下采样操作,相比P3/8特征图空间分辨率降低,但通道数增加,特征更抽象且有语义信息。它主要用于检测中等大小的目标,尺寸范围大概在32x32到64x64像素左右。P5/32 - large检测头P5/32。

Limiiiing的博客 634

含有重复元素的二分查找,查找最右端,输出下标

含有重复元素的二分查找,查找最右端,输出下标。 题目描述: 第一行输入要查找的元素 t 第二行输入数组元素的个数 n 接下来 n 行表示输入的 n 个元素(一个元素一行) 示例: 3 --待查找的数 5 --数组的个数 1 --每个元素一行 2 3 3 4 输出: 3 --重复元素最右边位置 #include <bits/stdc++.h> using namespace std; int left_bound(vector<int>& nums, int

weixin_37939906的博客 581

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

可查找重复元素的二分查找算法

可查找重复元素的二分查找算法 思路: 1、先定义两个下标 , left = 0 , right = arr.length -1; 2、因为我们也不知道要循环多少次,定义一个while循环,终止条件为right&amp;gt;left 3、因为是二分查找,定义一个mid = left + (right - left)/2; //;防止数据过大溢出 4、定义三个if语句,如果 target == a...

奇迹迪 7327

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

含有重复值的有序数组中查找给定值得上界以及不含重复值得有序数组中查找给定值得上界

import java.util.*; public class Solution { /** * 二分查找 * @param n int整型 数组长度 * @param v int整型 查找值 * @param a int整型一维数组 有序数组 * @return int整型 */ public int upper_bound_ (int n, int v, int[] a) { int start = 0, end

weixin_44718747的博客 182

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

二分查找算法

注意到此题目描述的是有重复元素的,所以我们需要在之前二分查找的基础之上做一下简单变形,在这里就变换为如何找出出现的第一个出现的数字,下面代码中做了具体标注 import java.util.*; class Search { public static int solution(int nums[],int target){ int low=0; int high=nums.length; int mid=0; while(low<=high){ mid=(low+high).

qq_43905485的博客 148

数组中的二分查找

先谈谈二分查找,

Rookie 678

查找算法之重复二分查找

重复二分查找,主要是在对已经排好序,且存在重复元素的数组中,获取要查找的元素第一次出现的位置,或者最后一次出现的位置,这种需求来使用。 <?php /** * 重复二分查找 * * @param string $find 要查找的值 * @param array $array 要查找的数组 * @return bool|string */ function repeatBin...

玲曦的博客 389

重温算法Day11:二分查找

二分查找依赖的是数组,找针对的是有序数据,数据量太小或太大都不适合二分查找。 没找到二分查找有什么应用场景 实现int sqrt(int x)函数。 计算并返回x的平方根,其中x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去 func mySqrt(x int) int { left, right := 1, x for left...

Linzhongyilisha的专栏 272

查找算法2 二分查找

二分查找 二分查找是一种重要的查找思想,它要求查找的序列表是有序的,具体实现如下步骤 (假设该示例有序表为从小到大排序) public static void main(String[] args) { // TODO 自动生成的方法存根 int[] arr= {1,5,7,9,16,18,122,187}; int start=0; int end=arr.length; int value=187;

weixin_43747389的博客 186

LintCode14.二分查找(binarySearch) Java实现

二分查找 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。 样例 样例 1: 输入:[1,4,4,5,7,7,8,9,9,10],1 输出: 0 没有出现过打印-1; 如果数组中没有重复元素,写出二分查找的代码很简单,如下 public int binarySearch(int[] nums, int target) { // write your co.

weixin_45787987的博客 252

算法——二分查找

二分查找 概念 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 代码实现过程 # lists 要查找的列表 # key 要查找的数字 def binarySearch(lists,key): start = 0 # 起始坐标 end = len(lists)-1 # 结束坐标 while ...

qq_39489231的博客 187

【算法】二分搜索的递归实现算法(有重复元素取最小序列)

给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x,可以利用二分查找递归实现,达到复杂度为O(log(n))。 但是传统的算法在有重复元素情况如 “1 1 1 1 1 1 ”时,想要找1元素,会返回序号为3. int BSearch(elemtype a[],elemtype x,int low,int high) /*在下届为low,上界为high的数...

12 26 25 的博客 1653

升序数组的二分查找

二分查找 怕下次找不到了?快快点关注鼓励一下嘛~ (╹▽╹) ~ 题目:请实现有重复数字的升序数组的二分查找 给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1 示例1 输入: [1,2,4,4,5],4 返回值:2 说明: 从左到右,查找到第1个为4的,下标为2,返回2 示例2 输入: [1,2,4,4,5],3 返回值:-1 示例3 输入: [1,1,1,1,1],1 返回值:0

qq_45838562的博客 1147

C语言:顺序查找和二分查找

任务代码: 顺序查找元素: #include #define SIZE 10 int main() { int a[SIZE]={1,2,3,4,5,6,7,8,9,10}; int index=-1;//如果末尾没有找到,默认函数为=-1 int i,number; printf("请输入要查找的数据:"); scanf("%d",&number)

Geek宝宝的努力! 2903
上一篇: Rc与Box区别
下一篇: notepad++ 正则替换的占位符超过9的处理方法
varding
博客等级 码龄17年 115粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值