Python 二分查找(bisect):排序数据的高效检索
二分查找:排序数据的高效检索
第二天清晨,李明早早来到了图书馆。今天他的研究目标是bisect模块,特别是其中的bisect_left和bisect_right函数。这些函数实现了二分查找算法,用于在已排序的序列中高效地查找元素或确定插入位置。
二分查找的核心思想是每次将搜索区间缩小一半,这使得算法的时间复杂度为O(log n),相比于线性搜索的O(n),在大规模数据集上表现出显著的性能优势。
李明首先记录了这两个函数的基本用途:
bisect_left(a, x):在已排序的序列a中查找元素x应该插入的位置,若x已存在,则返回最左侧的插入点bisect_right(a, x)或bisect(a, x):在已排序的序列a中查找元素x应该插入的位置,若x已存在,则返回最右侧的插入点
应用示例:数据分析中的区间分组
李明正在处理一个城市温度监测项目,需要将全年温度数据按照不同的温度区间进行分类统计。他发现bisect模块非常适合这种场景:
import bisectdef temperature_category(temp, boundaries=[0, 10, 20, 30]):"""根据温度值返回对应的温度区间类别"""return bisect.bisect_right(boundaries, temp)# 应用示例
categories = ["寒冷", "凉爽", "温暖", "炎热", "酷热"]
daily_temps = [5, 12, 18, 23, 27, 32, 8, 15, 25, 31]# 统计各温度区间的天数
stats = [0] * len(categories)
for temp in daily_temps:category_index = temperature_category(temp)stats[category_index] += 1print("温度区间统计结果:")
for i, count in enumerate(stats):print(f"{categories[i]}: {count}天")

应用示例:时间序列数据查询
午后,李明转向了另一个项目——金融数据分析系统,需要在时间戳排序的大型数据集中快速查找特定时间点的数据或最接近的记录。
import bisect
from datetime import datetime# 模拟股票价格数据,按时间排序
timestamps = [datetime(2023, 1, 1, 9, 0),datetime(2023, 1, 1, 9, 15),datetime(2023, 1, 1, 9, 30),# ... 更多时间点datetime(2023, 1, 1, 16, 0)
]
prices = [150.25, 151.75, 152.50, 153.00, 152.75]def find_nearest_price(target_time):"""查找最接近目标时间的价格记录"""pos = bisect.bisect_left(timestamps, target_time)# 处理边界情况if pos == 0:return prices[0]if pos == len(timestamps):return prices[-1]# 比较前后两个时间点,返回较近的那个对应的价格if (target_time - timestamps[pos-1]) < (timestamps[pos] - target_time):return prices[pos-1]else:return prices[pos]# 使用示例
query_time = datetime(2023, 1, 1, 9, 22)
nearest_price = find_nearest_price(query_time)
print(f"在{query_time}最接近的股票价格为: {nearest_price}")

应用示例:数值区间的高效映射
晚上,李明思考了bisect在机器学习特征工程中的应用。他正在开发一个信用评分模型,需要将连续的数值特征(如年龄、收入、账户余额等)映射到离散的评分区间。
import bisectdef score_mapping(value, boundaries, scores):"""将连续值映射到对应的分数区间"""idx = bisect.bisect_right(boundaries, value)return scores[idx]# 信用评分示例:根据账户余额评分
balance_boundaries = [0, 1000, 5000, 10000, 50000]
balance_scores = [10, 20, 30, 40, 50, 60] # 对应6个区间的分数# 客户数据
customer_balances = [850, 2500, 7500, 60000, 100]# 计算每个客户的评分
for balance in customer_balances:score = score_mapping(balance, balance_boundaries, balance_scores)print(f"账户余额 {balance} 对应的信用评分为: {score}")

思考与总结
深夜,李明合上笔记本,对这两天的学习成果感到满足。这些看似基础的数学函数构成了复杂算法和应用程序的基石。通过深入理解它们的原理和应用场景,他不仅丰富了自己的知识库,也为未来的项目开发奠定了坚实的基础。
二分查找算法的优雅与高效给李明留下了深刻印象。在有序数据集上,它能将搜索时间从线性降至对数级别,这在处理大规模数据时意味着巨大的性能提升。同时,bisect_left和bisect_right的细微差别也提醒他在实际应用中要注意边界条件的处理,这往往是编程中最容易被忽视却最关键的部分。
明天,他计划探索更多高级的数学函数,如线性代数运算和微积分函数,以进一步拓展他的数学工具箱。在计算机科学与数学交叉的广阔天地中,每一个函数都是通向新发现的钥匙。
正如李明在笔记末尾写道的:“数学不仅是科学的语言,更是解决实际问题的强大工具。理解其本质,方能驾驭其力量。算法的美妙之处在于,它将抽象的数学原理转化为解决现实问题的具体方法,而高效的实现则让这种美妙得以在有限的计算资源下展现。”
相关文章:
Python 二分查找(bisect):排序数据的高效检索
二分查找:排序数据的高效检索 第二天清晨,李明早早来到了图书馆。今天他的研究目标是bisect模块,特别是其中的bisect_left和bisect_right函数。这些函数实现了二分查找算法,用于在已排序的序列中高效地查找元素或确定插入位置。 …...
【数据结构】堆排序详细图解
堆排序目录 1、什么是堆?1.1、什么是大顶堆1.2、什么是小顶堆 2、堆排序的过程3、堆排序的图解3.1、将数组映射成一个完全二叉树3.2、将数组转变为一个大顶堆3.3、开始进行堆排序 4、堆排序代码 1、什么是堆? 堆的定义:在一棵完全二叉树中&a…...
Dubbo(45)如何排查Dubbo的序列化问题?
排查Dubbo的序列化问题需要从多个角度进行分析,包括序列化协议的配置、序列化对象的定义、序列化框架的兼容性等。以下是详细的排查步骤及相关代码示例: 1. 检查序列化协议配置 Dubbo支持多种序列化协议(如Hessian、Kryo、FST等)…...
有哪些基于solidity的应用
🔥 Solidity 常见应用分类(附例子) 🏦 1. DeFi(去中心化金融) Solidity 的最大应用场景之一。 项目功能示例合约逻辑Uniswap去中心化交易所(AMM)流动性池、定价算法、swap函数Aave /…...
CST1016.基于Spring Boot+Vue高校竞赛管理系统
计算机/JAVA毕业设计 【CST1016.基于Spring BootVue高校竞赛管理系统】 【项目介绍】 高校竞赛管理系统,基于 DeepSeek Spring AI Spring Boot Vue 实现,功能丰富、界面精美 【业务模块】 系统共有两类用户,分别是学生用户和管理员用户&a…...
安卓性能调优之-掉帧测试
掉帧指的是某一帧没有在规定时间内完成渲染,导致 UI 画面不流畅,产生视觉上的卡顿、跳帧现象。 Android目标帧率: 一般情况下,Android设备的屏幕刷新率是60Hz,即每秒需要渲染60帧(Frame Per Second, FPS&a…...
GPT-SoVITS:5 步实现 AI 语音克隆
在 AI 技术高速迭代的今天,语音合成早已突破”机械朗读“的局限 —— 从短视频创作者的虚拟配音、游戏角色的个性化声线,到智能客服的自然交互,GPT-SoVITS正凭借其强大的多模态融合能力,成为实现”AI 声音克隆“与“情感化语音生成…...
记录:安装 Docker Desktop 时直接设置安装路径及容器存储路径
近期学用 deepseek 本地知识库的构建,准备尝试几个不同的 RAG 工具,结果基本都需要 Docker 支持,故又重新拾起 Docker 来安装,刚好看到个不用目录链接就可以直接设置安装路径的方法,就记录一下,以免以后忘…...
AI IDE 提示词
好的,这就将之前的分析内容整理成一篇适合发布在 CSDN 上的博客文章。 告别代码生成混乱:AI IDE 提示词模式权威指南 作者: (你的名字/昵称) 日期: 2025年4月14日 前言 随着人工智能技术的飞速发展,AI 助手(如 GitHub Copilot…...
Vue使用axios实现:上传文件、下载文件
Vue 使用 axios 框架,系列文章: 《Vue使用axios实现Ajax请求》 《Vue使用axios二次封装、解决跨域问题》 《Vue使用axios实现:上传文件、下载文件》 在实际开发过程中,浏览器通常需要和服务器端进行数据交互。而 Vue.js 并未提供与服务器端通信的接口。Axios 提供了一些方便…...
QPS是什么??
QPS QPS 是 Queries Per Second 的缩写,指每秒处理的查询请求数量,是衡量系统性能和吞吐量的重要指标,尤其在以下场景中广泛应用: 1. 数据库系统 QPS表示数据库每秒能够处理的查询次数,反映数据库的查询处理能力。 …...
算法训练之贪心
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
Vagrant 安装指南:从零开始搭建开发环境
Vagrant 是一款强大的虚拟化工具,能够帮助开发者快速创建和管理轻量级的、可复制的开发环境。它通过与 VirtualBox、VMware 或 Hyper-V 等虚拟机提供程序结合使用,让你在本地轻松运行虚拟机。本文将详细介绍如何在 Windows、macOS 和 Linux 系统上安装 V…...
APIGen-MT:高效生成多轮人机交互Agent数据的两阶段框架
APIGen-MT:高效生成多轮人机交互数据的两阶段框架 引言 随着人工智能技术的飞速发展,AI代理(Agent)已从简单的聊天机器人发展为能够执行复杂现实任务的系统,例如管理金融交易、安排预约和处理客户服务等。然而&#x…...
【NLP】 21. Transformer整体流程概述 Encoder 与 Decoder架构对比
1. Transformer 整体流程概述 Transformer 模型的整个处理流程可以概括为从自注意力(Self-Attention)到多头注意力,再加上残差连接、层归一化、堆叠多层的结构。其核心思想是利用注意力机制对输入进行并行计算,从而避免传统 RNN …...
《Vue Router实战教程》21.扩展 RouterLink
欢迎观看《Vue Router 实战(第4版)》视频课程 扩展 RouterLink RouterLink 组件提供了足够的 props 来满足大多数基本应用程序的需求,但它并未尝试涵盖所有可能的用例,在某些高级情况下,你可能会发现自己使用了 v-sl…...
开发一个答题pk小程序的大致成本是多少
答题 PK 小程序通常指的是一种允许用户之间进行实时或异步答题竞赛的应用程序,可能结合PK答题、积分系统、排行榜等功能。 一、首先,确定答题 PK 小程序的基本功能模块。这可能包括用户注册登录、题库管理、题目类型(单选、多选、判断等&am…...
Android 应用蓝牙连接通信实现
Android 应用蓝牙连接通信实现,主要包括如下步骤: 一.打开蓝牙 // 获取蓝牙适配器 BluetoothAdapter bluetoothAdapter BluetoothAdapter.getDefaultAdapter() 1.判断蓝牙是否打开, bluetoothAdapter.isEnabled() 2. 如果未打开,执行打开蓝牙…...
GPT-2 语言模型 - 模型训练
本节代码是一个完整的机器学习工作流程,用于训练一个基于GPT-2的语言模型。下面是对这段代码的详细解释: 文件目录如下 1. 初始化和数据准备 设置随机种子 random.seed(1002) 确保结果的可重复性。 定义参数 test_rate 0.2 context_length 128 tes…...
科技项目验收测试包括哪些内容?有什么作用?
在现代科技快速发展的背景下,科技项目的验收测试已成为项目管理中的重要环节。科技项目验收测试是一种系统性的方法,旨在评估一个科技项目是否达到预定的技术指标和要求,确认项目的完成质量。该测试通常在项目实施完成后进行,通过…...
Java 设计模式:组合模式详解
Java 设计模式:组合模式详解 组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组织成树形结构,以统一的方式处理单个对象和对象集合。组合模式适用于需要表示“部分-整体”层次结构的场景,例…...
java实现加密解密
AES加密/解密核心步骤 参考 https://flying-fish.blog.csdn.net/article/details/142688630?fromshareblogdetail&sharetypeblogdetail&sharerId142688630&sharereferPC&sharesourceweixin_48616345&sharefromfrom_link工具类 import javax.crypto.Cip…...
websoket 学习笔记
目录 基本概念 工作原理 优势 应用场景 HTTP协议与 webSoket协议之间的对比 消息推送场景 1. 轮询(Polling) 2. 长轮询(Long Polling) 3. 服务器发送事件(Server-Sent Events, SSE) 4. WebSocket…...
博途 TIA Portal之1200做从站与汇川EASY的TCP通讯
上篇我们写到了博途做主站与汇川EASY的通讯。通讯操作起来很简单,当然所谓的简单,也是相对的,如果操作成功一次,那么后面就很容易了, 如果操作不成功,就会很遭心。本篇我们将1200做从站,与汇川EASY做主站进行TCP的通讯。 1、硬件准备 1200PLC一台,带调试助手的PC机一…...
【数据结构_6下篇】有关链表的oj题
思路: 1.分别求出这两个链表的长度 2.创建两个引用,指向两个链表的头节点;找到长度长的链表,让她的引用先走差值步数 3.让这两个引用,同时往后走,每个循环各自走一步 然后再判定两个引用是否指向同一个…...
vscode+wsl 运行编译 c++
linux 的 windows 子系统(wsl)是 windows 的一项功能,可以安装 Linux 的发行版,例如(Ubuntu,Kali,Arch Linux)等,从而可以直接在 windows 下使用 Linux 应用程序…...
快速幂(蓝桥杯)
1. 递归实现 递归方法通过将问题分解为更小的子问题来实现。具体步骤如下: 如果指数 b 为 0,返回 1。 如果 b 是偶数,则递归计算 (a^2)b/2。 如果 b 是奇数,则递归计算 a⋅(a^2)(b−1)/2。 伪代码: function fas…...
狂神SQL学习笔记一:初识MySQL、关系型数据库和非关系型数据库
菜鸟教程学习一半了,但是已经疲倦了,所以换一个课程学习,来提升学习质量,可能会有很多已经学习到的地方,就当是复习巩固了。 按照SQL学习课程来划分,分为45集,所以可能也会写45篇文章ÿ…...
关于 Spring Boot 微服务解决方案的对比,并以 Spring Cloud Alibaba 为例,详细说明其核心组件的使用方式、配置及代码示例
以下是关于 Spring Boot 微服务解决方案的对比,并以 Spring Cloud Alibaba 为例,详细说明其核心组件的使用方式、配置及代码示例: 关于 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案! https://sca.aliyun.com/?spm7145af80…...
VS 基于git工程编译版本自动添加版本号
目录 概要 实现方案 概要 最近在用visual Studio 开发MFC项目时,需要在release版本编译后的exe文件自动追加版本信息。 由于我们用的git工程管理,即需要基于最新的git 提交来打版本。 比如: MFCApplication_V1.0.2_9.exe 由于git 提交信…...
