Swift中的二分查找:全面指南
Swift中的二分查找:全面指南
简介
二分查找是计算机科学中的经典算法,被广泛用于在已排序的数组中高效地搜索目标值。与线性查找逐个检查每个元素不同,二分查找不断将搜索区间减半,因此在处理大数据集时要快得多。
在这篇博客中,我们将探讨二分查找的基本原理,它在Swift中的实现,以及使其如此高效的底层概念。
理解二分查找
二分查找基于分治法的原理。以下是这个过程的逐步分解:
- 初始设置:从排序数组的开头(低位)和结尾(高位)各设置一个指针。
- 找到中间值:计算当前搜索区间的中间索引。
- 比较:将目标值与中间元素进行比较:
- 如果目标值等于中间元素,则搜索完成。
- 如果目标值小于中间元素,则将搜索区间缩小到左半部分。
- 如果目标值大于中间元素,则将搜索区间缩小到右半部分。
- 重复:重复步骤2和3,直到找到目标值或搜索区间为空。
Swift中的二分查找实现
以下是在Swift中实现二分查找的方法:
func binarySearch<T: Comparable>(_ array: [T], target: T) -> Int? {var low = 0var high = array.count - 1while low <= high {let mid = (low + high) / 2if array[mid] == target {return mid} else if array[mid] < target {low = mid + 1} else {high = mid - 1}}return nil
}
使用示例
让我们看看这个函数在一个示例中的工作方式:
let sortedArray = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
if let index = binarySearch(sortedArray, target: 7) {print("元素在索引 \(index) 处被找到")
} else {print("元素未找到")
}
复杂度分析
二分查找的时间复杂度是O(log n),其中n是数组中的元素数量。这种效率来自于每一步都将搜索区间减半。迭代版本的空间复杂度是O(1),因为它只使用了常量级的额外空间。
边界情况和考虑
- 空数组:如果数组为空,函数应立即返回
nil。 - 不存在的元素:如果目标值不在数组中,函数应在耗尽搜索区间后返回
nil。 - 重复元素:二分查找可以处理重复元素,但它将返回其中一个出现的位置,而不一定是第一个或最后一个。
结论
二分查找是一种高效的算法,适用于在排序数组中进行搜索,具有对数级时间复杂度。理解它的实现和行为对任何处理数据结构和算法的开发人员来说都是必不可少的。Swift的表达性语法使得在应用程序中实现和使用二分查找变得容易。

LeetCode (704. 二分查找)
题目描述
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
Swift Coding
class Solution {func search(_ nums: [Int], _ target: Int) -> Int {}
}
心得分析
- 核心是用
前后两个指针控制搜索区间, 然后通过比较中间值与 target 值来不断缩小区间; - 常见的错误思路是“试图仅通过一个指向中间值的指针来解决问题,不断调整 centerPoint 找到 target 值”, 很快你会发现 centerPoint 的位置很难计算,因为没有明确的
搜索区间;
相关文章:
Swift中的二分查找:全面指南
Swift中的二分查找:全面指南 简介 二分查找是计算机科学中的经典算法,被广泛用于在已排序的数组中高效地搜索目标值。与线性查找逐个检查每个元素不同,二分查找不断将搜索区间减半,因此在处理大数据集时要快得多。 在这篇博客中…...
BUG TypeError: GPT2Model.forward() got an unexpected keyword argument ‘past’
TypeError: GPT2Model.forward() got an unexpected keyword argument past’ 环境 transformers 4.38.1详情 这是由于新版的transformers 对GPT2Model.forward() 参数进行了改变导致的错误。具体是past名称改为了 past_key_values 。 解决方法 找到错误语…...
解析Kotlin中的Lambda【笔记摘要】
先看实例: fun b(param: Int): String {return param.toString() }fun a(funParam: (Int) -> String): String {return funParam(1) }a(::b) val d ::b1.双冒号 ::method 到底是什么?答:一个指向和该函数具有相同功能的对象的引用 因为…...
rust单元测试顺序执行
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 存在的问题 有时候,不同单元测试之间可能会竞争相同的资源,比如读写相同的文件。在这种情况下,如果…...
力扣-744. 寻找比目标字母大的最小字母
文章目录 力扣题目代码工程 力扣题目 给你一个字符数组 letters,该数组按非递减顺序排序,以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这样的字符,则返回 letters 的第一个…...
一篇文章搞懂弹性云服务器和轻量云服务器的区别
前言 在众多的云服务器类型中,弹性云服务器和轻量云服务器因其各自的特点和优势,受到了广大用户的青睐。那么,这两者之间到底有哪些区别呢?本文将为您详细解析。 弹性云服务器:灵活多变的计算资源池 弹性云服务器&…...
横穿自动驾驶
如果有一条线,可以穿起来所有自动驾驶的核心模块,那么我感觉它就是最优化,选择优化变量、构造优化问题、求解优化问题,这几个步骤贯穿了自动驾驶的始终。 先从我的自身接触顺序写起。最开始做个一点深度学习,那还是20…...
为什么网上商店需要翻译成其他语言
网上商店不仅仅是一个可以买到商品的网站。它是一个完整的电子商务平台,为来自世界各地的用户提供购买所需物品的机会。但是,为了让这些用户舒适地使用网站,需要高质量的翻译和本地化。 本地化是指产品或服务适应特定文化或市场的过程。它包…...
【高考志愿】交通运输工程
目录 一、专业概述 二、课程设置 三、就业前景 四、报考注意 五、未来发展 六、交通运输工程专业排名 高考志愿选择交通运输工程专业,无疑是一个既具远见又富有挑战性的决定。这个专业以其综合性强、实用性高的特点,吸引了大批有志于投身交通事业的…...
【深度学习】【Lora训练3】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练
为了便于使用,构建一个docker镜像来使用秋叶包。2024年6月26日。 docker run -it --gpus all -v /ssd/xiedong:/datax --net host kevinchina/deeplearning:pytorch2.3.0-cuda12.1-cudnn8-devel-xformers bashgit clone --recurse-submodules https://github.com/A…...
ubuntu系统下如何安装python
在Ubuntu系统下安装Python,有多种方法可供选择。以下是两种常见的方法: 一、使用apt包管理器安装 安装步骤如下: 首先更新软件包列表 sudo apt update安装Python 3: 输入以下命令以安装Python 3(Ubuntu的默认Pyth…...
邦芒攻略:职场中学会这五种管好情绪的方法
我们在公司里面在跟同事的一些往来,或者说是工作的一些合作当中。相信很多人都会有与周围的一些人发生过一些各种的争执,或者说是一些分歧。当然作为每一个职场的人来说,每天都是工作很累的,也是都很辛苦的,所以说…...
Linux各种命令——tac命令,more 命令, less命令,head命令,tail命令,file 命令, stat 命令
注意:tac命令是倒置输出文件内容 #### tac - **作用:倒叙访问文件内容** - 格式:tac 参数 文件名 - **例如:** **tac /etc/passwd** #### more 命令 - 作用:翻页查看文件内容,适合内容较多的文件查看…...
【Rust入门教程】hello world程序
文章目录 前言Hello World程序运行总结 前言 对于学习任何一种新的编程语言,我们都会从编写一个简单的Hello World程序开始。这是一个传统,也是一个开始。在这篇文章中,我们将一起学习如何在Rust中编写你的第一个程序:Hello Worl…...
激活函数、向前传播、损失函数、梯度下降
激活函数 作用:主要引入了非线性。从而能解决很复杂的非线性关系。能更好地处理现实世界的数据和任务。 向前传播 向前传播描述了,神经网络中,输入层到输出层的信号传播和处理过程。输入层将特征数据输入,加权求和,…...
three.js - MeshStandardMaterial(标准网格材质)- 金属贴图、粗糙贴图
金属贴图、粗糙贴图 金属贴图:metalnessMap 和 粗糙贴图:roughnessMap,是用于模拟物体表面属性的两种重要贴图技术,这两种贴图,通常与基于物理的渲染(PBR)材质(如:MeshSt…...
算法-位图与底层运算逻辑
文章目录 1. 位图的理论基础2. 完整版位图实现3. 底层的运算逻辑-位运算 1. 位图的理论基础 首先我们要理解什么是位图, 位图的一些作用是什么 位图法就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又…...
黑马点评-Redis的缓存击穿,缓存雪崩,缓存穿透,互斥锁,逻辑过期
文章目录 1.缓存穿透2.缓存雪崩3.缓存击穿3.1 互斥锁3.2 基于逻辑过期 1.缓存穿透 解决办法 写入NULL值到Redis缓存,以后就会命中Redis的控制缓存而不会出现请求直接打到数据库的问题! 代码 2.缓存雪崩 这个概念很好理解,雪崩就是无数的…...
8624 多项式系数累加和
这个问题可以通过使用数学的导数规则来解决。对于一个多项式,它的导数可以通过将每一项的系数乘以它的指数,然后降低该项的指数来得到。这个过程可以重复M次来得到多项式的M阶导数。然后,我们可以简单地将所有项的系数相加来得到结果。 以下…...
使用 C# 和 OpenXML 读取大型 Excel 文件
介绍 高效读取大型 Excel 文件可能具有挑战性,尤其是在处理需要高性能和可扩展性的应用程序时。Microsoft 的 OpenXML SDK 提供了一套强大的工具来处理 Office 文档(包括 Excel 文件),而无需在服务器上安装 Excel。本文将指导您使…...
手把手教你为WCH CH582移植CherryUSB主机栈(基于RT-Thread,含中断优化)
基于RT-Thread的WCH CH582 USB主机协议栈深度移植指南在嵌入式开发领域,USB主机功能的实现往往意味着设备能够直接连接各类USB外设,从简单的键盘鼠标到复杂的存储设备。对于使用WCH CH582这类RISC-V内核MCU的开发者而言,原厂SDK提供的USB主机…...
BLE蓝牙扫描深度剖析:扫描原理、核心参数、前后台差异
一、前言BLE设备交互分为两大角色:广播端(外设Peripheral)与扫描端(中心Central)。上一篇博客详解了四大广播模式,本文聚焦配套核心能力——BLE扫描机制。绝大多数蓝牙开发疑难问题:前台能扫后台…...
销售怎么通过各种方法获取电话号码
第一种就是那个用爬虫电话号码,然后再打电话给客户。第二种是在别人的挪车电话看车挪车电话,然后再打电话找客户。第三就是。扫楼一顿顿的扫,第四就是这个那种商店,一个个的去问陌拜地推一个个的问店子要不要贷款,去问…...
大佬推荐的网络安全学习路线(从基础到高级,超级详细)
大佬推荐的网络安全学习路线(从基础到高级,超级详细) 说起网络安全,你可能会担心它是一个过时的行业。有人说,网络安全快卷死了,你既要攻又要防,并且随着技术的发展,你还要不断地学…...
Sora 2 MOV导出画质崩坏真相:HDR10元数据丢失、BT.2020色域截断、帧率标志位误写——3大隐性缺陷紧急修复方案
更多请点击: https://intelliparadigm.com 第一章:Sora 2 MOV导出画质崩坏的系统性认知 Sora 2 在生成高保真视频后,导出为 MOV 格式时频繁出现色度抽样失真、动态范围压缩、帧间伪影加剧等现象,其本质并非单一环节失效ÿ…...
Taotoken的审计日志功能为企业API安全与合规管理提供支持
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken的审计日志功能为企业API安全与合规管理提供支持 当企业决定将大模型能力集成到内部业务流程中时,IT管理员和安…...
179个核心职位,50个公司分类,中国大模型产业全栈
最后 对于正在迷茫择业、想转行提升,或是刚入门的程序员、编程小白来说,有一个问题几乎人人都在问:未来10年,什么领域的职业发展潜力最大? 答案只有一个:人工智能(尤其是大模型方向)…...
风控系统如何全维度识别爬虫:IP、账号与行为的协同决策机制
1. 这不是“反爬失败”,而是风控系统在对你做全维度画像你写完一段 requests BeautifulSoup 的代码,本地跑通了,开开心心部署到服务器,结果第二天早上发现:所有请求返回 403,日志里全是空响应;…...
【DeepSeek灰度发布黄金法则】:20年SRE亲授7步零故障上线实战框架
更多请点击: https://intelliparadigm.com 第一章:DeepSeek灰度发布策略全景图 DeepSeek模型服务的灰度发布并非简单的流量切分,而是一套融合可观测性、渐进式验证与多维熔断机制的工程化闭环体系。其核心目标是在保障线上推理稳定性的同时&…...
告别手动复制!用这个自定义编辑器脚本一键备份/克隆Unity Terrain Data
告别手动复制!用这个自定义编辑器脚本一键备份/克隆Unity Terrain Data在Unity关卡设计和技术美术的工作流中,地形数据的灵活复用往往意味着反复的手动操作——导出高度图、备份材质参数、复制植被分布,每个环节都可能成为效率瓶颈。想象这样…...
