动态规划的POW函数计算
Pow function calculation by dynamic programming
我知道pow(base, power)
是C语言的内置函数,复杂度为O(power)。我可以通过动态规划降低它的复杂度吗?
你可以在 O(logn) 中计算它
int power(int x, unsigned int y)
{
int temp;
if( y == 0)
return 1;
temp = power(x, y/2);
if (y%2 == 0)
return temp*temp;
else
return x*temp*temp;
}
详情见Here
如果您的输入参数是非负整数,那么您可以实现自己的 pow
。
迭代,运行时间=O(n):
unsigned long long pow(unsigned long long x,unsigned int n)
{
unsigned long long res = 1;
while (n--)
res *= x;
return res;
}
递归,运行时间=O(n):
unsigned long long pow(unsigned long long x,unsigned int n)
{
if (n == 0)
return 1;
if (n == 1)
return x;
return pow(x,n/2)*pow(x,n-n/2);
}
高效,运行 时间 = O(log(n)):
unsigned long long pow(unsigned long long x,unsigned int n)
{
unsigned long long res = 1;
while (n > 0)
{
if (n & 1)
res *= x;
n >>= 1;
x *= x;
}
return res;
}
我知道pow(base, power)
是C语言的内置函数,复杂度为O(power)。我可以通过动态规划降低它的复杂度吗?
你可以在 O(logn) 中计算它
int power(int x, unsigned int y)
{
int temp;
if( y == 0)
return 1;
temp = power(x, y/2);
if (y%2 == 0)
return temp*temp;
else
return x*temp*temp;
}
详情见Here
如果您的输入参数是非负整数,那么您可以实现自己的 pow
。
迭代,运行时间=O(n):
unsigned long long pow(unsigned long long x,unsigned int n)
{
unsigned long long res = 1;
while (n--)
res *= x;
return res;
}
递归,运行时间=O(n):
unsigned long long pow(unsigned long long x,unsigned int n)
{
if (n == 0)
return 1;
if (n == 1)
return x;
return pow(x,n/2)*pow(x,n-n/2);
}
高效,运行 时间 = O(log(n)):
unsigned long long pow(unsigned long long x,unsigned int n)
{
unsigned long long res = 1;
while (n > 0)
{
if (n & 1)
res *= x;
n >>= 1;
x *= x;
}
return res;
}