赞
踩
算法:(Algorithm)
一个计算过程,解决问题的方法
程序=数据结构+算法
时间复杂度是用来估计算法运行时间的一个式子。
当算法过程出现循环折半时,复杂度式子会出现log2n。
一般来说,时间复杂度高的算法比复杂度低的算法会更慢(与机器和n有关)。
常见的时间复杂度(按效率排序):
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(nnlogn) < O(nn*n)
复杂问题的时间复杂度:
O(n!)
O(2^n)
O(n^n)
如何简单快速地判断算法复杂度
1)确定问题规模n
2)循环减半的过程–> logn
3)k层关于n的循环–> n^k
复杂情况:根据算法执行过程判断
用来评估算法内存占用大小的式子
空间复杂度的表示方式和时间复杂度完全一样
1)算法使用了几个变量: O(1)
2)算法使用了长度为n的一维列表:O(n)
3)算法使用了m行n列的二维列表:O(mn)
时间更重要,通常空间换时间:比如分布式训练
递归的两个特点:
1)调用自身
2)结束条件
例如:
func1和func2便不是递归
func3打印的结果:
3 2 1
func4打印的结果:
1 2 3
注意理解这里的func4:先递归调用完后再打印
解析如图:
汉诺塔问题:
将A上的盘子全部移到C盘,小圆盘不能放在大圆盘上,在三根柱子之间一次只能移动一个圆盘。
思路整理:
若只有两个盘子:
第一步:先将小盘子从A移动到B
第二步:再将大盘子从A移动到C
第三步:再将B上的小盘子从B移动到C
若有n个盘子:
看成一个递归问题(分为两部分:前n-1个盘子和第n个盘子)
第一步:先将前n-1个盘子从A移动到B
第二步:再将第n个盘子从A移动到C
第三步:再将b上的前n-1个盘子从B移动到C
代码如下:
# n表示n个盘子, a处表示起始柱子;b处表示中间柱子;c处表示目的柱子
def hanoi(n, a, b, c): # 表示把n个盘子从a经过b移动到c
if n > 0:
hanoi(n-1, a, c, b) # 表示把n-1个盘子从a经过c移动到b
print("moving from %s to %s" % (a, c)) # 表示将第n个盘子从a移动到c
hanoi(n-1, b, a, c) # 表示把n-1个盘子从b经过a移动到c
结果如下:
hanoi(2, "A", "B", "C")
#结果如下:
moving from A to B
moving from A to C
moving from B to C
hanoi(3, "A", "B", "C")
#结果如下:
moving from A to C
moving from A to B
moving from C to B
moving from A to C
moving from B to A
moving from B to C
moving from A to C
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。