出處: 演算法第四版 edition sedgewick 著,問題 1.4.7
三道小題初看覺得很簡單,但是仔細一分析,a、b小題裡面的內迴圈操作次數是和外層的n、i值有關,並不是簡單的操作n次,很久沒有算過時間複雜度了,稍微感到有點棘手。
public
static
voidfa(
int n)
} system.out.
println
(sum);}
public
static
voidfb(
int n)
} system.out.
println
(sum);}
public
static
voidfc(
int n)
} system.out.
println
(sum)
;}
從直覺上來說a和b的操作次數是差不多的,但是實際**執行兩者差別很大
a小題
如果按照通常的方法,分析for有多少個,那麼分析起來會很痛苦,外層迴圈是o(l
ogn)
o(logn)
o(logn
)的操作很容易看出來,但是第二個for,i和n是掛鉤的,這個時候通常的方法就不起作用了。
換一種思路,先寫一下sum++
操作的執行次數
n n/2 n/4 ... 1
,這實際上是乙個等比為2的等比數列,我們把這個數列記為l,它的項數為n
注意到第n項等於1,而l的首項是n,那麼1=n
∗21−
n1=n*2^
1=n∗21
−n,得出n=l
og2(
n)+1
n=log_2(n)+1
n=log2
(n)
+1對l用等比公式求和,sn=
n∗1−
(12)
n1−1
2s_n=n*\frac)^n}}
sn=n∗
1−21
1−(
21)
n=n (2
n−1)
n(2^n-1)
n(2n−1
),把n帶入,化簡即可得到2n−
12n-1
2n−1
也就是說內迴圈的總操作次數是2n,那麼它其實就是o(n
)o(n)
o(n)
級別的演算法
b小題
b小題其實和a小題很相似,只不過b的數列變為
1 2 4 … n,等比為2,同樣是n項
n同樣等於log
2(n)
+1log_2(n)+1
log2(
n)+1
,因為2n−
1=n2^=n
2n−1=n
而l的和 sn=
n∗1−
2n1−
2s_n=n*\frac
sn=n∗
1−21
−2n
=n (2
n−1)
=2n−
1n(2^n-1)=2n-1
n(2n−1
)=2n
−1,那麼b也是o(n
)o(n)
o(n)
級別的演算法
c小題
c小題用常規的做法做即可,c是o(n
logn
)o(nlogn)
o(nlog
n)級別的演算法
解釋一下a,b同為o(n)級別的演算法,為什麼它們實際操作次數卻不一樣,因為o(n)取的是近似值,剩餘的較低次項都被忽略了,但是實際計算中低次項的次數同樣很關鍵,因此a,b的執行次數會不一樣
參考:
時間複雜度計算
定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式 t n 稱為這一演算法的 時間複雜性 當輸入量n逐漸加大時,時間複雜性的極限情形稱為演算法的 漸近時間複雜性 我們常用大o表示法表示時間複雜性,注意它是某乙個演算法的時間複雜性。大o表示只是說有上界,由定義如...
時間複雜度計算
1,演算法複雜度是在 資料結構 這門課程的第一章裡出現的,因為它稍微涉及到一些數學問題,所以很多同學感覺很難,加上這個概念也不是那麼具體,更讓許多同學複習起來無從下手,下面我們就這個問題給各位考生進行分析。首先了解一下幾個概念。乙個是時間複雜度,乙個是漸近時間複雜度。前者是某個演算法的時間耗費,它是...
計算時間複雜度
求解演算法的時間複雜度的具體步驟是 找出演算法中的基本語句 演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。計算基本語句的執行次數的數量級 只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的係數。這樣能...