【数据结构】查找

目录

一、基本概念

二、顺序查找

三、动态查找表


一、基本概念

1、查找表的基本操作

(1)查询:确定某个“特定的”数据元素是否在查找表中

(2)检索:查找并读取某个特定的数据元素的各种属性

(3)插入

(4)删除

2、关键字

数据元素中某个(可以标识一个记录的)数据项的值,称为关键字。

若关键字可以唯一地标识一个记录,则称此关键字为主关键字,反之称为次关键字(标识若干个记录)。

3、查找

在一个查找表中找关键字(关键字或者次关键字)等于给定值的某个记录;若找到这样的记录,则查找成功,一般返回该记录的信息或位置;若在表中找不到这样的记录,则查找失败(不成功),一般返回一个错误信息或者空位置。

4、关键字类型及记录类型说明

#define maxsize 100
typedef int keytype;
typedef struct{
KeyType key;
……
}Elemtype;

查找也是计算机中经常遇到的操作。特别是当问题所涉及的数据量相当大时,查找的效率就显得格外重要。查找运算的主要操作是关键字的比较,所以,通常把查找过程中需要执行的关键字的平均比较次数(也称为平均查找长度,Average Search Length--ASL)作为衡量一个查找算法效率优劣的标准。

5、查找效率和平均查找长度

(1)考察一般情况下,查找的比较次数,有最多比较次数和平均比较次数,前者叫做最大查找长度,后者叫做平均查找长度。

(2)查找成功时,进行的元素比较次数的期望值。

ASL(n)=

Pi查找表中的第i个记录的概率,等概率情况下Pi=1/n

Ci找到关键字与给定值相等的第i个记录时,与给定值比较的关键字个数

二、顺序查找

又称线性查找,是最基本的查找方法之一。

1、概念

(1)基本思想:从表的一端开始,向另一端逐个按给定值k与关键码进行比较,若找到,若找到,表明查找成功;若直到所有元素都比较完毕,仍未找到与k相同的关键码,则表明查找失败。

(2)适用的数据结构:顺序表、线性链表

(3)算法实现:静态查找表的顺序存储结构

2、有序表的查找

有序表即是表中数据元素按关键码升序或降序排列,二分查找又称为折半查找。

(1)适用的数据结构:顺序存储的有序表

(2)基本思想:在有序表中,取中间元素作为比较对象,
若给定值与中间元素的关键码相等,则查找成功;
若给定值小于中间元素的关键码,则在中间元素的左半区继续查找;
若给定值大于中间元素的关键码,则在中间元素的右半区继续查找。
不断重复上述查找过程,直到查找成功,或所查找的区域无数据元素,查找失败。

3、折半查找

int BinarySearch(SSTable ST,KeyType k){
int low=1,high=ST.length,mid;
while(low<=high){
mid=(low+high)/2;
if(k<ST.elem[mid].key)
high=mid-1;
else if(k>ST.elem[mid].key)
low=mid+1;
else
return mid;
}
return 0;
}

4、索引顺序表的查找

是一种性能介于顺序查找和二分查找之间的查找算法。

三、动态查找表

1、二叉排序树

(1)定义:二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:

每个结点都有一个作为搜索依据的关键码(key),所有结点的关键码互不相同。

左子树(如果存在)上所有结点的关键码都小于根结点的关键码。

右子树(如果存在)上所有结点的关键码都大于根结点的关键码。

左子树和右子树也是二叉排序树

(2)存储结构:二叉链表

2、二叉排序树上的查找算法

在二叉排序树上进行搜索,是一个从根结点开始,沿某一个分支逐层向下进行比较判等的过程。

假设想要在二叉排序树中搜索关键字为x的元素,搜索过程从根结点开始。
如果给定值等于根结点的关键码,则搜索成功。
如果给定值小于根结点的关键码,则继续递归搜索根结点的左子树;否则,递归搜索根结点的右子树。

typedef struct_Node{
ElemType data;
struct_Node *left,*right;
}BSTreeNode,*BSTree;
int searchBST(KeyType k,BSTree &T,BSTree &f,BSTree &p){
if(T=NULL){
p=f;return 0;
}
else if(k==T->data.key){
p=T;return 1;
}else if(k<T->data.key){
return searchBST(k,T->left,T,p);
}else{
return searchBST(k,T->right,T,p);}
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值