基本递归函数的运行时复杂度

时间:2019-06-10 15:09:25

标签: recurrence

我试图了解此功能在运行时之间的对比

public static String f(int N) {
    if (N == 0) return "";
    String s = f(N / 2);
    if (N % 2 == 0) return s + s;
    else            return s + s + "x";
}

和此功能

public static String f(int N) {
    if (N == 0) return "";
    if (N == 1) return "x";
    return f(N/2) + f(N - N/2);
}

字符串连接所花费的时间与字符串的大小成正比。

到目前为止,我相信第一个函数对于输入N称为log(N)倍,第二个函数称为2log(N)倍。那正确吗?除此之外,我不确定如何考虑每个调用中发生了多少操作。我知道第一个函数在基本情况下有0个操作(无串联),然后有1个操作(两个长度为1的空字符串的串联),然后有2个操作。通常,我相信用N进行呼叫所产生的字符串长度为N?但是我只是不知道从哪里开始思考这一切如何加起来。

第二个我同样迷失了方向。我只需要一种方法来进行分析。请记住,我对符号不是很好,因此,如果您要使用符号来炫耀,我将不胜感激,这也将有助于我遵循这些符号。

1 个答案:

答案 0 :(得分:1)

有关进行分析的方法,建议您简化重复操作。您有F(n / 2)+ F(n-n / 2)。其后半部分可以简化(F(n-n / 2)= F(2n / 2-n / 2)= F(n / 2))。这意味着您实际上每次迭代都两次调用f(n / 2),这实际上是2log(n)。我认为,在这两个示例中,您都必须严格执行固定时间操作。

据我所知,这两者都应产生相似的输出,但在第一个示例中,您将为每n个奇数加上一个“ x”。这应该导致一个额外的n / 2 x乘以x的log(n)个数吗?我不确定这是否正确。我也相信您的第一个示例运行时间为2log(n),因为您两次调用f(n / 2)直到n为0。

注意:我不是最擅长的,但是我给了我最好的机会。