簡體   English   中英

遞歸算法的時間復雜度

[英]Time complexity of recursive algorithm

我有一個帶有x邊字段的網格。 每個字段都包含一個指向x個周圍字段的鏈接。 [ x是常數 ]

我有一個在此領域中實現的算法(可能可以對其進行優化):

[類似於偽代碼的Java]

public ArrayList getAllFields(ArrayList list) {

  list.addToList(this);

  for each side {
    if ( ! list.contains(neighbour) && constantTimeConditionsAreMet()) {
      neighbour.getAllFields(list) //Recursive call
    }
  }

  return list;

}

我很難找到時間的復雜性。

  • ArrayList#contains(Object)在線性時間內運行
  • 如何找到時間復雜度? 我的方法是這樣的:

    T(n) = O(1) + T(n-1) +
    c(nbOfFieldsInArray - n) [The time to check the ever filling ArrayList]
    
    T(n) = O(1) + T(n-1) + c*nbOfFieldsInArray - cn
    

    這會給我T(n) = T(n-1) + O(n)嗎?

    您添加到代碼中的注釋沒有幫助。 getContinent什么作用?

    無論如何,由於對列表中的每個潛在加法都使用了線性搜索( ArrayList.contains ),因此看起來復雜度將為Omega(n ^ 2)。

    您的復發似乎是正確的T(n) = T(n-1) + theta(1)

    如果您繪制遞歸樹,您會發現您有一個分支,值分別為theta(n-1), theta(n-2), ..., theta(2), theta(1)獲得算術級數1 + 2 + 3 + ... + n的所有級別

    S1 = 1+2+3+...+n
    

    如果您定義

    S2 = n+...+3+2+1
    

    然后計算出S1+S2

    S1 + S2 = 2*S1 = (n+1) + (n+1) + ... + (n+1) = n(n+1)
    

    因此

    2*S1 = n(n-1) => S1 = n(n-1)/2
    

    這意味着T(n) = 1/2 theta(n(n-1)) = 1/2 theta(n^2) = theta(n^2)

    暫無
    暫無

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

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