所以我有一个接缝雕刻功能:
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次。
我的分析有问题吗?
答案 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