很多時候,我們很容易看到時間複雜度為nlogn的演算法。
我覺得很多人其實和我一樣,可能知道快排的時間複雜度是nlogn。
但是怎麼出來的呢?如何計算這種分治或者遞迴處理的演算法的複雜度呢?
簡單舉個例子,很通用
我們設定解決這個問題需要的時間複雜度為t(n)
處理其中一半的問題時間複雜度為t(n/2),然後加上兩邊問題合起來一起處理一些特殊情況需要o(n)
我們得到t(n) = 2* t(n/2) + c*n…………式子1
把上面式子中n用n/代入
得到t(n/2) = 2 * t(n/4) + c*n/2…………式子2,這裡的4可以寫成2的平方
然後我們把這個得到的式子,代入到式子1裡面去
得到t(n) = 2 * (2*t(n/4) + c*n/2) + c*n
可以繼續算出t(n/4)然後再進行代入
一萬年之後,t(n) = 2^k * t(n/(2^k)) + k*c*n
其中你可以把n/(2^k) = 1
則n = 2^k , k = 以2為底n的對數
t(n) = 2^k * o(1) + k*c*n
前面那項為n
後面那項為n*logn
時間複雜度相加取大值
所以最終的時間複雜度就為nlogn
其實這樣的演算法和題目可能不會一模一樣,但是主要在於的是思路的問題,很多時候我們需要用數學歸納法的思想去一步步的推理,最終得到結論,只要給出乙個第一步的條件就行了。
所以我在這裡也只是介紹這樣的思想,對於具體的演算法來說還是要進行具體的分析。或許這種思想能在以後的面試什麼的地方給你所幫助吧。
遞迴演算法時間複雜度
開篇前言 為什麼寫這篇文章?筆者目前在學習各種各樣的演算法,在這個過程中,頻繁地碰到到遞迴思想和分治思想,驚訝於這兩種的思想的偉大與奇妙的同時,經常要面對的乙個問題就是,對於乙個給定的遞迴演算法或者用分治思想縮小問題規模的演算法,如何求解這個演算法的時間複雜度呢?在google過很多的博文後,感覺這...
遞迴演算法時間複雜度
求遞迴演算法時間複雜度 遞迴樹 遞迴演算法時間複雜度的計算方程式乙個遞迴方程 在引入遞迴樹之前可以考慮乙個例子 t n 2t n 2 n2迭代2 次可以得 t n n2 2 2t n 4 n 2 2 還可以繼續迭代,將其完全展開可得 t n n2 2 n 2 2 2 n 22 2 2 n 23 2 ...
遞迴演算法的時間複雜度
遞迴演算法大家應該都不陌生吧,其實最開始遇見遞迴應該是在數學課上,類似於f x f x 1 f x 1 f 1 1,f 2 4,f 3 3這種數學題大家應該見過不少,其實思想就是層層遞迴,最終將目標值用f 1 f 2 f 3 表示。之前做個乙個需求,需要實現類似作業系統資料夾的功能,我們用mysql...