数据结构与算法 —— 常用算法模版
数据结构与算法 —— 常用算法模版
- 二分查找
- 素数筛
- 最大公约数与最小公倍数
二分查找
人间若有天堂,大马士革必在其中;天堂若在天空,大马士革必与之齐名。 —— 阿拉伯谚语
算法若有排序,二分查找必在其中;排序若要使用,二分查找必与之齐名。 —— 木子李
(1)初始化左右指针
left 指向数组的起始位置(索引0)。
right 指向数组的末尾位置(索引len(arr) - 1)。
(2)循环条件
while left <= right:只要左指针不大于右指针,就继续搜索。这意味着搜索区间是有效的。
计算中间位置:
mid = left + (right - left) // 2:这是计算中间位置的标准方式。使用 (right - left) // 2 而不是 (right + left) // 2 是为了防止当 left 和 right 都很大时,它们的和可能超过整数类型的最大值,导致溢出。通过先减去再除以2,可以安全地计算出中间索引。
(3)检查中间元素
如果 arr[mid] == target,则找到了目标元素,返回其索引 mid。
如果 arr[mid] < target,说明目标元素在 mid 的右侧,因此将 left 更新为 mid + 1,缩小搜索范围到右半部分。
如果 arr[mid] > target,说明目标元素在 mid 的左侧,因此将 right 更新为 mid - 1,缩小搜索范围到左半部分。
(4)返回结果
如果循环结束还没有找到目标元素,则返回 -1,表示目标元素不在数组中。
(5)注意事项
确保输入的数组 arr 是有序的,因为二分查找依赖于数组的有序性。
mid 的计算方式可以防止整数溢出,这是在处理大数据集时的一个重要考虑因素。
返回值 -1 表示未找到目标元素,可根据需要自定义这个返回值。
# 排序是为了更快查找,不为了更快查找没必要排序。
def binary_search(arr, target):left, right = 0, len(arr) - 1while left <= right:# 防止(left + right)直接相加导致的整数溢出,这里mid有两种写法mid = left + (right - left) // 2 # 检查mid位置的元素if arr[mid] == target:return mid # 找到目标,返回索引elif arr[mid] < target:left = mid + 1 # 目标在mid右侧else:right = mid - 1 # 目标在mid左侧return -1 # 未找到目标,返回-1
array = [1,2,3,4,5]
for left in range(0, len(array)):for right in range(left, len(array)):if (right - left) % 2 == 0:print("奇数个元素:(",end="")else:print("偶数个元素:(",end="")for x in range(left, right + 1):if x < right:print(f"{x},",end="")if x == right:print(f"{x}",end="")print(")")# 关于mid的两种写法print(f"mid = (right + left) // 2 = ", (right + left) // 2)print(f"mid = (right + left + 1) // 2 = ", (right + left + 1) // 2)print("\n")
奇数个元素:(0)
(right + left) // 2 = 0
(right + left + 1) // 2 = 0
偶数个元素:(0,1)
(right + left) // 2 = 0
(right + left + 1) // 2 = 1
奇数个元素:(0,1,2)
(right + left) // 2 = 1
(right + left + 1) // 2 = 1
可以看到在偶数个元素时,(right + left) // 2 = mid下标偏左,(right + left + 1) // 2 = mid下标偏右,奇数个元素时都是对的
| 参考文章与视频链接 |
|---|
| [1]《大马士革刀传奇,一把宝刀,两座刀锋下的城市》 |
素数筛
def sieve_of_eratosthenes(n):# 创建一个布尔数组,初始化为 True,表示所有数都是素数is_prime = [True] * (n + 1)p = 2while (p * p <= n):# 如果 is_prime[p] 没有被改变,那么它是一个素数if is_prime[p]:# 更新 p 的所有倍数为 False,表示它们不是素数for i in range(p * p, n + 1, p):is_prime[i] = Falsep += 1# 收集所有的素数prime_numbers = [p for p in range(2, n + 1) if is_prime[p]]return prime_numbers# 示例使用
n = 30
primes = sieve_of_eratosthenes(n)
print(f"小于或等于 {n} 的素数有: {primes}")
最大公约数与最小公倍数
# 最大公约数
"""
a = 40, b = 104
算法过程
a b remain
40 % 104 = 40
104 % 40 = 24
40 % 24 = 16
24 % 16 = 8
16 % 8 = 0
8 % 0 = 不执行,结束
return a
"""
def gcd(a: int, b: int):while b != 0:remain = a % ba = bb = remainreturn a# 最小公倍数
def lcm(a: int, b: int):return int((a * b) / gcd(a, b))if __name__ == '__main__':print(gcd(400, 20)) # 20print(lcm(400, 20)) # 400相关文章:
数据结构与算法 —— 常用算法模版
数据结构与算法 —— 常用算法模版 二分查找素数筛最大公约数与最小公倍数 二分查找 人间若有天堂,大马士革必在其中;天堂若在天空,大马士革必与之齐名。 —— 阿拉伯谚语 算法若有排序,二分查找必在其中;排序若要使用…...
DDD - 领域事件_解耦微服务的关键
文章目录 Pre领域事件的核心概念领域事件的作用领域事件的识别领域事件的技术实现领域事件的运行机制案例领域事件驱动的优势 Pre DDD - 微服务设计与领域驱动设计实战(中)_ 解决微服务拆分难题 EDA - Spring Boot构建基于事件驱动的消息系统 领域事件的核心概念 领域事件&a…...
芯片AI深度实战:实战篇之vim chat
利用vim-ollama这个vim插件,可以在vim内和本地大模型聊天。 系列文章: 芯片AI深度实战:基础篇之Ollama-CSDN博客 芯片AI深度实战:基础篇之langchain-CSDN博客 芯片AI深度实战:实战篇之vim chat-CSDN博客 芯片AI深度…...
【产品经理学习案例——AI翻译棒出海业务】
前言: 本文主要讲述了硬件产品在出海过程中,翻译质量、翻译速度和本地化落地策略是硬件产品规划需要考虑的核心因素。针对不同国家,需要优化翻译质量和算法,关注市场需求和文化差异,以便更好地满足当地用户的需求。同…...
解决运行npm时报错
在运行一个Vue项目时报错,产生下面问题 D:\node\npm.cmd run dev npm WARN logfile could not be created: Error: EPERM: operation not permitted, open D:\node\node_cache\_logs\2025-01-31T01_01_58_076Z-debug-0.log npm WARN logfile could not be created:…...
【07-编译工程与导入网表】
这里写自定义目录标题 一丶编译原理图编译默认属性一丶编译项目二丶输出BOM材料报告优化EXCEL-BOM清单 三丶输出PDF原理图给维修人员看 四丶导入网格表查看是否有错误常见错误 其他问题什么是位号(C1)?EXCEL添加序号列和居中显示?位号(序号)与单位(型号)EXCEL设置自动换行 编…...
FireFox | Google Chrome | Microsoft Edge 禁用更新 final版
之前的方式要么失效,要么对设备有要求,这次梳理一下对设备、环境几乎没有要求的通用方式,universal & final 版。 1.Firefox 方式 FireFox火狐浏览器企业策略禁止更新_火狐浏览器禁止更新-CSDN博客 这应该是目前最好用的方式。火狐也…...
conda配置channel
你收到 CondaKeyError: channels: value https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main not present in config 错误是因为该镜像源(https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main)可能没有被正确添加到 Conda 的配置文件中&…...
【MQ】探索 Kafka
基本概念 主题:Topic。主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。 分区:Partition。一个有序不变的消息序列。每个主题下可以有多个分区。消息位移:Offset。表示分区中每条消息的位置信息,是一个…...
Workbench 中的热源仿真
探索使用自定义工具对移动热源进行建模及其在不同行业中的应用。 了解热源动力学 对移动热源进行建模为各种工业过程和应用提供了有价值的见解。激光加热和材料加工使用许多激光束来加热、焊接或切割材料。尽管在某些情况下,热源 (q) 不是通…...
计算机网络 笔记 网络层 3
IPv6 IPv6 是互联网协议第 6 版(Internet Protocol Version 6)的缩写,它是下一代互联网协议,旨在解决 IPv4 面临的一些问题,以下是关于 IPv6 的详细介绍: 产生背景: 随着互联网的迅速发展&…...
翼星求生服务器搭建【Icarus Dedicated Server For Linux】
一、前言 本次搭建的服务器为Steam平台一款名为Icarus的沙盒、生存、建造游戏,由于官方只提供了Windows版本服务器导致很多热爱Linux的小伙伴无法释怀,众所周知Linux才是专业服务器的唯一准则。虽然Github上已经有大佬制作了容器版本但是容终究不够完美,毕竟容器无法与原生L…...
ZZNUOJ(C/C++)基础练习1011——1020(详解版)
目录 1011 : 圆柱体表面积 C语言版 C版 1012 : 求绝对值 C语言版 C版 1013 : 求两点间距离 C语言版 C版 1014 : 求三角形的面积 C语言版 C版 1015 : 二次方程的实根 C语言版 C版 1016 : 银行利率 C语言版 C版 1017 : 表面积和体积 C语言版 C版 代码逻辑…...
论文阅读:Realistic Noise Synthesis with Diffusion Models
这篇文章是 2025 AAAI 的一篇工作,主要介绍的是用扩散模型实现对真实噪声的仿真模拟 Abstract 深度去噪模型需要大量来自现实世界的训练数据,而获取这些数据颇具挑战性。当前的噪声合成技术难以准确模拟复杂的噪声分布。我们提出一种新颖的逼真噪声合成…...
复杂场景使用xpath定位元素
在复杂场景下使用XPath定位元素时,可以通过以下高级技巧提高定位准确性和稳定性: 动态属性处理 模糊匹配: //div[contains(id, dynamic-part)] //button[starts-with(name, btn-)] //input[ends-with(class, -input)] (需XPath 2.0)多属性…...
算法基础——存储
引入 基础理论的进步,是推动技术实现重大突破,促使相关领域的技术达成跨越式发展的核心。 在发展日新月异的大数据领域,基础理论的核心无疑是算法。不管是技术设计,还是工程实践,都必须仰仗相关算法的支持࿰…...
动态规划 (环形)
在一个圆形操场的四周摆放着n堆石子,现要将石子有次序地合并成一堆。规定每次只能选相邻2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。 输入格式: n表示n…...
信号模块--simulink操作
位置simulink/sourses 常用的模块 功能:常数模块,提供一个常数 数据设置可以是一维或多维 一维数据设置 多维数据设置(例三维数据设置) 方波脉冲模块 模块用于按固定间隔生成方波脉冲信号 振幅就是方波的幅度,0到…...
Streamlit入门
1、Streamlit是什么 Streamlit 是一个用于快速构建数据应用的开源 Python 库,由 Streamlit 公司开发并维护。它极大地简化了从数据脚本到交互式 Web 应用的转化过程,让开发者无需具备前端开发的专业知识,就能轻松创建出美观、实用的交互式应…...
列表(列表是什么)
你将学习列表是什么以及如何使用列表元素。列表让你能够在一个地方存储成组的信息,其中可以只包含几个元素,也可以包含数百万个元素。 列表是新手可直接使用的最强大的Python功能之一,它融合了众多重要的编程概念。 列表是什么 列表 由一系列…...
洛谷-入门4-数组3
P2141 [NOIP 2014 普及组] 珠心算测验 题目背景 NOIP2014 普及 T1 题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。 某学…...
3步解锁全显卡AI超分:让老旧设备焕发新生的开源黑科技
3步解锁全显卡AI超分:让老旧设备焕发新生的开源黑科技 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler AI超分辨率技术正…...
本科生 AI 写论文天花板!Paperxie 智能写作:从选题到成稿全流程,零焦虑搞定毕业论文
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 一、写在前面:毕业论文,为什么成了本科生的 “年度噩梦”? 每年毕业季&#x…...
OpenClaw飞书机器人实战:GLM-4.7-Flash智能问答系统搭建
OpenClaw飞书机器人实战:GLM-4.7-Flash智能问答系统搭建 1. 为什么选择OpenClaw飞书GLM组合? 去年我负责团队的知识库建设时,每天要处理上百条技术咨询。传统FAQ文档的维护成本高,而商业客服系统又超出预算。直到发现OpenClaw这…...
WaveTools终极指南:免费解锁《鸣潮》流畅体验的完整解决方案
WaveTools终极指南:免费解锁《鸣潮》流畅体验的完整解决方案 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 还在为《鸣潮》游戏卡顿、帧率不稳而烦恼吗?WaveTools鸣潮工具箱为你带…...
DAMOYOLO-S边缘端部署指南:STM32F103C8T6嵌入式平台推理优化
DAMOYOLO-S边缘端部署指南:STM32F103C8T6嵌入式平台推理优化 1. 引言 如果你正在为一个资源极其有限的嵌入式设备寻找一个能跑起来的目标检测方案,比如用一块小小的STM32F103C8T6开发板,那么这篇文章就是为你准备的。你可能已经尝试过一些经…...
Mac清理工具Pearcleaner:残留文件处理与系统优化完全指南
Mac清理工具Pearcleaner:残留文件处理与系统优化完全指南 【免费下载链接】Pearcleaner Open-source mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner Pearcleaner是一款免费开源的Mac应用清理工具,专为彻底卸载应用程…...
Datart BI 工具数据库连接优化:解决 wait millis 5001 报错与连接池配置调整
1. 遇到 wait millis 5001 报错怎么办? 最近在帮客户部署 Datart BI 工具时,遇到了一个典型的数据库连接问题。每天早上业务高峰期,系统日志里就会频繁出现"wait millis 5001"的报错,但奇怪的是直接登录数据库服务器检查…...
Python多解释器冷启动优化:从2.1s到87ms的极致压缩术(附可复用的预热调度器)
第一章:Python多解释器冷启动优化:从2.1s到87ms的极致压缩术(附可复用的预热调度器) 在微服务与Serverless场景中,Python多解释器(如PyO3、subinterpreters或进程级隔离)常因模块导入、C扩展初始…...
OpenClaw+GLM-4.7-Flash:开发提效助手实战
OpenClawGLM-4.7-Flash:开发提效助手实战 1. 为什么选择本地化AI开发助手 去年接手一个紧急项目时,我经历了连续三天的凌晨日志排查。那段经历让我意识到,开发者80%的重复性工作其实可以被自动化。当我发现OpenClawGLM-4.7-Flash这个组合时…...
