算法複雜度:算法
複雜度計算出來後有什麼用?網絡
估計程序可否在規定時間內處理題目指定規模的數據數據結構
ACM有時間限制1s函數
「規模」的舉例優化
1.給N個數排序 規模:N編碼
2.判斷字符串P是不是字符串T的子串 規模:串的長度|P|和|T|spa
3.判斷一個整數是否屬於整數集合S 規模:|S| 要判斷多少次(查詢次數)設計
4.圖中某兩個點的最短路徑/求連通圖的最小生成樹 規模:頂點數 邊數排序
5.給一個整數集合S,問是否存在S的一個非空子集T,知足T中全部元素的和爲零 規模:|S|遞歸
算法運算次算:
當代計算機1s內可作10^7左右次計算,配置好的機器可到k*10^7~10^8
在這個限制下時間複雜度必定的算法存在能處理的規模上限
轉載:
OJ和正式的比賽必定會寫明評測機各參數的,若是隻是想比較準確的知道實際評測的效率,能夠搞一些無聊的大遞歸交上去試試(好比1e8次求mod),最多不過幾個TLE/WA而已。好在你們的機器基本上差很少,除非碰到惡意卡常數的狀況,不然憑藉通常人的常識足夠了(好比1e4^2臉沒洗好不要試,幾e6的規模nlgn多半能賭一下常數和數據放水,1e8線性算法交以前看好本身的常數,再大就想一想sqrt和log)。
本身代碼的話:
有個好方法:隨便來個極限數據,拿本身的機器跑一下(若是你以爲本身的機器太快,能夠將自機的0.5s當成1s)。
若是數據很差構造,算法複雜度一眼看不出怎麼辦?(我感受下面這部分全是跑題)
一個完整的題目可能由好幾個步驟構成,咱們分類來看一下各類小的狀況~
DP:
DP的分析通常比較簡單,狀態和轉移都是本身設計的,複雜度基本沒什麼懸念,若是你用了複雜的結構來搞各類優化,多想一想平攤分析通常仍是沒什麼壓力的。
圖結構、數據結構:
這類題經典模板用的比較多,將幾層經典算法組合在一塊兒也很常見,分析有壓力的話(通常不會)加起來就行了,平攤分析有時候也很給力的。
貪心:
貪心可以超時可很少見……若是你使用了某些複雜的估價方法,一步步分析吧(哦有些時候也許能夠平攤)。
網絡流(這個單獨說):
網絡流超時通常只有三種狀況:
你建圖建傻了 or 這個模型的一些特性使得它能夠被優化成其餘算法 or 你寫錯了
不要去考慮什麼O(V^2E),那是每次都考慮不好狀況分析出來的。通常來講比賽中分析網絡流的複雜度毫無心義……
字符串:
嗯……C/C++的各類函數速度仍是不錯的,常數沒有有些時候咱們相信的那樣可怕。通常來講,匹配算法等等經典模板分析不動直接記住就能夠了,複雜的串處理通常都是卡編碼時間而不是執行時間。(若是真的遇到了須要分析的狀況,說不定平攤分析還能夠救命)
模擬:
……好像沒什麼值得說的,複雜的模擬通常仍是卡編碼時間而不是執行時間。
數學:
不管是組合、數論、仍是數位統計你多半的思考時間是在壓縮和合並各類信息上面。看看你要處理的信息和輸入是什麼關係,你能合併多少信息。
搜索:
在我心中賽場上能把啓發搜索分析清楚的都是大神。瘋狂剪枝不必定有好效果(數據多是特殊的),搜索題不多見的,多交交……