AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

第七章 时空复杂度分析 笔记

作者: 作者的头像   松鼠爱葡萄 ,  2020-07-28 15:13:55 ,  所有人可见 ,  阅读 4301


161


332

一般 ACM 或者笔试题的时间限制是 1 秒或 2 秒。
在这种情况下,C++ 代码中的操作次数控制在 $10^7$ 为最佳。

下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:

  1. $n \le 30$, 指数级别,

    dfs + 剪枝,数字排列, n皇后问题, 八数码问题

    状态压缩 dp,蒙德里安的梦想, 最短Hamilton路径

  2. $n \le 100$ => $O(n^3)$,

    floyd,

    dp,

  3. $n \le 1000$ => $O(n^2)$,$O(n^2logn)$,

    dp,

    二分,

    朴素版 Dijkstra、朴素版 Prim、Bellman-Ford

  4. $n \le 10000$ => $O(n * \sqrt n)$,

    块状链表、分块、莫队

  5. $n \le 100000$ => $O(nlogn)$

    各种 sort,线段树、树状数组、set/map、heap、dijkstra+heap、prim+heap、spfa、求凸包、求半平面交、二分

  6. $n \le 1000000$ => $O(n)$, 以及常数较小的 $O(nlogn)$ 算法

    hash、双指针扫描、并查集,kmp、AC 自动机,

    常数比较小的 $O(nlogn)$ 的做法:sort、树状数组、heap、dijkstra、spfa

  7. $n \le 10000000$ => $O(n)$,

    双指针扫描、kmp、AC 自动机、线性筛素数

  8. $n \le 10^9$ => $O(\sqrt n)$,

    判断质数

  9. $n \le 10^{18}$ => $O(logn)$,

    最大公约数,快速幂

  10. $n \le 10^{1000}$ => $O((logn)^2)$,

    高精度加减乘除

  11. $n \le 10^{100000}$ => $O(logn \times loglogn)$,

    高精度加减、FFT/NTT


算法时间复杂度分析实例:

一般来说,k重循环,算法时间复杂度就是$n^k$

基础算法
快速排序 归并排序 二分 O(nlogn)
双指针 数组元素目标和 O(n)
数据结构
单链表 栈 (插入 删除操作) O(1)
单调栈 单调队列 O(n)
KMP O(n)
Trie字符串统计 O(n)
并查集 (路径压缩) O(nlogn)
堆排序 O(nlogn)
模拟散列表 O(1)
搜索与图论
排列数字(全排列) O(n*n!)
dfs bfs O(n+m)
Dijkstra O(mlogm)
Bellman_ford O(nm)
spfa O(nm)
Floyd O(n^3)
Prim O(n^2)
Kruskal O(mlogm)
染色法判定二分图 O(mlogm)
匈牙利算法 O(nm)

spfa算法, 匈牙利算法, 最大流算法时间复杂度理论值很大,但是实际运行速度很快

数学知识
试除法判定质数 分解质因数 sqrt(n)
筛质数 nlogn
最大公约数 logn
快速幂 logn

动态规划问题的计算量=状态数量*状态转移的计算量

动态规划
背包问题 k重循环,算法时间复杂度就是$n^k$
最长上升子序列 II nlogn
蒙德里安的梦想 2^{2n}*n
没有上司的舞会 nm

空间复杂度分析

64M

1 Byte = 8 bit

1 KB= 1024 Byte

1 MB=1024*1024 Byte

1 GB=1024 * 1024 * 1024 Byte

int  4 Byte

char 1 Byte

double, long long   6Byte

bool 1 Byte
C++: 为什么bool类型是1 Byte(8 bits)长?

为什么bool类型所需存储空间不是 1 bit, 1 bit就可以覆盖bool类型的值域范围 。

Cpp的数据类型必须就可以通过地址得到的(addressable)。

我们无法通过一位创建一个指针,但是我们可以通过一个自己创建一个指针。

所以, 在Cpp中,Bool类型的大小是一个字节。

64MB=2^26Byte

2^26Byte /4 =2^24 int

=1.6*10^7 int
注意

递归也是需要空间的,递归调用了系统栈,快速排序使用了递归,所以空间复杂度是O(logn)

15 评论


用户头像
张驰   2021-01-30 23:18      2    踩      回复

double和long long是8个byte吧,是不是写错了?


用户头像
思zhao百瑞   2024-05-18 16:47         踩      回复

感谢!


用户头像
小猫你可以吃芝士汉堡   2024-02-16 16:37         踩      回复

orz


用户头像
seedlesscute   2023-11-07 17:54         踩      回复

收藏


用户头像
seedlesscute   2023-11-07 17:54         踩      回复

double和long long写错了吧


用户头像
曦_36   2022-04-11 11:19         踩      回复

收藏夹吃灰


用户头像
qqqqqqqq   2022-03-11 17:56         踩      回复

果断收藏


用户头像
芙拉迪蕾娜-米利泽   2022-03-05 01:28         踩      回复

果断收藏


用户头像
IAG丶Skipper   2022-02-15 20:05         踩      回复

埃氏筛法时间复杂度是O(nloglogn)

用户头像
月下涼風   2022-02-28 16:30         踩      回复

埃氏筛$O(n\log n)$
线性筛$O(n\log \log n)$


用户头像
kuntl.21   2021-05-12 16:55         踩      回复

蒙德里安的梦想 2^(2n)*n 没有上司的舞会是O(n)


用户头像
实干者   2021-02-06 16:45         踩      回复

果断收藏


用户头像
Alain   2020-09-06 23:48         踩      回复

背包的时间复杂度我觉得是nk呢

用户头像
Keven11   2021-08-20 16:37         踩      回复

n^k


用户头像
cht   2020-07-29 17:20         踩      回复

果断收藏


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息