顺序搜索一个列表,并讨论搜索过程中的最好情况,最坏情况和平均情况的性能
python 中的 in 运算符作为 list 类中名为__contains__的一个方法而实现的。这个方法在列表中搜索一个特定的项(叫做目标项)。
在这样一个列表中搜索一个目标项的唯一的方法是,从第 1 个位置的项开始,将其与目标项进行比较。如果这两个项相等,该方法返回True。否则,该方法移动到下一个位置继续比较。如果该方法到达了最后一个位置,却仍然没有找到目标项,它就返回False。这种搜索叫做顺序搜索(sequential search)或线性搜索(linear search)。
算法实现:
def shunxusousuo(target,lists):
position = 0
while position < len(lists):
if target == lists[position]:
print(position)
position += 1
return -1
list1 = [1,2,3]
shunxusousuo(3,list1)
嗯。。。当然啦,在搜索的过程中总会发生运气很好的事情(比如说第一个位置的元素就与目标值一致),也会发生运气很不好的事情(比如说在列表的最后一个位置才搜索到与目标值一致的元素,或者一个一致的元素都没有)。
所以,对在顺序搜索的分析要考虑如下3中情况:
- 在最坏的情况下,目标项位于列表的末尾,或者根本就不在列表中。那么,算法必须访问每一个项,并且对大小为n的列表要执行n次迭代。因此,顺序搜索的最坏情况的复杂度为O(n);
- 在最好的情况下,算法只进行了1次迭代就在第1个位置找到目标项,复杂度为O(n);
- 在平均的情况下,要把每一个可能的位置找到目标项所需的迭代次数相加,并且用总和除以n。因此,算法执行了(n+n-1+n-2+n-3+n-4+n-5+······+1)/n次的迭代。简化式子为(n+1)/2。对于很大的n,常数因子2的作用并不大,因此,平均情况下的复杂度仍然为O(n)。
所以综上所述,顺序搜索的最好情况的性能是很少见的,而平均情况和最坏情况的性能则基本相同。