该算法的运行时复杂度?
Runtime complexity of this algorithm?
给定 a 和 b,我被要求以比 O(b) 更快的运行时间计算 a^b。我想到了:
if(b == 1) return a;
if(b % 2 == 0)
return findExp(a,b/2) * findExp(a,b/2);
else
return findExp(a,(b/2)+1) * findExp(a,b/2);
我的问题是,这个算法的运行时复杂度是对数时间还是多项式时间?
O(log(b)),所以是对数的。
你的算法是 O(b) 不是对数的。
在这部分代码 return findExp(a,b/2) * findExp(a,b/2);
中,您调用同一个函数,returns 两次调用相同的值。基本上,您正在为第二次通话花费多余的时间。
在数学上,如果根据您的算法 T(b) 表示 a^b 所需的时间,则它是 T(b) = T(b/2) + T(b/2)
,其中每个术语对应于每个调用。 T(b) = 2.T(b/2)
。解决这个递归,你会得到T(b)的顺序是b.
要使其成为对数,只需将值存储在变量中以防止冗余调用。
编辑后的代码:
if(b == 1) return a;
if(b % 2 == 0)
int x = findExp(a,b/2);
return x*x;
else
int x = findExp(a,b/2);
return a*x*x;
现在 T(b) = T(b/2)
因为你只调用 findExp(a,b/2) 一次(在 if
部分或 else
部分)。
这给你O(log(b))
算法
如果你想测试它,运行你的代码和我提到的一些大 b 的代码,假设 b = 1000000000 并对比所用的时间。
给定 a 和 b,我被要求以比 O(b) 更快的运行时间计算 a^b。我想到了:
if(b == 1) return a;
if(b % 2 == 0)
return findExp(a,b/2) * findExp(a,b/2);
else
return findExp(a,(b/2)+1) * findExp(a,b/2);
我的问题是,这个算法的运行时复杂度是对数时间还是多项式时间?
O(log(b)),所以是对数的。
你的算法是 O(b) 不是对数的。
在这部分代码 return findExp(a,b/2) * findExp(a,b/2);
中,您调用同一个函数,returns 两次调用相同的值。基本上,您正在为第二次通话花费多余的时间。
在数学上,如果根据您的算法 T(b) 表示 a^b 所需的时间,则它是 T(b) = T(b/2) + T(b/2)
,其中每个术语对应于每个调用。 T(b) = 2.T(b/2)
。解决这个递归,你会得到T(b)的顺序是b.
要使其成为对数,只需将值存储在变量中以防止冗余调用。
编辑后的代码:
if(b == 1) return a;
if(b % 2 == 0)
int x = findExp(a,b/2);
return x*x;
else
int x = findExp(a,b/2);
return a*x*x;
现在 T(b) = T(b/2)
因为你只调用 findExp(a,b/2) 一次(在 if
部分或 else
部分)。
这给你O(log(b))
算法
如果你想测试它,运行你的代码和我提到的一些大 b 的代码,假设 b = 1000000000 并对比所用的时间。