我剛開始學習算法,如何確定此代碼的時間複雜度?
int findMinPath(vector<vector<int> > &V, int r, int c){
int R = V.size();
int C = V[0].size();
if (r >= R || c >= C) return 100000000; // Infinity
if (r == R - 1 && c == C - 1) return 0;
return V[r][c] + min(findMinPath(V, r + 1, c), findMinPath(V, r, c + 1));
}
我想答案應該爲O(R C),但正確的答案是O(2 ^(R C))我不明白爲什麼。請解釋。
它是雙重遞歸的。如果將呼叫映射爲圖形,則會得到一個二進制呼叫樹。算法雖然對我沒有意義。 –
嗯。是不是O((C + R)選擇C),因爲代碼基本上是枚舉從(0,0)到(C,R)的路徑。 ?我認爲這是O(2 ^(RC)),但這是一個非常糟糕的上限。例如,當R = C時,(C + R)選擇C約爲4^R/sqrt(pi * R),其增長速度比2 ^(R^2)慢得多。 –
也許在問題中有一個錯字:O(2 ^(R + C))而不是O(2 ^(RC))?搜索樹的深度至多是R + C,所以2 ^(R + C)是對複雜度的合理的第一近似。當然R + C = O(RC),所以現在的問題在理論上也是正確的,但對我來說沒有多大實際意義(至少對我而言)。 –