17-数据结构-查找-(顺序、折半、分块)

news2025/1/19 13:10:27

        简介:查找,顾名思义,是我们处理数据时常用的操作之一。大概就是我们从表格中去搜索我们想要的东西,这个表格,就是所谓的查找表(存储数据的表)。而我们怎么设计查找,才可以让计算机更快的去找到筛选我们所需要的信息呢,因此,关于怎么设计查找,就有了很多道道了。

        比如,单纯的掰着手指头去算,一个一个查,这是顺序查找;又比如,我知道了一个有序数据的最大最小的下标,我直接每次看这组数据中间的值,就跟数字爆炸一样,1和10,我猜5,猜大了,那我就从6和10中间再说他们的中间值8,这样每次可以省一半的时间,这是折半查找;再者数据特别大,我每次查找要么挨个算,要么每次省一半,所需时间还很长,这时候我们就需要分块查找了,它用的时索引结构。索引,也就相当于书的目录,我们去读一本书想读的内容,首先先去目录去找它在第几章,随后在在那一章的第一页开始往下找。分块查找就是这样的,它显示分成块,每一块的第一个下标为该块在索引表的标记,分块查找的特点就是,索引表中是有序的,但块间无序的。
        


目录

一、顺序查找

        1.1简介:

 1.2代码:

        1.3实现

二、折半查找

        2.1简介:

        2.2折半思想代码:

        2.3.折半的判断树

三、分块查找

        3.1简介


一、顺序查找

        1.1简介:

顺序查找,一般在线性表中进行查找。查找对象的存储结构适用于顺序表和链表。

线性表的顺序表中,分为有序和无序两种情况。

        哨兵思想:就是在数组的开头第一个位置,或结尾第一个位置,不存放数据,从下标1开始存放,给每次需要对比的数据,放在哨兵位置,即下标0处,与之对比。这样可以避免越界。

        无序的话,则是从头到尾挨个遍历因此时间复杂度为O(n)。

        平均查找长度:

         查找成功:\frac{n*(n+1))}{2}  \frac{1}{n} =\frac{n+1}{2},前面是查找每一个数时的查找次数的总数,是个等差数列,后面乘上每个数被查找的概率,一般都是\frac{1}{n},即平分。

        查找失败:就是给数组遍历,遍历到数据的下一位时发现找不到了,所以为n+1即可。

        有序的话,类似于二叉排序树,它可以减少查找失败时的时间,因为有序,当我找的值,遍历到比前一个大,比后一个小时,那么就查找失败了,后面不用再看了。

        平均查找长度:

          查找成功:与无序一样,\frac{n*(n+1))}{2}  \frac{1}{n} =\frac{n+1}{2}

           查找失败:(\frac{n*(n+1))}{2}+n)*\frac{1}{n+1}=\frac{n}{2}\dotplus \frac{1}{n+1},,长方形为不存在的数据范围,查找这些范围,就算失败,后面就不用找了。如图,失败总次数为:1+2+3+3,1+2+3为等差数列,后面再加个3为结尾处无穷的情况。       

 1.2代码:

这里实现了顺序表的顺序查找

主要顺序查找思想:

//查找
int SeqSearch(SSTable* s,int key)
{
	//哨兵处,放进需要对比的值 
	s->data[0]=key;
	
	int i;
	//随后,从表尾进行遍历对比 
	i=s->tabLen;
	//不等于key的时候就一直递减 
	while(s->data[i]!=key)
	{
		i--;
	}
	//如果找到了,则返回i,如果没找到,即最后i=0,跟哨兵坐标相等了,则失败 
	return i;	
}
#include <stdio.h>
#include <string.h>
#include <malloc.h>
//顺序查找结构体
typedef struct 
{
	int *data; //动态一维数组 
	int tabLen;//表长度 
	
}SSTable;//顺序查找表 
//初始化顺序查找表 
void InitSSTable(SSTable *s)
{
	printf("输入表长\n");
	int k;
	scanf("%d",&k);
	s->tabLen=k;
	s->data=(int*)malloc(sizeof(int)*s->tabLen);
}
//查找
int SeqSearch(SSTable* s,int key)
{
	s->data[0]=key;
	
	int i;
	i=s->tabLen;
	while(s->data[i]!=key)
	{
		i--;
	}
	
	return i;	
}
void CreatSSTable(SSTable *s)
{
	printf("表长为%d\n",s->tabLen);
	int i=1;
	printf("请给数组赋值\n");
	while(i<s->tabLen)
	{
		int x;
		scanf("%d",&x);
		s->data[i]=x;	
		i++;
	}
}  

int main()
{
	SSTable s;
	InitSSTable(&s);
	CreatSSTable(&s);
	int pos;
	int key;
	printf("请输入要查找的值\n");
	scanf("%d",&key);
	
	pos=BinarySearch(s,key); 
	if(pos!=0)
	printf("%d在表中的下标为%d\n",key,pos);
	else
	printf("表中没有你要找的数据\n");
	
	return 0;
 } 

        1.3实现

        

二、折半查找

        2.1简介:

        折半查找,又叫二分查找,它仅适用于有序的顺序表,注意两个特点:1.有序;2.顺序表,进行随机存取操作时。折半字面意思,纸每次对折一半,就跟数字爆炸一样,每次我猜数字都从范围内的中间值猜,猜大猜小,再去另一个区域去猜。

        2.2折半思想代码:

    就是对有序的一维数组,进行折半划分。先定义两个标记遍历。low和high,low在数据最左侧开始,high在数据最右侧,high和low为数组下标,因此high=n-1;数组长度减1.随后进行while循环,循环为low<=high,随后进入循环,开始,先给mid跟新值,mid=(low+high)/2,我们通过mid去看数组中mid处的值,与key对比,如果相等,则返回,如果小于key,说明找的mid偏小了,所以在右区域去找,此时更新low即可,low=mid+1;同理如果大于key,说明大了,更新high=mid-1;

//二分查找
int BinarySearch(SSTable s,int key)
{
	int low=0;
	int high=s.tabLen-1;
	int mid=0;
	while(low <= high)
	{
		printf("mid=%d\n",mid);
		mid=(low+high)/2;
		
		if(s.data[mid]==key)
		return mid;
		else if(s.data[mid]<key)
		{
			low=mid+1;	
		}
		else
			high=mid-1;			
	}
	return 0;	
} 

        2.3.折半的判断树

   判断树,顾名思义,就是一个二叉树,通过二分法,去不断化分成两块。每个结点为mid处的值。先后顺序为,先记录low和high的初始值,当low<=high时,随后进行折半查找,先更新mid值\frac{low+high}{2},然后看数组mid处的值,与我们查找数对比,大或者小,进行high或low的更新即可。注:每次更新mid时,所得的运算结果,就是代码思想时所得结果,即3/2=1,  5/3=1,只保留整数位,

此外,做题的时候,要看好数据的下标,初始化时low永远都在数据第一个位置的下标处,high在数据最右侧。

直接上图:

树中,每个结点为数组mid下标处的数值。每次左右更新的时候,更新相应的变量。一个变一个不变。每个结点下面,写一下mid的值,方便计算下一个情况。蓝色区域为失败的区域。

三、分块查找

        3.1简介

        分块查找,仅适用于线性表顺序存储,是对顺序查找和分块查找的优化,它有两个表,一个查找表(正常存储数据的表),一个索引表(给查找表中的数据分成n块,包含该块最大值,和该块其实下标)。分块查找,索引表有序,查找表可以无序,即块内无序,块间有序。

        它用的是索引结构。索引,也就相当于书的目录,我们去读一本书想读的内容,首先先去目录去找它在第几章,随后在在那一章的第一页开始往下找。分块查找就是这样的,它显示分成块,每一块的第一个下标为该块在索引表的标记,分块查找的特点就是,索引表中是有序的,但块间无序的。

        先通过对比索引表中的值,若在在某个块之间,则通过下标,取查找表中遍历即可。

  平均查找长度:

        索引表采用折半查找,查找表采用顺序查找:折半查找相当于树,其树的高度,为平均查找长度不会超过树搞,即log(n)+1即树高的计算公式。顺序查找,则是遍历一遍。即长度为n的表通过划分为b块,每块为a个数据所以n=b*a;

所以总的平均查找为:

log(b)+1+(\frac{1}{a}*\frac{a*(a+1))}{2})

索引表采用折半查找,查找表也采用折半查找:log(b)+1+log(b)+1=log(b)+log(a)+2,其实也就是整个查找表都是有序的,直接对全部进行二分,所以为log(n)+2;

查找效率最高时:即默认n=ba时,b=a=\sqrt{n}时,索引表和查找表都时有序的,都采用二分查找,效率最高。平均查找长度最小。

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

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

相关文章

lv4 嵌入式开发-4 标准IO的读写(二进制方式)

目录 1 标准I/O – 按对象读写 2 标准I/O – 小结 3 标准I/O – 思考和练习 文本文件和二进制的区别&#xff1a; 存储的格式不同&#xff1a;文本文件只能存储文本。除了文本都是二进制文件。 补充计算机内码概念&#xff1a;文本符号在计算机内部的编码&#xff08;计算…

2023/09/10

文章目录 1. 使用Vue单页面全局变量注意事项2. 伪元素和伪类3. Vue3中定义数组通常使用ref4. Vue Router的 $router 和 $route5. Vue路由中的query和params的区别6. vue3defineExpose({})属性不能重命名&#xff0c;方法可以重命名7. 显卡共享内存的原理8. deltaY9. 快速生成方…

电池2RC模型 + 开路电压法 + 安时积分 + 电池精度测试 + HPPC脉冲

电池2RC模型 电池2RC模型是一种等效电路模型&#xff0c;用于描述电池的动态特性。该模型将电池视为一个理想电容器和一个理想电阻的并联&#xff0c;其中理想电容器代表电池的化学反应&#xff0c;理想电阻代表电池的内阻。该模型适用于描述电池的充电和放电过程。 开路电压…

Java中如何判断字符串输入[hello,world]是不是字符串数组参数

Java中如何判断字符串输入[hello,world]是不是字符串数组参数&#xff1f; 在Java中&#xff0c;可以使用正则表达式来判断一个字符串是否符合字符串数组的参数格式。你可以使用matches()方法和对应的正则表达式进行判断。 以下是一个示例代码&#xff1a; public static bo…

SpringCloudGateway网关实战(二)

SpringCloudGateway网关实战&#xff08;二&#xff09; 本文我们在前文的基础上&#xff0c;开始讲gateway过滤器的部分内容。gateway的过滤器分为内置过滤器Filter和全局过滤器GlobalFilter。本章节先讲内置过滤器Filter。 需要先声明一下内置过滤器和全局过滤器之间的区别…

mysql文档--innodb中的重头戏--事务隔离级别!!!!--举例学习--现象演示

阿丹&#xff1a; 先要说明一点就是在网上现在查找的mysql中的事务隔离级别其实都是在innodb中的事务隔离级别。因为在mysql的5.5.5版本后myisam被innodb打败&#xff0c;从此innodb成为了mysql中的默认存储引擎。所以在网上查找的事务隔离级别基本上都是innodb的。并且支持事务…

JavaScript基础10——获取数据类型、类型转换

哈喽&#xff0c;大家好&#xff0c;我是雷工。 现如今知识大爆炸&#xff0c;到处都有海量的知识&#xff0c;常常见了就收藏&#xff0c;把网盘塞得满满的&#xff0c;却从来没有看过。 收藏起来装到网盘里并没有什么软用&#xff0c;要把知识装到脑袋里才行。 从几分钟开始&…

【LeetCode-中等题】26. 删除有序数组中的重复项

文章目录 题目方法一&#xff1a;快慢指针 题目 方法一&#xff1a;快慢指针 class Solution { //快慢指针public int removeDuplicates(int[] nums) {int fast 1;int slow 0;while(fast < nums.length){if(nums[fast] nums[fast-1]) fast;//若当前元素和之前元素相同 则…

华为OD机试 - 战场索敌 - 深度优先搜索dfs算法(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、深度优先搜索dfs五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明4、如果增加目标敌人数量K为55、来&#xff0c;上强度 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 一、题目描述 有一个大小是N*M…

ros_launch配置

创建launch文件批运行节点和包 将以下四条指令写入launch文件中 获取软件包的完整指令 rospackpkg&#xff1a;软件包名字 type&#xff1a;节点名字 四条指令转化成launch文件

无人机航线规划

无人机航线规划&#xff0c;对于无人机的任务执行有着至关重要的作用&#xff0c;无人机在从起点飞向目的点的过程中&#xff0c;如何规划出一条安全路径&#xff0c;并且保证该路径代价最优&#xff0c;是无人机航线规划的主要目的。其中路径最优的含义是&#xff0c;在无人机…

大数据-玩转数据-Flink 容错机制

一、概述 在分布式架构中&#xff0c;当某个节点出现故障&#xff0c;其他节点基本不受影响。在 Flink 中&#xff0c;有一套完整的容错机制&#xff0c;最重要就是检查点&#xff08;checkpoint&#xff09;。 二、检查点&#xff08;Checkpoint&#xff09; 在流处理中&am…

初识Nacos

前言 Nacos是一个用于微服务架构下的服务发现和配置管理以及服务管理的综合解决方案&#xff08;官网介绍&#xff09;&#xff0c;这里的服务发现其实就是注册中心&#xff0c;配置管理就是配置中心&#xff0c;而服务管理是二者的综合&#xff1b; Nacos特性 1.服务发现与…

《Go语言在微服务中的崛起:为什么Go是下一个后端之星?》

&#x1f337;&#x1f341; 博主猫头虎&#x1f405;&#x1f43e; 带您进入 Golang 语言的新世界✨✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f…

【JavaEE】_CSS常用属性值

目录 1. 字体属性 1.1 设置字体家族 font-family 1.2 设置字体大小 font-size 1.3 设置字体粗细 font-weight 1.4 设置字体倾斜 font-style 2. 文本属性 2.1 设置文本颜色 color 2.2 文本对齐 text-align 2.3 文本装饰 text-decoration 2.4 文本缩进 text-indent 2.…

车载软件架构——基础软件供应商开发工具链(二)

车载软件架构——基础软件供应商&开发工具链(二) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己…

2023-9-10 能被整除的数

题目链接&#xff1a;能被整除的数 #include <iostream> #include <algorithm>using namespace std;typedef long long LL;const int N 20;int n, m; int p[N];int main() {cin >> n >> m;for(int i 0; i < m; i) cin >> p[i];int res 0;f…

性能测试 —— 全链路压测最佳实践!

全链路压测理论基础 什么是全链路压测 基于实际的生产业务场景、系统环境&#xff0c;基于真实数据模拟海量的用户请求对整个业务链进行压力测试&#xff0c;并持续调优的过程&#xff1b; 全链路的核心为&#xff1a;业务场景、数据链路、压力模型和环境拓扑&#xff1b;…

QuantLib学习笔记——看看几何布朗运动有没有股票走势的感觉

⭐️ 小鹿在乱撞 小伙伴们肯定看过股票的走势&#xff0c;真是上蹿下跳啊&#xff0c;最近小编学了一丢丢关于随机过程和QuantLib的知识&#xff0c;想利用随机过程生成一个类似股票价格走势的图&#xff0c;安排&#xff01;&#xff01;&#xff01; ⭐️ 随机过程 随机过程…

基于seata实现分布式事务实现订单服务 + 账户服务 + 商品库存服务之间的分布式事务

概述 实现订单服务 账户服务 商品库存服务之间的分布式事务. 订单服务生成订单,同时调用账户服务扣减金额, 调用库存服务扣减库存. 服务采用seata的刚性事务, 保证数据一致性. 详细 1.需求&#xff08;要做什么&#xff09; 模仿一个购物流程. 利用seata的分布式事务实现 …