数据结构与算法(十六)线性表查找

查找的对象--查找表

        查找表是一类数据的集合,数据元素之间存在着松散的关系(不一定有前驱和后继关系)

        关键字:        主关键字:可以唯一的找到一个记录的关键字

                               次关键字:用于识别若干条记录的关键字

        指标:平均查找长度(ASL)--关键字的评价比较次数  

               关键字比较次数的期望值:ASL=\sum p_{i}c_{i} (概率X次数)

        查找方法取决于数据元素的组织形式(存储结构)

                提高查找效率的一个办法就是:在构造查找表的时候人为的为数据元素加上约束关系

线性表的查找

        顺序查找(线性查找)

                应用范围:      顺序表或线性表表示的静态查找表

                                        表内元素是无序

                                        数据域分为:关键字域其他域

                   基础算法:

int Search_Seq(SSTable ST,KeyType key){
    for(i=ST.length;i>=1;--i)
        if(ST.R[i].key == key)    return i;
    return 0;
}

              改进算法(把待查的key存入表头/首元素<哨兵>,可以避免每次循环都要检查是否越界)

int Searcg_Seq(SSTable ST,KeyType key){
    for(i=ST,length;ST.R[i].key!=key;--i);
    return i;
}

                 时间效率分析:比较次数与key的位置之间的关系--查找第 i 个位置的元素需要比较n-i+1次,如果查找失败则需要比较n+1

                时间复杂度为O(n)                ASL=\frac{1}{n}\sum (n-i+1)=\frac{n+1}{2}

                空间复杂度为O(1)--哨兵的空间

                提高查找效率:查找概率高的元素后移,概率低的元素前移 

                                        或者按照查找概率动态调整记录顺序:     

                                                1.在每个记录中设一个访问频度域

                                                2.始终保持记录非递增有序的次序排序

                                                3.每次超找后均将刚查到的记录直接移到表头

                特点:算法简单,逻辑次序无要求,不同存储结构均可适用

                            ASL太长,时间效率较低

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

                每次待查区间会缩小一半(数据需要按大小顺序排列)

                取值公式:        mid = (low + high) / 2

                                        如果key

                                        如果key>mid则 low=mid+1

                非递归

int Sreach_Bin(SSTable ST,KeyType key){
    low=1;high=ST.Length;//置区间初值
    while(low<=high){
        mid=(low+high)/2;
        if(ST.R[mid].key == key)    return mid;//找到待查元素
        else if(key

               递归

int Search_Bin(SSTable ST,KeyType key,int low,int high){
    if(low>high)    return 0;//不存在
    mid=(low+high)/2;
    if(key==ST[mid].key)    return mid;//找到了
    else if(key

                性能分析--判定树

数据结构与算法(十六)线性表查找_第1张图片

                         查找不成功:比较次数=路径上的内部结点数     比较次数≤[log{_{2}}^{n}]+1

                        等概率且成功的情况下:ASL=除叶子结点外所有结点之和/总元素个数

                                              = \frac{1}{n}\sum jX2^{j-1}(j为层数)=\frac{n+1}{n}log{_{2}}^{n+1}-1log{_{2}}^{n+1}-1   (n>50)

                        特点:     效率比顺序查找高

                                        只适用于有序表(且必须是顺序存储结构,对链表无效)

        分块查找

                条件:将表分成几块,且分块有序(块与块之间有序--若i

                           建立索引表(每个块的最大关键字域和指向其第一个结点的指针)

                过程:确定待查记录所在块(折半/顺序)->块内顺序查找

                性能分析:        ASL=Lb(对索引表的ASL)+Lw(对块内的ASL)

数据结构与算法(十六)线性表查找_第2张图片

你可能感兴趣的:(学习笔记,数据结构,算法)