Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 递归算法的时间复杂度_Algorithm_Recursion_Time Complexity - Fatal编程技术网

Algorithm 递归算法的时间复杂度

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()) {

我有一个带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#包含(对象)
    以线性时间运行
  • 我如何找到时间复杂性?我的做法是:

    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用于表示下限,这正是您在这里需要的。。。