数据结构——查找1

一、基本定义

1.关键字:是数据元素中摸个数据项的值,又称键值,他可以标识一个数据元素

2.静态查找表:只作查找操作的查找表

3.动态查找表:在查找中插入或删除元素

二、顺序表查找(线性查找)

1.过程:从表的第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值相等,则查找成功。

2.算法:a为数组,n为要查找的数组个数,key为关键字

int Sequential_Search(int *a,int n, int ket)

{

    int i;

    for(i=0;i<n;i++)

    {    if(a[i]==key)

        return i;

    }

return 0;

)

3.优化 (有哨兵顺序查找)

以上算法,每次循环都需要判断i是否越界,可以设置一个哨兵,可以解决不需要每次i与 n作比较

int Sequential_Search2(int *a,int n,int key)

{

    int i;

    a[0]=key;

    i=n;   //循环从尾部开始

    while(a[i]!=k){

        i--;}

    return i;   //返回0则说明查找失败

)

4.复杂度

查找的最好情况时第一个位置就找到 复杂度:O(1)

最坏的情况需要你比较n次 复杂度 O(n)

最终时间复杂度O(n)

三、有序表查找

.折半查找  

1.前提:线性表中的关键码有序,线性表采用顺序存储

2.算法:取中间值作为比较对象,若给定值与中间记录相等则查找成功,若给定值小于中间记录,则在中间记录的左半区继续查找,若大于中间记录则在右边继续查找

int Binary_Search(int *a,int n, int key)

{  

    int mid,low,high;

    int low=0;

    int high=n;

    while(low<=high)

    {

        mid=(low+high)/2;

       if(a[mid]<key)

            low=mid+1;

       else if (a[mid]>key)

            high=mid-1;

       else

            return mid;

    }

return 0;

}

3.复杂度

由二叉树性质的值,具有n个结点的完全二叉树深度为(logn)向下取整+1,折半查找虽然不是完全二叉树,但最坏情况查找次数仍然是(logn)向下取整+1

时间复杂度O(logn)

四、线性索引查找

1.索引就是把一个关键字与它对应的记录相关联的过程

线性索引就是讲索引集合组织为线性结构,也成索引表。主要介绍三种:稠密索引、分块索引和倒排索引

2.稠密索引

在线性索引中,将数据集中的每个记录对应一个索引项,索引项一定要按照关键码有序排列。可以用到折半。插值、斐波那契等有序查找算法。

3.分块索引

块内无序,块间有序

定义分块索引的索引结构分三个数据项:

最大关键码:存储每一块中的最大关键字

存储块中的记录个数,以便于循环利用

用于指向块首数据元素的指针,便于开始对这一块进行遍历

平均查找长度:将n个记录分成m块,每个块中有t条记录 n=m*t,m=n/t

块间查找长度(m+1)/2,块内查找长度(t+1)/2

所以L=(m+1)/2+(t+1)/2=(m+t)/2+1=(n/t+t)/2+1

最佳情况是m=t,L=t+1=sqrt(n)+1

分块索引的效率比顺序查找高,但是低于折半查找




       



    

    


猜你喜欢

转载自blog.csdn.net/weixin_42162355/article/details/80263203