Algorithm 递归算法的时间复杂度
我有一个带x边场的网格。每个字段都包含指向其周围x个字段的链接。[x是常数] 我有一个在这个领域实现的算法(可能可以优化): [类java伪代码]Algorithm 递归算法的时间复杂度,algorithm,recursion,time-complexity,Algorithm,Recursion,Time Complexity,我有一个带x边场的网格。每个字段都包含指向其周围x个字段的链接。[x是常数] 我有一个在这个领域实现的算法(可能可以优化): [类java伪代码] public ArrayList getAllFields(ArrayList list) { list.addToList(this); for each side { if ( ! list.contains(neighbour) && constantTimeConditionsAreMet()) {
public ArrayList getAllFields(ArrayList list) {
list.addToList(this);
for each side {
if ( ! list.contains(neighbour) && constantTimeConditionsAreMet()) {
neighbour.getAllFields(list) //Recursive call
}
}
return list;
}
我很难找到时间的复杂性
ArrayList#包含(对象)
以线性时间运行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)
。getContinental
做什么
在任何情况下,由于对列表中的每个可能的添加项都使用线性搜索(
ArrayList.contains
),因此复杂性看起来将是ω(n^2)。添加到代码中的注释没有帮助。getContinental
做什么
在任何情况下,由于您对列表中的每个潜在添加都使用线性搜索(
ArrayList.contains
),因此看起来复杂性将是ω(n^2)。您的重复似乎是正确的T(n)=T(n-1)+θ(1)
如果你画递归树,你会注意到你有一个带有值θ(n-1),θ(n-2),…,θ(2),θ(1)
的分支,如果你把所有得到
如果你定义
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
这意味着你的重复似乎是正确的 如果你画递归树,你会注意到你有一个带有值
θ(n-1),θ(n-2),…,θ(2),θ(1)
的分支,如果你把所有得到
如果你定义
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θ(n(n-1))=1/2θ(n^2)=θ(n^2)递归调用要发生在哪里?“GetContinental”就是“getAllFields”吗?我在代码中添加了一条注释:)将列表更改为哈希表,您有一个O(n)算法,其中n=字段数:)我正计划这样做。你同意现在的算法是O(n^2)吗?递归调用应该发生在哪里?“GetContinental”就是“getAllFields”吗?我在代码中添加了一条注释:)将列表更改为哈希表,您有一个O(n)算法,其中n=字段数:)我正计划这样做。你同意现在的算法是O(n^2)吗?非常抱歉,我以前给它起过不同的名字,我忘了我后来给它改名了,谢谢;这已经是一个提示:)+1:但是挑剔一下:“至少O(n^2)”并没有太大意义。也许你的意思是说ω(n^2)?@白痴:注意到了。虽然我的阅读表明“ω(n^2)”意味着“O大于n^2”,这(我认为)与“至少O(n^2)”相同。不过,我可以看出我的术语信息量是如何减少的。@JIm:它并不是“信息量减少”。从技术上讲,它实际上是没有意义的。更清楚地说:O(n^2)的意思是不比cn^2差:也就是说,BigOh用来表示上界。所以你说的是“至少不比cn^2差”。欧米茄是用来表示下限的,这正是你在这里需要的…非常抱歉,我以前给它起了不同的名字,我忘了我后来重命名了它,谢谢;这已经是一个提示:)+1:但是挑剔一下:“至少O(n^2)”并没有太大意义。也许你的意思是说ω(n^2)?@白痴:注意到了。虽然我的阅读表明“ω(n^2)”意味着“O大于n^2”,这(我认为)与“至少O(n^2)”相同。不过,我可以看出我的术语信息量是如何减少的。@JIm:它并不是“信息量减少”。从技术上讲,它实际上是没有意义的。更清楚地说:O(n^2)的意思是不比cn^2差:也就是说,BigOh用来表示上界。所以你说的是“至少不比cn^2差”。Omega用于表示下限,这正是您在这里需要的。。。