目录
一、基本概念
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);}
}
}