数据结构之旅——搜索、排序和复杂度分析(Python实现)(二)

搜索算法:

首先是python自己的min/max函数,这个函数返回最小项的索引。此函数需要注意的是:使用的对象必须为iterable。关于min/max函数还有不少使用技巧,以下一一列举:

1.最基本的如:

tmp = max(1,2,4)
print(tmp)
#可迭代对象
a = [1,7,9,3,5]
tmp = max(a)
print(tmp)

2.参数key的使用:

利用max/min函数中的key参数实现多种搜索:
(1).找出一组数中绝对值最大的数:

a = [-9, -8, 1, 3, -4, 6]
tmp = max(a, key=lambda x: abs(x))
print(tmp)

(2).arr = ["abc","abcd","abcde"] 找到 arr中长度最短的字符串:

arr = ["abc","abcd","abcde"]
res = min(arr,key=len)

(3).找出字典中值最小的那组数据:

prices = {
    'A':123,
    'B':450.1,
    'C':12,
    'E':444,
}
# 在对字典进行数据操作的时候,默认只会处理key,而不是value
# 先使用zip把字典的keys和values翻转过来,再用max取出值最大的那组数据
max_prices = max(zip(prices.values(), prices.keys()))
print(max_prices)

最常用的两种搜索算法比较:

1.顺序搜索:

顾名思义,即从头开始往后遍历,直到找到目标项。期间每遍历到一个元素就与目标进行比较。若到最后一个位置都没有找到目标项,则返回False。

在确定了平均情况下,把在每一个可能的位置找到目标项所需的迭代次数相加,并且用总和除以N。得出平均情况下的复杂度为O(n)。当然,显然易见的是顺序搜索的最好情况下,即第一个就是目标项,的时间复杂度为O(1)

2.有序列表的二叉搜索

强调!!!有序列表。必须要是有序列表。

默认该列表为从小到大排序。第一步、搜索算法直接找到列表的中间位置,然后把该位置的项和目标项进行比较。如果他们一致,就返回该位置。不一致则进入第二步。第二步、判断:如果目标项小于当前项,算法按第一步搜索列表中间项以前的部分。如果目标项比当前项大,算法按第一步搜索列表中间项以后的部分。当找到目标,或当前的开始位置比当前的结束位置大的时候,停止搜索过程。

如下是二叉搜索函数的实现代码:

def binarySearch(target, sortedList):
    left = 0
    right = len(sortedList)-1
    if sortedList[0] < sortedList[-1]: #判断该列表是否是按从小到大的顺序排列
        while left <= right:
            midpoint = (left + right)//2
            if target == sortedList[midpoint]:
                return midpoint
            elif target > sortedList[midpoint]: #说明目标项在中间位置数的右边
                left = midpoint+1
            elif target < sortedList[midpoint]: #说明目标项在中间位置数的左边
                right = midpoint -1
        return -1 #没找到目标项

    if sortedList[0] > sortedList[-1]:
        while left <= right:
            midpoint = (left + right)//2
            if target == sortedList[midpoint]:
                return midpoint
            elif target < sortedList[midpoint]:
                left = midpoint+1
            elif target > sortedList[midpoint]:
                right = midpoint -1
        return -1

print(binarySearch(2, [1,2,3,4,5,6,7,8,9]))

二叉搜索的最好情况毋庸置疑就是O(1),中间位置的元素就是目标项。最坏情况则是一直分割到最后,找到了目标项,复杂度为O(log2n).

看上去二叉搜索可能比顺序搜索要更高效。然而选择何种搜索算法,取决于列表中的数据的组织方式。因为对于二叉搜索,必须要有有序列表这个前提,所以如果要搜索的列表是无序的,那么排序的时间复杂度很可能是不可忽略的,最终的时间复杂度可能会远远大于顺序搜索。

猜你喜欢

转载自www.cnblogs.com/Misakikure/p/9664948.html
今日推荐