【数据结构】顺序查找,折半查找,分块查找的知识点总结及相应的代码实现

目录

1、顺序查找

定义及步骤 

代码实现

2、折半查找

定义及步骤  

代码实现

折半查找判定树 

3、分块查找

定义及步骤 


1、顺序查找

定义及步骤 

        顺序查找的定义:从数据集合的起始位置开始,逐一比较每个数据元素,直到找到所要查找的元素或者遍历完整个数据集合为止。适用于顺序表,链表,表中元素有无顺序都可以。其时间复杂度为O(n),其中n为待查找元素个数。

具体步骤如下:

  1. 从集合的第一个元素开始顺序遍历,直到找到目标元素或者遍历完整个集合。

  2. 若遍历到的元素与目标元素相同,则返回该元素的位置。

  3. 若遍历完整个集合仍未找到目标元素,则返回未找到的标识(通常为-1)。

代码实现

下面是 C 语言实现顺序查找(带哨兵)的示例代码:

#include <stdio.h>#define MAXSIZE 100 // 定义最大容量typedef struct {int data[MAXSIZE+1]; // 数据存储数组,从 data[1] 开始存储数据int len; // 当前长度
} SeqList;// 初始化顺序表
void initList(SeqList *list) {for (int i = 1; i <= MAXSIZE; i++) {list->data[i] = 0;}list->len = 0;
}// 插入元素
int insertList(SeqList *list, int elem) {if (list->len >= MAXSIZE) { // 判断是否已满return 0;}list->data[++list->len] = elem;return 1;
}// 带哨兵的顺序查找
int searchList(SeqList *list, int elem) {int i;list->data[0] = elem; // 设置哨兵for (i = list->len; list->data[i] != elem; i--); // 从后向前遍历查找return i; // 返回查找到的位置
}int main() {SeqList list;initList(&list);insertList(&list, 1);insertList(&list, 3);insertList(&list, 5);insertList(&list, 7);insertList(&list, 9);int pos = searchList(&list, 5);if (pos == 0) {printf("未找到\n");} else {printf("找到了,位置为:%d\n", pos);}return 0;
}

        在上面的代码中,我们定义了一个 SeqList 结构体来实现顺序表,其中包含了数据存储数组和当前长度。使用 initList 函数进行初始化,使用 insertList 函数插入数据。在 searchList 函数中,我们设置了一个哨兵,然后从后向前遍历查找,如果找到则返回位置,否则返回 0 表示未找到。在主函数中,我们创建了一个顺序表,插入了一些数据,然后进行查找,输出查找结果。

 

2、折半查找

定义及步骤  

        折半查找(Binary Search)又称为二分查找,是一种基于比较目标值和数组中间元素的查找算法。该算法的前提条件是数组必须已经有序。只适用于顺序表,仅适用于顺序存储结构,不适用于链式存储结构。

具体实现过程为:

1. 定义左右指针,分别指向数组的第一个元素和最后一个元素。

2. 然后取中间元素的下标,将目标值与此元素进行比较。如果目标值等于数组中间元素的值,则直接返回中间元素的下标。

3. 如果目标值小于数组中间元素的值,则将右指针移动到中间元素的左边一位。

4. 如果目标值大于数组中间元素的值,则将左指针移动到中间元素的右边一位。

5. 重复步骤2~4,直到目标值与中间元素相等或者左右指针相遇。

6. 如果左右指针相遇时,仍没有找到目标值,则表示该数组中没有目标值。

折半查找算法的时间复杂度是O(logN),相对于顺序查找的时间复杂度O(N)而言,折半查找具有更高的效率。

代码实现

下面是 C 语言实现折半查找的示例代码:

#include <stdio.h>int binarySearch(int array[], int left, int right, int x) {while (left <= right) {int mid = left + (right - left) / 2;if (array[mid] == x) {return mid;}else if (array[mid] < x) {left = mid + 1;}else {right = mid - 1;}}return -1; //表示未找到
}int main() {int array[] = {1, 3, 5, 7, 9, 11};int x = 5;int n = sizeof(array) / sizeof(array[0]);int result = binarySearch(array, 0, n - 1, x);if (result == -1) {printf("未找到该元素\n");}else {printf("元素在数组中的索引是:%d\n", result);}return 0;
}

        上述代码中,binarySearch函数的参数依次是数组array、数组左边界left、数组右边界right和要查找的元素x。函数通过while循环不断缩小查找范围,最终返回要查找元素在数组中的索引。在主函数中,我们定义了一个有序数组,然后调用binarySearch函数查找元素5在数组中的位置。如果返回-1,则表示未找到该元素;否则,返回元素在数组中的索引。

        注意:该算法要求在查找之前需要先对数组进行排序。因此,如果数组没有排序,需要先调用排序算法进行排序,再进行查找。

折半查找判定树 

        折半查找判定树(Binary Search Decision Tree,BSDT)是一种二叉树,用于解决折半查找(Binary Search)问题。在BSDT中,每个节点代表一个比较操作,左节点表示小于比较值,右节点表示大于比较值。叶节点代表查找成功的结果,非叶节点代表查找失败的结果。

例如,对于一个长度为7的有序数组[1, 2, 3, 4, 5, 6, 7],对应的BSDT如下图所示:

                ______4______/            \___2___          __6__/       \        /     \1         3      5       7

        在BSDT中,从根节点(4)开始,如果要查找数字3,则先和根节点比较,由于3小于4,因此向左子节点(2)移动。然后再和2节点比较,由于3大于2,因此向右子节点(3)移动。最终到达叶节点,查找成功。

        对于长度为n的有序数组,BSDT的高度为log₂(n),因为每次比较可以剔除一半的数据,因此最多需要比较log₂(n)次。由于BSDT的高度与数据的顺序无关,因此对于任何有序数组,BSDT都可以处理。

        虽然BSDT的时间复杂度是O(log₂(n)),与折半查找一样,但是BSDT比折半查找更适合用于动态数据集合,因为BSDT可以实时更新,支持插入、删除等操作。

3、分块查找

定义及步骤 

        分块查找是一种查找算法,它是一种特殊的二分查找,用于在一组有序的数据中查找特定元素。分块查找主要用于在数据量大时,可以减少比较次数,快速查找所需的元素。

分块查找的过程分为以下几个步骤:

  1. 将数据分成若干个块:将查找的数据分割为若干块,块的大小可自行决定。每一块内的元素是有序的,块与块之间的元素大小可以不同。

  2. 对每一块内的元素建立索引:对每一块内的元素建立索引,索引可以是一个指向元素位置的指针或是一个存储最大元素值的数组。

  3. 使用二分查找在索引中查找所在块:根据查找的元素值,在索引中使用二分查找找到相应的块。

  4. 在所在块中进行线性查找:在所在块中使用线性查找查找所需元素,直到找到与之相等的元素或者超出所在块的范围为止。

  5. 返回查找结果:如果找到所需的元素,则返回该元素的位置;如果未找到,则返回不存在的信息。

        需要注意的是,分块查找的块大小和索引的大小对算法的效率有很大影响。一般来说,块的大小不要太大,索引的大小不要太小,这样才能充分利用分块查找的优势,减少查找次数,提高查找效率。

 

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

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

相关文章

windows下实现mysql8的主从复制

1、下载mysql8的安装包 MySQL :: Download MySQL Community Server 2、放到指定目录进行解压&#xff0c;更改名称为mysql-8.1.0-winx64-master,并复制一份作为从数据库 3、在bin目录下创建一个my.ini文件 添加如下内容 [mysqld] basedir"D:/soft/mysql/mysql-8.1.0-win…

【精华】关于生成式AI的思考

文章目录 0 论述1 观点2 模型开发栈3 新兴产品蓝图4 思考番外篇-与AI聊天须知 0 论述 生成式AI的首年——“第一幕”——是从技术出发的。我们发现了一个新的“锤子”——基础模型&#xff0c;并引发了一波轻量级的新技术演示应用。 我们现在认为市场正在进入“第二幕”——这…

TS编译选项——TS文件编译后消除注释

在tsconfig.json文件中配置removeComments属性 {"compilerOptions": {// outDir 用于指定编译后文件所在目录"outDir": "./dist", // 将编译后文件放在dis目录下// 是否文件编译后移除注释"removeComments": true} } 左边是编写的t…

华为云云耀云服务器L实例评测 | 基于minikube搭建单节点kubernetes集群

目录 1 安装Docker2 conntrack-tools3 安装minikube4 下载二进制&#xff1a;kubeadm、kubectl、kubelet5 准备镜像6 启动minikube7 简单测试8 开启dashboard ​ Minikube 是一个使用golang开发的单节点kubernetes集群环境&#xff0c;在资源紧张的情况下&#xff0c;可以用于快…

MySQL - 关于约束类型和作用的介绍

约束的概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 约束的作用&#xff1a;用于保证数据库中数据的正确性、完整性和一致性。 约束分类&#xff1a; 约束类型作用关键字非空约束限制该字段的数据不能为nullnot null唯一约束保证该…

什么是Peppol ID?如何创建?

Peppol 网络的两大优势是安全和高效&#xff0c;由于Peppol 最常用于电子发票&#xff0c;因此这些优势在电子发票上展露无遗。相比之下&#xff0c;通过电子邮件发送 PDF 格式的发票和其他文件不仅处理成本较高&#xff0c;而且容易出现发票欺诈。 如果您所在的公共部门组织或…

AI聊天ChatGPT系统源码卡密验证开源版

ChatGPT卡密验证版源码是一个基于PHP7.4和MySQL5.6的聊天AI源码&#xff0c;它不仅支持暗黑模式、反应速度极快&#xff0c;而且充值方面采用后台生成卡密方式&#xff0c;方便快捷&#xff0c;如果您有能力将其接入在线支付&#xff0c;即可进一步拓展充值方式&#xff0c;为更…

云原生容器平台——新华资产数字化转型加速器

新华资产管理股份有限公司&#xff08;以下简称“新华资产”&#xff09;于2006年5月经中国保险监督管理委员会批准、7月3日正式挂牌成立&#xff0c;是国内首批专业保险资产管理机构。2020年上半年&#xff0c;公司管理的资产规模突破万亿元人民币&#xff0c;投资收益水平居行…

Python 用列表实现模拟手机通讯录(简易版)

"""列表实现好友管理系统知识点&#xff1a;1、列表存储信息2、列表增删改查3、嵌套循环4、字符串分割和拼接&#xff08;重点&#xff09;5、列表索引"""# 暂存好友信息&#xff08;程序结束数据删除&#xff09; friend_info list()input_buf…

飞书与企业微信的异同

云文档 飞书的云文档会自动用游览器打开&#xff0c;不会直接在PC应用中打开&#xff08;移动端能在应用中打开&#xff09;。 飞书云文档能够插入视频、流程图、问卷等等 聊天消息交互 钉钉也有类似的功能&#xff0c;可以针对消息进行点赞等回复 钉钉的消息回复还有【收到…

Room Arranger for Mac: 轻松创造梦想家园的必备设计软件

你是否曾经梦想过自己动手设计理想中的家居环境&#xff1f;你是否希望通过一个简单易用的工具来实现你的设计理念&#xff1f;那么&#xff0c;Room Arranger for Mac就是你的最佳选择&#xff01; Room Arranger是一款专门为Mac用户打造的室内设计软件&#xff0c;它拥有直观…

适用于初学者,毕业设计的5个c语言项目,代码已开源

C语言项目集 项目介绍 该项目适用于初学者学习c语言&#xff0c;也适用于高校学生课程设计&#xff0c;毕业设计参考。 项目并不能满足所有人的需求&#xff0c;可进行项目指导&#xff0c;定制开发。 开源地址 c语言项目代码地址 项目列表 该项目包含如下5个管理系统&am…

Linux 入门:基本指令

本篇文章来介绍我们在初学Linux时可以会碰倒的一些基本指令&#xff0c;让我们对这些指令有一个基本的了解。 目录 01. ls 指令 02. pwd 命令 03. cd 指令 04. touch 指令 05. mkdir 指令&#xff08;重要&#xff09; 06. rmdir指令 && rm 指令&#xff08;重…

Java深入理解线程的三大特性

目录 1 CPU缓存导致可见性问题2 线程切换导致原子性问题3 性能优化导致有序性问题4 JMM(Java Memory Model)5 volatile6 synchronized 1 CPU缓存导致可见性问题 线程的三大特性&#xff1a; 可见性&#xff1a;Visibility有序性&#xff1a;Ordering原子性&#xff1a;Atomic…

轻松搭建Linux的环境

Linux的环境的搭建 目录&#xff1a;一、使用云服务器二、使用虚拟机软件2.1 下载虚拟机软件2.2 下载一个操作系统的镜像文件 三、直接安装在物理机上四、使用XShell远程登录到Linux 目录&#xff1a; 我们平常用的都是windows系统&#xff0c;对Linux系统还是很陌生得。为什么…

当遇到第一个不满足条件的元素后返回这个元素及之后的各元素itertools.dropwhile()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 当遇到第一个不满足条件的元素后 返回这个元素及之后的各元素 itertools.dropwhile() 选择题 以下程序的运行结果是? import itertools a[1,3,5,2,4,6] print("【显示】a ",a) prin…

百度实习一面(知识图谱部门)

百度面经&#xff08;知识图谱部&#xff09;一面 1.自我介绍 介绍完了&#xff0c;打开共享&#xff0c;对着简历一点一点问 2.ffmpeg在项目中是怎么使用的 回答了ffmpeg在项目中使用的命令&#xff0c;用来干了什么 3.为什么使用toml配置&#xff0c;了解过yml配置吗&am…

【大数据开发技术】实验05-HDFS目录与文件的创建删除与查询操作

文章目录 一、实验目标二、实验要求三、实验内容四、实验步骤 一、实验目标 熟练掌握hadoop操作指令及HDFS命令行接口掌握HDFS目录与文件的创建方法和文件写入到HDFS文件的方法掌握HDFS目录与文件的删除方法掌握查询文件状态信息和目录下所有文件的元数据信息的方法 二、实验…

全栈工程师必须要掌握的前端JavaScript技能

作为一名全栈工程师&#xff0c;在日常的工作中&#xff0c;可能更侧重于后端开发&#xff0c;如&#xff1a;C#&#xff0c;Java&#xff0c;SQL &#xff0c;Python等&#xff0c;对前端的知识则不太精通。在一些比较完善的公司或者项目中&#xff0c;一般会搭配前端工程师&a…

MySQL数据库基础知识要点总结

目录 前言 一.数据库构成 1.1 表 1.2 关系 1.3 索引 1.4 查询语言 1.5 数据库管理系统 二.数据类型 2.1 整数 2.2 浮点 2.3 日期与时间 2.4 字符串 三.约束条件 3.1 主键约束 3.2 唯一约束 3.3 外键约束 3.4 非空约束 3.5 默认值约束 总结 前言 数据库是…