查询

news2025/7/12 13:26:34

一、顺序查询

普通查找方式:

int SeqSearch(int a[],int n,int k)
{
	int i = 0;
	while (i < n && a[i] != k)
		i++;
	if (i >= n)
		return 0;
	else
		return i + 1;
}

优化版查找方式:

int OPSeqSearch(int a[], int n, int k)
{
	int i = 0;
	a[n] = k;
	while (a[i] != k)
		i++;
	if (i == n)
		return 0;
    else
	    return i + 1;
}

两种查询方式的不同点:循环过程是否需要进行 i<n 的判断。

优化方式:在数组的末尾增加了要查找的元素,使每次的循环不需要 i<n 的判断。

节省时间展示:

         通过60000000次的查询,优化版的比未优化版大约节省了25ms时间。

附:时间间隔求法

完整代码展示:

//顺序查找
# include <iostream>
# include<time.h>
using namespace std;
int SeqSearch(int a[],int n,int k) //未优化前的顺序查询
{
	int i = 0;
	while (i < n && a[i] != k)
		i++;
	if (i >= n)
		return 0;
	else
		return i + 1;
}
int OPSeqSearch(int a[], int n, int k)  //优化后的顺序查询
{
	int i = 0;
	a[n] = k;
	while (a[i] != k)
	{
		i++;
	}
	if (i == n)
	{
		return 0;
	}
	return i + 1;
}
int main(void)
{
	int a[60000000];
	for (int i = 0; i < 60000000; i++)
	{
		a[i] = i;
	}
	clock_t start, finish, OPstart, OPfinish;
	double duration, OPduration;


	//计算未优化前的执行时间
	start = clock(); 
	SeqSearch(a, 60000000, 59999999);
    finish = clock();

	//优化后的执行时间
	OPstart = clock();
	OPSeqSearch(a, 60000000, 59999999);
	OPfinish = clock();

	duration = (double)(finish - start)/CLOCKS_PER_SEC*1000;
	OPduration= (double)(OPfinish - OPstart)/CLOCKS_PER_SEC*1000;

	printf("未优化前执行60000000次查询需花费:%f ms\n", duration);
	printf("优化后执行60000000次查询需花费:%f ms", OPduration);
	system("pause");
	return 0;
}

平均查找长度:在查找运算中,时间主要花费在关键字比较上,把平均需要关键字比较次数称为平均查找长度。


查找成功的平均查找长度:

        ASL=\sum_{i=1}^{n}p_ic_i=\frac{1}{n}\sum_{i=1}^{n}i=\frac{1}{n}\times \frac{n(n+1)}{2}=\frac{n+1}{2} 

查找失败的平均查找长度:

        ASL=n


因此此顺序查找算法的平均时间复杂度为O(n) 。

顺序查找:优点是算法简单,且对于表的存储结构五特别的要求,无论是顺序表还是链表也无论是元素之间是否按关键字有用,他都同样适用

缺点是查找效率低。

二、折半查找 

1.思路与代码

        折半查找又称二分查找,其要求是线性表是有序表,即表中的元素按关键字有序排列。

查找思路:

        设 R[low...high] 是当前的查找区间,首先确定该区间的中点位置 mid=[(low+high)/2],然后将待查的 k 值与 R[mid] 进行比较。

         1.若k=R[mid],则查找成功并返回该元素的逻辑序号。

         2. 若k<R[mid],则由表的有序性可知 R[mid...high] 均大于k,因此若表中存在关键字等于k的元素,则该元素必定在位置mid左边的子表                R[low...mid-1] 中,故新查找的区间是左子表 R[low...mid-1]。

         3.若k>R[mid],则关键字为 k 的元素必定在 mid 的右子表 R[mid+1...high] 中,即新的查找区间是右子表 R[mid+1...high]。

折半查询代码:

int BinSearch(int R[], int n, int k)
{
	int low = 0, high = n - 1, mid;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (k == R[mid])
			return mid + 1;             //查找成功返回其逻辑序号mid+1
		if (k < R[mid])
			high = mid - 1;             //在R[low...mid-1]中查找
		else
			low = mid + 1;              //在R[mid+1...high]中查找
	}
	return 0;                           //未找到时返回0(查找失败)
}

2.折半查找判定树 

折半查找判定树:用来描述折半查找过程的的二叉树叫做判定树比较树 。

设存在有序表R[0...10]={2,7,11,16,21,27,32,45,53,62,78}.则其二叉查找树为:

注:

    1. 红色字体代表数组下标,蓝色字体代表数组下标对应的值。 

    2. 圆节点代表可查询到的节点,方块节点代表未在数组中的节点。

    3. 蓝色(2 7)代表 2 与 7 之间的数,不包括2与7。

    4. 红色(0 1)代表 0 与 1 之间的数组下标,不包括 0 与1。

内部点:树中圆节点个数。

外部点:树中方节点个数。

如果树中有n个内部点,则其有n+1个外部点。

3.平均查找长度与时间复杂度 

由折半查找判定树可知,节点的层数即为该节点的查找次数,由此可得成功的二分查找次数是:

                                                           ASL=\frac{1}{n}\sum_{i=1}^{h}c_i\times i

其中 n 为总结点数(不包括方节点),h 为树的高度,ci 为第 i 层节点的个数。

成功与不成功的最多查找次数为树的高度:

                                                            \left \lceil log_2(n+1) \right \rceil 

综上所述其时间复杂度为

                                                              O(log_2n)

三、分块查找

1.实现原理

        性能介于顺序查找与折半查找之间,通过索引存储结构将整个数组分块,以便于查找。

 索引表中的 key 值对应主数据表中此块的最大值 ,link 值对应主数据表此块的起始位置下标。

2.实现代码 

int IdxSearch(int I[], int R[], int b, int n, int k)
{
	//I为索引表,R为数据表,b为索引表的长度,n为数据表的长度,k为要查找的数据
	int s = (n + b - 1) / b;     //s为每块中的元素个数,应为(n/b)下取整
	int low = 0, high = b - 1, mid, i;
	while (low <= high)                 //采用折半查找,找到的位置为high+1
	{
		mid = (low + high) / 2;
		if (I[mid].key >= k)
			high = mid - 1;
		else
			low = mid + 1;
	}
	i = I[high + 1].link;
	while (i < I[high + 1].link + s && R[i] != k)
		i++;

	if (i <= I[high + 1].link + s - 1)
		return i + 1;              //返回其逻辑序号
	else
		return 0;
}

3.平均查找长度及时间复杂度

设有 n 个元素,每个块中有 s 个元素,索引表长度为b。

折半查找+顺序查找:

                \small ASL=ASL_b+ASL_s= log_2(b+1)-1+\frac{s+1}{2} \approx log_2(\frac{n}{s}+1)+\frac{s}{2}

s 越小 ASL 的值越小,即当采用折半查找确定块时,每块的长度越小越好。 

顺序查找+顺序查找:

                \small ASL=ASL_b+ASL_b=\frac{b+1}{2}+\frac{s+1}{2}=\frac{1}{2}(\frac{n}{s}+s)

显然,当s=\small \sqrt{n}时,ASL取极小值\small \sqrt{n}+1,故采用此方式查找时选定 \small \sqrt{n} 效果最佳。

分块查找的主要缺点是增加了索引表的存储空间和增加了建立索引表的时间。

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

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

相关文章

全志A33使用主线U-Boot方法

最近在研究A33主线相关的资源&#xff0c;目前主线uboot和内核都对A33有极好的支持了&#xff0c;所以现在把我在使用过程中遇到的问题和使用方法做个记录&#xff0c;首先是下载主线uboot源码&#xff0c;网址为https://ftp.denx.de/pub/u-boot/&#xff0c;我下载的版本为202…

点云 ICP学习-IterativeClosestPoint

目录 一、pcl中 点云配准算法 二、关于svd原理求解部分 三、pcl IterativeClosestPoint 完成demo 一、pcl中 点云配准算法 PCL 库中 ICP 的接口及其变种&#xff1a; 点到点&#xff1a;pcl::IterativeClosestPoint< PointSource, PointTarget, Scalar >点到面&…

RocketMQ——Mac电脑OS系统docker安装Dashboard

文章目录引言安装下载dashboard镜像docker pull镜像查看镜像运行容器启动容器查看容器日志问题解决方案解决方案说明登录dashboard界面关注微信公众号&#xff1a;CodingTechWork&#xff0c;一起学习进步。引言 前面的文章已经介绍过如何在OS系统上安装并启动使用RocketMQ&…

Canal 安装与入门

MySQL Binlog 简介 https://blog.csdn.net/weixin_44371237/article/details/127904514 MySQL 主从复制过程 1&#xff09;Master 主库将改变记录&#xff0c;写到二进制日志(Binary Log)中&#xff1b; 2&#xff09;Slave 从库向 MySQL Master 发送 dump 协议&#xff0c…

基于QT的考试管理系统设计与实现

目录 一、项目概要 4 1.1项目名称 4 1.2项目目标 4 1.3软件概要 4 1.4功能描述 5 1.5开发环境 5 1.6关键技术 6 1.7开发体制 6 1.8开发阶段 6 二、软件详细需求 7 2.1学生登陆主界面 7 2.2管理员登陆主界面 8 2.3 学生考试系统实现 9 2.4学生练习系统实现 10 2.5试题管理系统实…

mongoDB mapreduce使用总结

大家都知道&#xff0c;mongodb是一个非关系型数据库&#xff0c;也就是说&#xff0c;mongodb数据库中的每张表是独立存在的&#xff0c;表与表之间没有任何依赖关系。在mongodb中&#xff0c;除了各种CRUD语句之外&#xff0c;还给我们提供了聚合和mapreduce统计的功能&#…

JVM 彻底搞懂JVM内存区域及直接内存

面试题&#xff1a;直接内存会导致OOM么&#xff1f; 程序计数器 代表当前线程所执行的字节码所在的行号&#xff0c;配合字节码解释器获取下一条需要执行的字节码指令。 代码中的分支、循环、跳转、异常处理、线程恢复都要依靠它来实现。 程序计数器是线程私有的&#xff0…

进程控制的一些具体操作

目录进程控制进程终止进程退出的方式进程等待进程等待的方法wait使用方法waitpid使用方法进程程序替换替换函数execl函数execv函数execlp函数execvp函数execle函数execve函数---->只有这一个是系统调用&#xff0c;其他都是库函数execvpe函数补充几个知识: %s/被替换的文件…

代码随想录——冗余连接II(并查集)

题目 在本问题中&#xff0c;有根树指满足以下条件的 有向 图。该树只有一个根节点&#xff0c;所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点&#xff0c;而根节点没有父节点。 输入一个有向图&#xff0c;该图由一个有着 n 个节点&am…

vb.net自定义白板

希沃白板在学校里基本上是一直使用的&#xff0c;但是在非希沃电脑里面是没有启动白板的 简答介绍思路和具体的功能 1、背景颜色和画笔颜色自由切换、画笔粗细1~20可以调节。 2、画笔样式&#xff1a;虚线、点线、短线 3、基本图形&#xff1a;矩形&#xff0c;正方形&…

程序员级别分析,看看你是哪个级别

关于程序员的工资众说纷纭&#xff0c;有说开七八千的&#xff0c;也有人说每月上万的&#xff0c;但不管怎么说&#xff0c;程序员的工资是真的比一些文职、行政人员岗位挣得多&#xff0c;大家都是靠自己的能力赚钱&#xff0c;这没什么可比的&#xff0c;况且大家都是在学习…

JAVASE零基础到高级教程(1)------ 集成开发环境安装使用

一 什么是环境变量 环境变量是在操作系统中⼀个具有特定名字的对象&#xff0c;它包含了⼀个或者多个应⽤程序所将使⽤到的 信息。例如Windows和DOS操作系统中的path环境变量&#xff0c;当要求系统运⾏⼀个程序⽽没有告诉它程 序所在的完整路径时&#xff0c;系统除了在当前⽬…

前端框架 Electron 使用总结

目录 一、基础搭建 通过脚手架搭建 1、Electron官方案例搭建环境 2、查看调试 3、菜单的使用 4、图标配置 5、项目打包 web应用相信每位程序员都不陌生&#xff0c;PC端应用可能会底层开发的就不是太多了&#xff0c;下面的这套技术栈就是为前端程序员快速一键搭建windo…

Linux学习——网络编程基础及TCP服务器

目录 一、网络采用分层的思想&#xff1a; 二、各层典型的协议&#xff1a; 三、网络的封包和拆包&#xff1a; 四、网络编程的预备知识 4.1.SOCKET 4.2 IP地址 4.3 端口号 4.4 字节序 五、TCP编程API TCP协议分成了两个不同的协议&#xff1a;可靠传输&#xff1a;用来检测网络…

读书笔记-学习GNU Emacs-3终篇

学习本书目的&#xff1a; emacs的学习一直是陆陆续续看博客和上手实践&#xff0c;这次想通过阅读"学习GNU Emacs"这本书好好系统的再复习下emacs。 yps:读技术书应该是带着一定的目的去读的&#xff0c;最简单的目的可能就是为了学好某一项技术或者复习下某一项技…

[附源码]java毕业设计社区健康服务平台管理系统lunwen

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

IDEA利用maven建立javaWeb项目(IDEA 2021.3.3)

1、在Idea中配置maven (1)、打开Idea&#xff0c;点击File&#xff0c;然后点击Settings&#xff0c;进入设置&#xff0c;或者直接按CtrlAltS进入设置 (2)、先在左上角的搜索框输入maven&#xff0c;找到maven后单击&#xff0c;然后在右边的maven home path的右边选择你的m…

置信度--学习笔记

置信区间是衡量测量精度的一个指标&#xff0c;也能显示出估算有多稳定&#xff0c;也就是说如果重复做某项实验&#xff0c;得到的结果与最初的估计有多接近。步骤&#xff1a; 确定要测试的情况&#xff1a;如“A大学男生的平均体重是80公斤”&#xff0c;则后续就是要测试在…

最新最全面的Spring详解(三)——Resources,验证、数据绑定和类型转换与Spring表达式语言(SpEL)

前言 本文为 【Spring】Resources与Spring表达式语言&#xff08;SpEL&#xff09; 等相关知识&#xff0c;下边将对Resources&#xff08;包含&#xff1a;Resource接口、内置的 Resource的实现、ResourceLoader接口、应用环境和资源路径&#xff09;&#xff0c;验证、数据绑…

浅谈化工生产制造企业软件系统的选择

现在大家都在讨论全球COVID流行和经济衰退对企业的影响&#xff0c;以及一个有作为的企业&#xff0c;在当下的环境下如何求生存和谋发展的问题。“埃森哲的一份报告发现&#xff0c;99%的首席运营官都认为&#xff0c;使用实时数据运营对于应对Covid或经济衰退威胁等至关重要。…