当前位置: 首页 > news >正文

Swift中的二分查找:全面指南

Swift中的二分查找:全面指南

简介

二分查找是计算机科学中的经典算法,被广泛用于在已排序的数组中高效地搜索目标值。与线性查找逐个检查每个元素不同,二分查找不断将搜索区间减半,因此在处理大数据集时要快得多。

在这篇博客中,我们将探讨二分查找的基本原理,它在Swift中的实现,以及使其如此高效的底层概念。

理解二分查找

二分查找基于分治法的原理。以下是这个过程的逐步分解:

  1. 初始设置:从排序数组的开头(低位)和结尾(高位)各设置一个指针。
  2. 找到中间值:计算当前搜索区间的中间索引。
  3. 比较:将目标值与中间元素进行比较:
    • 如果目标值等于中间元素,则搜索完成。
    • 如果目标值小于中间元素,则将搜索区间缩小到左半部分。
    • 如果目标值大于中间元素,则将搜索区间缩小到右半部分。
  4. 重复:重复步骤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 {}
}

心得分析

  1. 核心是用前后两个指针控制搜索区间, 然后通过比较中间值与 target 值来不断缩小区间;
  2. 常见的错误思路是“试图仅通过一个指向中间值的指针来解决问题,不断调整 centerPoint 找到 target 值”, 很快你会发现 centerPoint 的位置很难计算,因为没有明确的搜索区间

相关文章:

Swift中的二分查找:全面指南

Swift中的二分查找&#xff1a;全面指南 简介 二分查找是计算机科学中的经典算法&#xff0c;被广泛用于在已排序的数组中高效地搜索目标值。与线性查找逐个检查每个元素不同&#xff0c;二分查找不断将搜索区间减半&#xff0c;因此在处理大数据集时要快得多。 在这篇博客中…...

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【笔记摘要】

先看实例&#xff1a; fun b(param: Int): String {return param.toString() }fun a(funParam: (Int) -> String): String {return funParam(1) }a(::b) val d ::b1.双冒号 ::method 到底是什么&#xff1f;答&#xff1a;一个指向和该函数具有相同功能的对象的引用 因为…...

rust单元测试顺序执行

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 存在的问题 有时候&#xff0c;不同单元测试之间可能会竞争相同的资源&#xff0c;比如读写相同的文件。在这种情况下&#xff0c;如果…...

力扣-744. 寻找比目标字母大的最小字母

文章目录 力扣题目代码工程 力扣题目 给你一个字符数组 letters&#xff0c;该数组按非递减顺序排序&#xff0c;以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这样的字符&#xff0c;则返回 letters 的第一个…...

一篇文章搞懂弹性云服务器和轻量云服务器的区别

前言 在众多的云服务器类型中&#xff0c;弹性云服务器和轻量云服务器因其各自的特点和优势&#xff0c;受到了广大用户的青睐。那么&#xff0c;这两者之间到底有哪些区别呢&#xff1f;本文将为您详细解析。 弹性云服务器&#xff1a;灵活多变的计算资源池 弹性云服务器&…...

横穿自动驾驶

如果有一条线&#xff0c;可以穿起来所有自动驾驶的核心模块&#xff0c;那么我感觉它就是最优化&#xff0c;选择优化变量、构造优化问题、求解优化问题&#xff0c;这几个步骤贯穿了自动驾驶的始终。 先从我的自身接触顺序写起。最开始做个一点深度学习&#xff0c;那还是20…...

为什么网上商店需要翻译成其他语言

网上商店不仅仅是一个可以买到商品的网站。它是一个完整的电子商务平台&#xff0c;为来自世界各地的用户提供购买所需物品的机会。但是&#xff0c;为了让这些用户舒适地使用网站&#xff0c;需要高质量的翻译和本地化。 本地化是指产品或服务适应特定文化或市场的过程。它包…...

【高考志愿】交通运输工程

目录 一、专业概述 二、课程设置 三、就业前景 四、报考注意 五、未来发展 六、交通运输工程专业排名 高考志愿选择交通运输工程专业&#xff0c;无疑是一个既具远见又富有挑战性的决定。这个专业以其综合性强、实用性高的特点&#xff0c;吸引了大批有志于投身交通事业的…...

【深度学习】【Lora训练3】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

为了便于使用&#xff0c;构建一个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&#xff0c;有多种方法可供选择。以下是两种常见的方法&#xff1a; 一、使用apt包管理器安装 安装步骤如下&#xff1a; 首先更新软件包列表 sudo apt update安装Python 3&#xff1a; 输入以下命令以安装Python 3&#xff08;Ubuntu的默认Pyth…...

邦芒攻略:职场中学会这五种管好情绪的方法

​​我们在公司里面在跟同事的一些往来&#xff0c;或者说是工作的一些合作当中。相信很多人都会有与周围的一些人发生过一些各种的争执&#xff0c;或者说是一些分歧。当然作为每一个职场的人来说&#xff0c;每天都是工作很累的&#xff0c;也是都很辛苦的&#xff0c;所以说…...

Linux各种命令——tac命令,more 命令, less命令,head命令,tail命令,file 命令, stat 命令

注意&#xff1a;tac命令是倒置输出文件内容 #### tac - **作用&#xff1a;倒叙访问文件内容** - 格式&#xff1a;tac 参数 文件名 - **例如&#xff1a;** **tac /etc/passwd** #### more 命令 - 作用&#xff1a;翻页查看文件内容&#xff0c;适合内容较多的文件查看…...

【Rust入门教程】hello world程序

文章目录 前言Hello World程序运行总结 前言 对于学习任何一种新的编程语言&#xff0c;我们都会从编写一个简单的Hello World程序开始。这是一个传统&#xff0c;也是一个开始。在这篇文章中&#xff0c;我们将一起学习如何在Rust中编写你的第一个程序&#xff1a;Hello Worl…...

激活函数、向前传播、损失函数、梯度下降

激活函数 作用&#xff1a;主要引入了非线性。从而能解决很复杂的非线性关系。能更好地处理现实世界的数据和任务。 向前传播 向前传播描述了&#xff0c;神经网络中&#xff0c;输入层到输出层的信号传播和处理过程。输入层将特征数据输入&#xff0c;加权求和&#xff0c;…...

three.js - MeshStandardMaterial(标准网格材质)- 金属贴图、粗糙贴图

金属贴图、粗糙贴图 金属贴图&#xff1a;metalnessMap 和 粗糙贴图&#xff1a;roughnessMap&#xff0c;是用于模拟物体表面属性的两种重要贴图技术&#xff0c;这两种贴图&#xff0c;通常与基于物理的渲染&#xff08;PBR&#xff09;材质&#xff08;如&#xff1a;MeshSt…...

算法-位图与底层运算逻辑

文章目录 1. 位图的理论基础2. 完整版位图实现3. 底层的运算逻辑-位运算 1. 位图的理论基础 首先我们要理解什么是位图, 位图的一些作用是什么 位图法就是bitmap的缩写。所谓bitmap&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于大规模数据&#xff0c;但数据状态又…...

黑马点评-Redis的缓存击穿,缓存雪崩,缓存穿透,互斥锁,逻辑过期

文章目录 1.缓存穿透2.缓存雪崩3.缓存击穿3.1 互斥锁3.2 基于逻辑过期 1.缓存穿透 解决办法 写入NULL值到Redis缓存&#xff0c;以后就会命中Redis的控制缓存而不会出现请求直接打到数据库的问题&#xff01; 代码 2.缓存雪崩 这个概念很好理解&#xff0c;雪崩就是无数的…...

8624 多项式系数累加和

这个问题可以通过使用数学的导数规则来解决。对于一个多项式&#xff0c;它的导数可以通过将每一项的系数乘以它的指数&#xff0c;然后降低该项的指数来得到。这个过程可以重复M次来得到多项式的M阶导数。然后&#xff0c;我们可以简单地将所有项的系数相加来得到结果。 以下…...

使用 C# 和 OpenXML 读取大型 Excel 文件

介绍 高效读取大型 Excel 文件可能具有挑战性&#xff0c;尤其是在处理需要高性能和可扩展性的应用程序时。Microsoft 的 OpenXML SDK 提供了一套强大的工具来处理 Office 文档&#xff08;包括 Excel 文件&#xff09;&#xff0c;而无需在服务器上安装 Excel。本文将指导您使…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...