【脚踢数据结构】查找

news2025/1/21 20:25:53
  • (꒪ꇴ꒪ ),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.coloradmin.cn/o/895347.html

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

相关文章

代码随想录—力扣算法题:707设计链表.Java版(示例代码与导图详解)

版本说明 当前版本号[20230818]。 版本修改说明20230818初版 目录 文章目录 版本说明目录707.设计链表思路获取链表第index个节点的数值在链表的最前面插入一个节点在链表的最后面插入一个节点在链表第index个节点前面插入一个节点删除链表的第index个节点 单链表角度总结 7…

STM32入门——IIC通讯

江科大STM32学习记录 I2C通信 I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线两根通信线&#xff1a;SCL&#xff08;Serial Clock&#xff09;、SDA&#xff08;Serial Data&#xff09;同步&#xff0c;半双工带数据应答支持总线挂载多设备…

Python“牵手”lazada商品评论数据采集方法,lazadaAPI申请指南

lazada平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;lazadaAPI接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问lazada平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现la…

程序人生:进不了大厂的测试员,究竟还有没有出路了?

金九银十的到来&#xff0c;使得许多职场人按耐不住&#xff0c;纷纷开始找寻合适的工作机会。猎头和HR们摩拳擦掌&#xff0c;争取在这两个月给今年多加点业绩。 对许多互联网人来说&#xff0c;跳槽意味着加薪&#xff0c;而对于程序员而言&#xff0c;是否能跳槽进大厂是他…

前端---需要了解浏览器相关知识--浏览器请求服务器资源---缓存

知识点1: 掘金1&#xff1a;浏览器缓存 掘金2 :浏览器缓存 一、浏览器缓存 请求&#xff08;静态资源 &#xff5c; 动态资源&#xff09; 一、缓存是什么&#xff1f; 如果没有缓存的机制 每次都要重新请求静态资源 1.从网络上的下载时间&#xff0c;肯定大于从硬盘里读的…

《树莓派4B家庭服务器搭建指南》第二十期:在树莓派运行rsnapshot, 实现对服务器数据低成本增量本地备份

title: 020《树莓派4B家庭服务器搭建指南》第二十期&#xff1a;在树莓派运行rsnapshot, 实现对服务器数据低成本增量本地备份 我的天翼云服务器有/opt 和 /usr/share/nginx两个目录, 用来存储网站的内容, 数据无价, 为了避免珍贵的数据丢失&#xff0c;我决定使用树莓派运行 …

TikTok或将于8月底关闭半闭环、速卖通或将推出“半托管”模式

《出海周报》是运营坛为外贸企业主和外贸人独家打造的重要资讯栏目&#xff0c;聚焦企业出海、海外市场动态、海外监管政策等方面&#xff0c;以简捷的方式&#xff0c;提升读者获取资讯的效率。 接下来运营坛为大家带来第15期出海周报&#xff0c;快来看看这周国内外市场发生了…

【经验】VScode远程连接Ubuntu出错的解决办法(2023年,完整的排查思路)

用VScode常常会碰到以下情况&#xff0c;Could not establish connection。 先介绍一下VScode远程连接和终端SSH连接的区别&#xff1a;终端直接用SSH连接时&#xff0c;只需要开启SSH服务&#xff0c;并消耗少量的内存即可&#xff1b;VScode连接时&#xff0c;会自动在服务器…

HCIP实验之MPLS

目录 一&#xff0c;实验题目 ​编辑 拓扑与IP地址规划如图所示 二&#xff0c;实验思路 三&#xff0c;实验步骤 3.1 私网部分IP地址配置 3.2 LSP部分配置 3.3 启动OSPF协议 3.4 启动MPLS协议 3.5 启动MPLS VPN 3.6 实现公网私网互通 3.7 配置BGP 3.8 双向重发布 …

Python软件外包开发框架

Python有许多流行的开发框架&#xff0c;用于不同类型的应用开发&#xff0c;包括Web应用、数据科学、人工智能等。以下分享一些常见的Python开发框架及其特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流…

[MySQL] — 数据类型和表的约束

目录 数据类型 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 float decimal 字符串类型 char varchar char和varchar的区别 日期和时间类型 enum 和 set 表的约束 空属性 默认值 列描述 zeorfill 主键 创建表时在字段上指定主键 删除主键&#xff1a; 追…

Lnton羚通算法算力云平台在环境配置时 OpenCV 无法显示图像是什么原因?

问题&#xff1a; cv2.imshow 显示图像时报错&#xff0c;无法显示图像 0%| | 0/1 [00:00<…

IDEA连接MySQL数据库错误

说明&#xff1a;使用IDEA连接云服务器中的MySQL数据库时&#xff0c;报下面的这个错误&#xff1b; [08S01] Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the serve…

docker cURL error 6: Could not resolve host

场景&#xff1a; 微信小程序 获取 用户 openpid&#xff0c;在此之前&#xff0c;我需要先 "获取稳定版接口调用凭据"&#xff0c;根据手册提示的&#xff0c;要先调用 https://api.weixin.qq.com/cgi-bin/stable_token 我这边就开始了请求&#xff0c;结果返回了…

上班族的高效时间管理软件,可一直显示在电脑桌面上

在现代职场中&#xff0c;相信工作党都深有体会&#xff0c;繁忙的工作带来的压力和任务都堆积如山&#xff0c;如果没有一个良好的时间管理系统&#xff0c;我们可能会一筹莫展。而高效管理时间的好处也是显而易见的&#xff0c;它不仅可以帮助我们更好地安排工作&#xff0c;…

Linux Day09

目录 一、进程替换 二、Linux信号的使用 2.1 kill() 发送信号 2.2 signal() 改变进程对信号的响应方式 2.3 处理僵死进程 2.3.1 在信号处理函数中调用wait 2.3.2 Linux特有的 2.3.3 结果 一、进程替换 linux上创造一个新进程&#xff0c;没有create创建方法&#xf…

【Mysql】MVCC版本机制的多并发

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

Android3:布局

一。线性布局 创建项目Linear Layout Example activity_main.xml <?xml version"1.0" encoding"utf-8"?><LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"an…

微信转账警示!切莫在此时输入密码

微信已经成为我们日常生活中不可或缺的社交工具&#xff0c;通过微信红包和转账完成支付也变得非常普遍。 然而&#xff0c;正如人们常说的&#xff0c;树大招风。随着微信的广泛使用&#xff0c;骗子们也愈发猖獗&#xff0c;他们利用微信进行诈骗活动&#xff0c;使许多人遭受…

手把手教你快速使用java与cpp的互相调用

在jni的开发过程中&#xff0c;如果需要实现java和c之间的接口调用&#xff0c;就要定义一个方法来实现&#xff0c;如果有多个接口调用&#xff0c;就需要定义多个方法来实现&#xff0c;这里介绍一种抽象的接口&#xff0c;只需要分别定义一个javaCallCpp和cppCallJava方法就…