我有一些麻烦弄清楚下面代码的最坏时间复杂度。
(这不是一门功课,看https://leetcode.com/problems/integer-replacement/description/。)if if递归最坏时间复杂度
int recursion (int n) {
if (n == 1)
return 0;
if (n % 2 == 0) {
return recursion(n/2) + 1
} else {
return min(recursion(n/2 + 1) + 1, recursion(n - 1)) + 1;
}
}
我唯一知道的是,当N == 2^k(k > 0)
,最坏的时间复杂度为O(logN)
。 但是,我不清楚何时N
不是2^k
。因为即使number/2
仍然可以得到奇数。有人说它仍然是O(LogN)
,但我不相信。
我知道代码不是最好的解决方案,只是想分析时间复杂性。我试过递归树和聚合分析,似乎没有帮助。
你的其他情况有错误的说法,它应该是'(n + 1)/ 2' –
@BlackMamba。嗨,(n + 1)会溢出。但我有其他错误。 Updated.Thanks非常多 – nathan
我看到了leetcode问题陈述。我不知道在前两个版本中,最后一个分支(用'min'选择其中一个)与它有关 - 它不应该是“an'else”的一部分,如果“then”无论如何,''终止于无条件的'return'。 – greybeard