数据结构与算法——10. 顺序查找

顺序查找

如果数据项保存在如列表这样的集合中,我们会称这些数据项具有线性或者顺序关系
在Python List中,这些数据项的存储位置称为下标(index),这些下标都是有序的整数,从零开始,到n-1结束(n为数据项的数量)。
通过下标,我们就可以按照顺序来访问和查找数据项,这种技术称为“顺序查找”。

1. 无序表的顺序查找

对于无序表的查找,首先从列表的第1个数据项开始,按照下标增长的顺序,逐个比对数据项,如果到最后一个都未发现要查找的项,那么查找失败。

python代码实现

def sequential_search(a_list, item):
    """
    无序表的顺序查找
    :param a_list: 被查找列表
    :param item: 目标元素
    :returns: 元素是否在列表中被找到
    """
    # 从列表中一个个取出元素进行比较
    for i in a_list:
        # 找到值相同的元素,说明查找成功
        if i == item:
            return True
    # 所有元素都取完还未找到,说明查找失败
    return False

算法分析

在查找算法中,基本计算步骤就是进行数据项的比对,对比的次数决定了算法复杂度。

无序表中的数据项并没有按值排列顺序,而是随机放置在列表中的
各个位置。换句话说,数据项在列表中各处出现的概率是相同的

  • 最好的情况下,目标元素被放在列表的第一个位置,第1次比对就找到。
  • 最坏的情况下,目标元素被放在列表末尾或者根本不在列表中,那就需要n次比对。
  • 因为数据项在列表中各个位置出现的概率是相同的。所以平均状况下,比对的次数是n/2。
情况最好情况最坏情况平均情况
元素存在1nn/2
元素不存咋在1nn/2

所以,顺序查找的算法复杂度是 O ( n ) O(n) O(n)

2. 有序表的顺序查找

当数据项存在时,比对过程与无序表完全相同不同之处在于,如果数据项不存在,比对可以提前结束。

比如,列表从小到大排列,我们要查找31,当我们查找到32(或者更大的数字)的时候还没有找到,那么就没有必要再去后面查找了。

python代码实现

我们以从小到大排序的列表为例。

def ordered_sequential_search(a_list, item):
    """
    有序表的顺序查找
    :param a_list: 被查找列表
    :param item: 目标元素
    :returns: 元素是否在列表中被找到
    """
    for i in a_list:
        # 对比当前元素是否已经大于目标元素,如果是则提前返回
        if i > item:
            return False
        if i == item:
            return True
    return False

算法分析

无序表的顺序查找和有序表的顺序查找基本相同。只是在数据项不存在的时候,有序表的查找能节省一些比对次数,但并不改变其数量级。

情况最好情况最坏情况平均情况
元素存在1nn/2
元素不存在1nn/2

所以算法复杂度仍然是 O ( n ) O(n) O(n)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

花_城

你的鼓励就是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值