时间复杂度
1.时间复杂度,表示形式为 Big O notation
时间复杂度也可以理解为指令执行多少次。好的时间复杂度程序,会让程序跑起来更快更节约资源。从所有可能的解决方法中找出 时间最快、内存最少 的最优解决方法。
2.常见的几种时间复杂度
O表示它的复杂度是n的怎样的一个函数
O(1):Constant Complexity 常数复杂度
O(log n):Logarithmic Complexity 对数复杂度
O(n):Linear Complexity 线性时间复杂度
O(n^2):N square Complexity 平方
O(n^3):N cubic Complexity 立方
O(2^n):Exponential Complexity 指数
O(n!):Factorial 阶乘
3.递归 时间复杂度分析
递归,关键是了解它的递归总共执行了语句多少次。循环,比较好理解,n次循环就执行了n次语句。递归是层层嵌套的,通常可以把它的执行顺序画出一个树形结构。
两个现象:
1.每多展开一层,运行的节点数就是上面一层的2倍。第一层1个节点,第二层2个节点,第三层4个节点,第四层8个节点........以此类推,它每一层的节点数即它的执行次数 是按指数级递增的。由此可见,当到最后一层的话,会变成2的n次方,大概这么一个数量级的节点。那么可以肯定,最后总的执行次数,就是变成指数级了。
2.有重复的节点出现在执行状态数中。F1、F2、F3都被重复计算很多次,这些大量冗余的计算,导致求第6个数的Fibonacci数变成了2的6次方这么一个繁复的时间复杂度。面试中不要这么写算法,可以加缓存,把中间节点的结果缓存下来,或者直接用循环来写求和。
主定理
主定理:解决所有递归函数怎么计算时间复杂度
1》二分查找:有序数列,一分为二,只在一边进行查找,O(log n)。
2》二叉树遍历:每次一分为二,但每一边是相等的时间复杂度这么下去。简化思维:二叉树遍历每个节点都会访问一次,且仅访问一次,O(n)。
3》有序的二维矩阵:如果是一维的数组进行二分查找为O(log n),有序的二维矩阵二分查找时,被降了一维就不是n平方的算法,而是O(n)。
4》归并排序
空间复杂度
两条原则:
1.如果代码里开了数组,那么数组的长度基本上就是你的空间复杂度。譬如长度为n的一维数据,空间复杂度为O(n)。长度为n平方的二维数组,空间复杂度为O(n^2)。
2.如果有递归的话,递归的深度就是就是你的空间复杂度的最大值。如果又有数组又有递归,那两者之间的最大值就是你的空间复杂度。
算法分析题解答:爬楼梯