Recursion 两个递归调用将N分成两半的函数的时间复杂度 int函数8(int N){ 整数和=0; 对于(int i=0;i1) 返回和+函数8(N/2)+函数8(N/2); 其他的 返回0; }
上述算法的时间复杂度是多少Recursion 两个递归调用将N分成两半的函数的时间复杂度 int函数8(int N){ 整数和=0; 对于(int i=0;i1) 返回和+函数8(N/2)+函数8(N/2); 其他的 返回0; },recursion,time-complexity,big-o,Recursion,Time Complexity,Big O,上述算法的时间复杂度是多少 参考斐波那契递归理论,将其视为n* 2 ^ n,因为循环为O(n),递归部分为2 ^ n/p> 递归部分是2^N 不,递归部分是O(log(N)),因为每次递归调用都会将N切成两半。该算法基本上简化为O(n log(n)),因为我们对每个堆栈帧执行O(n)个工作,并且创建了log(n)个堆栈帧 斐波那契在这里是不相关的,因为这是一个动态规划问题,涉及到使用前面的两个解N-1和N-2来构建N,正如你所说的,它给出了一个简单的指数算法。这与我们在这里看到的代码中的复杂度不
参考斐波那契递归理论,将其视为n* 2 ^ n,因为<<代码> < /代码>循环为O(n),递归部分为2 ^ n/p> 递归部分是2^N
不,递归部分是O(log(N)),因为每次递归调用都会将N切成两半。该算法基本上简化为O(n log(n)),因为我们对每个堆栈帧执行O(n)个工作,并且创建了log(n)个堆栈帧 斐波那契在这里是不相关的,因为这是一个动态规划问题,涉及到使用前面的两个解N-1和N-2来构建N,正如你所说的,它给出了一个简单的指数算法。这与我们在这里看到的代码中的复杂度不同。如果递归调用是function8(N-2)+function8(N-1)代码>,那么你就对了
递归部分是2^N
不,递归部分是O(log(N)),因为每次递归调用都会将N切成两半。该算法基本上简化为O(n log(n)),因为我们对每个堆栈帧执行O(n)个工作,并且创建了log(n)个堆栈帧
斐波那契在这里是不相关的,因为这是一个动态规划问题,涉及到使用前面的两个解N-1和N-2来构建N,正如你所说的,它给出了一个简单的指数算法。这与我们在这里看到的代码中的复杂度不同。如果递归调用是function8(N-2)+function8(N-1)代码>,那么您就对了。实现的时间复杂度是O(N log N)
,因为递归关系是T(N)=O(N)+2*T(N/2)
(O(N)
用于计算sum
,其余用于两个递归调用)
但是您可以编写2*function8(N/2)
而不是function8(N/2)+function8(N/2)
。这将给出递归关系T(N)=O(N)+T(N/2)
(只有一个递归调用),
因此,将复杂性降低到O(N)
实现的时间复杂性是O(N log N)
,因为递归关系是T(N)=O(N)+2*T(N/2)
(O(N)
用于计算sum
,其余用于两个递归调用)
但是您可以编写2*function8(N/2)
而不是function8(N/2)+function8(N/2)
。这将给出递归关系T(N)=O(N)+T(N/2)
(只有一个递归调用),
从而将复杂性降低到O(N)
int function8(int N) {
int sum = 0;
for (int i = 0; i < N; i++) sum += 1;
if (N > 1)
return sum + function8(N / 2) + function8(N / 2);
else
return 0;
}