一、算法简介
1、二分查找
典型的应用实例:猜数字
需要的步数:logn 步
算法逻辑:
def binary_search(list, item):
low = 0
high = len(list) - 1
while low <= high:
mid = (low + high)
guess = list[mid]
if guess == item:
return mid
if guess > item:
#大了,所以大的后边不是
high = mid - 1
else
low = mid + 1
return None
my_list = [1, 3, 5, 7, 9]
print binary_search(my_list, 3) # 1
print binary_search(my_list, -1) # None
运行时间:40亿的数字,二分查找最多只猜32次,而线性查找最多需要猜40亿次
2、大O表示法
O(n) : 其中的n为操作数
例如:线性O(n),对数性O(log n)
其他:O(n * log n)、O(n^2)、O(n!)
3、旅行商问题
O(n!)
4、内存的工作原理:有很多抽屉,每个抽屉都有地址
5、数组和链表:
数组:需要在创建时申请固定的空间,否则需要进行“转移”,并且存在申请空间浪费的风险!
优点:可以跳跃查询,随机的读取数据
缺点:插入、删除复杂
链表:元素可存储在任何地方,并通过内存地址串在一起,只要有空间就可以分配内存
优点:插入快速方便,删除简单
缺点:无法跳跃查询,只能依次寻找
时间复杂度对比:
6、选择排序
思路:遍历找最大(小)、再次遍历找第二大(小)、依次进行,时间复杂度为 O(1/2 n^2 ) = O(n^2)
7、 递归