第7章
查找技术
【学习重点】
①折半查找的过程及性能分析;
②二叉排序树的插入、删除和查找操作;
③平衡二叉树的调整方法;
④散列表的构造和查找方法;
⑤各种查找技术的时间性能及对比。
【学习难点】
①二叉排序树的删除操作;
②平衡二叉树的调整方法;
③闭散列表的删除算法。
7.1 概述
7.11 查找的基本概念
在查找问题中,通常将数据元素称为记录。
关键码
可以标识一个记录的某个数据项称为关键码,关键码的值称为键值,若关键码可以唯一地标识一个记录,则称此关键码为主关键码;反之,则称为次关键码。
查找
查找是在具有相同类型的记录构成的集合中找到满足给定条件的记录。
查找的结果
若在查找的集合中找到了与给定值相匹配的记录,则称查找成功;否则,称查找不成功。
静态查找、动态查找
不涉及插入和删除操作的查找称为静态查找;涉及插入和删除操作的查找称为动态查找。
查找结构
面向查找操作的数据结构称为查找结构。
本章讨论的查找结构有:
⑴线性表
⑵树表
⑶散列表
7.2线性表的查找技术
7.2.1 顺序查找
基本思想:从线性表的一端向另一端逐个将关键码与给定值进行比较。
1.顺序表的顺序查找
顺序表的顺序查找算法SeqSearch 1
2.单链表的顺序查找
7.3 树表的查找技术
7.3.1 二叉排序树
性质:
若它的左子树不空,则左子树上所有结点的值均小于根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于根结点的值;
它的左右子树也都是二叉排序树。
二叉排序树的插入
算法 InsertBST
void BiSortTree::InsertBST(BiNOde<int>*s)
{else if(s->data<root->data) InsertBST(root->lchild,s);}
二叉排序树的构造
算法 BiSortTree
BiSortTree:: BiSortTree(int r[],int n)
{
for(i=0;i<n;i++)
{
s=new BiNode;s->data=r[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
}
}
二叉排序树的删除
算法 DeleteBST
void BiSortTree::DeleteBST(BiNode<int>*p,BiNode<int>*f)
{
if((p->lchild==NULL)&&(p->rchild==NULL)){
f->lchild=NULL;
delete p;
}
else if (p->rchild==NULL){
f->lchild=p->lchild;
delete p;
}
else{
par=p;s=p->rchild
}
p->data=s->data;
if(par==p) par->rchild;
delete s;
}
二叉排序树的查找及性能分析
算法SearchBST
BiNode<int>* BiSortTree::SearchBST(BiNode<int>*root,int k)
{
if(root==NULL)return NULL;
else if (root->data==k)return root;
else if(root->data<k)return SearchBST(root->lchild,k);
else return SearchBST(root->rchild,k);
}
7.3.2 平衡二叉树
平衡二叉树性质:
根结点的左子树和右子树的深度最多相差1.
根结点的左子树和右子树也都是平衡二叉树。
平衡因子
结点的平衡因子是该结点的左子树的深度与右子树的深度之差。
最小不平衡子树
最小不平衡子树是指在平衡二叉树的构造过程中,以距离插入结点最近的、且平衡因子的绝对值大于1的结点为根的子树。
7.4 散列表的查找技术
7.4.1 概述
采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间成为散列表,将关键码映射为散列表中适当存储位置的函数称为散列函数。
散列函数的设计
直接定址法
除留余数法
数字分析法
平方取中法
折叠法
7.4.3处理冲突的方法
(1)开放定址法
(2)拉链法