[英]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.