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

目录

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.mzph.cn/news/90673.shtml

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

相关文章

uni-app 实现凸起的 tabbar 底部导航栏

效果图 在 pages.json 中设置隐藏自带的 tabbar 导航栏 "custom": true, // 开启自定义tabBar(不填每次原来的tabbar在重新加载时都回闪现) 新建一个 custom-tabbar.vue 自定义组件页面 custom-tabbar.vue <!-- 自定义底部导航栏 --> <template><v…

react.js在visual code 下的hello World

想学习reacr.js &#xff0c;就开始做一个hello world。 我的环境是visual code &#xff0c;所以我找这个环境下的例子。参照&#xff1a; https://code.visualstudio.com/docs/nodejs/reactjs-tutorial 要学习react.js &#xff0c;还得先安装node.js&#xff0c;我在visual …

github代码提交过程详细介绍

1、下载github上面的代码 &#xff08;1&#xff09;在github网站上&#xff0c;找到想要下载的代码仓库界面&#xff0c;点击Code选项就可以看到仓库的git下载地址&#xff1b; &#xff08;2&#xff09;使用命令下载&#xff1a;git clone 地址&#xff1b; 2、配置本地git…

【通意千问】大模型GitHub开源工程学习笔记(1)

9月25日&#xff0c;阿里云开源通义千问140亿参数模型Qwen-14B及其对话模型Qwen-14B-Chat,免费可商用。 立马就到了GitHub去fork。 GitHub&#xff1a; GitHub - QwenLM/Qwen: The official repo of Qwen (通义千问) chat & pretrained large language model proposed b…

在vue使用wangEditor(简单使用)

wangEditor不同的版本使用方法都不一样&#xff0c;这里以目前最新的参考官网方法使用2023-09-28 首先安装&#xff0c;参考官网&#xff0c;注意editor跟editor-for-vue两个都要装 yarn add wangeditor/editor # 或者 npm install wangeditor/editor --saveyarn add wangedit…

【Linux指令集】---git命令的基本使用

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 演示环境&#xff1…

Event Loop——事件循环

JS 是单线程的&#xff0c;也就是同一个时刻只能做一件事情。 那么思考&#xff1a;为什么浏览器可以同时执行异步任务呢&#xff1f;因为浏览器是多线程的。 当 JS 需要执行异步任务时&#xff0c;浏览器会另外启动一个线程去执行该任务。 也就是说&#xff0c;“JS 是单线程…

Springboot中slf4j日志的简单应用

1、注入依赖&#xff08;pom.xml&#xff09; <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.9</version> &…

【5G PHY】物理层逻辑和物理天线的映射

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

最新AI创作系统源码ChatGPT源码+附详细搭建部署教程+AI绘画系统+支持国内AI提问模型

一、AI系统介绍 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&am…

数学术语之源——纤维(fiber)

1. 数学术语“纤维”(英英“fibre”,美英“fiber”)在数学中的起源 fiber[ˈfaɪbə(r)]这个词始于14世纪晚期&#xff0c;词义为“肝叶的一瓣(a lobe of the liver)”,也指“内脏(entrails)”。来自中世纪拉丁语“fibre”,其又源自拉丁语“fibra”,词义为“纤维(a fiber)、细…

31.链表练习题(2)(王道2023数据结构2.3.7节16-25题)

【前面使用的所有链表的定义在第29节】 试题16&#xff1a;两个整数序列A&#xff0c;B存在两个单链表中&#xff0c;设计算法判断B是否是A的连续子序列。 bool Pattern(LinkList L1,LinkList L2){ //此函数实现比较L1的子串中是否有L2LNode *p, *q; //工作在L1,p记录L1子串…

springcloud之自我介绍

写在前面 在这篇文章 中我们分析了单体应用的问题&#xff0c;以及用来解决这些问题的解决的方案微服务&#xff0c;并接着看了微服务需要考虑的各种&#xff0c;如服务调用&#xff0c;负载均衡&#xff0c;服务治理&#xff0c;链路追踪&#xff0c;分布式事务&#xff0c;等…

【IDEA】使用idea调试时查看对象集合的值

1、在实体类上添加toString方法 2、在要查看集合的地方右键View as→toString 3、View Text复制对象集合的值 4、复制map集合的值同理

《动手学深度学习 Pytorch版》 7.6 残差网络(ResNet)

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l7.6.1 函数类 如果把模型看作一个函数&#xff0c;我们设计的更强大的模型则可以看作范围更大的函数。为了使函数能逐渐靠拢到最优解&#xff0c;应尽量使函数嵌套&…

Qt 画自定义饼图统计的例子

先给出结果图&#xff0c;这个例子是将各种事件分类然后统计的其比例&#xff0c;然后画饼图显示出来 这个是我仿照官方给的例子&#xff0c;让后自己理解后&#xff0c;修改的&#xff0c;要生成饼图&#xff0c;需要QT的 charts 支持&#xff0c;安装QT 没有选择这个的&#…

【sgUploadTileImage】自定义组件:浏览器端生成瓦片图,并转换为File文件序列上传瓦片图

特性&#xff1a; 支持自定义瓦片图尺寸支持显示预览最小尺寸100x100像素大小&#xff0c;切换为实际切割尺寸支持获取切割后的文件Files数组 sgUploadTileImage源码 <template><div :class"$options.name"><div class"sg-ctrl"><di…

并查集专题

一、并查集的定义 二、基本操作 1、初始化 一开始,每个元素都是独立的集合 #include<iostream>using namespace std;const int maxN=1000; int father[maxN];int</

商场做小程序商城的作用是什么?

商场是众多商家聚集在一起的购物公共场所&#xff0c;大商场也往往入驻着众多行业商家&#xff0c;是每个城市重要的组成部分。 随着互联网电商深入及客户消费行为改变&#xff0c;不少商场如今的客流量非常有限&#xff0c;甚至可以说是员工比客人多&#xff0c;这就导致撤店…

力扣:113. 路径总和 II(Python3)

题目&#xff1a; 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;…