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

算法:(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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值