查找 - 线性表的查找

发布时间 2023-11-21 16:15:15作者: ww0809

线性表的查找

顺序查找

技巧:设置哨兵,放在下标为0的位置。

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

算法分析

适用于顺序结构和链式结构,不要求记录按关键字有序。
平均查找长度为(n + 1) / 2,查找效率低。

折半(二分)查找

int Search_Bin(SSTable ST, KeyType key) {
    low = 1; high = ST.length;
    while(low <= high) {
        mid = (low + right) / 2;
        if(key == ST.R[mid].key) return mid;
        else if(key < ST.R[mid].key) high = mid - 1;
        else low = mid + 1;
    }
    return 0;
}

二叉判定树

当前查找区间的中间位置是根,左子树和右子树分别是左子表和右子表。
则查找失败就是走了一条从根结点到外部结点的路径,比较的关键字个数等于路径上的内部结点个数。
当n较大时,ASL = log2(n + 1) - 1

算法分析

要求必须是顺序存储结构,且按关键字有序排列。
对于长度为n的有序表,需要比较的关键字个数最多是floor(log2(n)) + 1。时间复杂度为O(log2(n)).

分块查找(索引顺序查找)

建立一个索引表,按关键字有序,整个待查找表有序或者分块有序。
确定块的查找可以用顺序查找或者折半查找,块中的查找只能用顺序查找(因为不一定关键字有序)。

算法分析

顺序查找:ASL = (1 / 2) * (n / s + s) + 1
折半查找:ASL = log2(n / s + 1) + (s / 2)
便于插入和删除,可以实现在快速查找的同时经常动态变化。