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