第七章 查找技术
7.1 概述
1.记录:在查找问题中,通常将数据元素称为记录。
2.关键码:可以标识一个记录的某个数据项。
3.键值:关键码的值。
4.主关键码:可以唯一地标识一个记录的关键码。
5.次关键码:可以标识多个记录的关键码。
6.查找:广义上,是在具有相同类型的记录构成的集合中找出满足给定条件的记录。
7.静态查找:不涉及插入和删除操作的查找。
8.动态查找:涉及插入和删除操作的查找。
9.查找结构:是面向查找操作的数据结构。
7.2 线性表的查找技术
2.1.顺序查找
1.顺序表的顺序查找算法seqsearch1
int seqsearch1(int r[],int n,int k)
{
r[0]=k;i=n;
while(r[i]!=k)
i--;return i;
}
2..单链表的顺序查找算法seqsearch2
int seqsearch2(Node<int>*first,int k)
{
p=first->next;count=1;
while(p!=NULL&&p->data!k)
{
p=p->next;j++;
}
if(p->data==k)return j;
else return 0;
}
2.2 折半查找
1.它要求线性表中的记录必须按关键码有序,并且必须采用顺序存储,一般用于静态查找。
2.折半查找非递归算法binsearch1
int binsearch1(int r[],int n,int k)
{
low=1,high=n;
while(low<=high)
{
mid=(low+high)/2;
if(k<r[mid])high=mid-1;
else if(k>r[mid])low=mid+1;
else return mid;
}
3.折半查找递归算法binsearch2
int binsearch2(int r[],int high,int low,int k)
{
if(low>high)return 0;
else
{
mid=(low+high)/2
if(k<r[mid])return binsearch2(r,low,mid-1,k);
else if(k>r[mid])return binsearch2(r,mid+1,high,k);
else return mid;
}
}
7.3 树表的查找技术
3.1 二叉排序树
1.二叉排序树又称二叉查找树,它或者是一棵空的二叉树,或者是具有下列性质的二叉树:
(1)若它的左子树不空,则左子树上所有结点的值均小于根结点的值;
(2)若它的右子树不空,则右子树上所有结点的值均大于根结点的值;
(3)它的左右子树也都是二叉排序树;
2.二叉排序树插入算法insertBST
void bisorttree::insertBFT(biNode<int>*root,biNode<int>*s)
{
if(root==NULL)root=s;
else if(s->data<root->data)insertBST(root->lchild,s);
else insertBST(root->rchild,s);
}
3.二叉排序树构造函数算法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);
}
4.二叉排序树的删除
设待删除结点为p,其双亲结点为f,且p是f的左孩子
(1)p结点为叶子结点,p没有左右子树:
只需将结点删除即可。
(2)p只有左子树Pl或只有右子树Pr:
只需将Pl或Pr替换为f的左子树。
(3)p有左右子树:
将结点p的右子树中值最小的结点的值代替结点p的值;
或将结点p的左子树中值最大的结点的值代替结点p的值;
3.2 平衡二叉树
1.平衡二叉树或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:
(1)根结点的左子树和右子树的深度最多相差1。
(2)根结点的左子树和右子树也都是平衡二叉树。
2.结点的平衡因子是该结点的左子树的深度与右子树的深度之差。
3.最小不平衡子树:在平衡二叉树的构造过程中,以距离插入结点最近的.且平衡因子的绝对值大于1的结点为根的子树。
7.4 散列表的查找技术
4.1 概述
1.采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表。
2.将关键码映射为散列表中适当存储位置的函数称为散列函数,所得的存储位置称为散列地址。
3.散列过程:
(1)存储记录时,通过散列函数计算记录的散列地址,并按此散列地址存储该记录;
(2)查找记录时,通过同样的散列函数计算记录的散列地址,按此散列地址访问该记录。
4.冲突:对于两个不同关键码k1≠k2,有H(k1)=H(k2),即两个不同的记录需要存放在同一个存储位置中的现象(此时k1和k2相对于H称做同义词)。
4.2 散列函数的设计
1.基本原则:
(1)计算简单。
(2)函数值即散列地址分布均匀。
2.直接定址法
(1)直接定址法的散列函数是关键码的线性函数;
(2)特点:单调.均匀,不会产生冲突。
4.3处理冲突的方法
1.开放定址法
(1)用开放定址法处理冲突得到的散列表叫做闭散列表。
(2)定义:由关键码得到的散列地址一旦产生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。