大话数据结构之查找
Posted -恰饭第一名-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大话数据结构之查找相关的知识,希望对你有一定的参考价值。
一、查找概论
查找表
由同一类型的数据元素(或记录)构成的集合
关键字
数据元素中某个数据项等等值,用它可以标识一个数据元素,也可以标识一个记录的某个数据项(字段)
主关键字
可以唯一地标识一个记录的关键字
次关键字
可以识别多个数据元素(或记录)的关键字
查找
就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)
查找表按照操作方式来分为两大种:静态查找表和动态查找表
静态查找表:只作查找操作的查找表。
它的主要操作有:
- 查询某个“特定的”数据元素是否在查找表种
- 检索某个“特定的”数据元素和各种属性
动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素
- 查找时插入数据元素
- 查找时删除数据元素
二、顺序表查找
顺序查找又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功
2.1、顺序表查找算法
/* 无哨兵顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键字 */
int Sequential_Search(int *a,int n,int key)
{
int i;
for(i=1;i<=n;i++)
{
if (a[i]==key)
return i;
}
return 0;
}
2.2、顺序表查找优化
设置一个哨兵,可以解决不需要每次让i与n作比较
/* 有哨兵顺序查找 */
int Sequential_Search2(int *a,int n,int key)
{
int i;
a[0]=key;
i=n;
while(a[i]!=key)
{
i--;
}
return i;
}
此时代码是从尾部开始查找,由于a[0]=key,也就是说,如果在a[i]中有key则返回i值,查找成功。否则一定在最终的a[0]处等于key,此时返回的是0,即说明a[1]~a[n]中没有关键字key,查找失败
三、有序表查找
3.1、折半查找
二分查找
前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储
/* 折半查找 */
int Binary_Search(int *a,int n,int key)
{
int low,high,mid;
low=1; /* 定义最低下标为记录首位 */
high=n; /* 定义最高下标为记录末位 */
while(low<=high)
{
mid=(low+high)/2; /* 折半 */
if (key<a[mid]) /* 若查找值比中值小 */
high=mid-1; /* 最高下标调整到中位下标小一位 */
else if (key>a[mid])/* 若查找值比中值大 */
low=mid+1; /* 最低下标调整到中位下标大一位 */
else
{
return mid; /* 若相等则说明mid即为查找到的位置 */
}
}
return 0;
}
二分查找的判定树
二分查找过程可用二叉树来描述,我们把当前查找区间的中间位置上的记录作为根,左子表和右子表中的记录分别作为根的左子树和右子树,由此得到的二叉树,称为描述二分查找的判定树或比较树。
3.2、插值查找
3.3、斐波那契查找
四、线性索引查找
索引就是把一个关键字与它对应的记录相关联的过程,一个索引由若干个索引项构成,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息
4.1、稠密索引
4.2、分块索引
分块有序,是把数据集的记录分成了若干块,并且这些块需要满足两个条件:
- 块内无序,即每一个块内的记录不要求有序
- 块间有序,例如:要求第二块所有记录的关键字均要大于第一块中所有记录的关键字
我们定义的分块索引的索引项结构分三个数据项:
- 最大关键码,它存储每一块中的最大关键字,这样的好处就是可以使得在它之后的下一块中的最小关键字也能比这一块最大的关键字要大
- 存储了块中的记录个数,以便于循环时使用
- 用于指向块首数据元素的指针,便于开始对这一块中记录进行遍历
接下来分析一下分块索引的平均查找长度
设n个记录的数据集被平均分成m块,每个块中有t条记录,显然n=m*t,或者说m=n/t
再假设Lb为查找索引表的平均查找长度,因最好与最差的等概率原则,所以Lb的平均长度为m+1/2.
Lw为块中查找记录的平均长度,为t+1/2
以上是关于大话数据结构之查找的主要内容,如果未能解决你的问题,请参考以下文章