一:查找(搜索
、
Search)
所谓
查找
,就是在数据集合中寻找满足某种条件的数据对象。
通常称用于搜索的数据集合为
搜索结
构(查找表),
它是由
同一数据类型的对
象(或记录)
组成。
关键字
•
是数据元素(或记录)中某个
数据项
的值,用以
标识
(识别)一个数据元素(或记录)。
若此关键字可以识别
唯一的
一个记录,则称之谓
“
主关键字
”
。
若此关键字能识别
若干
记录,则称
之谓
“
次关键字
”
。
•
查找的结果通常有两种可能:
–
查找成功
,即找到满足条件的数据对象。这时,作为结果,可报告该对象在结构中的位置,还可进一步给出该对象中的具体信息。
–
查找不成功
,或搜索失败。作为结果,也应 报告一些信息,如失败标志、失败位置等。
查找表的逻辑结构
查找表是由同一类型的数据元素
(
或记
录
)
构成的
集合
。
由于
“
集合
”
中的数据元素之间存在着松
散的关系,因此查找表是一种应用灵便
的结构。
二:
查找表可分为两类:
静态查找表 :
仅作
查询
和
检索
操作的查找表。
动态查找表
有时在查询之后,还需要将“查询”结果为“
不在查找表中
”的数据元素
插入到
查找表中;或者,从查找表中
删除
其“查询”结果为“
在查找表中
”的数据元素。
三:
静
态
查
找
表
一、
顺序查找
以顺序表或线性链表表示静态查
找表
顺序查找
(Sequential Search)
•
所谓顺序查找,又称线性查找,主要用于在
线性结构
中进行查找。
•
设若表中有
n
个对象,则顺序查找从表的先(后)端开始,顺序用各对象的关键字与给定值x进行比较,直到找到与其值相等的对象,则查找成功,给出该对象在表中的位置。
•
若整个表都已检测完仍未找到关键字与x相等的对象,则查找失败。给出失败信息。
平均比较次数(1+2+3+……+n-1 +n)/n = (n+1)/2
查找算法的
平均查找长度
(
A
verage
S
earch
L
ength)
约为表长的一半。
二、有序查找
上述顺序查找表的查找算法简单,
但平均查找长度较大,即查找效率太低,特别不适用于表长较大的查找表。
若以
有序表
表示静态查找表,则查找过
程可以基于
“
折半
”
进行。
基于有序顺序表的折半搜索
•
设n个对象存放在一个有序顺序表中,并按其
关键字
从小到大排好了序。
•
采用折半查找时,先求位于查找区间正中的对象的下标mid,用其关键码与给定值x比较:
–
Elem
[
mid
].
Key
=
x
,查找成功;
–
Elem
[
mid
].
Key
>
x
,把查找区间缩小到表的
前半部分
,再继续进行折半查找;
–
Elem
[
mid
].
Key
<
x
,把查找区间缩小到表的
后半部分
,再继续进行折半查找。
•
每比较一次,查找区间缩小一半。如果查找区间已缩小到一个对象,仍未找到想要查找的对象,则查找失败。
key=64
的查找过程如下
low
指示查找区间的下界
high
指示查找区间的上界
mid
= (low+high)/2
折半查找过程可用二叉判定树来描述
•
一般情况下,表长为
n
的折半查找的判定
树的深度和含有
n
个结点的完全二叉树的
深度相同。
•
在有序表中查找记录的过程就是走了一条从根结点到与该记录相应的结点的路径,和给定值进行的比较次数就是该结点在判定树上的层次数。
•
折半查找在查找成功时关键字比较次数不
超过树的深度
,
即
: log
2
n + 1
。
折半查找的效率比顺序查找高,但折半查找只适用于有序表,且限于顺序存储结构。
综合上一节讨论的几种查找表的特性:
可得如下结论:
1)从
查找
性能看,最好情况能达
O
(logn)
,此时要求表
有序
;
2)从
插入
和
删除
的性能看,最好
情况能达
O
(1)
,此时要求存储
结构是
链表
。