提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、
1.最简单版本
def fib(n):
if(n<3)
return 1
return fib(n-1)+fib(n-2)
这种代码的写法会导致时间复杂度和空间复杂度都很高,借助递归树不难看出,接近2的n次方指数级别的时间复杂度。理解这个时间复杂度有点类似于二叉树的层数,比如说一个具体的fib(8),层数是7层,当n足够大的时候,其实就无限接近了。而空间复杂度比较难理解,是O(1),这个比较难理解,因为函数调用的本质是堆栈的操作,调用结束空间销毁,所以只会占用有限可数个函数栈空间。
2.稍微改进
代码如下(示例):
def fib(n):
tmp = np.zeros(n)
tmp[0] = 1
tmp[1] = 1
for i in range(2,n):
tmp[i] = tmp[i-2]+tmp[i-1]
return tmp[n-1]
这个代码的改进思路是把所有计算的过程都存储起来,避免重复调用函数,所以时间复杂度低了变成了O(n).但是空间复杂度确实高了,也变成了O(n),是因为之前栈还有销毁空间,而这里就存储在一个数组里面,注意return 的是n-1,因为数组下标从第0项开始的。
3.进一步改进
def fib(n):
a,b =1,1
c = 0
for i in range(2,n):
c = a+b
a = b
b = a
return c
这个代码就进一步提升了,空间复杂度是O(1),时间复杂度是O(n),改进的思路就是返回的结果只与前面两项有关,其余的数都是多余的,所以我要用两个来代替,为了降低存储空间,所以也会使用两个变量来不停的赋值。
4.还有更好的解决方案
时间复杂度为O(1),其实有一个投机取巧的办法就是公式,但是这个公式是可以用矩阵分解来证明的,hh~