我正在研究算法的複雜性,我仍然無法確定一些算法的複雜性......好吧,我能夠找出基本的O(N)和O(N^2)循環,但我是具有程序給出了一些困難像這樣的:如何有效計算算法的時間複雜度?
// What is time complexity of fun()? int fun(int n) { int count = 0; for (int i = n; i > 0; i /= 2) for (int j = 0; j < i; j++) count += 1; return count; }
好吧,我知道,有些人可以閉眼計算這一點,但我很想看到一個「臺階」的「一步」如何如果可能的話。
我首先要解決這將是「模擬」的輸入,並把該值在某種表的,像下面的嘗試:
for n = 100 Step i 1 100 2 50 3 25 4 12 5 6 6 3 7 1
確定在這一點上我假設這循環是O(logn),但不幸的是,正如我所說的沒有人通過「步驟」解決這個問題的「步驟」,所以最後我不知道做了什麼線索......
如果內循環我可以建立一些像下面這樣的表格:
for n = 100 Step i j 1 100 0..99 2 50 0..49 3 25 0..24 4 12 0..11 5 6 0..5 6 3 0..2 7 1 0..0
我可以看到,這兩個循環會減少,我想一個公式可以根據以上數據可以得出...
有人能澄清這個問題? (答案是O(n))
模擬它可以給你的直覺,而是得到一個明確的答案的唯一方法是分析得出的。 –
是的,我明白...但我怎麼能一步一步知道這個算法是O(n)? – marcoshass
您已經計算了操作次數。它是n + n/2 + n/4 + ... + 1.n + n/2 + n/4 + ... + 1' <= n * SUM(1/2^k) = [0,INF)'<='N * 2'∈'爲O(n)' – DAle