第8章 查找

2019-03-02  本文已影响0人  cb_guo

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

查找概论

顺序表查找

/* 无哨兵顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键字 */
int Sequential_Search(int *a, int n, int key){
    for(int i=1; i<=n; i++){
        if (a[i] == key)
            return i;
    }
    return 0;
}
/* 有哨兵顺序查找 */
int Sequential_Search2(int *a,int n,int key){
    int i;
    a[0]=key;
    i=n;
    while(a[i]!=key){
        i--;
    }
    return i;
}

此时代码从尾部开始查找,由于 a[0]=key ,也就是说,如果在 a[i] 中有 key 则返回 i 值,查找成功,否则一定在最终的 a[0] 处等于 key ,此时返回的是 0 ,即说明 a[1] - a[n] 中没有关键字 key ,查找失败。
这种在查找方向的尽头设置 "哨兵" 免去了在查找过程中每一次比较厚都要判断查找位置是否越界的小技巧,看似已原先差别不大,但在总数据较多时,效率提高很大,是非常好的编码技巧。当然,“哨兵” 也不一定就一定要在数据开始,也可以在末端
时间复杂度分析: 对于顺序表来说,查找成功最好的情况就是在第一个位置就找到了,算法时间复杂度为 O(1),最坏情况是在最后一位置找到,需要 n 次比较,时间复杂度为 O(n) ,当查找不成功时,需要 n+1 次比较,时间复杂度为 O(n)。我们之前推导过,关键字在任何一位置都是相同的,所以平均查找次数为 (n+1)/2 ,所以最终时间复杂度为O(n)

有序表查找

/* 折半查找 */
int Binary_Search(int *a, int n, int key){
    int low, high, mid;
    low = 1;    /* 定义最低下标为记录首位 */
    high = n;   /* 定义最高下标为记录末位 */
    while(low <= high){
        mid = (low + high) / 2; /* 折半 */
        if (key < a[mid])       /* 若查找值比中值小 */
            high = mid-1;       /* 最高下标调整到中位下标小一位 */
        else if (key > a[mid])/* 若查找值比中值大 */
            low = mid + 1;      /* 最低下标调整到中位下标大一位 */
        else
            return mid;     /* 若相等则说明mid即为查找到的位置 */
    }
    return 0;
}

线性索引查找

索引就是把一个关键字与它对应的记录相关联的过程。一个索引由若干个索引项构成,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息。索引技术是组织大型数据库以及磁盘文件的一种重要技术
索引按照机构可以分为线性索引,树形索引和多级索引。我们这个只介绍线性索引技术。所谓线性索引就是将索引项集合组织为线性结构,也称为索引表。我们重点介绍三种索引技术:稠密索引,倒排索引,分块索引

二叉排序树

平衡二叉树(AVL树)

平衡二叉树,是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于 1
我们将二叉树上节点的左子树深度减去右子树深度的值称为平衡因子BF( Balance Factor),那么平衡二叉树上所有节点的平衡因子只可能是 -1,0,1。只要二叉树上有一个节点的平衡因子的绝对值大于 1,则该二叉树就是不平衡的

多路查找树 (B树)

散列表查找(哈希表)概论

散列函数的构造方法

构造原则: 计算简单,散列地址分布均匀

处理散列冲突的方法

散列表查找实现

上一篇 下一篇

猜你喜欢

热点阅读