【发布时间】:2014-11-26 19:55:33
【问题描述】:
我在接受采访时遇到的这个问题。 假设我想计算 x^n 的 power(x, n)。
我所知道的最好的算法是在 O(logn) 时间内计算 pow(x, n),但这是一个需要 O(logn) 空间(调用堆栈)的递归算法。
int pow(int x, int n)
{
if(n==0)
return 1;
int tmp = pow(x,n/2);
if(n%2)
return tmp*tmp*x;
return tmp*tmp;
}
上述算法在 O(logn) 时间内运行,但它的调用堆栈占用 O(logn) 空间。 如何在保持 O(logn) 时间的同时使空间保持不变。
我现在能想到的算法需要 O((logn)^2) 时间但在恒定空间中(将上述算法迭代转换并根据 2^i 计算 pow)。 我们能否实现对 O(logn) 时间和常数空间的限制?
【问题讨论】:
-
提示:您也可以编写
tmp = pow(x*x,n/2)并将您的两个tmp*tmp替换为tmps。 -
如果可以的话,这会改善时间和空间限制吗?您的算法的复杂性是什么?我看到的唯一改进是每次通话一次操作,但通话次数保持不变,如果我遗漏了什么,请告诉我。
-
嗯....这是你在公共论坛上的反应吗?