【脚踢数据结构】查找

  • (꒪ꇴ꒪ ),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)开发板实战

📢写在最后

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

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

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

相关文章

JDBC配置文件抽取-spring11

改成context,到这里我们context命名空间就引入完毕&#xff0c;加载我们外部properties配置文件&#xff1a; 用它&#xff1a;第一个属性&#xff0c;第二个类型 在未加载路径下&#xff1a; 现在我已经把spring加载到配置文件里了。 现在我需要在这个位置引入proper…

04 qt功能类、对话框类和文件操作

一 QT中时间和日期 时间 ---- QTime日期 ---- QDate对于Qt而言,在实际的开发过程中, 1)开发者可能知道所要使用的类 ---- >帮助手册 —>索引 -->直接输入类名进行查找 2)开发者可能不知道所要使用的类,只知道开发需求文档 ----> 帮助 手册,按下图操作: 1 …

人类反馈强化学习RLHF;微软应用商店推出AI摘要功能

&#x1f989; AI新闻 &#x1f680; 微软应用商店推出AI摘要功能&#xff0c;快速总结用户对App的评价 摘要&#xff1a;微软应用商店正式推出了AI摘要功能&#xff0c;该功能能够将数千条在线评论总结成一段精练的文字&#xff0c;为用户选择和下载新应用和游戏提供参考。该…

小程序中display:flex和v-show,v-show不生效,uni-app

小程序中display:flex和v-show&#xff0c;v-show不生效、、 解决方案&#xff1a; display&#xff1a;flex样式的优先级高于了v-show &#xff0c;v-show其实就是display&#xff1a;none&#xff0c;display&#xff1a;flex优先级高于display&#xff1a;none。 使用 :s…

opencv 矩阵运算

1.矩阵乘&#xff08;*&#xff09; Mat mat1 Mat::ones(2,3,CV_32FC1);Mat mat2 Mat::ones(3,2,CV_32FC1);Mat mat3 mat1 * mat2; //矩阵乘 结果 2.元素乘法或者除法&#xff08;mul&#xff09; Mat m Mat::ones(2, 3, CV_32FC1);m.at<float>(0, 1) 3;m.at…

(stm32)低功耗模式

低功耗模式 执行哪个低功耗模式的程序判断流程 标志位设置操作一定要在WFI/WFE之前&#xff0c;调用此指令后立即进入睡眠判断流程 模式对比 睡眠模式 停止模式 待机模式

中间件的介绍

1.1 什么是中间件 中间件是介于应用系统和系统软件之间的一类软件&#xff0c;他使用系统软件所提供的基础服务&#xff0c;衔接网络上应用系统的各个部分或不同的应用&#xff0c;能够达到资源共享、功能共享的目的。 例如MySQL就可以看作是具备中间件特性的一种技术&#x…

centos下使用jemalloc解决Mysql内存泄漏问题

参考&#xff1a; MySQL bug&#xff1a;https://bugs.mysql.com/bug.php?id83047&tdsourcetags_pcqq_aiomsg https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md &#xff08;1&#xff09;ptmalloc 是glibc的内存分配管理 &#xff08;2&#xff09;tcmalloc…

Ubuntu软件源、pip源大全,国内网站网址,阿里云、网易163、搜狐、华为、清华、北大、中科大、上交、山大、吉大、哈工大、兰大、北理、浙大

文章目录 一、企业镜像源1、阿里云2、网易1633、搜狐镜像4、华为 二&#xff1a;高校镜像源1、清华源2、北京大学3、中国科学技术大学源 &#xff08;USTC&#xff09;4、 上海交通大学5、山东大学6、 吉林大学开源镜像站7、 哈尔滨工业大学开源镜像站8、 西安交通大学软件镜像…

Android Retrofit原理浅析

官方地址:Retrofit 原理:Retrofit 本质上是代理了OKhttp,使用代理模式,Type-Safe 类型安全 编译器把类型检查出 避免类型错误, enqueue 异步 切换线程 execute 同步 不切换线程 enqueue:Call接口定义的抽象方法 Retrofit.Create() 方法首先验证接口validateServiceInterf…

RGOS日常管理操作

RGOS日常管理操作 一、前言二、RGOS平台概述2.1、锐捷设备的常用登陆方式2.2、使用Console登入2.3、Telnet远程管理2.4、SSH远程管理2.5、登陆软件&#xff1a;SecureCRT 三、CLI命令行操作3.1、CLI命令行基础3.2、CLI模式3.3、CLI模式互换3.4、命令行特性3.4.1、分屏显示3.4.2…

0基础入门C++之类和对象上篇

目录 1.面向过程和面向对象初步认识2.类的引入3.类的定义3.1类的两种定义方式:3.2成员变量命名规则的建议 4.类的访问限定符及封装4.1访问限定符4.2封装 5.类的作用域6.类的实例化7.类对象模型7.1如何计算类对象的大小7.2 类对象的存储方式猜测 8.this指针8.1this指针的引出8.2…

通过请求头传数据向后端发请求

axios &#xff08;get post请求、头部参数添加&#xff09;傻瓜式入门axios_axiospost请求参数_web_blog的博客-CSDN博客

http库 之 OKHttpUtil

源码位置 方便实用&#xff0c;个人感觉不错 依赖 <dependency><groupId>io.github.admin4j</groupId><artifactId>common-http-starter</artifactId><version>0.7.5</version> </dependency>代码实践 /*** 通用http的pos…

在 IDEA 中使用 Git开发 图文教程

在 IDEA 中使用 Git开发 图文教程 一、连接远程仓库二、IDEA利用Git进行开发操作三、分支操作3.1 新建分支3.2 切换分支3.3 删除分支3.4 比较分支3.5 合并分支 四、常用快捷键 一、连接远程仓库 一、打开IDEA&#xff0c;进入目录&#xff1a;File ->New ->Project from…

CSS和AJAX阶段学习记录

1、AJAX的工作原理&#xff1a; 如图所示&#xff0c;工作原理可以分为以下几步&#xff1a; 网页中发生一个事件&#xff08;页面加载、按钮点击&#xff09; 由 JavaScript 创建 XMLHttpRequest 对象 XMLHttpRequest 对象向 web 服务器发送请求 服务器处理该请求 服务器将响应…

C++项目实战之演讲比赛流程管理系统

演讲比赛流程管理系统 1. 演讲比赛程序需求 1.1 比赛规则 学校举行一场演讲比赛&#xff0c;共有12个人参加。比赛共两轮&#xff0c;第一轮为淘汰赛&#xff0c;第二轮为决赛 每名选手都有对应的编号&#xff0c;如 10001 ~ 10012 比赛方式&#xff1a;分组比赛&#xff0…

C语言之指针进阶篇(1)

目录​​​​​​​ 引言 字符指针 指针数组 数组指针 数组指针的定义 &数组名vs数组名 数组指针的使用 一维数组使用 二维数组使用 一维数组传参 二维数组传参 总结 数组参数 一维数组传参 二维数组传参 指针参数 一级指针传参 二级指针传参 引言 今…

【爬虫练习之glidedsky】爬虫-基础1

题目 链接 爬虫的目标很简单&#xff0c;就是拿到想要的数据。 这里有一个网站&#xff0c;里面有一些数字。把这些数字的总和&#xff0c;输入到答案框里面&#xff0c;即可通过本关。 思路 找到调用接口 分析response 代码实现 import re import requestsurl http://www.…

设计模式——桥接模式

引用 桥我们大家都熟悉&#xff0c;顾名思义就是用来将河的两岸联系起来的。而此处的桥是用来将两个独立的结构联系起来&#xff0c;而这两个被联系起来的结构可以独立的变化&#xff0c;所有其他的理解只要建立在这个层面上就会比较容易。 基本介绍 桥接模式&#xff08;Br…