数据结构的运算之查找(一)

在前面我们花了很长时间学习了几种基本的数据结构后,今天我们继续来看看下一个重要的内容——数据结构的运算。数据结构的运算包括几种,如查找,删除,排序和插入等等。接下来的即将期文章,我们将一种一种运算分享给大家。下面看第一种——查找。

查找是指根据给定的某个值,确定关键字值,查询确定关键字值与给定值相等的记录在文件中的位置。它是程序设计中一项重要的基本技术。查找的结果有两种情况:若在文件中找到了待查找的记录,则称查找成功,这时可以得到该记录在文件中的位置,或者得到该记录中其他的信息;若在文件中没有找到所需要的记录,则称查找不成功或查找失败。查找可分为静态查找和动态查找两种,在查找过程中不修改查找表的长度和表中内容的方法称作静态查找,仅仅只是进行查找操作而已,反之称作动态查找,将进行插入和删除操作。

查找算法的评价指标:平均查找长度(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;
}

 三种查找方法的比较:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值