第七章知识总结
第七章 查找
查找的概念
- 查找表:同一类型的数据元素构成的集合。包含线性表、树表和散列表。
- 关键字:标识一个数据元素
主关键字:唯一地标识一个记录
Key1 |
Otherinfor1 |
次关键字:标识若干记录
Key1 |
Otherinfor1 |
Otherinfor2 |
|
Otherinfor3 |
注:当数据元素只有一个数据项时,关键字=该数据元素
- 查找
- 动态查找表(结构本身是在查找过程中动态生成的)和静态查找表
- 平均查找长度:在找到目标关键字时,需要和定值进行比较地关键字个数的期望值
线性表查询
顺序查找
从表的一端开始,依次比较记录的的关键字和给定值,若想等则查找成功,反之查找失败。书上讲述了基于顺序表实现的顺序查找算法,并通过设置监视哨来进行改良。
数据元素类型定义:
关键字域key |
其他域otherinfo |
折半查找
从中间记录开始,如果给定值和中间记录相等,则查找成功;如果给定值大于或等于中间记录的关键字,则在表中大于或者小于中间记录的那一半中查找,重复操作直到查找成功,若某一步查找区间为空,则查找失败。
数据元素类型定义:
关键字域key |
其他域otherinfo |
分块查找
介于顺序查找和折半查找之间,需要建立一个“索引表”,其中包括关键字项和指针项。
树表查找
线性表的查找更适用于静态查找表,若要对动态查找表进行高效率的查找,可采用树表。
二叉排序树
1. 定义:左子树上所有结点值均小于根结点的值,右子树的所有结点均大于根结点。
数据结构类型:(书上给定了基于二叉排序树的二叉链表):
关键字域key |
其他域otherinfo |
左孩子指针lchild |
|
右孩子指针rchild |
2.查找:二叉排序树的查找和折半查找类似,稍微不同的地方就是当关键字key与给定值比较大了或者小了,就用递归的方法查找key对应结点的右子树或者左子树。
3.二叉排序树的构建
初始化空树
读入key结点
插入读入关键字key对应的结点
void CreateBST(BSTree &T) {//依次读入一个关键字为key的结点,将此节点插入二叉排序树中 T=NULL; cin>>e; while(e.key!=ENDFLAG) { InsertBST(T,e); //将此结点插入二叉排序树中 cin>>e; } }
InsertBST(BSTree &T,ElemType e) {//当二叉排序树T中不存在关键字等于e.key的数据元素是,则插入该元素 if(!T) { s=new BSTNode; s->data=e; s->lchild=s->rchild=NULL; T=S; } else if(e.key<T->data.key) InsertBST(T->lchild,e); else if(e.key>T->data.key) InsertBST(T->rchild,e); }
4.二叉排序树的删除:
(1)p左右子树都为空,直接修改双亲结点指针
(2)p只有左子树或者只有右子树,让左子树或者右子树直接成为双亲结点的左子树
(1)p左右子树都不为空,第一种令p的左子树成为双亲结点的左子树,令p的右子树成为左子树最大元素的右子树;第二种直接取出左子树最大元素s代替p结点的位置,令p的左子树成为s的左子树,p的右子树为s的右子树。
平衡二叉树
左右子树深度之差就对峙不超过1,左右子树也是二叉平衡树,四种调整规律:LL型、RR型、LR型、RL型。
B-树和B+树
B-树是一种平衡的多叉查找树,B+树是B-树的一种变形树,适合做文件系统的索引。
散列表查找
基于线性表和树表结构的查找方法都是以关键字的比较为基础的,而散列表查找则是通过对元素关键字值进行某种运算,直接求出元素的地址,不需要进行反复比较。
散列表函数的构造有:数字分析法、平方取中法、折叠法和除留余数法。而针对当不同关键字可能得到同一散列地址的问题,又提出了开放地址法和链地址法。
小结:查找这一章节的知识点很多,而且综合性比较强,因此本篇小结主要是对知识点进行梳理。
下次目标:希望能够结合PTA代码编程题进一步解释书中的概念和算法。