数据结构与算法-静态查找表

在这里插入图片描述
🌞 “清醒 自律 知进退!”

查找

  • 🎈1.查找的相关概念
  • 🎈2.静态查找表
    • 🔭2.1静态查找表的类定义
    • 🔭2.2顺序查找
    • 🔭2.3二分查找
      • 🔎二分查找例题
    • 🔭2.4分块查找
    • 🔭2.5三种算法的比较分析

查找是在一些有序的或无序的数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程,即根据给定的某个值在查找表中确定一个关键字等于给定的记录或数据元素。查找是信息处理科学中十分重要的操作。

🎈1.查找的相关概念

  1. 查找表是同一类型数据元素(或记录)构成的集合,与4种数据关系中的集合结构对应。由于集合中数据元素之间存在着完全松散的关系。因此,查找表往往要借助其他数据结构来实现相关算法。
  2. 关键字是可以标识一个数据元素(或记录)的数据项,关键字的值被称之为键值。若关键字可以唯一地标识一条记录,则称此关键字为主关键字。
  3. 查找是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元素的过程。若在查找表中存在与给定值匹配的记录,则查找成功,此时查找的结果可以是整个记录的信息或查找成功标记等。若在查找表中不存在与给定值匹配的记录,则查找不成功,此时查找结果可以是不成功标记,或将被查找记录插入查找表。
  4. 静态查找表是仅对表进行查找操作,而不进行插入和删除操作的查找表。静态查找在查找不成功时,只返回一个不成功标志,不改变查找表,因此表中数据元素的数量不会发生变化。
  5. 动态查找表是在查找的同时对表进行插入和删除操作的表。动态查找在查找不成功时,需要将被查找的记录插入查找表,因此表中数据元素的数量可能会发生变化。
    在这里插入图片描述

🎈2.静态查找表

🔭2.1静态查找表的类定义

#define _CRT_SECURE_NO_WARNINGS 1
#define Max 100
#include <iostream>
using namespace std;
typedef int KeyType;
typedef int InfoType;
typedef int IndexType;
typedef struct 
{KeyType key;//KeyType为关键字数据类型InfoType otherinfo;//其他域
}SElemType;
class StaticSearchtable
{
private:SElemType* elem;int length;
public:StaticSearchtable()//构造函数,0位留空{elem = new SElemType[Max + 1];length = 0;}~StaticSearchtable()//析构函数,释放存储空间{delete[]elem;length = 0;}void Create(int n)//创建n个元素的顺序表{for (int i = 0; i <= n; i++){cin >> elem[i].key >> elem[i].otherinfo;}length = n;}int SqSearch(KeyType key);//顺表表查找值等于key的关键字int BinSearch(KeyType key);//二分查找值等于key的关键字int IndexSearch(IndexType index[Max], KeyType key, int b);//分块查找值等于key的关键字,b为块数
};

🔭2.2顺序查找

🔎顺序查找的主要思想

  1. 设立哨兵位elem[0].key=key,其作用是防止扫描溢出。
  2. 从表的末端开始向左扫描线性表,依次将扫描到的关键字值和给定值key进行比较,若找到关键字,则查找成功,返回该关键字在顺序表中的下标;否则查找失败,返回0.
int StaticSearchtable::SqSearch(KeyType key)
{elem[0].key = key;//哨兵位int i = 0;for (i = length; elem[i].key != key; i--)//从末端开始向左扫描{;//空语句}return i;
}

🔎顺序查找分析:
在这里插入图片描述

🔭2.3二分查找

二分查找又称折半查找,它是一种效率较高的查找方法。二分查找要求线性表采用顺序存储结构且元素有序。类似于顺序查找方法,在存储元素时,数组元素第0位留空。

🔎二分查找的主要思想是每次将待查找记录所在的区间缩小一 半。具体步骤如下:设elem[low..high]是当前的查找区间,首先确定中间点位置mid = [(low+high)/2],然后将待查元素的关键字key值与elem[mid].key比较:(初始时,令low=1,high=length

  1. mid = [(low+high)/2]
  2. key==elem[mid].key,则查找成功,返回mid,即该元素在顺序表中的下标。
  3. key<elem[mid].key,则high = mid-1
  4. key>elem[mid].key,则low = mid+1
  5. 重复上述操作,直至low>high时,查找失败,此时返回0
int StaticSearchtable::BinSearch(KeyType key)
{int low = 1,high = length;int mid;while (low <= high){mid = (low + high) / 2;if (key == elem[mid].key)return mid;else if (key < elem[mid].key)high = mid - 1;elselow = mid + 1;}return 0;
}

✅二分查找过程可用二叉树来描述,在构造二叉树的过程中,把当前查找区间的中点位置上的元素作为树根,左子表和右子表的元素分别作为根的左子树和右子树。由此递归得到二叉树,通常称描述查找的过程的二叉树为判定树。判定树的形态与表中个数n相关,与输入示例中的key值无关。

例如,要找到15个数据元素的有序表中的第8个元素仅需比较1次,找到第4和第12个元素需要比较2次,找到第2,6,1014个元素需要比较3次;找到第1,3,5,7,9,11,1315个元素需要比较4次。其查找过程如图所示,树中的每个圆圈结点表示表中一个元素,结点中的值表示该元素在表中的位置;圆圈结点表示查找成功,方框结点表示查找失败。若查找失败,则比较过程是一条从判定树的根到某结点的路径,所需关键字比较次数是该路径上圆圈结点的个数。
在这里插入图片描述

🔎二分查找分析:

  1. 判定树为满二叉树:(有序表元素个数为:n=2h-1
    (1).查找成功时平均查找长度:
    在这里插入图片描述
    (2).查找不成功时平均查找长度:h

  2. 判定树为非满二叉树:

(1).查找成功时平均查找长度:
在这里插入图片描述
(2).查找不成功时平均查找长度:
在这里插入图片描述

🔎二分查找例题

例:给定18个元素的有序表 {2,5,8,10,15,40,42,55,66,70,72,75,80,88,90,100,108,200},采用二分查找,试问:
(1).查找长度为4和5的元素个数分别有多少个?
(2).若要查找值为15的数据元素,要经过多少次比较?依次与哪些元素进行比较?
(3).在查找概率相等的情况下,计算查找成功和查找不成功的平均查找长度。
在这里插入图片描述
:第一问可以直接数第四行和第五行元素的个数:分别是8和3.
第二问数这条路径圆圈结点的个数为比较次数,圆圈内的值为比较的数:
在这里插入图片描述
因此,我们需要进行4次比较,依次与表中的元素66,10,40,15比较。
第三问,在查找概率相等的情况下,查找成功的平均查找长度为:
(11+22+43+84+35)/18=32/9
查找不成功的平均查找长度为:(4
13+5*6)/19=82/19

🔭2.4分块查找

🔎 分块查找又称索引顺序查找,它是顺序表查找的一种改进方法,其性能介于顺序查找和二分查找之间。在索引查找方法中,除存储表本身以外,还需存储一个索引表。存储方法如下:

  1. 将线性表elem[1..n]均分为b块,前b-1块中元素个数为s=[n/b],最后一块即b块的元素个数小于等于s.
  2. 每一块中的关键字不一定有序,但前一块中的最大关键字小于后一块中的最小关键字,即块内无序,块间有序
  3. 抽取各块的最大关键字及起始位置构成一个索引表index[0..b-1],即index[i](0<=i<=b-1)中存放第i块的最大关键字和该块在表中的初始位置。

📖索引表的数据类型定义:

typedef struct
{KeyType key;int link;
}IndexType;

📖分块查找的算法:

int StaticSearchtable::IndexSearch(IndexType index[Max], KeyType key, int b)
{//b为块数int low = 0, high = b - 1, mid, i, s;if (length % b == 0)s = length / b;elses = length / b + 1;while (low <= high){mid = (low + high) / 2;if (index[mid].key >= key)high = mid - 1;elselow = mid + 1;}//在索引表high+1快对应的线性表中顺序查找keyi = index[high + 1].link;while (i <= index[high + 1].link + s - 1 && elem[i].key != key){i++;}if (i <= index[high + 1].link + s - 1)return i;//查找成功,返回该元素的下标elsereturn 0;//查找失败,返回0
}

🔭2.5三种算法的比较分析

  1. 顺序查找的时间复杂度最差,二分查找的时间复杂度最好,分块查找的时间复杂度介于两种之间。
  2. 分块查找需要增加索引数据的空间,空间复杂度最大。
  3. 顺序查找对表没有特殊要求。
  4. 分块查找的数据块之间在物理上可以不连续,插入、删除数据只涉及对应的块,但增加了索引的维护。
  5. 二分查找要求表有序,若表的元素插入与删除很频繁,则维持有序的工作量极大。
  6. 在表不大的时候,一般使用顺序查找。

🌞运行示例:

#define _CRT_SECURE_NO_WARNINGS 1
#define Max 100
#include <iostream>
using namespace std;
typedef int KeyType;
typedef int InfoType;
typedef struct
{KeyType key;//KeyType为关键字数据类型InfoType otherinfo;//其他域
}SElemType;
typedef struct
{KeyType key;int link;
}IndexType;
class StaticSearchtable
{
private:SElemType* elem;int length;
public:StaticSearchtable()//构造函数,0位留空{elem = new SElemType[Max + 1];length = 0;}~StaticSearchtable()//析构函数,释放存储空间{delete[]elem;length = 0;}void Create(int n)//创建n个元素的顺序表{for (int i = 0; i <= n; i++){cout << "输入第" << i+1 << "个元素的值和下标:";cin >> elem[i].key >> elem[i].otherinfo;}length = n;}int SqSearch(KeyType key);//顺表表查找值等于key的关键字int BinSearch(KeyType key);//二分查找值等于key的关键字int IndexSearch(IndexType index[Max], KeyType key, int b);//分块查找值等于key的关键字,b为块数
};
int StaticSearchtable::SqSearch(KeyType key)
{elem[0].key = key;//哨兵位int i = 0;for (i = length; elem[i].key != key; i--)//从末端开始向左扫描{;//空语句}if (i >= 0)cout << "该数所在顺序表中的下标为:" << i << endl;elsecout << "未找到!" << endl;return 0;
}
int StaticSearchtable::BinSearch(KeyType key)
{int low = 1, high = length;int mid;while (low <= high){mid = (low + high) / 2;if (key == elem[mid].key){cout << "该数经二分查找下标为:" << mid << endl;break;}else if (key < elem[mid].key)high = mid - 1;elselow = mid + 1;}if(low>high)cout << "未找到!" << endl;return 0;
}
int StaticSearchtable::IndexSearch(IndexType index[Max], KeyType key, int b)
{//b为块数int low = 0, high = b - 1, mid, i, s;if (length % b == 0)s = length / b;elses = length / b + 1;while (low <= high){mid = (low + high) / 2;if (index[mid].key >= key)high = mid - 1;elselow = mid + 1;}//在索引表high+1快对应的线性表中顺序查找keyi = index[high + 1].link;while (i <= index[high + 1].link + s - 1 && elem[i].key != key){i++;}if (i <= index[high + 1].link + s - 1)return i;//查找成功,返回该元素的下标elsereturn 0;//查找失败,返回0
}
int main()
{StaticSearchtable a;a.Create(8);a.SqSearch(6);a.BinSearch(7);return 0;
}

在这里插入图片描述

好啦,关于静态查找表的知识到这里就先结束啦,后期会继续更新学习数据结构与算法的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️

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

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

相关文章

oracle sql相关语法

SQL*PLUS 在SQL*PLUS执行&#xff0c;会在执行后显示查询的执行计划和统计信息 SET AUTOTRACE ON;SELECT * FROM your_table WHERE column_name value;SET AUTOTRACE OFF;PLSQL PLSQL查询sql界面&#xff0c;鼠标右键&#xff0c;点击执行计划&#xff0c;会出现sql的执行计…

鸿蒙原生应用/元服务开发-AGC分发如何生成密钥和和证书请求文件

HarmonyOS通过数字证书&#xff08;.cer文件&#xff09;和Profile文件&#xff08;.p7b文件&#xff09;等签名信息来保证应用的完整性&#xff0c;应用如需上架到华为应用市场必须通过签名校验。因此&#xff0c;开发者需要使用发布证书和Profile文件对应用进行签名后才能发布…

04_Flutter自定义Slider滑块

04_Flutter自定义Slider滑块 一.Slider控件基本用法 Column(mainAxisAlignment: MainAxisAlignment.start,children: <Widget>[Text("sliderValue: ${_sliderValue.toInt()}"),Slider(value: _sliderValue,min: 0,max: 100,divisions: 10,thumbColor: Colors.…

Java研学-配置文件

一 配置文件 1 作用–解决硬编码的问题 在实际开发中,有时将变量的值直接定义在.java源文件中;如果维护人员想要修改数据,无法完成(因为没有修改权限),这种操作称之为硬编码 2 执行原理: 将经常需要改变的数据定义在指定类型的文件中,通过java代码对指定的类型的文件进行操作…

软件测试框架实战:Python+Slenium搭建Web自动化测试框架全教程

PythonSelenium是一种流行的Web自动化测试框架&#xff0c;可以模拟真实的用户操作&#xff0c;对网页进行功能和样式的验证。要通过selenium测试网页&#xff0c;需要以下几个步骤&#xff1a; 安装selenium库和浏览器驱动 。使用selenium提供的方法来控制浏览器窗口大小、后…

【NeurIPS 2023】PromptIR: Prompting for All-in-One Blind Image Restoration

PromptIR: Prompting for All-in-One Blind Image Restoration&#xff0c; NeurIPS 2023 论文&#xff1a;https://arxiv.org/abs/2306.13090 代码&#xff1a;https://github.com/va1shn9v/promptir 解读&#xff1a;即插即用系列 | PromptIR&#xff1a;MBZUAI提出一种基…

非得让你会之MyBatis插件与Java动态代理

引言 咱们今天聊聊Java动态代理&#xff0c;这东西在开发中真的太常见了。比如Spring AOP、RPC&#xff0c;它们都离不开动态代理。然后&#xff0c;咱们再来说说MyBatis插件&#xff0c;这可是MyBatis框架中的一个超实用的功能&#xff0c;它就像是给MyBatis加了个“超能力”…

基于WebSocket实现客户聊天室

目录 一、实现聊天室原理 二、聊天室前端代码 三、聊天室后端代码&#xff08;重点&#xff09; 四、聊天室实现效果展示 一、实现聊天室原理 1.1 介绍websocket协议 websocket是一种通信协议&#xff0c;再通过websocket实现弹幕聊天室时候&#xff0c;实现原理是客户端首…

Unity Image - 镜像

1、为什么要使用镜像 在游戏开发过程中&#xff0c;我们经常会为了节省 美术图片资源大小&#xff0c;美术会将两边相同的图片进行切一半来处理。如下所示一个按钮 需要 400 * 236&#xff0c;然而美术只需要切一张 74*236的大小就可以了。这样一来图集就可以容纳更多的图片。…

HarmonyOs 4 (一) 认识HarmonyOs

目录 一 HarmonyOs 背景1.1 发展时间线1.2 背景分析1.2.1 新场景1.2.2 新挑战1.2.3 鸿蒙生态迎接挑战 二 HarmonyOS简介2.1 OpenHarmony2.2 HarmonyOS Connect2.3 HarmonyOS Next**2.4 ArkTS &#xff08;重点掌握&#xff09;****2.5 ArkUI** 三 鸿蒙生态应用核心技术理念**3.…

SmartSoftHelp8,数据库字段详细文档自动生成工具

数据库开发文档自动生成 包括数据库设计详细信息&#xff1a; 数据库字段名称&#xff0c;数据类型&#xff0c;大小&#xff0c;是否主键&#xff0c;说明等 一键自动生成开发需求文档 导出html 格式方便查询 下载地址 https://pan.baidu.com/s/1zBgeYsqWnSlNgiKPR2lUYg…

Spring---更简单的存储和读取对象

文章目录 存储Bean对象配置扫描路径添加注解存储Bean对象使用类注解为什么需要五个类注解呢&#xff1f;Bean命名规则 使用方法注解重命名Bean 读取Bean对象属性注入Setter注入构造方法注入注入多个相同类型的BeanAutowired vs Resource 存储Bean对象 配置扫描路径 注&#xf…

maven下载和安装

maven下载和安装 一、概述 Maven是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (Project Object Model)&#xff0c;一组标准集合&#xff0c;一个项目生命周期(Project Lifecycle)&#xff0c;一个依赖管理系统(Dependency Management System)&#xff0c;和用来…

conda环境下 ERROR: CMake must be installed to build dlib问题解决

1 问题描述 在构建video_retalking项目过程中&#xff0c;使用命令安装依赖包时&#xff0c;运行依赖安装命令&#xff1a; pip install -r requirements.txt 出现如下错误&#xff1a; Building wheels for collected packages: face-alignment, dlib, ffmpy, futureBuil…

【HuggingFace Transformer库学习笔记】基础组件学习:Tokenizer

基础组件——Tokenizer &#xff08;1&#xff09;模型加载 from transformers import AutoTokenizersen "弱小的我也有大梦想!" # 从HuggingFace加载&#xff0c;输入模型名称&#xff0c;即可加载对于的分词器 tokenizer AutoTokenizer.from_pretrained("m…

〖大前端 - 基础入门三大核心之JS篇㊸〗- DOM事件对象及它的属性

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

【稳定检索|投稿优惠】2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024)

2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024) 2024 International Conference on Biological Neuroengineering and Health Big Data(ICBNHBD) 一、【会议简介】 2024年生物神经工程与健康大数据国际会议(ICBNHBD 2024)&#xff0c;这场科学盛宴&#xff0c;会议在中…

rtsp点播异常出现‘circluar_buffer_size‘ option was set but it is xx

先说现象: 我使用potplay播放器来点播rtsp码流的时候可以点播成功&#xff0c;同事使用vlc和FFplay来点播rtsp码流的时候异常。 排查思路: 1.开始怀疑是oss账号问题&#xff0c;因为ts切片数据是保存在oss中的&#xff0c;我使用的是自己的oss账号&#xff0c;同事使用的是公司…

Azure Machine Learning - 使用 REST API 创建 Azure AI 搜索索引

本文介绍如何使用 Azure AI 搜索 REST AP和用于发送和接收请求的 REST 客户端以交互方式构建请求。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&…

Python 安装mysqlclient 错误 无法打开包括文件: “mysql.h”: 解决方法

解决方案&#xff1a;python最新3.12.0不支持mysqlclient 请下载 python3.9.9 版本 高速下载地址CNPM Binaries Mirror 官方下载地址Welcome to Python.org 下载完成后将python添加到环境变量 pycharm 虚拟环境下的python版本切换到你刚才下载的3.9.9的python版本 Avai…