ACM中演算法複雜度估算經驗

2022-07-24 08:36:09 字數 1110 閱讀 1337

oj和正式的比賽一定會寫明評測機各引數的,如果只是想比較準確的知道實際評測的效率,可以搞一些無聊的大遞迴交上去試試(比如1e8次求mod),最多不過幾個tle/wa而已。好在大家的機器基本上差不多,除非碰到惡意卡常數的情況,否則憑藉一般人的常識足夠了(比如1e4^2臉沒洗好不要試,幾e6的規模nlgn多半能賭一下常數和資料放水,1e8線性演算法交之前看好自己的常數,再大就想想sqrt和log)。

自己**的話:

有個好方法:隨便來個極限資料,拿自己的機器跑一下(如果你覺得自己的機器太快,可以將自機的0.5s當成1s)。

如果資料不好構造,演算法複雜度一眼看不出怎麼辦?(我感覺下面這部分全是跑題)

乙個完整的題目可能由好幾個步驟構成,我們分類來看一下各種小的情況~

dp:dp的分析一般比較簡單,狀態和轉移都是自己設計的,複雜度基本沒什麼懸念,如果你用了複雜的結構來搞各種優化,多想想平攤分析一般還是沒什麼壓力的。

圖結構、資料結構:

這類題經典模板用的比較多,將幾層經典演算法組合在一起也很常見,分析有壓力的話(一般不會)加起來就好了,平攤分析有時候也很給力的。

貪心:貪心能夠超時可不多見……如果你使用了某些複雜的估價方法,一步步分析吧(哦有些時候也許可以平攤)。

網路流(這個單獨說):

網路流超時一般只有三種情況:

你建圖建傻了 or 這個模型的一些特性使得它可以被優化成其他演算法 or 你寫錯了

不要去考慮什麼o(v^2e),那是每次都考慮很差情況分析出來的。一般來說比賽中分析網路流的複雜度毫無意義……

字串:

嗯……c/c++的各種函式速度還是不錯的,常數沒有有些時候我們相信的那樣可怕。一般來說,匹配演算法等等經典模板分析不動直接記住就可以了,複雜的串處理一般都是卡編碼時間而不是執行時間。(如果真的遇到了需要分析的情況,說不定平攤分析還可以救命)

模擬:……好像沒什麼值得說的,複雜的模擬一般還是卡編碼時間而不是執行時間。

數學:無論是組合、數論、還是數字統計你多半的思考時間是在壓縮和合併各種資訊上面。看看你要處理的資訊和輸入是什麼關係,你能合併多少資訊。

搜尋:在我心中賽場上能把啟發搜尋分析清楚的都是大神。瘋狂剪枝不一定有好效果(資料可能是特殊的),搜尋題很少見的,多交交……

演算法複雜度 時間複雜度和空間複雜度

1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...

演算法複雜度 時間複雜度和空間複雜度

演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...

演算法複雜度 時間複雜度和空間複雜度

演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...