1. 程式人生 > 其它 >時間空間複雜度分析

時間空間複雜度分析

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