在前面我们花了很长时间学习了几种基本的数据结构后,今天我们继续来看看下一个重要的内容——数据结构的运算。数据结构的运算包括几种,如查找,删除,排序和插入等等。接下来的即将期文章,我们将一种一种运算分享给大家。下面看第一种——查找。
查找是指根据给定的某个值,确定关键字值,查询确定关键字值与给定值相等的记录在文件中的位置。它是程序设计中一项重要的基本技术。查找的结果有两种情况:若在文件中找到了待查找的记录,则称查找成功,这时可以得到该记录在文件中的位置,或者得到该记录中其他的信息;若在文件中没有找到所需要的记录,则称查找不成功或查找失败。查找可分为静态查找和动态查找两种,在查找过程中不修改查找表的长度和表中内容的方法称作静态查找,仅仅只是进行查找操作而已,反之称作动态查找,将进行插入和删除操作。
查找算法的评价指标:平均查找长度(ASL)这个大家了解即可。

- n:记录的个数
- pi:查找第i个记录的概率 ( 通常认为pi =1/n )
- ci:找到第i个记录所需的比较次数
这里进入一个新概念——查找表。
查找表: 是由同一类型的数据元素(或记录)构成的集合。
查找表的操作:
(1)查询某个“特定的”数据元素是否在查找表中。
(2)检索某个“特定的”数据元素的各种属性。
(3)在查找表中插入一个数据元素;
(4)从查找表中刪去某个数据元素。
接下来就是重头戏啦,划重点划重点。线性表的查找主要分为三种——顺序查找(线性查找)、折半查找(二分或对分查找)和分块查找
一)顺序查找(线性查找)



注意这里由于是顺序表,进行循环,找到了就返回下标,若找不到是会返回0的,不用担心一直循环下去的问题。温馨提示:for循环语句后面的分号不能省略哦
此算法时间效率分析:

二)折半查找(二分或对分查找)

核心思路:
实现方式一:循环实现
实现方式二:递归实现

那两句补充为Search(SSTable ST,ketType key,int low,int mid-1);
Search(SSTable ST,ketType key,int mid+1,int high);
性能分析:


三)分块查找(索引顺序查找)
分块查找中,需要建立一个“索引表”来划分块区域,通过定位某一块区域来查找相应信息;
索引表包括两项内容:最大关键项、最大关键项块区域的指针项;
对索引表来说是有序的顺序表,可用顺序查找和折半查找两种方法查找索引表;
而对索引表所标识的块区域中的数据是无序的,所以只能使用顺序查找。

由此可见,分块查找法的效率在顺序查找和折半查找法之间。
实现代码:
typedef struct
{ int key; char info; }Key;
typedef struct
{ int maxkey(最大值); int address(区间); }Index;//索引
int Search_Blo(SqList L, IndexList I, KeyType key)
{
int low = 1;
int high = I->length;
int mid = (low+high)/2;
while(low < high) //先折半查找索引表,若找不到key匹配的值,就在low所指区块上找
{
if(key == I->D[mid].maxkey)
break;
else
{
if(key < I->D[mid].maxkey) //缩小查找范围到左子序列
high = mid;
else //缩小查找范围到右子序列
low = mid +1;
}
mid = (low+high)/2;
}
int end;
start = I->D[mid].address; //找key值所在的区间首地址,此时mid就在key值所在的区间内
if(mid == I->length)//如果中间值为队尾时
end = L->length + 1;//结果就是找不到
else
end = I->D[mid+1].address;//索引值为mid后移一位
for(int i = start; i < end; i++)//再顺序查找该区间
if(key == L->R[i].key)
return i; //返回位置
return 0;
}
三种查找方法的比较:

4442

被折叠的 条评论
为什么被折叠?



