ACM模板——測試時間複雜度
阿新 • • 發佈:2019-01-07
案例:
#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a); #define INF 0x3f3f3f3f using namespace std; typedef long long ll; set<int> st; void init() { st.clear(); for(int i=0;i<1000000;i++) { st.insert(i+1); } } void foo() { long i; for (i=0;i<1000000000;i++) { long a= 0; a = a+1; } } void foo_set_count() { for(int i=0;i<1000000;i++) { st.count(i+1); } } void test() { double dur; clock_t start,end; start = clock(); // do something... // foo(); foo_set_count(); end = clock(); dur = double(end - start); printf("Use Time: %f\n",(dur/CLOCKS_PER_SEC)); } int main() { init(); test(); return 0; }
結果:
解析:
- clock() 函式返回從 “開啟這個程式程序” 到 “程式中呼叫 clock() 函式” 時之間的 CPU 時鐘計時單元(clock tick)數,在MSDN 中稱之為掛鐘時間(wal-clock)常量 CLOCKS_PER_SEC,它用來表示一秒鐘會有多少個時鐘計時單元。並且用 clock_t 方法來做時間差的優點:支援 Linux + Windows 系統。
- 需要測試哪個方法就把該方法放到時間差變數的中間位置,千萬不要把之前的預備工作也放入在內,以免結果有誤差。而且最好不要單個測試,最好弄個 for 迴圈來多跑 N 次(最後的結果除以 N),以免出現偶然性。
- 一般情況,1s 可以跑 10^8 次數量級單位,OJ 評測比本機應該要更快個(1~10)倍之間不等。
- 執行一次 st.count() 方法:0.669 * 10^8 / 10^6 == 66.9 數量級單位。log(2,10^6) (下2,上10^6) ==19.93。又因為 OJ 與本機之間有幾倍的誤差,所以可以看為這個結果是有效的。所以 set.count() 屬於 O(logn) 級別。