[英]Calculating time complexity of recursive algorithm.
我剛剛開始解決Topcoder算法問題,並用Java編寫了針對SRM 466 Div 2 LotteryTicket問題的算法。
由於我對時間復雜度不好,因此如果有人可以向我解釋如何逐步計算此算法的時間復雜度。
public static String buy1(int price,int...b){
int sum=0; String stat="IMPOSSIBLE";
for(int i=0;i<b.length;i++)
sum=sum+b[i];
if(sum==price)
return "POSSIBLE";
if(b.length>1){
stat=buy1(price,Arrays.copyOfRange(b,0,b.length-1));
stat=buy1(price,Arrays.copyOfRange(b,1,b.length));
}
return stat;
}
對於您的情況,遞歸關系為(讓b.length()為bn)
___________buy1(p,bn-1) (as (b,0,b.length-1) equivalent is bn-1 in number )
/
buy1(p,bn) ____/
\
\___________ buy1(p,bn-1) (as (b,1,b.length) equivalent is bn-1 in number )
所以我們的問題是n = n-1的兩個子問題,因此我們的時間函數T(n)如下
T(n)=2T(n-1)+c (For convenience lets eliminate c as it is very less compared to T(n) for this instance )
T(n)=2[2(T(n-2))]
T(n)=2{2[2(T(n-3))]} ===> 2poweri(T(n-i)) -------- equation(1)
當滿足基本條件時,重復結束。 假設T(0)= c(是基本條件),這意味着t(ni)= t(0)是基本條件。所以i = n
將i值代入方程式(1),我們得到2power(n){t(0)}
因此我們的時間函數值將為2power(n),程序的復雜度等於bigoh(2power(n))
有趣的問題。 讓我們正確地計算它;)因此,當條件(sum ==價格)永遠不會出現時,我們將檢查最壞的情況。
首先,讓我們在b.length = 1時檢查完整性。然后,在循環內僅應使用一個“ =”操作:
for(int i=0;i<b.length;i++)
和2內部初始化:
int sum=0; String stat="IMPOSSIBLE";
下一步。 讓我們為N計算此任務。首先,您需要在循環的第一個內部執行N“ =”操作,在初始化內部執行2個操作,在if內部執行2個操作。
stat=buy1(price,Arrays.copyOfRange(b,0,b.length-1));
stat=buy1(price,Arrays.copyOfRange(b,1,b.length));
在遞歸步驟中進行另一個操作。 因此,對於這種情況,我們可以使用遞歸公式,等於:
f(n)= 4 + n + 2 * f(n-1),f(1)= 3
該方程的解為:f(n)= -6 + 5 * 2 ^ nn
因此,您的算法的靈活性是指數級的。 O(2 ^ n)我忽略了除“ =”之外的所有其他運算,因為它們不會改變漸近復雜度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.