时间空间复杂度总结

学习复杂度总结和发现问题的想法总结

时间复杂度

效率排序 从高到低

O(1)
O(log n): 例如 :while或者for中执行循环次数为i = i/2或者 i = i * 2, 其中不一定是常数2,也可以为3,或者4 则 执行次数为logn;
O(n): 比如简单打印操作 1层的for/while循环,复杂度跟n线性关系,n为多少执行多少次
O(n^2), 2 层嵌套for/while循环 做打印操作
O(n^3), 3层for/while循环 做打印操作
O(2^n), 斐波那契
O(n!)
指数级涨的很快,复杂度效率差别天壤之别

二分查找O(logn): 一分为二只查一边时间复杂度为O(logn)
二叉树遍历O(n): 每次一分为二,但每次一分为二之后,每一边是相等的时间复杂度T(n) = 2T(n/2) + O(1),另一个维度思考每个节点只访问一次,所以是O(n)

一维有序数组二分查找 O(logN)
二维有序矩阵查找 O(n)
归并 O(nlogn)

前,中,后序 遍历O(n), n为节点总数,每个节点访问一次且仅访问一次,所以时间复杂度线性于节点总数

空间复杂度

1 代码中开了数组,数组长度是空间
2 递归的深度

爬楼梯问题

没有缓存情况下时间复杂度: 每一层一分为2依次为1, 2,4,8,… 所以为O(2^n)
空间复杂度:深度最大可能是n层,所以为O(n)

记忆递归
由于有了缓存所以不再重复计算相同的方法数,时间复杂度变成了O(n) 即每个台阶到n个台阶的方法数只被计算了一次
空间复杂度,因为开了数组O(n),同时递归的深度是n,两个是并行关系,所以整体空间复杂度为O(n)

动态规划
时间复杂度O(n),单循环到n,空间复杂度O(n),dp数组用了n空间

爬楼梯用斐波那契
用两个常数作为基点,保存开始的状态,
时间复杂度O(n),单循环到n,空间复杂度为O(1)

爬楼梯发现问题的总结
1 在用DP时要注意 int[] dp = new int[n + 1] 还是 int[] dp = new int[n + 2]
为什么有的时候用new int [n + 1]有的时候用int[n + 2] ?
当有if (n == 1) return 1的时候用int[] dp = new int[n + 1]
当没有if ( n == 1) return 1的时候用 int[] dp = new int[n+2];
当带入n=1时,dp[2] 越界问题
为什么有了if(n==1) return 1 的时候还要用int[] dp = new int[n +1]呢?
因为程序中for的条件是i <= n,如果不为n+1那么dp[n]就越界了

2 在爬楼梯用斐波那契数解决问题的时候要忽略掉dp[0] (但从斐波那契角度,dp[0]=1只是借助于这个方法来得到dp[2]的结果为2而写的),实际上不存在爬0阶楼梯的,如果要说爬0阶楼梯只能说dp[0] = 0,有0个台阶不需要爬,没有方法数所以为0 注意如果dp[0] = 1; dp[1] = 1则for中的i是从2开始到n的. 如果是dp[1] = 1; dp[2] = 2,则for中的i是从3开始到n的.
3 在记忆化递归中返回mems[i]表示什么?
当n=4的时候mems数组为
/* [0: (1 + 2), 1: (2 + 3), 2: (3 + 4), 3: (4 + 5)]
[0: (3 + 2), 1: (2 + 1), 2: (1 + 1), 3: (1 + 0)] */

不懂的问题
归并 O(nlogn) 这里有个问题,归并也是一分为2,再每一边相等的时间复杂度,那么在归并的过程中为什么是logn 不是O(n)呢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值