Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >二分查找及其变形与Python的bisect模块的关系

二分查找及其变形与Python的bisect模块的关系

作者头像
echobingo
发布于 2019-11-11 05:05:50
发布于 2019-11-11 05:05:50
72600
代码可运行
举报
运行总次数:0
代码可运行
首先,我们完成了二分查找及其变形的 3 个函数的模板:

1、binsearch(nums, target):标准的二分查找,找不到返回-1; 2、lowerbound(nums, target):查找第一个>=target的元素索引,找不到返回数组长度; 3、upperbound(nums, target):查找第一个>target的元素索引,找不到返回数组长度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class BinarySearch:

    # 标准的二分查找,找不到返回-1
    def binsearch(nums, target):
        lo, hi = 0, len(nums) - 1
        while lo <= hi:
            mid = lo + (hi - lo) // 2
            if nums[mid] == target:
                return mid
            elif nums[mid] > target:
                hi = mid - 1
            else:  # nums[mid] < target:
                lo = mid + 1
        return -1

    # 查找第一个>=target的元素索引,找不到返回数组长度
    def lowerbound(nums, target):
        lo, hi = 0, len(nums) - 1
        pos = len(nums)  # 找不到
        while lo < hi:
            mid = lo + (hi - lo) // 2
            if nums[mid] >= target:
                hi = mid
            else:  # nums[mid] < target:
                lo = mid + 1
        if nums[lo] >= target: # lo就是要找的元素索引
            pos = lo
        return pos

    # 查找第一个>target的元素索引,找不到返回数组长度
    def upperbound(nums, target):
        lo, hi = 0, len(nums) - 1
        pos = len(nums)  # 找不到
        while lo < hi:
            mid = lo + (hi - lo) // 2
            if nums[mid] > target:
                hi = mid
            else:  # nums[mid] <= target:
                lo = mid + 1
        if nums[lo] > target: # lo就是要找的元素索引
            pos = lo
        return pos
然后,我们介绍 Python 的 bisect 模块(import bisect):

先说明的是,使用这个模块的函数前先确保操作的列表是已排序的。

  • 有 3 个函数:bisect.bisect(list, val)bisect.bisect_left(list, val)bisect.bisect_right(list, val),功能是在有序数组 list 中返回 val 插入位置的索引(不改变 list 本身),后两者适合包含重复元素的情况。实际上,bisect.bisect(list, val) 等价于 bisect.bisect_right(list, val)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import bisect
a = [1,1,2,2,2,2,3,4,4,5,5,6,6,6]
print(bisect.bisect(a, 0))  # 1
print(bisect.bisect_left(a, 6))  # 11
print(bisect.bisect_right(a, 2))  # 6
  • 有 3 个函数:bisect.insort(list, val)bisect.insort_left(list, val)bisect.insort_right(list, val),功能是在有序数组 list 中插入 val (会改变 list 本身)。单纯看其结果的话,3 个函数的操作结果是一样的,其实插入的位置不同而已。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import bisect
a = [1,1,2,2,2,2,3,4,4,5,5,6,6,6]
bisect.bisect(a, 0)  # a = [0,1,1,2,2,2,2,3,4,4,5,5,6,6,6]
bisect.bisect_left(a, 6)  # a = [0,1,1,2,2,2,2,3,4,4,5,5,6,6,6,6]
bisect.bisect_right(a, 2)  # a = [0,1,1,2,2,2,2,2,3,4,4,5,5,6,6,6,6]
二分查找的变形与 bisect 模块的关系:

1、二分查找中的 lowerbound(nums, target) 函数等价于 bisect.bisect_left(list, val); 2、二分查找中的 upperbound(nums, target) 函数等价于 bisect.bisect_right(list, val)bisect.bisect(list, val)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python数组二分查找算法bisect
摘自官方文档:https://docs.python.org/zh-cn/3.7/library/bisect.html
西西嘛呦
2020/08/26
7360
Python 二分查找库 bisect
参数 lo 和 hi 可用于指定应该考虑的列表的子集; 默认情况下使用整个列表。如果 x 已经存在于 a 中,则插入点将位于任何现有条目之前(左侧)。假设 a 已经排序,返回值适合作为 list.insert() 的第一个参数使用。
为为为什么
2023/10/18
2540
python的二分查找库:bisect
具体参考 文章 import bisect #查找指定区间中包含的元素个数 A = [1,2,2.5,3,3.5,4,5] lindex = bisect.bisect_left(A,2.5) rindex = bisect.bisect_right(A,3.5) print(lindex, rindex, rindex-lindex) #分数等级 def grade(score,breakpoints=[60, 70, 80, 90], grades='FDCBA'): i = bisect
故事尾音
2019/12/18
2K0
LeetCode-算法-二分查找-第15天
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。
布衣者
2021/09/07
2520
二分查找真的很快吗
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Alan Lee
2019/10/30
1K0
二分查找真的很快吗
​LeetCode刷题实战34:在排序数组中查找元素的第一个和最后一个位置
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/01/20
1.2K0
python 模块之 bisect
python一个有趣的模块,bisect,感觉挺有趣,怎么有趣呢,下面来给你道来。
雷子
2021/03/15
2300
Leetcode 1671. Minimum Number of Removals to Make Mountain Array
文章作者:Tyan 博客:noahsnail.com | CSDN | 简书
Tyan
2021/09/06
3170
python 在排序数组中查找元素的第一个和最后一个位置 多种解法
编程小白狼
2024/12/31
2120
Python笔记:bisect库简介
今天在做题的时候偶然发现python中有一个强大的内置库,即bisect库,它能够轻易地实现顺序列表中的二分查找与插入操作。
codename_cys
2021/03/25
8300
剑指offer【50~59】
排序数组,很明显二分查找,找到第一个 >= k 的元素索引以及第一个 > k 的元素索引,两者相减即为答案,即 lowerBound - upperBound。时间复杂度为 O(logn),空间复杂度为 O(1)。
echobingo
2019/12/20
3760
【2025-02-25】基础算法:二分查找(一)
📝前言说明: ●本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,主要跟随B站博主灵茶山的视频进行学习,专栏中的每一篇文章对应B站博主灵茶山的一个视频 ●题目主要为B站视频内涉及的题目以及B站视频中提到的“课后作业”。 ●文章中的理解仅为个人理解。 ●文章中的截图来源于B站博主灵茶山,如有侵权请告知。
用户11029137
2025/02/26
980
【2025-02-25】基础算法:二分查找(一)
二分查找一看就会,一写就废?
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
后端时光
2022/08/19
3710
二分查找一看就会,一写就废?
再也不担心用不好二分法了,因为我找到了"作弊"的接口
导读:算法是程序的灵魂,而复杂度则是算法的核心指标之一。为了降低复杂度量级,可谓是令无数程序员绞尽脑汁、甚至是摧枯秀发。一般而言,若能实现对数阶的时间复杂度,算法效率往往就已经非常理想。而实现对数阶的常用思想莫过于二分。
luanhz
2020/03/31
5220
再也不担心用不好二分法了,因为我找到了"作弊"的接口
面试前必知必会二分查找及其变种
今天给大家带来的是二分查找及其变种的总结,大家一定要看到最后呀,用心满满,废话不多说,让导演帮我们把镜头切到袁记菜馆吧!
公众号袁厨的算法小屋
2020/12/19
1.3K0
备战蓝桥杯————二分查找(二)
小小程序员
2024/03/07
1401
备战蓝桥杯————二分查找(二)
二分查找总结
二分查找是在每次匹配后,将查找的空间一分为二的算法,二分查找应该是有序的数组进行查找.
Tim在路上
2020/08/04
4820
JS数据结构与算法-快速排序与二分查找算法
快速排序 快速排序是处理大数据集最快的排序算法之一。它是一种分而治之的算法,通过递归的方式将数据依次分解为包含较小元素和较大元素的不同子序列。该算法通过不断重复这个步骤知道所有数据都是有序的。 算法实现 这个算法首先要在列表中选择一个元素作为基准值(pivot)。数据排序围绕基准值进行,将列表中小于基准值的元素移到数组的底部(左边),将大于基准值的元素移到数组的顶部(右边)。 ①选择一个基准元素,将列表分成两个子序列; ②对列表重新排序,将所有小于基准值的元素放在基准值前面,所有大于基准值的元素
Ewall
2018/09/04
7750
JS数据结构与算法-快速排序与二分查找算法
【优选算法篇】寻找隐藏的宝藏:用二分查找打开算法世界的大门(上篇)
二分查找(Binary Search)是一种经典的算法,广泛应用于计算机科学中,尤其在处理有序数据时。其重要性体现在以下几个方面:
熬夜学编程的小王
2024/12/24
1000
【优选算法篇】寻找隐藏的宝藏:用二分查找打开算法世界的大门(上篇)
【算法题解】 Day8 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
sidiot
2023/08/31
1870
推荐阅读
相关推荐
python数组二分查找算法bisect
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验