数据结构——查找算法

文章目录

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

我们水冷电阻器支持高脉冲负载和高抗振能

我们电阻器是液冷电阻器&#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 …

人工智能算法工程师(中级)课程10-PyTorch神经网络之卷积神经网络与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程10-PyTorch神经网络之卷积神经网络实战与代码详解。卷积神经网络&#xff08;CNN&#xff09;是一种广泛应用于图像识别、目标检测、视频分析等领域的深度学习模型。本文将详细介绍卷积…

【VIVADO SDK调试遇到DataAbortHandler】

问题 SDK调试遇到DataAbortHandler问题。 运行后不显示结果&#xff0c;debug模式下发现进入DataAbortHandler异常函数。程序中存在大数组。 原因:SDK默认的堆栈为1024bytes,需要将堆栈调大。 修改方法&#xff1a; 解决:对application中src下的lscript.ld双击&#xff0c;…

【游戏引擎之路】登神长阶(七)——x86汇编学习:凡做难事,必有所得

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-7月1日&#xff1a;攻克《Windows游戏编程大师技巧》。 7月…

解决GET请求中文乱码问题

解决GET请求中文乱码问题 1、乱码的根本原因2、解决方法方法一&#xff1a;修改Tomcat配置&#xff08;推荐&#xff09;方法二&#xff1a;使用URLEncoder和URLDecoder&#xff08;不推荐用于GET请求乱码&#xff09;方法三&#xff1a;String类编解码&#xff08;不直接解决乱…

欣奇随机美图源码

欣赏养眼美图让人心情愉悦 新增正能量进站引导首页 上传文件解压即可用有手就行 美图输出接口自判断版 http://mt.xqia.net/api.php http://mt.xqia.net/api.php?typejson 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89520368 更多资源下载&…

FPGA学习笔记(一) FPGA最小系统

文章目录 前言一、FPGA最小系统总结 前言 今天学习下FPGA的最小系统一、FPGA最小系统 FPGA最小系统与STM32最小系统类似&#xff0c;由供电电源&#xff0c;时钟电路晶振&#xff0c;复位和调试接口JTAG以及FLASH配置芯片组成&#xff0c;其与STM32最大的不同之处就是必须要有…

如何ssh远程Windows电脑

参考&#xff1a;https://www.jianshu.com/p/1321b46b40ee 上述教程中&#xff0c;直接根据微软的教程进行openssh安装 遇到的问题 远程windows电脑需要具备什么条件&#xff1f; 需要Windows电脑上安装了openssh server 远程Windows电脑的话&#xff0c;用户怎么创建&…

C++ | Leetcode C++题解之第230题二叉搜索树中第K小的元素

题目&#xff1a; 题解&#xff1a; class MyBst { public:MyBst(TreeNode *root) {this->root root;countNodeNum(root);}// 返回二叉搜索树中第k小的元素int kthSmallest(int k) {TreeNode *node root;while (node ! nullptr) {int left getNodeNum(node->left);if…

产品经理-一份标准需求文档的8个模块(14)

一份标准优秀的产品需求文档包括&#xff1a; ❑ 封面&#xff1b; ❑ 文档修订记录表&#xff1b; ❑ 目录&#xff1b; ❑ 引言&#xff1b; ❑ 产品概述&#xff1a;产品结构图 ❑ 详细需求说明&#xff1a;产品逻辑图、功能与特性简述列表、交互/视觉设计、需求详细描述&am…

vue使用 “xlsx-style“: “^0.8.13“ 报错

关于jszip not a constructor报错配置config.js文件后可能还报错的问题&#xff1a; 在node_modules处找到node_modules\xlsx-style\xlsx.js 文件。 将 if(typeof jszip undefined) jszip require(./jszip).JSZip;(应该在xlsx.js文件1339行左右) 替换成 if(typeof jszip und…

C语言 | Leecode C语言题解之第229题多数元素II

题目&#xff1a; 题解&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*//*假定 num1&#xff0c;num2 为出现次数大于 nums.length / 3 的两个数。&#xff08;最多出现两个&#xff09;遍历 nums&#xff0c; 若出现 num1、num2…

C语言 | Leetcode C语言题解之第230题二叉搜索树中第K小的元素

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int search_num(struct TreeNode* root, int k, int *result, int num) {if(num k 1){retu…

Jmeter多用户登录操作实战

在使用Jmeter性能测试时,首先要解决的问题恐怕就会并发压测和多用登录的问题.今天就一篇文章讲清楚这两个问题的解决方案: 一.多并发压测如何配置线程? &#xff08;1&#xff09;同时并发&#xff1a;设置线程组、执行时间、循环次数&#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.…

windows上修改redis端口号

概况 redis是一个开源的内存数据结构存储系统&#xff0c;常用做数据库、缓存和消息代理。默认的端口号为6379 更改redis端口号步骤如下 先停止redis服务 redis-cli shutdowm 打开redis配置文件 在redis安装目录下&#xff0c;即redis.windows.conf文件。 port 6396 然后…

LabVIEW滤波器性能研究

为了研究滤波器的滤波性能&#xff0c;采用LabVIEW设计了一套滤波器性能研究系统。该系统通过LabVIEW中的波形生成函数&#xff0c;输出幅值及频率可调的正弦波和白噪声两种信号&#xff0c;并将白噪声与正弦波叠加&#xff0c;再通过滤波器输出纯净的正弦波信号。系统通过FFT&…

go-redis 封装事件-client封装模型、批量数据处理的导出器设计

一、redis-go的封装实践-client模型 // Copyright 2020 Lingfei Kong <colin404foxmail.com>. All rights reserved. // Use of this source code is governed by a MIT style // license that can be found in the LICENSE file.package storageimport ("context&q…

Java项目中,常用的SQL语句

常用的命令&#xff1a; 1.数据的增删改查 1.插入数据(进行注册&#xff09; 语法 1&#xff1a; --第一种&#xff1a; INSERT INTO 表名(列名 1,列名 2, …) ; insert into tablename(member1,member3) valuse(,); --第二种&#xff1a; INSERT INTO 表名 VALUES(值 1,值 …