查找:
简单查找最多需要n步,用二分查找最多需要log2(n)步
def binary_search(list, item):
low = 0
high = len(list)-1
while low <= high:
mid = (low + high) / 2
guess = list[mid]
if guess == item:
return mid
if guess > item:
high = mid -1
else:
low = mid + 1
return Nune
算法的运行时间以不同的速度增加。大O表示法指出了算法的速度有多快。指出了算法运行时间的增速。指出了最糟情况下的运行时间。
选择排序:
数组和链表:
数组的各个项在内存中是相连的
链表的元素可以存储在内存的任何地方,每个元素都存储了下一个元素的地址。需要读取链表的最后一个元素时,不能直接读取,需要从第一元素开始找...。需要读取全部元素时,链表的效率很高。
链表的优势在插入和删除元素方面。数组的优势在读取元素方面,擅长随机访问。
递归:
每个递归函数都有两部分: 基线条件和递归条件。基线条件指函数不再调用自己,从而避免无限循环。递归条件指函数调用自己。
def countdown(i):
print i
if i <= 1: ←------基线条件
return
else: ←------递归条件
countdown(i-1)
调用栈
调用栈相当于一叠便条。插入的待办事项放在清单的最上边。读取时,也只读取最上边的事项,并将之删除。因此栈只有两个操作:压入和弹出
分而治之 : D&C
快速排序
速度决定于选择的基准线
平均排序和快速排序?
散列表
数组和链表都直接映射到内存,但散列表更复杂,它使用散列函数来确定元素的存储位置。
python中散列表的实现为字典
book = dict()
book["apple"] = 0.67; book["milk"]=1.39
缓存是一种常用的加速方式,所有大型网站都使用缓存。而缓存的数据则存储在散列表中。
要避免冲突,需要有(1)较低的填装因子; (2)良好的散列函数
广度优先搜索:找出两样东西之间的最短距离。是一种用于图的查找算法。查找最短路径。
先在一度关系中搜索,再在二度关系中搜索。
队列:
队列是一种先进先出(FIFO)的数据接口(和乘坐公交车一样)。栈是一种后进先出(LIFO)的数据结构
狄克斯特拉算法
贪婪算法: 每步都采取最优的做法
动态规划:先解决子问题,再逐步解决大问题
K最近邻算法:
回归
二叉查找树:
反向索引
傅立叶变换
并行算哒
分布式算法(MapReduce): 基于 映射函数和归并函数