簡體   English   中英

如何計算DFS算法的時間復雜度?

[英]How to calculate time complexity of DFS algorithm?

像下面的函數一樣,如何計算其時間復雜度? 我認為應該是O(m * n)...

int uniquePaths(int m, int n) {
    if (m < 1 || n < 1) return 0;     
    if (m == 1 && n == 1) return 1;      
    return uniquePaths(m - 1, n) + uniquePaths(m, n - 1);
}

您可以使用遞歸函數T(m,n) = T(m-1, n) + T(m, n-1)建模時間復雜度,其中T(1,1)=1T(m,n)=0每當min(m,n)<1

看起來像T(m,n)=(m+n choose m) 可以看到,通過二項式系數遞歸(m+n choose n) = (m+n-1 choose m) + (m+n-1 choose m-1) ,並且T(m,n) = T(m-1, n) + T(m,n-1)完全相同。

因此T(m,n) = O((m+n)^n / n!) (還有許多其他界限 。)

遞歸樹:

為了表示m = M和n = N的問題,我們將其寫為<M, N> 如果我們嘗試繪制此問題的遞歸樹:

  • 從根本上講,我們有一個問題: <M, N>
  • 然后,root打破了兩個問題: <M-1, N><M, N-1>
  • 而且,如果我們繼續沿遞歸樹向下移動,將到達<0, 0>葉子。

樹的深度:

但是,這棵樹最大可能的深度是多少? 1 (M + N)。 此外, 每個節點<M, N>可以中斷至多兩條路徑,即。 <M-1, N><M, N-1>


從樹推斷復雜度:

那么,最大可能的葉子數是多少? (提示:2 (M + N)

好吧,由於每個節點都分解為兩個節點,所以在每個級別上,葉子的數量將乘以2,從根的1開始。

  • 因此,從根開始,總數可能為2 (M + N-1)
  • 乘以除以2得到(1/2)* 2 (M + N)
  • 擺脫常數值(1/2),我們得到的復雜度= 2 (M + N)

因此,算法的復雜度可以上限為O(2 (m + n) )。


1最長的路徑將從<M, N> ,首先到<0, N> 然后從那里轉到<0, 0> 因此,最長可能的路徑長度= M +N。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM