算法的时间复杂度与空间复杂度
发布日期:2022-02-14 23:02:51
浏览次数:47
分类:技术文章
本文共 2044 字,大约阅读时间需要 6 分钟。
主要材料来源
时间复杂度
- 概念
- 执行当前算法所消耗的时间(最坏情况的运行时间)
- 推导
O
阶的方法- 用常数
1
取代运行时间中的所有加法常数 - 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项存在且不是1,则去掉该最高阶项系数。
- 得到的最后结果就是
O
阶
- 用常数
- 常用的时间复杂度所耗费的时间从小到大依次是 O ( 1 ) < O ( l o g n ) < O ( n ) < O ( n l o g n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) < O ( n ! ) < O ( n n ) O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n) O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
- 常见复杂度量级
- 常数阶
O(1)
:没有循环等复杂结构 - 线性阶
O(n)
:循环 n n n次i = 0while i <= n: i += 1
- 对数阶
O(log(n))
i = 1while i <= n: i *= m
m m m为常数,则循环次数 x x x: m x = n ⇒ x = l o g m n m^x = n \Rightarrow x = log_m{n} mx=n⇒x=logmn,故量级为: l o g ( n ) log(n) log(n) - 线性对数阶
O(nlog(n))
:将复杂度为对数阶O(log(n))
的代码循环 n n n次,则其复杂度为: n × l o g ( n ) n \times log(n) n×log(n),即:O(nlog(n))
- 平方阶
O(n²)
:复杂度为O(n)
的代码嵌套循环 - 立方阶
O(n³)
、 k k k次方阶O(n^k)
:同O(n²)
- 常数阶
- 常见排序算法复杂度
排序法 | 平均时间 | 最差情况 | 稳定度 | 额外空间 | 备注 |
---|---|---|---|---|---|
冒泡 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | 稳定 | O ( 1 ) O(1) O(1) | n n n小时较好 |
交换 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | 不稳定 | O ( 1 ) O(1) O(1) | n n n小时较好 |
选择 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | 不稳定 | O ( 1 ) O(1) O(1) | n n n小时较好 |
插入 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | 稳定 | O ( 1 ) O(1) O(1) | 大部分已排序时较好 |
基数 | O ( l o g R B ) O(log_R{B}) O(logRB) | O ( l o g R B ) O(log_R{B}) O(logRB) | 稳定 | O ( n ) O(n) O(n) | B B B是真数(0-9) R R R是基数(个十百) |
Shell | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | O ( n s ) , 1 < s < 2 O(n^s), 1 < s < 2 O(ns),1<s<2 | 不稳定 | O ( 1 ) O(1) O(1) | s s s是所选分组 |
快速 | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | O ( n 2 ) O(n^2) O(n2) | 不稳定 | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | n n n大时较好 |
归并 | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | 稳定 | O ( 1 ) O(1) O(1) | n n n大时较好 |
堆 | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) | 不稳定 | O ( 1 ) O(1) O(1) | n n n大时较好 |
空间复杂度
- 概念
- 执行当前算法需要占用的内存空间
- 常见复杂度量级
O(1)
:算法执行所需要的临时空间不随着某个变量 n n n的大小而变化- 场景
- 变量赋值(变量分配的内存不会随着处理数据量的变化而变化)
- 变量数学计算(同上)
x = 91y = 100while y > 0: if x > 100: x -= 10 y -= 1 else: x += 1
- 场景
O(n)
:数组,列表等,随着元素的增多,内存将会增加
两者都平衡
- 判断是否闰年
- 空间复杂度 > 时间复杂度:算法判断
- 时间复杂度 > 空间复杂度:列表
转载地址:https://blog.csdn.net/fish2009122/article/details/106566043 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月16日 01时27分55秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
每日一道python面试题 - Python的实例,类和静态方法揭秘
2019-04-28
今日金融词汇---新股新债前面的N,是什么?
2019-04-28
每日一道python面试题 - Python的实例,类和静态方法揭秘
2019-04-28
原创专辑来了
2019-04-28
好好做好你喜欢做的事情,并且把它做好
2019-04-28
反馈不足
2019-04-28
人生永远没有太晚的开始
2019-04-28
python 周日福利来了
2019-04-28
状态模式
2019-04-28
跳表SkipList
2019-04-28
跳跃表(Skip list)原理与java实现
2019-04-28
Java 常见的 30 个误区与细节
2019-04-28
干货|基于 Spring Cloud 的微服务落地
2019-04-28
WEB攻击手段及防御第2篇-SQL注入
2019-04-28
WEB攻击手段及防御第3篇-CSRF
2019-04-28
WEB攻击手段及防御-扩展篇
2019-04-28
spring bean初始化及销毁你必须要掌握的回调方法。
2019-04-28
mysql语句性能开销检测profiling详解
2019-04-28
hashCode到底有什么用?
2019-04-28
设计模式之动态代理模式实战
2019-04-28