Python 二分查找(bisect):排序数据的高效检索

news2025/4/16 2:40:09

二分查找:排序数据的高效检索

第二天清晨,李明早早来到了图书馆。今天他的研究目标是bisect模块,特别是其中的bisect_leftbisect_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 bisect

def 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] += 1

print("温度区间统计结果:")
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 bisect

def 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_leftbisect_right的细微差别也提醒他在实际应用中要注意边界条件的处理,这往往是编程中最容易被忽视却最关键的部分。

明天,他计划探索更多高级的数学函数,如线性代数运算和微积分函数,以进一步拓展他的数学工具箱。在计算机科学与数学交叉的广阔天地中,每一个函数都是通向新发现的钥匙。

正如李明在笔记末尾写道的:“数学不仅是科学的语言,更是解决实际问题的强大工具。理解其本质,方能驾驭其力量。算法的美妙之处在于,它将抽象的数学原理转化为解决现实问题的具体方法,而高效的实现则让这种美妙得以在有限的计算资源下展现。”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2335649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】堆排序详细图解

堆排序目录 1、什么是堆&#xff1f;1.1、什么是大顶堆1.2、什么是小顶堆 2、堆排序的过程3、堆排序的图解3.1、将数组映射成一个完全二叉树3.2、将数组转变为一个大顶堆3.3、开始进行堆排序 4、堆排序代码 1、什么是堆&#xff1f; 堆的定义&#xff1a;在一棵完全二叉树中&a…

CST1016.基于Spring Boot+Vue高校竞赛管理系统

计算机/JAVA毕业设计 【CST1016.基于Spring BootVue高校竞赛管理系统】 【项目介绍】 高校竞赛管理系统&#xff0c;基于 DeepSeek Spring AI Spring Boot Vue 实现&#xff0c;功能丰富、界面精美 【业务模块】 系统共有两类用户&#xff0c;分别是学生用户和管理员用户&a…

安卓性能调优之-掉帧测试

掉帧指的是某一帧没有在规定时间内完成渲染&#xff0c;导致 UI 画面不流畅&#xff0c;产生视觉上的卡顿、跳帧现象。 Android目标帧率&#xff1a; 一般情况下&#xff0c;Android设备的屏幕刷新率是60Hz&#xff0c;即每秒需要渲染60帧&#xff08;Frame Per Second, FPS&a…

GPT-SoVITS:5 步实现 AI 语音克隆

在 AI 技术高速迭代的今天&#xff0c;语音合成早已突破”机械朗读“的局限 —— 从短视频创作者的虚拟配音、游戏角色的个性化声线&#xff0c;到智能客服的自然交互&#xff0c;GPT-SoVITS正凭借其强大的多模态融合能力&#xff0c;成为实现”AI 声音克隆“与“情感化语音生成…

记录:安装 Docker Desktop 时直接设置安装路径及容器存储路径

近期学用 deepseek 本地知识库的构建&#xff0c;准备尝试几个不同的 RAG 工具&#xff0c;结果基本都需要 Docker 支持&#xff0c;故又重新拾起 Docker 来安装&#xff0c;刚好看到个不用目录链接就可以直接设置安装路径的方法&#xff0c;就记录一下&#xff0c;以免以后忘…

算法训练之贪心

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

Vagrant 安装指南:从零开始搭建开发环境

Vagrant 是一款强大的虚拟化工具&#xff0c;能够帮助开发者快速创建和管理轻量级的、可复制的开发环境。它通过与 VirtualBox、VMware 或 Hyper-V 等虚拟机提供程序结合使用&#xff0c;让你在本地轻松运行虚拟机。本文将详细介绍如何在 Windows、macOS 和 Linux 系统上安装 V…

APIGen-MT:高效生成多轮人机交互Agent数据的两阶段框架

APIGen-MT&#xff1a;高效生成多轮人机交互数据的两阶段框架 引言 随着人工智能技术的飞速发展&#xff0c;AI代理&#xff08;Agent&#xff09;已从简单的聊天机器人发展为能够执行复杂现实任务的系统&#xff0c;例如管理金融交易、安排预约和处理客户服务等。然而&#x…

【NLP】 21. Transformer整体流程概述 Encoder 与 Decoder架构对比

1. Transformer 整体流程概述 Transformer 模型的整个处理流程可以概括为从自注意力&#xff08;Self-Attention&#xff09;到多头注意力&#xff0c;再加上残差连接、层归一化、堆叠多层的结构。其核心思想是利用注意力机制对输入进行并行计算&#xff0c;从而避免传统 RNN …

《Vue Router实战教程》21.扩展 RouterLink

欢迎观看《Vue Router 实战&#xff08;第4版&#xff09;》视频课程 扩展 RouterLink RouterLink 组件提供了足够的 props 来满足大多数基本应用程序的需求&#xff0c;但它并未尝试涵盖所有可能的用例&#xff0c;在某些高级情况下&#xff0c;你可能会发现自己使用了 v-sl…

开发一个答题pk小程序的大致成本是多少

答题 PK 小程序通常指的是一种允许用户之间进行实时或异步答题竞赛的应用程序&#xff0c;可能结合PK答题、积分系统、排行榜等功能。 一、首先&#xff0c;确定答题 PK 小程序的基本功能模块。这可能包括用户注册登录、题库管理、题目类型&#xff08;单选、多选、判断等&am…

GPT-2 语言模型 - 模型训练

本节代码是一个完整的机器学习工作流程&#xff0c;用于训练一个基于GPT-2的语言模型。下面是对这段代码的详细解释&#xff1a; 文件目录如下 1. 初始化和数据准备 设置随机种子 random.seed(1002) 确保结果的可重复性。 定义参数 test_rate 0.2 context_length 128 tes…

科技项目验收测试包括哪些内容?有什么作用?

在现代科技快速发展的背景下&#xff0c;科技项目的验收测试已成为项目管理中的重要环节。科技项目验收测试是一种系统性的方法&#xff0c;旨在评估一个科技项目是否达到预定的技术指标和要求&#xff0c;确认项目的完成质量。该测试通常在项目实施完成后进行&#xff0c;通过…

websoket 学习笔记

目录 基本概念 工作原理 优势 应用场景 HTTP协议与 webSoket协议之间的对比 消息推送场景 1. 轮询&#xff08;Polling&#xff09; 2. 长轮询&#xff08;Long Polling&#xff09; 3. 服务器发送事件&#xff08;Server-Sent Events, SSE&#xff09; 4. WebSocket…

博途 TIA Portal之1200做从站与汇川EASY的TCP通讯

上篇我们写到了博途做主站与汇川EASY的通讯。通讯操作起来很简单,当然所谓的简单,也是相对的,如果操作成功一次,那么后面就很容易了, 如果操作不成功,就会很遭心。本篇我们将1200做从站,与汇川EASY做主站进行TCP的通讯。 1、硬件准备 1200PLC一台,带调试助手的PC机一…

【数据结构_6下篇】有关链表的oj题

思路&#xff1a; 1.分别求出这两个链表的长度 2.创建两个引用&#xff0c;指向两个链表的头节点&#xff1b;找到长度长的链表&#xff0c;让她的引用先走差值步数 3.让这两个引用&#xff0c;同时往后走&#xff0c;每个循环各自走一步 然后再判定两个引用是否指向同一个…

vscode+wsl 运行编译 c++

linux 的 windows 子系统&#xff08;wsl&#xff09;是 windows 的一项功能&#xff0c;可以安装 Linux 的发行版&#xff0c;例如&#xff08;Ubuntu&#xff0c;Kali&#xff0c;Arch Linux&#xff09;等&#xff0c;从而可以直接在 windows 下使用 Linux 应用程序&#xf…

关于 Spring Boot 微服务解决方案的对比,并以 Spring Cloud Alibaba 为例,详细说明其核心组件的使用方式、配置及代码示例

以下是关于 Spring Boot 微服务解决方案的对比&#xff0c;并以 Spring Cloud Alibaba 为例&#xff0c;详细说明其核心组件的使用方式、配置及代码示例&#xff1a; 关于 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案! https://sca.aliyun.com/?spm7145af80…

VS 基于git工程编译版本自动添加版本号

目录 概要 实现方案 概要 最近在用visual Studio 开发MFC项目时&#xff0c;需要在release版本编译后的exe文件自动追加版本信息。 由于我们用的git工程管理&#xff0c;即需要基于最新的git 提交来打版本。 比如&#xff1a; MFCApplication_V1.0.2_9.exe 由于git 提交信…

pytorch软件封装

封装代码&#xff0c;通过传入文件名&#xff0c;即可输出类别信息 上一章节&#xff0c;我们做了关于动物图像的分类&#xff0c;接下来我们把程序封装&#xff0c;然后进行预测。 单张图片的predict文件 predict.py 按着路径&#xff0c;导入单张图片做预测from torchvis…