基于线性表的查找

news2024/9/22 16:33:06

目录

一、查找的基本概念

 二、顺序查找

 关键代码

 完整代码

 运行结果

增加哨兵 

 三、二分查找(折半查找)

 关键代码

 完整代码

 运行结果

四、分块查找

 图示

 关键代码

 完整代码


 

一、查找的基本概念

  • 对查找表进行的操作
    1.查找某个特定的数据元素是否存在
    2.检索某个特定数据元素的属性
    3.在查找表中插入一个数据元素
    4.在查找表中删除一个数据元素
  • 静态查找(Static Search Table)——在查找过程中仅查找某个特定元素是否存在或它的属性的,称为静态查找。
  • 动态查找(Dynamic Search Table)——在查找过程中对查找表进行插入元素或删除元素操作的,称为动态查找。
  • 关键字(Key)——数据元素(或记录)中某个数据项的值,用它可以标识数据元素(或记录)。
  • 主关键字(Primary Key)——可以唯一地标识一个记录的关键字称为主关键字。
  • 次关键字(Secondary Key)——可以标识若干个记录的关键字称为次关键字。
  • 查找(Searching)——在查找表中确定是否存在一个数据元素的关键字等于给定值的操作,称为查找(也称为检索)。若表中存在这样一个数据元素(或记录),则查找成功;否则,查找失败。
  • 内查找和外查找——若整个查找过程全部在内存进行,则称为内查找;若在查找过程中还需要访问外存,则称为外查找。
  • 平均查找长度ASL——查找算法的效率,主要是看要查找的值与关键字的比较次数,通常用平均查找长度来衡量。

 二、顺序查找

  • 顺序查找,也称线性查找,通常用于线性表。
  • 算法思想:从头到尾挨个找 
  •  关键代码

int Search_Seq(SSTable S, ElemType key)
{
	for (int i = 0; i < S.len ; i++)
	{
		if (S.elem[i] == key)
			return i;//查找成功,返回元素下标
	}
	return -1;
}
  •  完整代码

#include<iostream>
#include<stdio.h>
#include<malloc.h>
#include<iomanip>
using namespace std;
typedef int ElemType;
typedef struct 
{
	ElemType* elem;//动态数组基址
	int len;//表的长度
}SSTable;
int Search_Seq(SSTable S, ElemType key)
{
	for (int i = 0; i < S.len ; i++)
	{
		if (S.elem[i] == key)
			return i;//查找成功,返回元素下标
	}
	return -1;
}
int main()
{
	SSTable s;
	s.elem = (int*)malloc((80*sizeof(int)));
	s.len = 0;
	for (int i = 0; i <80 ; i++)
	{
		s.elem[i] = (rand() % 150 + 1);//产生【1,150】之间任意的随机整数
		s.len++;
	}
	int key;
	cout << "请输入想要查找的(1-150)之间任意的数字:";
	cin >> key;
	if (Search_Seq(s, key) != -1)
	{
		cout << "找到了!下标为:" << Search_Seq(s, key)<<endl;
	}
	else
		cout << "未找到!" << endl;
	cout << "所有数据为:" << endl;
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			cout << setw(2) << 10 * i + j << "[" <<setw(3)<< s.elem[10 * i + j] << "]" << " ";
			//setw()函数使输出对齐
		}
		cout << endl;
	}
	return 0;
}
  •  运行结果

  • 增加哨兵 

int Search_Seq(SSTable S, ElemType key)
{
	S.elem[0] = key;//S.elem[0]称为监视哨,可以起到防止越界的作用。
	int i = S.len;
	while (S.elem[i] != key)//从后往前找
	{
		i--;
	}
	return i;//查找成功返回元素下标,查找失败返回0
}

 三、二分查找(折半查找)

  • 基本思路:在有序表中,取中间元素作为比较对象,若给定值与中间元素的关键字相等,则查找成功;若给定值小于中间元素的关键字,则在中间元素的左半区继续查找;若给定值大于中间元素的关键字,则在中间元素的右半区继续查找。不断重复上述查找过程,直到查找成功,或所查找的区域无数据元素,查找失败。
  •  关键代码

int BinSearch(int* data,int n, int key)//折半查找
{
	int low = 0, high = n - 1;
	int mid = 0;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (key < data[mid])//继续在data[low,mid-1]左区间查找
			high = mid - 1;
		else if (key > data[mid])//继续在data[mid+1,high]右区间查找
			low = mid + 1;
		else
			return mid;//查找成功
	}
	return -1;//查找失败,返回-1
}
  •  完整代码

#include<iostream>
#include<stdio.h>
#include<algorithm>//sort函数的头文件
#include<iomanip>//setw()函数的头文件
using namespace std;
int BinSearch(int* data,int n, int key)//折半查找
{
	int low = 0, high = n - 1;
	int mid = 0;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (key < data[mid])//继续在data[low,mid-1]左区间查找
			high = mid - 1;
		else if (key > data[mid])//继续在data[mid+1,high]右区间查找
			low = mid + 1;
		else
			return mid;//查找成功
	}
	return -1;//查找失败,返回-1
}
int main()
{
	int a[80] = { 0 };
	for (int i = 0; i < 80; i++)
	{
		a[i] = (rand() % 200 + 1);//产生【1,200】之间任意随机数
	}
	sort(a, a + 80,less<int>());//使用现成的sort函数,从小到大排序
	//sort(a, a + 80, greater<int>());//从大到小排序
	int key;
	cout << "请输入(1-200)之间想要查找的数字:";
	cin >> key;
	if (BinSearch(a, 80, key) != -1)
	{
		cout << "查找成功!" << "下标为:" << BinSearch(a, 80, key) << endl;
	}
	else
	{
		cout << "查找失败!" << endl;
	}
	cout << "所有数据是:" << endl;
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			cout << setw(2) << 10 * i + j << "[" << setw(3) << a[10 * i + j] << "]" << " ";
		}
		cout << endl;
	}
}
  •  运行结果

 

四、分块查找

  • 分块存储的索引表中保存的是各个分块的最大的元素和分块的存储区间
  • 特点:块内无序、块间有序
  • 算法过程:
    1.在索引表中确定待查记录所属分块
    2.在块内顺序查找
  •  图示

 

  •  关键代码

int IdxSearch(int*data, Index I[], ElemType key,int n,int b)
//分块查找key,索引表为I[0,..,b-1]
{
	int s=n/b;//索引表内每块元素个数
	int low = 0, high = b - 1;
	int mid = 0;
	while (low <= high)//在索引表中折半查找
	{
		mid = (low + high) / 2;
		if (key <= I[mid].maxkey)
		{
			high = mid - 1;
		}
		else
		{
			low = mid + 1;
		}
	}
	if (low <= b - 1)
	{
		for (int i = I[low].link; i <= I[low].link+s-1&&i<n; i++)//在数组中顺序查找
		{
			if (key == data[i])
				return i;
		}
		return 0;
	}

}
  •  完整代码

#include<iostream>
#include<stdio.h>
using namespace std;
//#define b 6;//索引表的最大长度
typedef int ElemType;
typedef struct//索引表
{
	ElemType maxkey;
	int link;//分块区间的起始下标
}Index;
int Max(int& a, int& b)
{
	if (a <= b)
		return b;
	else
		return a;
}
void Init(int* data, Index I[], int n, int b)//初始化索引表
//索引表为I[0, .., b - 1]
{
	int max = 0;
	int s = n / b;
	for (int i = 0; i <=b-1; i++)//初始I[i]分块
	{
		for (int j = i * s; j <= s * (i + 1) - 1; j++)
		{
			max = Max(max, data[j]);
		}
		I[i].maxkey = max;
		I[i].link = i * s;
	}
}
int IdxSearch(int*data, Index I[], ElemType key,int n,int b)
//分块查找key,索引表为I[0,..,b-1]
{
	int s=n/b;//索引表内每块元素个数
	int low = 0, high = b - 1;
	int mid = 0;
	while (low <= high)//在索引表中折半查找
	{
		mid = (low + high) / 2;
		if (key <= I[mid].maxkey)
		{
			high = mid - 1;
		}
		else
		{
			low = mid + 1;
		}
	}
	if (low <= b - 1)
	{
		for (int i = I[low].link; i <= I[low].link+s-1&&i<n; i++)//在数组中顺序查找
		{
			if (key == data[i])
				return i;
		}
		return 0;
	}

}
int main()
{
	int a[] = { 8,14,6,9,10,22,34,18,19,31,40,38,54,66,46 };
	int size = sizeof(a) / sizeof(a[0]);//数组a中元素个数
	Index I[3];
	Init(a, I, size, 3);
	int x;
	cout << "请输入想要查找的元素:";
	cin >> x;
	cout<<"下标为:"<<IdxSearch(a, I, x, size, 3);
	return 0;
}

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

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

相关文章

攻防世界-fakebook

题目 访问题目场景 我自己尝试了很久&#xff0c;发现怎么都找不到这道题的入手点&#xff0c;然后就去看了大佬们的文章&#xff0c;然后我发现这道题更趋近于真实的场景 解题过程 先使用目录扫描器扫一下发现存在robots.txt访问一下 这里发现存在一个备份文件 <?php…

html、css、js的小米商城

首页的展示 首页的功能 1、搜索栏模糊查询 在我在输入框输入关键字的时候&#xff0c;会匹配关键字&#xff0c;如果我的存放的数据里面包含这些关机键字就会显示出来。做到模糊查询的效果。 2、实现搜索功能 在首页的搜索框点击搜索的时候&#xff0c;就会对你输入的关键字进…

Redis 未授权访问的原理、危害及复现

原理介绍 Redis 未授权访问 准确的来说&#xff0c;其实并不是一个漏洞。而是由于开发人员配置不当&#xff0c;而产生的预料之外的危害。 具体原理&#xff1a; 可能由于部分业务要求&#xff0c;或者开发人员的配置不当&#xff0c;将 redis 服务器的 ip 和 port 暴露在公网…

基础数学(7)——常微分方程数值解法

文章目录期末考核方式基础知识解析解&#xff08;公式法&#xff09;解析解例题&#xff08;使用公式法&#xff0c;必考&#xff09;解析解的局限性数值解数值解的基本流程显示Euler法显示欧拉&#xff08;差值理解&#xff09;显示欧拉&#xff08;Taylor展开理解&#xff09…

ClickHouse表引擎详解看这篇就够了-基本讲解、处理逻辑、测试实例

表引擎是ClickHouse设计实现中的一大特色。表引擎在 ClickHouse 中的作用十分关键&#xff0c;直接决定了数据如何存储和读取、是否支持并发读写、是否支持 index、支持的 query 种类、是否支持主备复制等。1、表引擎概述1.1 介绍ClickHouse 提供了大约 28 种表引擎&#xff0c…

ArcGIS基础实验操作100例--实验43填充面要素空洞

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验43 填充面要素空洞 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&a…

JavaScript 条件语句

文章目录JavaScript If...Else 语句条件语句If 语句If...else 语句If...else if...else 语句JavaScript If…Else 语句 条件语句用于基于不同的条件来执行不同的动作。 条件语句 通常在写代码时&#xff0c;您总是需要为不同的决定来执行不同的动作。您可以在代码中使用条件语…

【学习笔记】Shell入门

Shell入门 https://www.bilibili.com/video/BV1WY4y1H7d3 资料&#xff1a;评论区取的 公众号的资料链接 https://pan.baidu.com/s/1_nBKUjE57MB2c96wmfSD5A 提取码&#xff1a;yyds 文章目录一、**Shell** 概述二、**Shell** 脚本入门三、变量1.系统预定义变量2.自定义变量**3…

自学软件测试该如何入门?

互联网行业发展很快技术更新也很快&#xff0c;软件测试技能要求在逐渐提高&#xff0c;自学软件测试要尽快而且入行后需要持续学习。保持好心态&#xff0c;找准教程&#xff0c;按照学习路线和自己的规划一步步学习下去~ 软件测试对代码的要求不像其他编程学科那么高&#x…

30个精品Python练手项目

随着 Python 语言的流行&#xff0c;越来越多的人加入到了 Python 的大家庭中。到底为什么这么多人学 Python &#xff1f;我要喊出那句话了&#xff1a;“人生苦短&#xff0c;我用 Python&#xff01;”&#xff0c;正是因为语法简单、容易学习&#xff0c;所以 Python 深受大…

Java微服务连接云服务器上的ZooKeeper

前言 这次要讲的连接ZooKeeper是在外网的云服务器上&#xff0c;不同于以往的本机上的虚拟机上的ZooKeeper&#xff0c;将会有一些不同于本机的连接方式。连接外网服务器进行操作可以更好的适应企业化的开发&#xff0c;脱离了本机的限制&#xff0c;具有很强的实战意义。 前…

小程序容器产品有何特点?

小程序容器顾名思义&#xff0c;是一个承载小程序的运行环境&#xff0c;可主动干预并进行功能扩展&#xff0c;达到丰富能力、优化性能、提升体验的目的。目前市面已知的技术产品包括&#xff1a;mPaas、FinClip、uniSDK 以及上周微信团队才推出的 Donut。今天&#xff0c;我们…

2022 年,这 20+22 位共建者闪耀 StarRocks 社区

2022 年即将过去&#xff0c;多变波动的大环境之中&#xff0c;一岁多的 StarRocks 社区依然保持了高速成长。这一年里&#xff0c;StarRocks 共发布 47 个大小版本&#xff0c;超过 200 人投入社区建设&#xff0c;每月 PR 数突破 1100。 在项目快速迭代的同时&#xff0c;社…

Jumpserver堡垒机部署使用详细教程

部署jumpserver服务器配置 官方建议2核8G 首先cd 到/opt目录下 curl -sSL https://github.com/jumpserver/jumpserver/releases/download/v2.28.1/quick_start.sh | bash 下载的时候可能会报错&#xff0c;不用管多执行几次。 正常下载页面是这样 因为是从github拉的所以可…

volatile关键字(针对内存可见性)

一&#xff0c;示例 说明&#xff1a;创建两个线程&#xff0c;t1线程用来判断定义的flag变量是否等于0&#xff08;等于0的话进入循环什么都不做&#xff09;&#xff0c;t2线程用来输入一个变量来修改flag的值&#xff1b;我们想要通过t2线程修改flag变量的值来达到跳出t1线…

Educational Codeforces Round 140 (Rated for Div. 2)(A,B,D)

太久没写博客了&#xff0c;感觉做的题不自己写一遍思路总还是有点问题。。。又到了新年啦&#xff0c;cf的新年特效爱了爱了A. Cut the Triangle给出三角形的三个顶点坐标&#xff0c;问是否可以使用水平或者竖直线从任意一个顶点将三角形划为两部分。思路&#xff1a;易得知&…

研发协同利器:XState调研与应用

背景帖子详情是一个图文/视频混排、拥有大量长文本、大量交互和部分细节动效的页面&#xff0c;细节组件非常多&#xff0c;页面复杂度高。按以往的页面协作方式&#xff0c;会将一个个组件样式、组件数据和组件交互逻辑交给对应的开发同学完成&#xff0c;通过多人协同最终搭建…

【数据结构】C语言实现栈和队列

目录 一、栈 1、栈的概念及结构 2、如何实现栈 3、代码实现 3.1 栈的定义 3.2 栈中将要实现的函数 3.3 函数实现 二、队列 1、队列的概念及结构 2、如何实现队列 3、代码实现 3.1 队列定义 3.2 队列中将要实现的函数 3.3 函数实现 一、栈 1、栈的概念及结构 栈&am…

AI医药论文阅读-使用药物描述和分子结构从文献中提取药物-药物相互作用

202107Using drug descriptions and molecular structures for drug-drug interaction extraction from literature 使用药物描述和分子结构从文献中提取药物-药物相互作用 Bioinformatics. 2021.07 有代码 https://github.com/tticoin/DESC_MOL-DDIE 目录 202107Using dru…

2022亚太杯数学建模(补赛)DE题思路模型代码

占个位置吧&#xff0c;开始在本帖实时更新赛题思路代码&#xff0c;文章末尾名片获取&#xff01;ABC题已更新 持续为更新参考思路 赛题思路 会持续进行思路模型分析&#xff0c;下自行获取。 D题思路&#xff1a; &#xff08;比赛开始后第一时间更新&#xff09; E题思…