通常,我们需要计算 X 的 n 次方的最简单的计算方法如下:
int power(int x,int n)
{
int result = 1;
while(n--)
{
result *= x;
}
return result;
}
上述程序的时间复杂度为 O(n),即需要计算 n 次方,则需要执行 n 次循环。但 SGI 的 STL 中使用了一种巧妙的方法将进入循环的次数降到 logn 。
以 2 的 10 次方为例:10 的二进制表示为: 0x 1010。对应数值为: 1 * 2^8 + 0 * 2^4 + 1 * 2^2 + 0 * 2^1 ,可以观察得到:
2 ^ 2 = (2 ^ 1) * (2 ^ 1), 2 ^ 4 = (2 ^ 2) * (2 ^ 2),2 ^ 8 = (2 ^ 4 ) * (2 ^ 4)。。。。也即是说:对 0x1010 ,计算方法如下: