衡量一个算法的快慢,一定要考虑数据规模的大小。一般来说,数据规模越大,算法的用时就越长。而在算法竞赛中,我们衡量一个算法的效率时,最重要的不是看它在某个数据规模下的用时,而是看它的用时随数据规模而增长的趋势,即时间复杂度。
一般编程题的时间限制是1秒或2秒 ,在这种情况下,C++代码中的操作次数控制在 为最佳。
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
时间复杂度 | 对应的数据规模上限(1s时限) | 算法 |
| - | - |
高精度加减、FFT/NTT | ||
高精度乘除 | ||
最大公约数、快速幂、数位DP | ||
| 判断质数 | |
| 单调队列、 hash、双指针扫描、并查集、kmp、AC自动机 | |
各种sort、线段树、树状数组、set、map、heap、拓扑排序、dijkstra+heap、prim+heap、Kruskal、spfa、求凸包、求半平面交、二分、CDQ分治、整体二分、后缀数组、树链剖分、动态树 | ||
| 块状链表、分块、莫队 | |
dp、二分、朴素版Dijkstra、朴素版Prim、Bellman-Ford | ||
| floyd、dp、高斯消元 | |
| dfs+剪枝、状态压缩dp | |
|
| - |
| - |
每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容
点个赞,关注一下呗~