通过重复操作,您可以在每次调用此函数时得出时间复杂度为:T(n) = 2T(n/2) + O(1)
重复树的高度为log2(n)
,其中是调用的总数(即树中的节点)。
教师说这个函数的时间复杂度为O(n),但我根本看不出原因。
此外,当你将O(n)代入时间复杂度方程时,会有奇怪的结果。例如,
T(n)< = cn
T(n / 2)< =(cn)/ 2
回到原来的等式:
T(n)< = cn + 1
这显然不是真的,因为cn + 1 !< cn
答案 0 :(得分:1)
你的导师是对的。这是Master theorem的应用。
你不能像在时间复杂度方程式中那样替换O(n),正确的替换将是像+ b一样的多项式形式,因为O(n)只显示最高有效度(可能有常数)较低程度)。
要扩展答案,您可以正确识别表单的时间复杂度等式
T(n) = aT(n/b) + f(n)
,其中a = 2,b = 2且f(n)为渐近。等于O(1)。
对于这种类型的方程,您有三种情况取决于log_b(a)(递归成本)和f(n)的比较值(解决长度为n的基本问题的成本):
1°f(n)比递归本身(log_b(a)&lt; f(n))长得多,例如a = 2,b = 2和f(n)渐近。等于O(n ^ 16)。然后递归的复杂度可以忽略不计,总时间复杂度可以与f(n)的复杂度相吻合:
T(n) = f(n)
2°递归长于f(n)(log_b(a)> f(n)),这就是这里的情况那么复杂度是O(log_b(a)),在你的例子中是O(log_2) (2)),即O(n)。
3°f(n)== log_b(a)的关键情况,即存在k> = 0,使得f(n)= O(n ^ {log_b(a)} log ^ k(n )),那么复杂性是:
T(n) = O(n^{log_b(a)} log^k+1 (a)}
在我看来,这是一个丑陋的案例。