【脚踢数据结构】查找

  • (꒪ꇴ꒪ ),Hello我是祐言QAQ
  • 我的博客主页:C/C++语言,Linux基础,ARM开发板,软件配置等领域博主🌍
  • 快上🚘,一起学习,让我们成为一个强大的攻城狮!
  • 送给自己和读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

        数据结构中的查找是指在一个数据集合(例如数组、列表、树等)中,根据给定的某个值或条件,寻找目标元素或符合条件的元素。查找操作旨在确定特定元素是否存在于数据集合中,并在存在时获取其位置或值。在算法和数据结构领域,查找是一项基础操作,它对于许多应用程序的性能和效率至关重要。不同类型的查找方法适用于不同的数据集合和操作需求,涵盖了顺序查找、二分查找、插值查找、树表查找、哈希表查找等。那么接下来我们就讲讲这些查找的实现吧。

一、顺序查找(线性查找)


1.概念

         顺序查找是一种基本查找方法,它一般为从头开始逐个遍历数据集合,直到找到目标元素或遍历完整个集合。

2.算法

        (1) 从数据集合的起始位置开始,逐个比较元素与目标元素;
        (2)如果找到目标元素,返回其位置(索引);
        (3)如果遍历完整个数据集合仍未找到目标元素,返回查找失败。


3.实现

         此程序是一个完整的可执行程序,执行结果如上图所示,接下来的其他代码我将只给查找的核心代码,感兴趣的同学可以尝试自己完成其余的代码使之运行,或自行练习编写代码。

#include <stdio.h>int linear_search(int arr[], int n, int target) {for (int i = 0; i < n; i++) {if (arr[i] == target) {return i;  // 返回目标元素的索引}}return -1;  // 目标元素未找到
}// 遍历
void display(int arr[], int n) {for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int data[] = {2, 3, 5, 7, 9, 11};int n = sizeof(data) / sizeof(data[0]);display(data, 6); int target;printf("请输入要查找的元素。\n");scanf("%d",&target);int result = linear_search(data, n, target);if (result != -1) {printf("元素 %d 在索引 %d(下标)处找到。\n", target, result);} else {printf("未找到目标元素。\n");}return 0;
}


二、二分查找(折半查找)


1.概念

        二分查找适用于有序数据集合,它通过重复将数据集划分为两半并比较目标元素与中间元素的大小,从而快速定位目标元素。

2.算法

        (1)在有序数据集合中,确定左右边界;
        (2)计算中间位置 mid = (left + right) / 2
        (3)比较目标元素与中间元素的大小关系;
        (4)如果目标元素等于中间元素,查找成功;
        (5)如果目标元素小于中间元素,继续在左半部分查找;
        (6)如果目标元素大于中间元素,继续在右半部分查找;
        (7)重复步骤2-3,直到找到目标元素或左边界大于右边界。


3.实现

int binary_search(int arr[], int n, int target) {int left = 0, right = n - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;  // 返回目标元素的索引} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;  // 目标元素未找到
}


三、 插值查找


1.概念

         插值查找是在有序数据集合中通过插值计算来估计目标元素的位置,从而加快查找速度。

2.算法

        (1)在有序数据集合中,确定左右边界;
        (2)计算插值位置 mid = left + (target - arr[left]) * (right - left) / (arr[right] - arr[left])
        (3)比较目标元素与插值位置处元素的大小关系;
        (4)如果目标元素等于插值位置处元素,查找成功;
        (5)如果目标元素小于插值位置处元素,继续在左半部分查找;
        (6) 如果目标元素大于插值位置处元素,继续在右半部分查找;
        (7)重复步骤2-3,直到找到目标元素或左边界大于右边界。


3.实现


        插值查找的实现与二分查找类似,但计算插值位置时使用了插值公式。

int interpolation_search(int arr[], int n, int target) {int left = 0, right = n - 1;while (left <= right && target >= arr[left] && target <= arr[right]) {int pos = left + ((target - arr[left]) * (right - left)) / (arr[right] - arr[left]);if (arr[pos] == target) {return pos;  // 返回目标元素的索引} else if (arr[pos] < target) {left = pos + 1;} else {right = pos - 1;}}return -1;  // 目标元素未找到
}

四、 树表查找(二叉树查找)


        树表查找方法包括各种基于树结构的查找,其中二叉树查找是最简单的一种。


1.概念

         二叉树查找是基于二叉搜索树的查找方法,利用树结构将元素组织起来以支持高效的查找操作。它是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。 这个算法的查找效率很高,但是如果使用这种查找方法要首先创建树。 

2.算法

        (1)从根节点开始,比较目标元素与当前节点的值;
        (2)如果目标元素等于当前节点的值,查找成功;
        (3)如果目标元素小于当前节点的值,继续在左子树中查找;
        (4)如果目标元素大于当前节点的值,继续在右子树中查找;
        (5)如果到达叶子节点仍未找到目标元素,查找失败。


3.实现

#include <stdio.h>
#include <stdlib.h>// 定义二叉树结点
struct TreeNode {int value;struct TreeNode* left;struct TreeNode* right;
};// 二叉树查找函数
struct TreeNode* binary_tree_search(struct TreeNode* root, int target) {// 当根节点为空或者根节点的值等于目标值时,返回根节点if (root == NULL || root->value == target) {return root;}// 如果目标值小于根节点的值,则在左子树中查找if (target < root->value) {return binary_tree_search(root->left, target);}// 如果目标值大于根节点的值,则在右子树中查找return binary_tree_search(root->right, target);
}int main() {// 构建二叉搜索树struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));root->value = 5;root->left = NULL;root->right = NULL;root->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));root->left->value = 3;root->left->left = NULL;root->left->right = NULL;root->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));root->right->value = 8;root->right->left = NULL;root->right->right = NULL;// 要查找的目标值int target = 3;// 调用二叉树查找函数struct TreeNode* result_node = binary_tree_search(root, target);if (result_node) {printf("元素 %d 找到了。\n", target);} else {printf("未找到目标元素。\n");}// 释放动态分配的内存free(root->left);free(root->right);free(root);return 0;
}

        更多C语言Linux系统ARM板实战数据结构相关文章,关注专栏:

   手撕C语言

            玩转linux

                    脚踢数据结构

                            6818(ARM)开发板实战

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

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

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

相关文章

数据结构双向链表

Hello&#xff0c;好久不见&#xff0c;今天我们讲链表的双向链表&#xff0c;这是一个很厉害的链表&#xff0c;带头双向且循环&#xff0c;学了这个链表&#xff0c;你会发现顺序表的头插头删不再是一个麻烦问题&#xff0c;单链表的尾插尾删也变得简单起来了&#xff0c;那废…

智慧化工地SaaS平台源码,PC端+APP端+智慧数据可视化大屏端,源码完全开源不封装,自主研发,支持二开,项目使用,微服务+Java++vue+mysql

智慧工地管理平台充分运用数字化技术&#xff0c;聚焦施工现场岗位一线&#xff0c;依托物联网、互联网、AI等技术&#xff0c;围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三大体系为基础应用&#xff0c;实现全面高效的工程…

Windows下 MySql通过拷贝data目录迁移数据库的方法

MySQL数据库的文件目录下图所示&#xff0c; 现举例说明通过COPY文件夹data下数据库文件&#xff0c;进行数据拷贝的步骤&#xff1b;源数据库运行在A服务器上&#xff0c;拷贝到B服务器&#xff0c;假定B服务器上MySQL数据库已经安装完成&#xff0c;为空数据库。 首先进入A服…

[Stable Diffusion教程] 第一课 原理解析+配置需求+应用安装+基本步骤

第一课 原理解析配置需求应用安装基本步骤 本次内容记录来源于B站的一个视频 以下是自己安装过程中整理的问题及解决方法&#xff1a; 问题&#xff1a;stable-diffusion-webui启动No Python at ‘C:\xxx\xxx\python.exe‘ 解答&#xff1a;打开webui.bat 把 if not de…

React Diff算法

文章目录 React Diff算法一、它的作用是什么&#xff1f;二、React的Diff算法1.了解一下什么是调和&#xff1f;2.react的diff算法3.React Diff的三大策略4.tree diff&#xff1a;1、如果DOM节点出现了跨层级操作&#xff0c;Diff会怎么办? 5. component diff&#xff1a;6. e…

SEMIDRIVE X9U 插入 USB 不识别调试要点

一、前言 客户用芯驰 X9U 平台做的智能座舱产品&#xff0c;在烧写固件时发现&#xff0c;通过 USB 连接到 SSA 的 USB 接口&#xff0c;Windows 上无法识别出 USB 设备&#xff0c;一直处在 Ready 状态。 二、SEMIDRIVE X9U 插入 USB 不识别调试要点 ① 建议客户测量 SoC 的…

macOS M1使用TensorFlow GPU加速

本人是在pycharm运行代码&#xff0c;安装了tensorflow版本2.13.0 先运行代码查看有没有使用GPU加速&#xff1a; import tensorflow as tf# Press the green button in the gutter to run the script. if __name__ __main__:physical_devices tf.config.list_physical_dev…

【Vue】vue2项目使用swiper轮播图2023年8月21日实战保姆级教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、npm 下载swiper二、使用步骤1.引入库声明变量2.编写页面3.执行js 总结 前言 swiper轮播图官网 参考文章&#xff0c;最好先看完他的介绍&#xff0c;再看…

动手学深度学习—深度卷积神经网络AlexNet(代码详解)

AlexNet 1. 学习表征1.1 缺少的成分&#xff1a;数据1.2 缺少的成分&#xff1a;硬件 2. AlexNet2.1 模型设计2.2 激活函数2.3 容量控制和预处理 3. 读取数据集4. 训练AlexNet ImageNet classification with deep convolutional neural networks 原文链接&#xff1a;https://d…

视频云存储/安防监控视频智能分析网关V3:占道经营功能详解

违规占道经营者经常会在人流量大、车辆集中的道路两旁摆摊&#xff0c;导致公路交通堵塞&#xff0c;给居民出行的造成不便&#xff0c;而且违规占路密集的地方都是交通事故频频发生的区域。 TSINGSEE青犀视频云存储/安防监控视频/AI智能分析网关V3运用视频AI智能分析技术&…

YOLOv5算法改进(5)— 添加ECA注意力机制

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。ECA注意力机制是一种用于图像处理中的注意力机制&#xff0c;是在通道注意力机制的基础上做了进一步的改进。通道注意力机制主要是通过提取权重&#xff0c;作用在原特征图的通道维度上&#xff0c;而ECA注意力机制则使用了…

git常用操作命令(不定时更新)

git常用操作命令 将某个分支的某次提交迁移到另外一个分支查询这次提交的ID号方法一方法二 切换到目标分支执行commitID合并指令 将某个分支的某次提交迁移到另外一个分支 查询这次提交的ID号 方法一 方法二 切换到目标分支 git checkout 目标分支名 执行commitID合并指令 gi…

MySQL视图

一、视图-介绍及基本语法 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#xff0c;视图只保存了查询的SQL逻辑&#xf…

mysql 、sql server trigger 触发器

sql server mySQL create trigger 触发器名称 { before | after } [ insert | update | delete ] on 表名 for each row 触发器执行的语句块## 表名&#xff1a; 表示触发器监控的对象 ## before | after : 表示触发的时间&#xff0c;before : 表示在事件之前触发&am…

mysql基础——认识索引

一、介绍 “索引”是为了能够更快地查询数据。比如一本书的目录&#xff0c;就是这本书的内容的索引&#xff0c;读者可以通过在目录中快速查找自己想要的内容&#xff0c;然后根据页码去找到具体的章节。 二、优缺点 优势&#xff1a;以快速检索&#xff0c;减少I/O次数&am…

低代码赋能| 智慧园区项目开发痛点及解决方案

智慧园区是一个综合体&#xff0c;集技术开发、产业发展和学术研究于一体。作为未来智慧城市建设的核心&#xff0c;智慧园区充当着“产业大脑”和“指挥中心”的角色。它通过整合园区内的制造资源和第三方服务能力&#xff0c;实现园区各组成部分的协调运作、良性循环和相互促…

课程项目设计--项目建立--宿舍管理系统--springboot后端

前要 项目设计–宿舍管理系统 文章目录 项目建立导入依赖配置文件配置目录结构config配置mybatis-plusswagger 生成实体、mapper和servicebaseEntity统一响应实例响应码接口响应码接口实现统一响应result统一分页响应 项目建立 太长了&#xff0c;修改一下 导入依赖 暂时先加…

yyyy-MM-dd‘T‘HH:mm时间格式探索

yyyy-MM-ddTHH:mm:ss 一直以后这个T是为了避免yyyy-MM-dd HH:mm:ss空格出现解析报错 但是这个T实际是一个标识符&#xff0c;作为小时元素的开始。 T代表后面跟着是时间&#xff0c;Z代表0时区&#xff08;相差北京时间8小时&#xff09; T 即代表 UTC&#xff08;Coodinated U…

【面试】一文讲清组合逻辑中的竞争与冒险

竞争的定义&#xff1a;组合逻辑电路中&#xff0c;输入信号的变化传输到电路的各级逻辑门&#xff0c;到达的时间有先后&#xff0c;也就是存在时差&#xff0c;称为竞争。 冒险的定义&#xff1a;当输入信号变化时&#xff0c;由于存在时差&#xff0c;在输出端产生错误&…

Tokenview再度升级:全新Web3开发者APIs数据服务体验!

Tokenview发布全新版本的区块链APIs和数据服务平台&#xff0c;为开发者打造更强大、更便捷的开发体验&#xff01; 此次升级&#xff0c;我们整合了开发者使用习惯以及Tokenview产品优势。我们深知对于开发者来说&#xff0c;时间是非常宝贵的&#xff0c;因此我们努力提供一…