全都是查找

【自动驾驶控制算法】 第一讲 绪论 声明【自动驾驶控制算法】系列是博主对所分享教学内容的学习笔记,并且该系列每篇博客都会将博主听课后总结的纸质版笔记附于文末,供大家参考。是一位研究汽车领域,无人驾驶方向及其相关方向的大佬,也算是博主在无人驾驶方向的启蒙老师。所以研究相关领域的朋友推荐去听一听他的视频讲解。... 阅读详情

二分查找

思路

二分查找细节十分繁琐,这里参考labuladong的文章,将二分查找分为三种情况,分别为查找某一个数、查找左边界、查找有边界。

框架如下:

查找某一个数

二分查找

写法一

这时的搜索区间是 [left, right],左闭右闭,跳出 while 循环的可能情况有 [left, left-1] 和 [right+1, right]。这时已经没有交集,直接返回-1。

def binarySearch(nums, target):
    left, right = 0, len(nums) - 1            # 1
    while left <= right:                      # 2
        mid = left + (right - left) // 2
        if nums[mid] == target:
            return mid
        elif target > nums[mid]:
            left = mid + 1
        elif target < nums[mid]:
            right = mid - 1                   # 3
    return -1

写法二

代码中1、2、3是两种写法不同的地方。

写法二的搜索区间是 [left, right),左闭右开,left 或 right 相等时跳出 while 循环,可能情况有 [left, left) 和 [right, right),没有交集,直接返回-1。

def binarySearch(nums, target):
    left, right = 0, len(nums)                # 1
    while left < right:                       # 2
        mid = left + (right - left) // 2
        if nums[mid] == target:
            return mid
        elif target > nums[mid]:
            left = mid + 1
        elif target < nums[mid]:
            right = mid                       # 3
     return -1

上面的写法是无法查找左侧边界或右侧边界,也就是接下来的两种情况,查找左边界或右边界。

查找左边界

在排序数组中查找元素的第一个和最后一个位置

需要将左边界返回,即代码中的 left,这时的 left 有多种含义:

这时下标1的含义可以是:nums 中小于 target 的元素的个数。

但就这个题而言,如果没有找到边界值的话,我们希望返回-1,而不是 left。

写法一

这里跳出 while 循环的条件是 [left, left-1] 和 [right+1, right]。

这时的 left 如果是第二种情况 right+1,有可能发生越界;如果是第一种情况,还是 left,则有可能是左边界的值(因为 [left, left] 的时候我们没有返回任何值,所以需要在这里判断一下)。所以需要在返回 left 前加上一个判断,返回-1。

def leftBound(nums, target):
    if len(nums) == 0:
        return -1
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = left + (right-left) // 2
        if target == nums[mid]:
            right = mid - 1                    # 找到目标值不返回,继续缩小范围
        elif target > nums[mid]:
            left = mid + 1
        elif target < nums[mid]:
            right = mid - 1
    if left >= len(nums) or nums[left] != target:
        return -1
    return left

写法二

跳出 while 循环的条件是 [left, left) 和 [right, right),这里同样需要判断是否会向右越界和判断左边界的值。

这里最后只判断数组右边界 left == len(nums),是因为移位操作有 right = mid 和 left = mid+1,只可能数组右边界超出范围。

def leftBound(nums, target):
    if len(nums) == 0:
        return -1
    left, right = 0, len(nums)
    while left < right:
        mid = left + (right-left) // 2
        if target == nums[mid]:
            right = mid
        elif target > nums[mid]:
            left = mid + 1
        elif target < nums[mid]:
            right = mid
    if left == len(nums) or nums[left] != target:
        return -1
    return left

查找右边界

在排序数组中查找元素的第一个和最后一个位置

写法一

与查找左边界一样,跳出 while 循环的条件是 [right+1, right] 和 [left, left-1]。

同样对应两种情况,如果 right 是第二种情况 left-1,则需要判断是否越界,如果是第一种情况,需要判断 right 是否为 target。

def rightBound(nums, target):
    if len(nums) == 0:
        return -1
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = left + (right-left) // 2
        if target == nums[mid]:
            left = mid + 1                   # 与左边界不同的地方 
        elif target > nums[mid]:
            left = mid + 1
        elif target < nums[mid]:
            right = mid - 1
    if right <= -1 or nums[right] != target:    # 这里与-1对比是为了和上面找左边界时判断的len(nums)相对应
        return -1
    return right

写法二

跳出 while 循环的条件是 [left, left) 和 [right, right),需要注意的是代码中判断的是 left - 1。

也可以是 right - 1,因为跳出循环时 left 和 right 相等。

之所以得减1,是因为我们在找右边界,每次 left 移动到 mid+1(而上面找左边界的时候,right 是移动到了 mid)。相当于跳出循环前的 mid 对应的是 left-1。

这里最后只判断数组左边界 left-1 == -1,虽然移位操作和 查找左边界 一样,但是 left-1 不可能超出数组的右边界,但是有可能超出数组的左边界。

def rightBound(nums, target):
    if len(nums) == 0:
        return -1
    left, right = 0, len(nums)
    while left < right:
        mid = left + (right-left) // 2
        if target == nums[mid]:
            left = mid + 1
        elif target > nums[mid]:
            left = mid + 1
        elif target < nums[mid]:
            right = mid
    if left-1 == -1 or nums[left-1] != target:        # left - 1,这里与-1对比也是为了和上面找左边界时判断的len(nums)相对应
        return -1
    return left-1

总结

总的来说方法一较为统一,但是方法二容易理解。

其他

二维数组中的查找

比较特殊,记住就行。

以 matrix 中的 左下角元素 为标志数 flag ,则有:

若 flag > target ,则 target 一定在 flag 所在 行的上方 ,即 flag 所在行可被消去。
若 flag < target ,则 target 一定在 flag 所在 列的右方 ,即 flag 所在列可被消去。

class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        if not matrix or not matrix[0]:
            return False
        i, j = len(matrix)-1, 0
        while i >= 0 and j < len(matrix[0]):
            if matrix[i][j] > target:
                i -= 1
            if matrix[i][j] < target:
                j += 1
            
            elif matrix[i][j] == target:
                return True
        return False

 时间复杂度 O(M+N),空间复杂度 O(1)。

剑指 Offer 11. 旋转数组的最小数字

这里使用的是写法一,但是又有不同。

这个题的思路是比较数组中 mid 位置值 Xmid 与 j(二分区间末尾值)位置值 Xj 的大小,因为最小值 X 一定在 j 的左侧或者就是 Xj。

如果 Xmid 大于 Xj 的话,mid 左侧的值一定也都比 j 位置值大,因为 j 位置是旋转后数组的末尾,这样就可以把 mid 及 mid 位置左侧值都舍弃掉。
如果 Xmid 小于 Xj 的话,mid 右侧的值一定都比 j 位置值大,但是无法确定 Xmid 是不是最小值,所以只能把 mid 位置右侧值都舍弃掉。对应代码中不同点3。

pivot处的值大于high的,它肯定不是最小值,所以可以放心大胆地pivot+1;若pivot处的值小于high,它有可能就是最小值,不能轻易地把它给排除,需要继续观察。

如果 Xmid 等于 Xj 的话,不能判断 j 左侧或右侧值的情况,Xj 这时已经有了一个替代者 Xmid,不会跳过答案,因此 j 减一即可。对应代码中不同点2。

不同点1是因为当 i 与 j 相同时,按照这个算法已经找到答案,直接跳出循环即可

class Solution:
    def minArray(self, numbers: List[int]) -> int:
        i, j = 0, len(numbers)-1
        while i<j:                             # 不同点1,搜索区间是 [left, right)
            mid = i + ((j - i) // 2)
            if numbers[mid] == numbers[j]:
                j -= 1                         # 不同点2
            elif numbers[mid] > numbers[j]:
                i = mid + 1
            elif numbers[mid] < numbers[j]:
                j = mid                        # 不同点3

        return numbers[i]
深度学习笔记(3)——kernel(内核)与filter(滤波器) 本文仅仅简单介绍了kernel和filter的概念,介绍了确定filter和kernel个数的方法。 阅读详情

相关推荐

【四季发财中线】通达信炒股指标副图指标使用图文教程,短线紫色柱线操作,与中线短柱线共振抓牛股妖股主升浪

如上图标记位置,对应的是副图指标的紫色柱线开始的位置,这个紫色柱线信号开始出现,也是短线进场做多的信号,紫色柱线的持续出现和加长,可以持股待涨,或行情继续上涨的可以在分时行情中逢低进场短线顺势做多。如上图标记部分,指标的主要部分信号,三行柱线-ZR-ZC -ZM,当出现这三行信号时,中线或波段看多做多,信号持续则中线顺势做多和持股待涨。不论是跟踪信号的出现先后进场和持股,或是在中线多头的行情中,找到短线转多信号进场做安全的短线操作机会,都是非常好的指标信号和辅助操作功能。

weixin_69760830的博客 1602

数据结构——静态查找表&动态查找表的区别用法【顺序查找-线性查找-折半查找-二分查找-有序表查找-插值查找-斐波那契查找-索引顺序表查找-分块查找】

目录: 一:静态查找表(Static Search Table) 主要操作: 二:动态查找表(Dynamic Search Table) 主要操作: 三:顺序查找(Sequential Search)【线性查找】 1.查找过程 2.时间复杂度 四:折半查找(Binary Search)【二分查找】【有序表查找】 1.查找过程 2.时间复杂度 3.二分查找在静态查找表&amp...

刘鑫磊 9756

Python表白代码:“ 星光月夜烟花皆归你,我也归你”(满天烟花盛开、附番外玫瑰)

导语 "慢品人间烟火色 闲观人间岁月长" ———致自己​​​ ​ ???? 遇见我以后,我们的故事就开始了,愿你历经山河,仍觉得人间值得????。 ​ 星光月夜烟花皆归你,我也归你。关于烟花????大家都​知道多少?有多少表白故事情节都发生在烟 花下,想必木木子????不用说大家也知道叭~​​ 今天这则小短文就是关于烟花的故事!你准备好跟我一起进入烟花的世界了嘛? ​正文 “每一句文案,都有一个故事,你仔细听” ​ 1)环境安装???? 准备好:.

顾木子吖的博客 5万+

查找(顺序查找,折半查找,分块查找)

查找 ​ 查找是在查询数据过程中必不可少的一个环节,那么如何来进行查找,以及如何进行高效率的查找,就是接下来要解决的问题。 文章目录查找查找的概念顺序查找顺序查找-算法原理顺序查找-算法实现顺序查找-性能分析折半查找折半查找-算法原理折半查找-算法实现折半查找-性能分析分块查找分块查找-算法原理分块查找-算法实现分块查找-性能分析 查找的概念 ​ 首先提出一些定义,在查找元素的时候,必然是从一堆数据中去找自己想要的数据,那么这种由同一类型的数据元素构成的集合就被称为查找表。对于查找表可执行以下操作: 查询

weixin_44267007的博客 4361

数字经济新质生产力数字化转型数据要素流通交易解决方案:数据要素化演进路径与管理、公共数据授权运营平台体系、数据底座、典型应用场景

数字经济的发展依赖于数据要素的有效流通与交易,数字化转型的核心在于数据的全生命周期管理和价值释放。数据要素化通过数据资源化、资产化和资本化的“三化”过程,实现其经济与社会价值。数据管理涵盖采集、存储、加工、分析等环节,支持数据的度量与交换。公共数据、企业数据和个人数据通过场内、场外及二级市场交易实现资本化。公共数据开发利用面临隐私泄露、监督管理难等痛点,目标是构建授权运营平台体系,确保数据流通的安全与效率。平台体系包括统一门户、授权管理、运营管理、合规监督等核心功能,支持明文、密文和可信交换流通方式。数据底

weixin_44094929的博客 1003

深入浅出一文搞懂Raft协议

前言 在分布式的世界里,要说最核心最复杂的功能,一致性的实现无出其右,之前的paxos算法堪称经典,被认为是同类算法中效果最好的,基本上成为分布式一致性的代名词,但是paxos算法也是出了名的难理解,而且相当不好实现。本人也花了很多时间、看了很多材料也没有真正理解。所以基于paxos的思想进行的一致性算法的简化和实现就成为了现实的需求,在此背景下,本文的主角Raft就出现了。 Raft算法的头号目标就是容易理解(UnderStandable),这从论文中就可以看出来。当然,R...

microGP的专栏 6486

顺序查找、折半查找、分块查找

查找:在数据集合中寻找满足某种条件的数据元素的过程称为查找。查找的结果一般分为两种:一是查找成功,即在数据集合中找到满足条件的数据元素;二是查找失败。 查找表(查找结构):用于查找的由同一类型的数据元素(或记录)构成的集合。查找表本质是表中记录之间仅存在"同属一个集合”这个逻辑的集合结构。为此,我们在数据元素之间人为地加上一些关系,以便按照某种规则查找,即用另一种数据结构来表示查找表。

24考研人晴落的博客 4511

详细分析一下华为自研的MetaERP系统中的合并报表流程与规则

华为MetaERP合并报表系统针对其全球化复杂业务量身定制,采用五层自动化架构:统一数据采集、多币种转换、智能对账协同、规则化抵消处理及多维分析输出。系统核心在于可配置的智能规则引擎,涵盖股权合并范围、内部交易抵消、未实现利润计算等复杂场景,实现多准则并行处理。相比传统软件,该系统深度集成业务数据、支持准实时合并,并通过参数化配置快速适应组织变革,成为华为全球财务管控的"数字神经中枢",在效率、准确性和安全性上具有显著优势。

金牌架构师 674

查找算法总结:顺序查找,二分查找,分块查找,散列查找,二叉排序树查找

查找算法包括:顺序查找,二分查找,分块查找,散列查找,二叉排序树查找,B树 B树用于查找磁盘数据,这里不进行分析顺序查找思想:从头到尾一个一个比较,简单,时间复杂度O(n)java实现:public static int seqSearch(List<Integer> arr, int key) { for (int i = 0; i < arr.size(); i++) {

抬头看世界 6965

华为OD机试 - 机器人活动区域(Python/JS/C/C++ 双机位C卷 200分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。现有一个机器人,可放置于 M × N的网格中任意位置,每个网格包含一个非负整数编号。当相邻网格的数字编号差值的绝对值小于等于 1 时,机器人可在网格间移动问题:求机器人可活动的最大范围对应的网格点数目。说明:1)网格左上角坐标为 (0, 0),右

学Java,找哪吒 1434

【Clickhouse】Cannot allocate block number in Zookeeper write prefix view location

我有一个问题,我CK集群跑批的时候,replicated表变成只读的了下面是CK的报错和当时ZK的日志。下面是zk报错开始 我认为是写入的时候,压力太大,ZK扛不住了,就按照博客里的建议优化了ZK的参数,现在偶尔还会只读,zk报错都是图里的那种clickhouse的集群是5分片的集群,数据量比较大。每小时批量一次,每次2-10W条数据,字段的话,不到200个字段,使用的 jdbc sink写入。

九师兄 836

【Python查找算法】二分查找、线性查找、哈希查找

【Python查找算法】二分查找、线性查找、哈希查找原理详解示例与应用

qq_35831906的博客 1958

IoU的进化之路——IoU、GIoU、DIoU、CIoU四种损失函数总结

IoU、GIoU、DIoU、CIoU四种损失函数总结

chase 8131

七大查找算法(顺序查找、折半查找、插值查找、斐波那契查找、分块查找、哈希查找、树表查找)

一、顺序查找 顺序查找适合于存储结构为顺序存储或链接存储的线性表。 基本思想:顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。 二、折半查找 元素必须是有序的,如果是无序的则要先进行排序操作。 基本思想:也称为是折半查找,属于有序查找算法。用给定值...

lonely_yfl的博客 4032

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

查找——分块查找

文章目录分块查找的概念分块查找的基本思想分块查找的平均查找长度 分块查找的概念 当数据表中的数据元素很多时,可以采用分块查找。 分块查找又称为索引顺序查找。它汲取了顺序查找和折半查找各自的优点,既有动态结构,又适于快速查找。 分块查找的基本思想 基本思想: <1> 将查找表分为若干子块,要求所有这些块分块有序,即后一块中所有元素的关键码均大于前一块中所有元素的关键码(块间有序);而每个块内的元素可以是无序的(块内无序)。 <2> 另外要为这些块建立一个索引表。索引表中的每个元素

薛定谔的猫的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

查找(顺序查找、二分查找、插值查找)

查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。 查找表按照操作方式来分有两大种:静态查找表和动态查找表。 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。 1. 顺序查找 /* 顺序查找,a为数组,n为要查找的数组元素个数,key为要查找的关键字*/ int Sequential_Sear

静水流深 3万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

python之查找(顺序查找、折半查找、索引查找、二叉排序树查找、哈希表查找)

查找可以分为静态查找和动态查找。 静态查找 定义: 在查找过程中,只是对数据元素执行查找操作,而不对其执行其他操作。 顺序查找 折半查找 索引查找 通常用线性表来表示静态查找表,线性表有顺序存储结构和链式存储结构,此处只考虑顺序结构。 顺序查找 顺序查找思路: 将给定值与静态查找表中数据元素的关键字逐个比较,若表中某个元素的关键字与给定值相等,则查找成功,否则查找失败。 class StaticT...

不服输的南瓜的博客 2856

5种查找方法简单介绍:顺序查找、分块查找、二分查找、哈希查找、插值查找

5种查找算法的简单介绍:顺序查找、分块查找、二分查找、哈希查找、插值查找

aw2371的博客 2042

静态查找表(顺序查找,折半查找,分块查找)

良心总结,表哥看了直呼内行!!!

qq_52607834的博客 1784

查找算法-顺序查找、有序查找

1.顺序表的查找 1)顺序查找 顺序查找又称为线性查找,是一种最简单的查找方法。         从表的一端开始,向另一端逐个按要查找的值key 与关键码key进行比较,若找到,查找成功,并给出数据元素在表中的位置;若整个表检测完,仍未找到与关键码相同的key值,则查找失败,给出失败信息。 说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是

黄俊彬 1万+

查找:静态查找表的几种查找方法:顺序查找、折半查找、分块查找

查找——顺序查找、折半查找、分块查找

MillinZhang的博客 2691

查找——顺序查找、二分查找、散列查找

二分查找 条件1:经过排序的数据集合 条件2:只适合于顺序存储的数据结构 设有数据集合 {5,13,17,42,46,55,70,94} 元素 5 13 17 42 46 55 70 94 下标 0 1 2 3 4 5 6 7 表示 low high 查找94 (0+7 )/ 2 = 3 ----> a[3] < key (4+7) / 2 ...

mango660的博客 1564

查找算法系列之简单查找:顺序查找、二分查找、分块查找

近期总结了各大排序算法的原理 ,并对其进行了实现,想着一并把查找算法总结了,今天就着手开始总结查找算法。 废话不多说,这篇文章从最简单的查找算法开始讲起,之后会补充复杂的二叉搜索树查找(BST)和B树,B+树查找以及哈希查找等。 顾名思义,查找就是寻找到关键字在队列中的位置,最笨的查找算法就是依次顺序比较,复杂度为O(n),但是有很多方法的复杂度可以达到O(logn)等等。 1.顺序

susandebug 7787

C语言常见查找算法:线性查找、二分查找、插值查找、斐波那契查找

查找算法是计算机科学中的基本算法,用于在数据集合中查找特定元素。常见的查找算法包括线性查找、二分查找、插值查找、斐波那契查找。本文将介绍几种常见的查找算法及其在C语言中的实现。

科技改变人类,技术成就未来 1248

算法查找——分块查找

本文将讲述分块查找有关内容

Alita233_的博客 2525

数据结构之查找-顺序查找,折半查找,分块查找

文章目录一、顺序查找1.1 无序表的顺序查找1.2 有序表的顺序查找二、折半查找三、分块查找 一、顺序查找 顺序查找又称线性查找,主要用于在线性表中进行查找。 1.1 无序表的顺序查找 对无序线性表进行顺序查找,查找失败时要遍历整个线性表 int search_seq_u(int elems[], int key) { int i; for(i = elems.length-1; i >=0 && elems[i]!=key; i--); return

衍射的博客 2283
上一篇: 度量学习——总结
下一篇: Python中的内置函数与lambda表达式
不说话装高手H
博客等级 码龄7年 43粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值