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

文章目录

  • 顺序查找
    • 1. 无序表的顺序查找
      • python代码实现
      • 算法分析
    • 2. 有序表的顺序查找
      • python代码实现
      • 算法分析

顺序查找

如果数据项保存在如列表这样的集合中,我们会称这些数据项具有线性或者顺序关系
在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。
情况 最好情况 最坏情况 平均情况
元素存在 1 n n/2
元素不存咋在 1 n n/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

算法分析

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

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

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

你可能感兴趣的:(数据结构与算法,python,数据结构,算法)