数据结构概述 第七章 查找技术

第七章      查找技术

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,且pf的左孩子

(1)p结点为叶子结点,p没有左右子树:

只需将结点删除即可。

(2)p只有左子树Pl或只有右子树Pr

只需将PlPr替换为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.冲突:对于两个不同关键码k1k2,有Hk1=Hk2),即两个不同的记录需要存放在同一个存储位置中的现象(此时k1k2相对于H称做同义词)。

4.2 散列函数的设计

1.基本原则:

(1)计算简单。

(2)函数值即散列地址分布均匀。

2.直接定址法

(1)直接定址法的散列函数是关键码的线性函数;

(2)特点:单调.均匀,不会产生冲突。

4.3处理冲突的方法

1.开放定址法

(1)用开放定址法处理冲突得到的散列表叫做闭散列表。

(2)定义:由关键码得到的散列地址一旦产生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值