一、基本概念
1、查找的定义
在数据集合中寻找满足所给条件的数据元素的过程
,称之为查找;查找的结果有且只有两种:成功和失败
,换句话就是:要么从集合中找到至少一个满足条件的元素,要么在集合一个也找不到满足条件的元素
。
2、查找表
- 也叫做
查找结构
。
- 待进行查找的数据集合称为查找表,其数据元素的类型往往是一样的,可以是数组或链表等。对链表进行的操作一般有:
① 确定某个值是否在查找表中
;
② 从查找表中筛选出满足特定条件的元素的各种属性
;
③ 从查找表中确定一个用于进行元素插入操作的位置
;
④ 从查找表中寻找满足删除条件的元素进行删除操作
。
3、静态查找表与动态查找表
- 当一个查找表的所有操作,只涉及到
元素确定
,也即是上面的 ①②,那么这种查找表就称为静态查找表。适合静态查找表的查找算法有:顺序查找、折半查找和散列查找
。
- 相反的,当一个查找表的全部操作涉及
元素修改
,即上面的 ③④,那么这种查找表就称之为动态查找表;适合动态查找表的查找算法有:二叉排序树查找、散列查找等
。
4、关键字与平均查找长度
- 关键字,是指
数据元素中能够唯一标识该数据元素的数据项的值
,例如学生信息表中的学号就是一个具体的学生信息的关键字;基于关键字的查找,其查找成功的结果往往是唯一确定的。
- 在查找过程中,
一次查找的长度指需要比较的关键字的次数
,平均查找长度则是指整个查找过程中进行关键字比较的次数的平均值
:
- Pi 是第 i 个数据元素的概率,一般认为查找表中的元素是等概率的,即表长的倒数;
- Ci 是第 i 个数据元素所需进行的比较次数。
平均查找长度,往往用于衡量一个算法是否高效。
二、针对线性结构的查找算法
- 针对线性结构的查找算法,也是诸多查找算法中较为容易实现的算法,有
顺序查找、折半查找和分块查找
。
1、顺序查找
- 也称为
线性查找
,分为对一般无序线性表的顺序查找和针对关键字有序的顺序表进行查找。
1.1、一般线性表的顺序查找
- 这是最为简单的查找,其思想就是从表的一端按下标依次比较直到表尾,若找到则返回元素下标,否则返回查找失败,代码如下:
int SimpleSeqSearch(int arr[], int len, int keyValue)
{
for(int i=0