数据结构与算法学习笔记之查找第一篇---静态查找表(C语言)

目录

前言

1.顺序表的查找

1.定义

2.顺序查找的实现过程

3.顺序表查找算法分析

2.有序表的查找

1.折半查找的过程

2.折半查找的算法分析

3.静态树表的查找

4.索引顺序表的查找


前言

   这篇博客主要是介绍顺序折半查找的表示和实现。

1.顺序表的查找

1.定义

        静态查找表的顺序存储结构定义如下:

typedef int ElemType;
typedef int Status;
// - - - - - 静态查找表的顺序存储结构 - - - - -
typedef struct {
    ElemType * elem;    // 数据元素存储空间基址,建表时按实际长度分配0,0号单元留空
    int length;         // 表长度
} SSTable;

// - - 对数值型关键字
#define EQ(a,b) ((a)==(b))

2.顺序查找的实现过程

        顺序查找(Sequential Search)的查找过程为:先设置顺序表的第一个数据元素为哨兵,然后从表中最后一个记录开始,逐个往前查找,找到要查找的数据元素之后则查找成功,返回下标;否则往前遍历查找,一直查找到哨兵元素,则返回下标0。具体比较过程可以看下面的示意图:

        图1.顺序查找示意图

        核心顺序表查找算法为:

// 顺序表查找
int search_seq(SSTable *ssTable, ElemType key){
    ssTable->elem[0] = key;
    int i ;
    for (i = ssTable->length; !EQ(ssTable->elem[i], key); --i);
    return i;
}

3.顺序表查找算法分析

        在上述顺序表的查找过程中,我们设置了哨兵,避免了每次都要检测整个表是否查找完毕的过程。第一个哨兵元素起到了监视哨的作用。

        假设每次要查找的数据元素在表中的话, 我们看到数据元素的查找次数跟数据的下标有关系,要查找的元素如果位于末尾,只需要查找1次,倒数第二个数据元素需要查找表长-1次,依次类推,当顺序表表长为n的时候,第i个数据元素需要查找n-i+1次,所有元素需要比较的总的次数为1+2+......n = n*(n+1)/2次,假设每个数据元素查找到的概率相同,则每个数据元素被查找到的概率为1/n,那么顺序表的平均查找长度为(n+1)/2。

        假如每次都能查找成功和失败的概率都相同,算法如下,这里偷个懒,直接贴个图。

        我们可以看出当表的长度n比较大的时候,查找的次数也会增大。

2.有序表的查找

1.折半查找的过程

        当用有序表表示静态查找表的时候,可以使用折半查找来实现。

        具体过程如下:先确定待查记录所在的范围,然后逐步缩小范围知道找到或者找不到改记录为止。

        我这里也写了一个程序表示折半查找的过程:

        图2.折半查找过程

        核心查找算法如下:

// 折半查找
Status binarySearch(SSTable *ssTable, ElemType key, int *locate) {
    int low = 1, high = ssTable->length;
    while (low <= high) {
        int mid = (low + high) / 2;
        if (ssTable->elem[mid] == key) {
            *locate = mid;
            return 1; // 找到了
        } else if (ssTable->elem[mid] < key) {
            low = mid + 1; // 在右半部分继续查找
        } else {
            high = mid - 1; // 在左半部分继续查找
        }
    }
    return 0; // 没找到
}

2.折半查找的算法分析

        我们可以使用二叉树来表示折半查找的过程,折半查找成功的时候进行比较的关键字个数最多不超过树的深度,结论参考严蔚敏老师的数据结构,下面直接贴出来结论:

        图3.折半查找的平均查找长度                         

3.静态树表的查找

        这里太复杂了,有时间研究明白了在补充上吧。

4.索引顺序表的查找

        这里太复杂了,有时间研究明白了在补充上吧。

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
折半查找,也称为二分查找,是一种常见的查找算法。它是针对有序数组进行查找的。具体步骤如下: 1. 确定查找范围的左右边界,分别为 low 和 high,初始值分别为数组的第一个和最后一个元素的下标。 2. 计算中间位置 mid,即 mid = (low + high) / 2。 3. 比较中间位置的元素与要查找的值。如果相等,返回 mid;如果小于要查找的值,说明要查找的元素在右半部分,将 low 赋值为 mid + 1;如果大于要查找的值,说明要查找的元素在左半部分,将 high 赋值为 mid - 1。 4. 循环执行第 2 步到第 3 步,直到 low 大于 high,查找失败。 下面是 PHP 代码实现: ```php function binarySearch($arr, $target) { $low = 0; $high = count($arr) - 1; while ($low <= $high) { $mid = intval(($low + $high) / 2); if ($arr[$mid] == $target) { return $mid; } elseif ($arr[$mid] < $target) { $low = $mid + 1; } else { $high = $mid - 1; } } return -1; } ``` 除了折半查找,还有二叉树查找和有序查找。二叉树查找是利用二叉树结构进行查找,每次比较当前节点的值与目标值的大小关系,然后根据大小关系往左或者往右走,直到找到目标值或者走到叶子节点为止。有序查找是将有序分成若干个子,然后根据目标值与子的范围比较,确定目标值可能在哪个子中,然后再在该子中进行折半查找。这两种算法的实现比较复杂,这里就不再赘述了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫柱子哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值