算法之线性表的查找

一、查找的基本概念

1.概念:

1.查找表:

由同一类型的数据元素(或记录)构成的集合。由于‘集合’中的数据元素之间存在着松散的关系,异常查找表是一种应用灵便的结构。没有严格的前驱后继关系。(类似于多个数据项组成了不同的数据元素,由数据元素组成的数据对象,每一个数据元素之间没有确定的数据关系)

2.查找:

根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)

查找成功:成功操作到该记录或者表中的位置,

查找不成功:为空记录或者空指针。

通常感觉是否修改数据分为:(查询)/(插入和删除)

3.关键字:

用来标识一个数据元素(或记录)的某一个数据项的值

主关键字:可唯一地标识一个记录的关键字是主关键字

次关键字:反之,用以识别若干记录的关键字是此关键字

4. 算法评价指标:

关键字的平均比较次数,也称平均查找长度ASL

2.线性表的查找:

1.顺序查找

应用范围:顺序表或线性链表表示的静态查找表,表内元素之间无序

数据元素类型定义:

typedef struct {  // 顺序表在元素的结构定义
    KetType key;// 关键字
    ····     // 其他域
}ElemType

typedef struct {    // 顺序表结构类型定义
    ElemType  *R // 表基址
    int lenght; // 表长
}SSTable ;        // 定义别名
 SStable ST        // 创建表类型名为ST

 基础查找算法:

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存入表头(‘哨兵’、‘监视哨’)从后往前比较,可以免去查找过程中每一步都要检测是否查找完毕(减少了一次if比较),加快速度。

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

时间效率:

与key的位置有关:查找dii个元素需要比较n-i+1次,查找失败需要比较n+1次

O(n):查找成功时的平均查找长度,处处几率相等。ASL = (n+1)/2.时间效率过长

时间复杂度:

一个辅助空间—O(1)

2.二分法查找

 每次可以缩短一半区间,但是只能查找有序表。

//非递归算法
int Search_Bin(SSTable ST,KeyType key) {
    low = 1;hing = ST.length; // 置区间初值
    while(low <= high) {
        mid = (low+high)/ 2
        if(ST.R[mid].key == key) return mid    // 找到待查元素
        else if (key <ST.R[mid].key)    // 缩小查找区间
             high = mid -1     // 继续在前半区间进行查找
        else low = mid + 1     // 在后边区进行查找
    }
    return 0                    // 顺序表中不存在待查元素
}

// 递归算法
int Search_Bin(SSTable ST,keyType key,int low,int high) {
    if(low > high) return 0;
    mid =(low+high)/2
    if(key == ST.elem[mid].key) return mid;
    else if(key <ST.elem[mid].key) Search_Bin(ST,key ,low =mid +1,high )
    else Search_Bin(ST,key ,low ,high=mid - 1 )
}

3.分块查找

 1.将表分成几块,且表或者有序或者分板有序。若i < j ,则第j块中所有记录的关键字均大于第i块中的最大关键字。

2.建立索引表,记录每一块中的最大值,记录每一块的开始位置。

3.查找过程:先确定待查记录所在快(顺序或者折半查找),再在块内查找(顺序查找)。

 

posted @   铜须的编程生活  阅读(225)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示