存在常數 c,使得當 n >= c 時 t(n) <= f(n),表示為 t(n) = o(f(n))意思就是o(f(n))表示的是t(n)的增長速度,由於t(n)可以看做是漸進於o(n),所以這也叫做演算法時間複雜度的漸進表示法。
做題技巧
考試中做題還是最重要的。
for
(int i =
0; i < n;
++i)
這裡有n個o(1),所以演算法時間複雜度是o(n)。如果我們暴力套一堆迴圈。
for
(int i =
0; i < n;
++i)
}}
那麼很顯然,演算法複雜度就是o(n³)。
再來乙個,要注意這裡內迴圈的初始值是i。
for
(int i =
0; i < n;
++i)
for(
int j = i; j < n;
++j)
printf
("校草喜歡校花"
);
很顯然,內迴圈執行了log2
(n)\log_2(n)
log2(
n)次,所以t(n
)=o(
logn)
t(n) = o(\log n)
t(n)=o
(logn)
對付這種程式數迴圈個數就夠了。很顯然聯賽不會考這麼簡單的 。
long
fun(
int n)
else
}
好,你厲害,一眼看出是斐波那契數列然後默寫了個複雜度。那看不出來豈不完蛋了!其實在賽場上可以手推得,有高中的數學基礎就可以了。
這個時間複雜度可以寫成乙個遞推式:
t (0
)=t(
1)=1
t(0) = t(1) = 1
t(0)=t
(1)=1t(
n)=t
(n−1
)+t(
n−2)
,n≥2
t(n) = t(n-1) + t(n-2) ,n\geq2
t(n)=t
(n−1
)+t(
n−2)
,n≥2
驚不驚喜,意不意外,計算fun(n)的次數就是 計算fun(n-1)的次數加上fun(n-2)的次數。所以fun(n)計算次數就是fun(n),也就是斐波那契數列第n項。
於是大筆一揮寫出答案 t(n
)=o(
fun(
n))t(n) = o(fun(n))
t(n)=o
(fun
(n))
。這道題是2023年提高組初賽第7題,我們就這麼做出來了。
總結一下,演算法複雜度分析,先轉遞推式,然後把能拆的全拆開,再數項數
來個真題
)…每次都n/2,所以總共拆logn
\log n
logn次⇒t(
n)=n
logn+
nlog(
n2)+
nlog
(n22
)+..
....
+nlog(n
2logn
)\rightarrow t(n) =n \log n +n\log(\frac)+ nlog(\frac)+......+ n\log(\frac})
⇒t(n)=
nlogn+
nlog(2
n)+
nlog
(22n
)+.
....
.+nlog(2
lognn
)總共有logn項
⇒ t(
n)<
nlog2
n\rightarrow t(n)⇒t
(n)<
nlog2n
所以選c。
通俗的一塌糊塗的總結
碰到這類題,先化遞推式,然後把遞推式全拆開。拆的過程中要注意數與數之間的關係,得出總共能拆幾層,然後寫成一排,合併同類項,再找出不可忽略的項(比如最高次項)一般帶log的和指數特別大的基本上都是重點 歸納表示式,填答案。
賽場上最重要的是冷靜,近幾年演算法複雜度分析最多也就一兩道選擇題,實在做不出還是好好抓後面的大題吧,有時間再回過來做。
以及,演算法導論是個好東西,有空還是要看看。
演算法的複雜度 演算法的時間複雜度和空間複雜度
在一次筆試題目中,發現了自己對於演算法的時間複雜度問題上並沒有完全清晰這個概念和計算方法,故上網尋找到比較好的詳細介紹來學習。演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也...
演算法的複雜度 時間複雜度與空間複雜度
通常,對於乙個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式 數學歸納法等。而在證明演算法是正確的基礎上,第二步就是分析演算法的時間複雜度。演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很...
演算法中的時間複雜度和空間複雜度
演算法 algorithm 是指用來運算元據 解決程式問題的一組方法。對於同乙個問題,使用不同的演算法,也許最終得到的結果是一樣的,但在過程中消耗的資源和時間卻會有很大的區別。那麼我們應該如何去衡量不同演算法之間的優劣呢?主要還是從演算法所占用的 時間 和 空間 兩個維度去考量。因此,評價乙個演算法...