时间复杂度
大O表示法是一种特殊的表示法,指出了算法的速度有多快.大O表示法让你能够比较操作数,它指出了算法运行时间的增速。
O(log n),也叫对数时间,这样的算法包括二分查找。
O(n),也叫线性时间,这样的算法包括简单查找。
O(n * log n),这样的算法包括快速排序——一种速度较快的排序算法。
O(n 2 ),这样的算法包括选择排序——一种速度较慢的排序算法。
O(n!),这样的算法包括旅行商问题的解决方案——一种非常慢的算法。
总结:
算法运行时间是从其增速的角度度量的。
算法运行时间用大O表示法表示。
空间复杂度
空间复杂度是对一个算法在运行过程中临时占用存储空间大小度量
二分法查找
简单查找: 是一个查找算法,一个个的数.
二分法是一个查找算法, 其输入的是一个有序的元素列表,如果要查找的元素包含在其中,二分法查找返回其位置,否则返回none.
一般而言,对于包含n个元素的列表,用二分查找最多需要log 2 n步,而简单查找最多需要n步。
简单的思路: 利用列表的中间值和正确的值进行比较,来调整列表的索引范围,然后再在新的范围内重新取中间值,然后再和正确的值比较,来调整列表的索引范围,直到找到正确值的索引.
适用范围: 有序的列表
def binary_search(list,item): """ 二分法求出给定的元素在列表中的索引 :param list: 有序的数组 :param item: 你要查找的元素 :return: 你要查找元素的索引 """ low=0 #最低位的索引 hight=len(list)-1#最高位的索引 while low <= hight: mid=int((low+hight)/2) #得到中间元素的索引值 guess=list[mid] #猜测的元素就是列表中间的数字 if guess==item: #如果猜测的值正好是正确的值,那么mid就是给定元素的索引 return mid elif guess>item: #如果猜测的值大于正确的值,那么列表的的hight就变成了mid-1,因为正确值并不是mid所有最高的索引就是mid-1 hight=mid-1 #wi else: low=mid+1 return None list=[1,3,5,6,17,28,35] print(binary_search(list,17))
结果:
4
递归版的二分法查找
def bin_search_rec(data_set,value,low,hight): if low <= hight: mid=int((low+hight)/2) if data_set[mid]==value: return mid elif data_set[mid]>value: return bin_search_rec(data_set,value,low,mid-1) else: return bin_search_rec(data_set,value,mid+1,hight) else: return None list=[1,13,15,18,20] N=bin_search_rec(list,19,0,len(list)-1) print(N)
顺序查找法
顺序查找法主要应用于无序列表,原理从第一个位置的数开始,将其与正确的数比较,如果这两个数相等返回该索引值,如果不相等,再比较第二个位置,知道找到相等的值
def linear_search(data_set, value): for i in range(len(data_set)): if data_set[i] == value: return i return None data_set = [1, 3, 5, 27, 17, 28, 35] l = linear_search(data_set, 27) print(l)
浙公网安备 33010602011771号