查找的基本概念
列表:由同一类型的数据元素(或记录)构成的集合,可利用任意数据结构实现。
关键字:数据元素的某个数据项的值,用它可以标识列表中的一个或一组数据元素。
- 主关键字:惟一标识列表中的一个数据元素
- 次关键字:不是主关键字,就为次关键字
- 当数据元素仅有一个数据项时,数据元素的值就是关键字
查找:根据给定的关键字值,在特定的列表中确定一个其关键字与给定值相同的数据元素,并返回该数据元素在列表中的位置。
- 静态查找:在查找过程中只是对数据元素进行查找
- 动态查找:在实现查找的同时,插入找不到的元素,或从查找表中删除已查到的某个元素。
平均查找长度(ASL):为确定数据元素在列表中的位置,需和给定值进行比较的关键字个数的期望值,称为查找算法在查找成功时的平均查找长度。
查找的基本方法
1. 比较式查找法 —— (1)基于线性表的查找 (2)基于树的查找法
2. 计算式查找法 —— HASH(哈希)查找法
基于线性表的查找法 —— 顺序查找法;折半查找法
顺序查找法
若列表长度为 n,查找从最后一个元素开始找起,查找每个数据元素的概率相等,
则顺序查找算法的平均查找长度为:ASL=(n + 1)/ 2 (从首元素开始同样)
若查找第 i 个元素,需进行(n - i + 1)次比较。
折半查找法
前提条件:
- 必须采用顺序储存结构
- 必须按关键字大小有序排列
基于树的查找法 —— 二叉排序树;平衡二叉树
二叉排序树
-
若它的左子树非空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树非空,则右子树上所有结点的值均大于(或大于等于)它的根结点的值;
- 它的左、右子树也分别为二叉排序树
插入:
-
若二叉树是空树,则 S 成为二叉排序树的根;
-
若二叉树非空,则将 S.key 与二叉排序树根结点的关键字进行比较:
if(key的值等于根结点的值),则停止插入;
else if(key的值小于根结点的值), 则将S插入左子树;
else if(key的值大于根结点的值), 则将S插入右子树。
查找:
首先将待查关键字 key 与根结点关键字 t 进行比较,如果:
-
key=t: 则返回根结点地址;
-
key<t: 则进一步查左子树;
-
key>t: 则进一步查右子树。
平衡二叉排序树
-
左子树与右子树的深度之差的绝对值小于等于1;
-
左子树和右子树也是平衡二叉排序树;