【问题标题】:Complexity of recursive function递归函数的复杂性
【发布时间】:2019-08-27 03:26:33
【问题描述】:

我正在阅读我遇到的here 及其相应解决方案的问题。声明如下:

给定源点 (x1, y1) 的坐标确定是否有可能到达目标点 (x2, y2)。从任何点 (x, y) 开始,只有两种类型的有效运动: (x, x + y) 和 (x + y, y)。如果可能,则返回布尔值 true,否则返回 false。

我了解递归是如何解决这个问题的,但我在考虑它的复杂性是如何工作的。我正在考虑从 (1,1) 开始到达任意 (x,y) 的最坏情况 - 在这种情况下有多少递归调用?我在尝试计算递归调用的数量时遇到了困难,所以我非常感谢关于调用数量的解释或说明。提前致谢

【问题讨论】:

  • 为算法定义了复杂度。你能提供你用来解决这个问题的算法吗?
  • stackoverflow.com/a/56598475 描述了一种O(n) 算法并暗示了一种O(log(n)) 算法。但正如 Yuri 所说,大 O 符号是关于算法而不是问题。

标签: recursion time-complexity


【解决方案1】:

要为此编写递归算法,我们可以假设如下:

bool possible(Point src(x1,y1), Point dst(x2,y2))
{
    if((x1 > x2) || (y1>y2))
        return False;
    if(src == dst)
        return True;

    Point p1 = Point(x1 , x1+y1);
    Point p2 = Point(x1+y1 , y1);

    return(possible(p1,dst) || possible(p2,dst));
}

对于时间复杂度,我们需要考虑函数被调用的最大次数。如果我们考虑树,这将是深度优先搜索,每次我们增加y 的值直到它到达y > y2 的位置。然后我们回到增加x 的值。我的猜测是O(max((y2-y1) , (x2-x1));因为在最坏的情况下,我们会一个接一个地向下遍历树,直到 xy 的值(取决于此处的顺序:return(possible(p1,dst) || possible(p2,dst)))大于 dst 点的相应值。

【讨论】:

    【解决方案2】:

    不失时间复杂度的一般性,令 x1 = y1 = 1 和 x2 = y2 = n。

    递归调用将生成二叉树。因为 x1 和 y1 都是 1,所以二叉树第 i 层的最高 x 和 y 值将是第 i 个斐波那契数。由于第 i 个斐波那契数约为 1.618 的第 i 个幂,因此树的高度为 O(log(n))。二叉树的节点数为 O(2^h),其中 h 是树的高度,因此该算法将进行 O(2^log(n)) 次递归调用,这意味着它是 O(n)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2017-09-04
      • 2018-08-18
      相关资源
      最近更新 更多