時間空間複雜度分析
阿新 • • 發佈:2022-03-14
c++一般1s能夠計算107~108
一般ACM或者筆試題的時間限制是1秒或2秒。
在這種情況下,C++程式碼中的操作次數控制在 107∼108為最佳。
下面給出在不同資料範圍下,程式碼的時間複雜度和演算法該如何選擇:
- n ≤ 30 , 指數級別, dfs+剪枝,狀態壓縮dp(n皇后,八數碼,蒙德里安的夢想)
- n ≤ 100 => O(n^3),floyd,dp,高斯消元
- n ≤ 1000 => O(n ^ 2),O(n ^ 2 * logn),dp,二分,樸素版Dijkstra、樸素版Prim、Bellman-Ford
- n ≤ 10000 => O(n ∗ √n) 塊狀連結串列、分塊、莫隊
- n ≤ 100000 => O(nlogn) => 各種sort,線段樹、樹狀陣列、set/map、heap、拓撲排序、dijkstra+heap、prim+heap、Kruskal、spfa、求凸包、求半平面交、二分、CDQ分治、整體二分、字尾陣列、樹鏈剖分、動態樹
- n ≤ 1000000 => O(n), 以及常數較小的 O(nlogn) 演算法 => 單調佇列、 hash、雙指標掃描、並查集,kmp、AC自動機,常數比較小的 O(nlogn) 的做法:sort、樹狀陣列、heap、dijkstra、spfa
- n ≤ 10000000 => O(n),雙指標掃描、kmp、AC自動機、線性篩素數
- n ≤ 10^9 => O(√n),判斷質數
- n ≤ 10^18 => O(logn),最大公約數,快速冪,數位DP
程式碼時間複雜度分析
- 看迴圈
- 遞迴,比如快排,一般logn層遞迴,每層需要O(n)的時間複雜度
- 並查集
- 路徑壓縮
- 按秩合併
- 兩個優化可以使得並查集達到O(log(logn)),單純路徑壓縮可以達到O(nlogn)
- 並查集
- 排列數字,O(n! * n),總共有n!中結果,每次需要複製結果需要O(n)的時間
- dp的問題計算量 = 狀態數量 * 狀態轉移的計算量,(沒有上司的舞會,每個點只會遍歷一次,所以時間複雜度為O(n))
空間複雜度
一個 int 4 byte,char 1 byte,double / long long 8 byte, bool 1 byte,題目一般給64MB = 2 ^ 26 byte, (2 ^ 26) / 4 = 16 * 1024 * 1024
1 byte = 8 bit
1 KB = 1024 byte
1 MB = 1024 * 1024 byte