数据结构——查找算法

文章目录

1. 查找算法

2. 顺序查找

2. 二分查找


1. 查找算法

查找算法是用于在数据集中定位特定元素的位置的算法。查找是计算机科学中一项基本操作,几乎在所有应用程序中都需要使用。例如,数据库查询、信息检索、字典查找等都涉及到查找操作。查找算法可以根据不同的需求和数据结构选择不同的实现方法,以达到高效、准确的目的。

顺序查找

原理:从数据集的起始位置开始,依次检查每个元素,直到找到目标元素或到达数据集末尾。

优点:实现简单。无需数据集有序。

缺点:查找效率较低,时间复杂度为O(n)。

二分查找

原理:在有序数据集中,通过反复将查找范围减半,逐步缩小搜索范围,直到找到目标元素或确定目标元素不存在。

优点

  • 查找效率较高,时间复杂度为O(log n)。
  • 适用于有序数据集。

缺点

  • 需要数据集有序。
  • 实现相对复杂。

2. 顺序查找

顺序查找,又称线性查找,是一种最基本的查找算法。它的工作原理非常简单,主要步骤如下:

  1. 从头开始遍历:从数据集的起始位置开始,依次检查每个元素。
  2. 比较目标:对于每个遍历到的元素,将其与目标元素进行比较。
  3. 查找成功:如果当前元素等于目标元素,则查找成功,返回当前元素的索引。
  4. 查找失败:如果遍历完整个数据集仍未找到目标元素,则查找失败,返回一个特殊的标识来表示未找到。

这种方法的优点在于简单直观,但对于大量数据来说,效率不高,因为它在最坏情况下需要检查每个元素。

伪代码

function linearSearch(array, target):for index from 0 to length(array) - 1:if array[index] == target:return index  // 查找成功,返回索引return -1  // 查找失败,返回特殊标识

C代码实现

#include <stdio.h>// 顺序查找函数
// arr[]: 待查找的数组
// n: 数组的长度
// target: 目标元素
int linearSearch(int arr[], int n, int target) {// 遍历数组中的每个元素for (int i = 0; i < n; i++) {// 如果当前元素等于目标元素if (arr[i] == target) {return i;  // 查找成功,返回当前元素的索引}}return -1;  // 查找失败,返回特殊标识 -1 表示未找到目标元素
}int main() {int arr[] = {3, 5, 7, 9, 11, 13, 15};  // 定义一个整数数组int n = sizeof(arr) / sizeof(arr[0]);  // 计算数组的长度int target = 9;  // 定义目标元素// 调用顺序查找函数查找目标元素int result = linearSearch(arr, n, target);// 根据查找结果输出相应的信息if (result != -1) {printf("元素 %d 在数组中的索引为: %d\n", target, result);  // 查找成功} else {printf("元素 %d 不在数组中\n", target);  // 查找失败}return 0;  // 程序结束
}
  • 函数定义linearSearch 函数接收一个数组、数组长度和目标元素作为参数。
  • 遍历数组:使用 for 循环遍历数组中的每个元素。
  • 比较元素:在循环中,将每个元素与目标元素进行比较。如果相等,则返回当前索引。
  • 查找失败:如果循环结束后仍未找到目标元素,则返回 -1 表示查找失败。
  • 主函数:在 main 函数中,定义了一个数组和目标元素,调用 linearSearch 函数,并根据返回结果输出相应的信息。

2. 二分查找

二分查找(Binary Search)是一种高效的查找算法,通常用于在有序数据集中查找目标元素。其原理是通过将数据集划分为两半并与目标进行比较,以确定目标在哪一半中,从而逐步缩小搜索范围,直到找到目标元素或确定不存在目标元素。基本原理如下:

1. 选择中间元素:在有序数据集中,选择数组的中间元素。

  • 初始时,选择整个数组的中间元素。对于一个有序数组arr,如果当前的搜索范围是[low, high],则中间元素的位置是mid = (low + high) / 2

2. 比较目标:将中间元素与目标元素进行比较。

  • 将数组中间位置的元素arr[mid]与目标元素target进行比较。

3. 查找成功:如果中间元素等于目标元素,则查找成功,返回中间元素的索引。

  • 如果arr[mid] == target,则找到目标元素,返回mid

4. 缩小搜索范围

  • 对于一个升序的数据集,如果中间元素大于目标元素,说明目标可能在左半部分;如果中间元素小于目标元素,说明目标可能在右半部分。根据比较结果,将搜索范围缩小到左半部分或右半部分,继续查找。
  • 如果arr[mid] > target,则目标元素在左半部分,即更新搜索范围为[low, mid - 1]
  • 如果arr[mid] < target,则目标元素在右半部分,即更新搜索范围为[mid + 1, high]

5. 重复步骤:重复上述步骤,不断将搜索范围缩小,直到找到目标元素或搜索范围为空。

  • 重复上述步骤,直到low > high(搜索范围为空)或找到目标元素。

C代码实现

#include <stdio.h>// 二分查找函数
int binarySearch(int arr[], int low, int high, int target) {while (low <= high) {int mid = (low + high) / 2; // 选择中间元素if (arr[mid] == target) {return mid; // 查找成功,返回索引} else if (arr[mid] > target) {high = mid - 1; // 缩小搜索范围到左半部分} else {low = mid + 1; // 缩小搜索范围到右半部分}}return -1; // 查找失败,返回特殊值
}int main() {int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};int n = sizeof(arr) / sizeof(arr[0]);int target = 5;int result = binarySearch(arr, 0, n - 1, target);if (result != -1) {printf("Element found at index: %d\n", result);} else {printf("Element not found in array\n");}return 0;
}
  • 时间复杂度:二分查找的时间复杂度是O(log n),因为每次比较后搜索范围都会减少一半。
  • 空间复杂度:由于二分查找只需要几个额外的变量存储索引,因此空间复杂度是O(1)

假设我们有一个有序数组arr = {1, 2, 3, 4, 5, 6, 7, 8},目标元素是5

  1. 初始时,low = 0high = 7,计算mid = (0 + 7) / 2 = 3

    • 比较arr[3](即4)与目标5
    • 因为4 < 5,所以目标在右半部分,更新low = 4
  2. 下一步,low = 4high = 7,计算mid = (4 + 7) / 2 = 5

    • 比较arr[5](即6)与目标5
    • 因为6 > 5,所以目标在左半部分,更新high = 4
  3. 最后,low = 4high = 4,计算mid = (4 + 4) / 2 = 4

    • 比较arr[4](即5)与目标5
    • 因为5 == 5,查找成功,返回索引4

因此,目标元素5在数组中的索引是4

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

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

相关文章

【JavaScript 报错】未捕获的类型错误:Uncaught TypeError

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、错误原因分析1. 调用不存在的方法2. 访问未定义的属性3. 数据类型不匹配4. 函数参数类型不匹配 二、解决方案1. 检查方法和属性是否存在2. 使用可选链操作符3. 数据类型验证4. 函数参数类型检查 三、实例讲解四、总结 在…

[C++初阶]list类的初步理解

一、标准库的list类 list的底层是一个带哨兵位的双向循环链表结构 对比forward_list的单链表结构&#xff0c;list的迭代器是一个双向迭代器 与vector等顺序结构的容器相比&#xff0c;list在任意位置进行插入删除的效率更好&#xff0c;但是不支持任意位置的随机访问 list是一…

mac生成.dmg压缩镜像文件

mac生成.dmg压缩镜像文件 背景准备内容步骤1&#xff0c;找一个文件夹2&#xff0c;制作application替身1&#xff0c;终端方式2&#xff0c;黄金右手方式 3&#xff0c;.app文件放入文件夹4&#xff0c;制作.dmg压缩镜像文件5&#xff0c;安装.dmg 总结 背景 为绕开App Store…

视频融合共享平台视频共享融合赋能平台数字化升级医疗体系

在当前&#xff0c;医疗健康直接关系到国计民生&#xff0c;然而&#xff0c;由于医疗水平和资源分布不均&#xff0c;以及信息系统老化等问题&#xff0c;整体医疗服务能力和水平的提升受到了限制。视频融合云平台作为数字医疗发展的关键推动力量&#xff0c;在医疗领域的广泛…

Docker部署gitlab私有仓库后查看root默认密码以及修改external_url路径和端口的方法

文章目录 1、docker部署最新版gitlab2、进入gitlab容器3、修改路径地址ip和端口4、检验效果 1、docker部署最新版gitlab #docker安装命令 docker run --detach \--name gitlab \--restart always \-p 1080:80 \-p 10443:443 \-p 1022:22 \-v /gitlab/config:/etc/gitlab \-v …

MacOS 开发 — Packages 程序 macOS新版本 演示选项卡无法显示

MacOS 开发 — Packages 程序 macOS新版本 演示选项卡无法显示 问题描述 &#xff1a; 之前写过 Packages 的使用以及如何打包macOS程序。最近更新了新的macOS系统&#xff0c;发现Packages的演示选项卡无法显示&#xff0c;我尝试从新安转了Packages 也是没作用&#xff0c;…

夏令营入门组day1

一. 题目 二. 初步思路 因为是解决区间上的问题&#xff0c;很容易想到用前缀和来解决。前缀和是o ( n ) 的时间复杂度&#xff0c;但后续枚举两个端点要 o ( n^2 )&#xff0c;对于2e10的数据&#xff0c;超时。 for (int i 1; i < n; i )for (int j i; j <n; j ){if…

转录组和基因芯片GSE数据RAW.tar压缩包下载和多样本整合处理教程

转录组和基因芯片GSE数据集的RAW.tar压缩包下载和多样本整合处理教程 GSEXXX_RAW.tar压缩包手动下载解压 前情回顾 关于OmicsTools根据GSE编号自动下载和提取GEO表达数据 根据GSE编号自动下载和提取GEO表达数据的窗口截图 自动下载和提取整理到结果文件 该模块的分析教程 …

天环公益首发原创开发进度网站 带后台

天环公益计划首发原创开发进度网站 带后台 后台地址是&#xff1a;admin.php 后台没有账号密码 这个没有数据库 有能力的可以自己改 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89520358 更多资源下载&#xff1a;关注我。

区分modbus tcp和tcp/ip

Modbus 对某些人来说&#xff0c;这听起来可能很复杂&#xff0c;也很令人费解&#xff0c;但是一旦你了解了它的工作原理&#xff0c;那就是一个特别简单的过程。MODBUS 这是一种请求和响应协议。MODBUS 主站将发起请求&#xff0c;从站将响应错误或请求信息。这就是 modbus 简…

通俗易懂,幽默诙谐,《IP 核芯志》让逻辑设计思想摆脱枯燥的标签(可下载)

在科技的广袤星空中&#xff0c;数字逻辑设计宛如一颗璀璨的明星&#xff0c;闪耀着智慧与创造的光芒。而在这光芒的深处&#xff0c;IP 核芯则是那关键的能量源泉&#xff0c;驱动着无数创新的浪潮。 《IP 核芯志——数字逻辑设计思想》犹如一座灯塔&#xff0c;照亮了我们在…

Java | Leetcode Java题解之第229题多数元素II

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> majorityElement(int[] nums) {HashMap<Integer, Integer> cnt new HashMap<Integer, Integer>();for (int i 0; i < nums.length; i) {if (cnt.containsKey(nums[i])) {cnt.…

Python 核心编程

Python 核心编程 1. 数据类型1.1 整型 int1.2 浮点数 float1.3 布尔类型 bool1.4 字符串 str1.5 列表 list1.6 元组 tuple1.7 集合 set1.8 字典 dict 2. 逻辑结构、文件操作2.1 分支结构和三元表达2.2 循环和遍历2.3 目录和路径2.4 文件操作 3. 函数、类、异常处理3.1 函数3.2 …

JS爬虫实战之极验四代

极验四代滑块验证码 一、目标网站说明二、流程步骤1. 逆向步骤一般分为&#xff1a;2. 接口确认1- 确认流程2- 获取verify的参数3- 构建requests验证verify的参数4- 锁定secode参数的作用 ok&#xff0c;让我们去获取verify接口中的响应&#xff01;&#xff01;&#xff01; 3…

java算法day12

java算法day12 199二叉树的右视图637二叉树的层平均值515 在每个树行中找最大值429 N叉树的层序遍历116 填充每个节点的下一个右侧节点指针 199 二叉树的右视图 这题还是层序遍历的板子&#xff0c;但是在处理上略有差异 这个题我一开始的想法就有误&#xff0c;因为我一开始…

基于PID控制器的双容控制系统matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1PID控制器的基本原理 4.2双容水箱系统的数学模型 5.完整工程文件 1.课题概述 基于PID控制器的双容控制系统matlab仿真&#xff0c;仿真输出PID控制下的水位和流量两个指标。 2.系统仿真结果 &…

Nginx七层(应用层)反向代理:SCGI代理scgi_pass篇

Nginx七层&#xff08;应用层&#xff09;反向代理 SCGI代理scgi_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this art…

ENSP防火墙

实验拓扑图 需求&#xff1a; ENSP的配置&#xff1a; 防火墙&#xff1a; 交换机&#xff1a; 华为防火墙的配置&#xff1a; 接口配置&#xff1a; 安全区域&#xff1a; 安全策略&#xff1a; 办公区访问DMZ&#xff1a; 生产区访问DMZ&#xff1a; 游客区只能访问门户网…

[人工智能]对未来建筑行业的影响

作者主页: 知孤云出岫 目录 引言1. 人工智能在建筑行业的应用场景1.1 设计阶段1.2 施工阶段1.3 运营和管理 2. 关键技术2.1 机器学习2.2 计算机视觉2.3 自然语言处理2.4 大数据分析 3. 实际案例分析3.1 案例1&#xff1a;利用GAN生成建筑设计方案3.2 案例2&#xff1a;利用计算…

操作User表的CRUD增删改查(二):修改和删除

文章目录 修改运行发现数据库数据没有添加进去 修改 int u session.update(s, new User(1,"xiaoxiao",18));运行发现数据库数据没有添加进去 运行发现数据库没有添加进去数据&#xff0c;原因是默认是手动添加的&#xff0c;需要修改。 有两种方法然后再重新运行&a…