如何由数据范围反推算法复杂度以及算法内容

 写在前面:大家好!我是ACfun,我的昵称来自两个单词Acceptedfun。我是一个热爱ACM的蒟蒻。这篇博客来详解一下如何由题目的数据范围反推算法的时间复杂度以及算法的内容。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭!
用知识改变命运,用知识成就未来!加油 (ง •̀o•́)ง (ง •̀o•́)ง

评测机1秒最多可以运行几次

 一般评测机一秒最多可以运行 一亿次10^8次。而一般编程竞赛都会将时间限制为 1000ms1s。在这种情况下,C++ 代码的操作次数控制在 10^7 为最佳。我们可以根据题目给出的数据范围来大致的判断一下对于该题我们使用的算法的时间复杂度大致为多少,也就帮助我们更快的找到可以用什么算法来解决该问题,更快更好的完成题目。

如何根据数据范围判断大致时间复杂度

 下面来给出不同数据范围下应该如何选择算法的时间复杂度以及算法:

数据范围 算法时间复杂度 可选择算法
n ≤ 30 指数级别的算法 暴力搜索、dfs+减枝、状态压缩dp
n ≤ 100 O(n3) floyd,dp
n ≤ 1000 O(n2),O(n2logn) dp,二分,朴素版Dijkstra、朴素版Prim、Bellman-Ford
n ≤ 10000 O(n∗n\sqrt{n}) 块状链表、分块、莫队
n ≤ 100000 O(nlogn) 各种sort,线段树、树状数组、set/map、heap、拓扑排序、dijkstra+heap、prim+heap、spfa、求凸包、求半平面交、二分
n≤1000000 O(n) , 以及常数较小的 O(nlogn) 算法 hash、双指针扫描、并查集,kmp、AC自动机,常数比较小的 O(nlogn)O(nlogn) 的做法:sort、树状数组、heap、dijkstra、spfa
n≤10000000 O(n) 双指针扫描、kmp、AC自动机、线性筛素数
n≤109 O(n\sqrt{n}) 判断质数
n≤1018 O(logn) 最大公约数,快速幂
n≤101000 O((logn)2) 高精度加减乘除
n≤10100000 O(logn×loglogn) 高精度加减、FFT/NTT

参考文档:由数据范围反推算法复杂度以及算法内容


我是ACfun,感谢大家的支持!
如何由数据范围反推算法复杂度以及算法内容