当前位置: 首页 > news >正文

07_查找

查找概念

  • 查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合。

  • 关键字(Key)是数据元素中某个数据项的值,又称为键值。可以标识一个数据元素,也可以标识一个记录中的某个数据项。

    若关键字可以唯一标识一个记录,则称为此关键字为主关键字(Primary Key)

    可以识别多个数据元素(或者记录)的关键字,我们称为次关键字(Secondary Key)

**查找(Searching)**就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或者记录)

静态查找表(Static Search Table):只作 查找操作 的 查找表(可以考虑线性表结构来组织数据)

  1. 查询某个“特定的“数据元素是否在查找表中
  2. 检索某个”特定的“数据元素喝各种属性

动态查找表(Dynamic Search Table):在查找过程中同时插入表中不存在的数据元素,或者从查找表中删除已经存在的某个元素(可以考虑二叉排序树的查找技术)

  1. 查找时插入数据元素
  2. 查找时删除数据元素

顺序表查找

**顺序查找(Sequential Search)**又叫线性查找,是最基本的查找技术 , 它的查找过程是:从表中第一个(或最后一个)记录开始,逐步进行记录的关键字喝给定值比较,若某个记录的关键字喝给定值相等,则查找成功;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,查找不成功。

查找算法

/* 定义 a 的元素值下标从1开始 */
int SequentialSearch(int *a,int n,int key)
{int i;a[0]=key;i=n;while(a[i] !=key){i--;}return i; /*返回0则说明查找失败了*/
}

有序表查找

折半查找

折半查找(Binary Search)技术,又称为二分查找。它的前提是线性表中的记录必须是关键码有序(通常从小到大有序) ,线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所以查找区域无记录,查找失败为止。

// 假设我们现在有这样一个有序裴数组{0,l,16,24,35,47,59,62,73,88,99}
// 除 0 下 标外共 10 个数字 对其进行查找是否存在 62 这个数
/* 折半查找 */
int BinarySearch(int *a,int n ,int key)
{int low,high,mid;low=1;					/* 定义最低下标为记录首位 */high=n;					/* 定义最高下标为记录末位 */while(low<high){mid=(low+high) /2;	/* 折半 */if(key < a[mid])    /* 若查找值比中值小 */hight=mid-1;    /* 最高下标调整到中位下标小一位 */else if (key > a[mid]) /* 若查找值比中值大 */low=mid+1;		/* 最低下标调整到中位下标小一位 */else 	return mid;		/* 若相等,则说明mid即为查找到的位置 */}return 0;
}

插值查找

折半查找代码的第11行,略微等式变换:
m i d = l o w + h i g h t 2 = l o w + 1 2 ( h i g h − l o w ) mid=\frac{low+hight}{2} = low+\frac{1}{2}(high-low) mid=2low+hight=low+21(highlow)
也就是 mid 等于最低下标low加上最高下标 high 与 low的差的一半。
m i d = l o w + k e y − a [ l o w ] a [ h i g h ] − a [ l o w ] ( h i g h − l o w ) mid = low+\frac{key-a[low]}{a[high]-a[low]}(high - low) mid=low+a[high]a[low]keya[low](highlow)
只需要在折半查找算法的代码中更改一下第 11行代码如下 :

mid = low + (high-low)*(key -a[low])/(a[high]-a[low]); /* 插值 */

插值查找(Interpolation Search)是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心在于插值的计算公式 k e y − a [ l o w ] a [ h i g h ] − a [ l o w ] \frac{key-a[low]}{a[high]-a[low]} a[high]a[low]keya[low]

相关文章:

  • Crosslink-NX器件应用连载(9): USB3.0相机
  • 私有云和多云管理平台 | Cloudpods v3.11.4 正式发布
  • CSS学习笔记之高级教程(五)
  • 目标检测-AnyLabeling标注格式转换成YOLO格式
  • BottomSheetDialog高度自适应,布局RecyclerView使用问题
  • Mac下删除系统自带输入法ABC,正解!
  • Mysql中表的常用约束
  • 从零开始:如何用Electron将chatgpt-plus.top 打包成EXE文件
  • RabbitMQ启动报错:Error during startup: {error, {schema_integrity_check_failed,
  • 我是大学生,应该选系统运维方向,还是web开发方向?
  • 31|HTTP3:甩掉TCP、TLS 的包袱,构建高效网络
  • flask 之JWT认证实现
  • 系统安全及其应用
  • 一种用于异质结高电子迁移率晶体管(HEMTs)的紧凑型漏电流模型,其中包括双子带的二维电子气(2DEG)密度解
  • Zookeeper复习
  • 【css3】浏览器内核及其兼容性
  • extract-text-webpack-plugin用法
  • Flex布局到底解决了什么问题
  • HTTP请求重发
  • Java多态
  • Kibana配置logstash,报表一体化
  • Koa2 之文件上传下载
  • LeetCode29.两数相除 JavaScript
  • Mysql数据库的条件查询语句
  • PAT A1092
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Spring Boot MyBatis配置多种数据库
  • vue数据传递--我有特殊的实现技巧
  • 从零开始学习部署
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 前端知识点整理(待续)
  • 区块链共识机制优缺点对比都是什么
  • 温故知新之javascript面向对象
  • 我从编程教室毕业
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 在Unity中实现一个简单的消息管理器
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 带你开发类似Pokemon Go的AR游戏
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​什么是bug?bug的源头在哪里?
  • #LLM入门|Prompt#3.3_存储_Memory
  • (C++17) optional的使用
  • (C语言)fgets与fputs函数详解
  • (C语言)逆序输出字符串
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (四) Graphivz 颜色选择
  • (万字长文)Spring的核心知识尽揽其中
  • (小白学Java)Java简介和基本配置
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)