@WillireamAngel
2018-05-28T11:20:25.000000Z
字数 1180
阅读 1360
数据结构
搜索、排序、插入、更新、删除
明确、输入、输出、有限性、可行性、独立
先验分析、后验分析
时间因素、空间因子
算法在其生命周期中的内存空间量,主要包括:
固定部分,存储某些数据和变量所需的空间,与问题大小无关;
变量部分,取决于问题的大小,如动态内存分配,递归堆栈空间等。
空间复杂度S(P)是S(P)= C + SP(I),其中C是固定部分,S(I)是算法的可变部分,取决于实例特征I。
算法完成所需时间量,时间T(n),其中T(n)可以测量为步数,只要每步消耗的时间恒定。
O(n)运行时间上限形式化方法
Ω(n)算法运行时间下线形式化方法
θ(n)算法运行时间的下限和上限的形式化方法
将问题分成若干子问题,所有子问题的解决方案合并成原始问题的解决方案。
子问题分割成原子性问题。
小问题的解决。
子问题解决后递归结合,得到原始问题的解决方案。
函数自行调用
def bsearch(list, idx0, idxn, val):
if (idxn < idx0):
return None
else:
midval = idx0 + ((idxn - idx0) // 2)
# Compare the search item with middle most value
if list[midval] > val:
return bsearch(list, idx0, midval-1,val)
elif list[midval] < val:
return bsearch(list, midval+1, idxn, val)
else:
return midval
list = [8,11,24,56,88,131]
print(bsearch(list, 0, 5, 24))
print(bsearch(list, 0, 5, 51))
回溯属于递归的一种形式,涉及任何可能性的唯一选择,先指定唯一退出状态选项。
def permute(list, s):
if list == 1:
return s
else:
return [ y + x
for y in permute(1, s)
for x in permute(list - 1, s)
]
print(permute(1, ["a","b","c"]))
print(permute(2, ["a","b","c"]))
寻找局部最优解:
旅行推销员问题
Prim的最小生成树算法
克鲁斯卡尔的最小生成树算法
Dijkstra的最小生成树算法
问题分解,解决方案合并:
合并排序
快速排序
克鲁斯卡尔的最小生成树算法
二进制搜索
对问题进行全面优化,将尝试检查解决问题的结果:
斐波那契数列
背包问题
河内塔