递归算法的空间复杂度界限

时间:2018-03-30 22:50:48

标签: algorithm space-complexity

所以我有一个接缝雕刻功能:

int seamCarve(int i, int j, int width)
{
   if(j < 0 || j >= width) //width is just a constant
      return INT_MAX;
   if (i == 0)
      return e(i,j);  //just some int value in this case

   int best = INT_MAX;
   for(int k = -1; k <=1; k++)
     best = min(best, seamCarve(i - 1, (j+k) % width),width));

   return best + e(i,j);
}

我无法看到此功能的空间复杂性。 空间复杂度是算法所需的额外变量(空间)的数量,据我所知。在这种情况下,它是int best

这是我的分析:当i == 0时,空间复杂度将为O(1),因为它甚至不会创建额外的变量。所以这将是下限。 对于上限,它将是O(i ^ 3),因为有一个for循环迭代3次。在for循环中,它也会调用seamCarve。因此,best更改的最长时间将是i ^ 3次。

我的分析有问题吗?

1 个答案:

答案 0 :(得分:0)

实际上看起来它会是O(3 ^ n)。调用参数看起来像:

level1: (i, 0)
level2: (i-1, -1), (i-1, 0), (i-1, 1)
level3: (i-2, -2), (i-2, -1), (i-2, 0), (i-2, -1), (i-2, 0), (i-2, 1),(i-2, 0), (i-2, 1), (i-2, 2)

如果已经计算出seamCarve()结果被存储并重复使用,那么它将只是O(i * width)。假设S正在开始(i, j)而X是需要计算的点:

0-----width 

XXXXXXXXXXX  0
XXXXXXXXXXX  |
XXXXXXXXXXX  |
XXXXXXXXXXX  |
XX..XXXXXXX  |
X....XXXXXX  |
......XXXXX  |
.......XXX.  |
........S..  i