友友们好(^-^)🌹🌹🌹,我是杨枝,一枚在算法领域迈步的呆萌的博主呀~
目前还是一只纯纯的菜汪🐶。 典型的又菜又爱闹那种👀,做不好很多事,说不好很多话,写题还总不Ac😅,还在努力还在前进👣。
因为了,你们对我来说都是是独一无二的呀💓。在点开这篇文章的那一刻,我相信,我们之间相互需要彼此啦🌹🌹
时刻谨记:认真写算法,用心去分享。不负算法,不误卿。 感谢相遇(^㉨^)
💓前序
🌟一、由数据范围反推算法复杂度以及算法内容
一般算法题的时间限制是1秒或2秒。
在这种情况下,C++代码中的操作次数控制在 1 0 7 ∼ 1 0 8 10^7 \sim 10^8 107∼108 ,大概就是一亿次运算的样子为最佳。
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
接下的内容是一个很宽泛但是也很实用的总结,不用刻意的背诵,很难暴力的记住,建议收藏,假如感觉忘记了,就翻开看一下,更加符合人类的记忆遗忘曲线,用这种方式进行迭代记忆会更轻松 ^ - ^
1. n ≤ 30 n≤30 n≤30, 指数级别, dfs+剪枝,状态压缩dp
2. n ≤ 100 n≤100 n≤100 => O ( n 3 ) O(n^3) O(n3),floyd,dp,高斯消元
3. n ≤ 1000 n≤1000 n≤1000 => O ( n 2 ) O(n^2) O(n2), O ( n 2 l o g n ) O(n^2logn) O(n2logn),dp,二分,朴素版Dijkstra、朴素版Prim、Bellman-Ford
4. n ≤ 10000 n≤10000 n≤10000 => O ( n ∗ n ) O(n∗\sqrt n) O(n∗n),块状链表、分块、莫队
5. n ≤ 100000 n≤100000 n≤100000 => O ( n l o g n ) O(nlogn) O(nlogn) => 各种sort,线段树、树状数组、set/map、heap、拓扑排序、dijkstra+heap、prim+heap、Kruskal、spfa、求凸包、求半平面交、二分、CDQ分治、整体二分、后缀数组、树链剖分、动态树
6. n ≤ 1000000 n≤1000000 n≤1000000 => O ( n ) O(n) O(n)