数据结构与算法 —— 常用算法模版
数据结构与算法 —— 常用算法模版
- 二分查找
- 素数筛
- 最大公约数与最小公倍数
二分查找
人间若有天堂,大马士革必在其中;天堂若在天空,大马士革必与之齐名。 —— 阿拉伯谚语
算法若有排序,二分查找必在其中;排序若要使用,二分查找必与之齐名。 —— 木子李
(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功能之一,它融合了众多重要的编程概念。 列表是什么 列表 由一系列…...

笔记本搭配显示器
笔记本:2022款拯救者Y9000P,显卡RTX3060,分辨率2560*1600,刷新率:165Hz,无DP1.4口 显示器:2024款R27Q,27存,分辨率2560*1600,刷新率:165Hz &…...

基于排队理论的物联网发布/订阅通信系统建模与优化
论文标题 英文标题:Queuing Theory-Based Modeling and Optimization of a Publish/Subscribe IoT Communication System 中文标题:基于排队理论的物联网发布/订阅通信系统建模与优化 作者信息 Franc Pouhela Anthony Kiggundu Hans D. Schotten …...

指针(C语言)从0到1掌握指针,为后续学习c++打下基础
目录 一,指针 二,内存地址和指针 1,什么是内存地址 2,指针在不同系统下所占内存 三,指针的声明和初始化以及类型 1,指针的声明 2,指针 的初始化 1, 初始化方式优点及适用场景 4,指针的声明初始化类型…...

实验八 JSP访问数据库
实验八 JSP访问数据库 目的: 1、熟悉JDBC的数据库访问模式。 2、掌握使用My SQL数据库的使用 实验要求: 1、通过JDBC访问mysql数据,实现增删改查功能的实现 2、要求提交实验报告,将代码和实验结果页面截图放入报告中 实验过程&a…...

Day31-【AI思考】-关键支点识别与战略聚焦框架
文章目录 关键支点识别与战略聚焦框架**第一步:支点目标四维定位法****第二步:支点验证里程碑设计****第三步:目标网络重构方案****第四步:动态监控仪表盘** 执行工具箱核心心法 关键支点识别与战略聚焦框架 让思想碎片重焕生机的…...

DeepSeek与其他大模型相比
DeepSeek与其他大模型相比 与GPT-4对比 性能方面 推理速度:DeepSeek在解决复杂的数学、物理和逻辑推理问题方面速度惊人,是ChatGPT的两倍。“幻觉”现象:在处理需要网络信息检索的任务时,DeepSeek的“幻觉”现象似乎比ChatGPT更少。创意任务:ChatGPT在创意性任务,如创作…...

在深度Linux (Deepin) 20中安装Nvidia驱动
文章创作不易,麻烦大家点赞关注收藏一键三连。 在Deepin上面跑Tensorflow, pytorch等人工智能框架不是一件容易的事情。特别是如果你要使用GPU,就得有nvidia的驱动。默认情况下Deepin系统自带的是nouveau开源驱动。这是没办法用tensorflow的。下面内容是…...

“LoRA技术中参数初始化策略:为何A参数采用正态分布而B参数初始化为0”
在LoRA(Low-Rank Adaptation)中,参数A和B的初始化策略是经过精心设计的,以确保模型训练的稳定性和有效性。具体来说,参数A通常被初始化为正态分布,而参数B则初始化为0。这样的设计有以下几个优点࿱…...

C语言初阶力扣刷题——349. 两个数组的交集【难度:简单】
1. 题目描述 力扣在线OJ题目 给定两个数组,编写一个函数来计算它们的交集。 示例: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2] 输入:nums1 [4,9,5], nums2 [9,4,9,8,4] 输出:[9,4] 2. 思路 直接暴力…...

理解动手学深度学习的自编包d2l
跟着李沐的《动手学深度学习-PyTorch版》入门Python编程和Pytorch框架,以前是重度Matlab用户,对于Python里的各种包很不习惯。特别是,本书还自己做了一个名为d2l包,有几个问题很是困惑。今天终于弄明白了,写在这里&…...