当前位置:   article > 正文

数据结构笔记:时间复杂度和空间复杂度、递归问题_递归和循环时间和空间复杂度

递归和循环时间和空间复杂度

算法:(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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

结果如下:

hanoi(2, "A", "B", "C")
#结果如下:
moving from A to B
moving from A to C
moving from B to C
  • 1
  • 2
  • 3
  • 4
  • 5
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/552302
推荐阅读
相关标签
  

闽ICP备14008679号