繁体   English   中英

C中数据结构的幂运算和算法分析

[英]exponentiation in Data Structures and Algorithm Analysis in C

在第2章谈到幂运算时,作者提到

“显然,所需的乘法数最多为2 log n(底数为2),因为最多需要两次乘法(如果n为奇数)就可以使问题减半。同样,可以编写并求解递推公式。”

代码如下:

int pow( int x, unsigned int n)
{
/*1*/ if( n == 0 )
/*2*/ return 1;
/*1*/ if( n == 1 )
/*4*/ return x;
/*5*/ if( even( n ) )
/*6*/ return( pow( x*x, n/2 ) );
else
/*7*/ return( pow( x*x, n/2 ) * x );
}

:正如作者所说,

2 ^ 16最多需要8个乘法

2 ^ 15 ... 7 ...

2 ^ 14 ... 7 ...

2 ^ 13 ... 7 ...

2 ^ 12 ... 7 ...

实际上,我执行以下代码:

2 ^ 16 .... 4 ...

2 ^ 15 .... 6 ...

2 ^ 14 ... 5 ...

2 ^ 13 ... 5 ...

2 ^ 12 ... 4 ...

那么,哪里出问题了?

找到x ^ n 最多需要 2个log n乘法,因为n / 2在每次迭代中都可能是奇数。 例如:

pow(2, 15) --> pow(2 * 2, 7) * 2
           --> pow(4 * 4, 3) * 4 * 2
           --> pow(16 * 16, 1) * 16 * 4 * 2

这是六个乘法(每个函数调用两个乘法)。 2 * log(15)〜= 7.8 因此满足了上限。 最好的情况是n的2的幂,仅需对数n乘法。

为了计算复杂度,请考虑该算法将n减少一半k倍,直到n在1和2之间; 也就是说,我们有:

1≤N / 2 k <2

所以:

2 k≤Ñ<2 K + 1
⇒k≤log n <k + 1
⇒(log n)-1 <k≤log n

因此,该算法采取log n步,并且由于最坏的情况是每步两次乘法,因此最多需要2 log n乘法。

没有矛盾或错误-这本书给出了一个上限,您正在查看乘法的确切数量。

精确的乘法次数(对于n> 0)是floor(log_2(n))+ bitcount(n)-1。这只是通过检查代码-偶数情况(执行一次乘法)对应于0中的0位。输入时,奇数情况(执行额外的乘法运算)对应于输入中的1位,并且代码到达最高位时停止。

这本书说2 * log_2(n)是乘法次数的上限。 这与确切的公式一致:floor(log_2(n))<= log_2(n)和bitcount(n)-1 <= log_2(n)。 所以floor(log_2(n))+ bitcount(n)-1 <= 2 * log_2(n)。

从精确的公式中,您可以看到n的位数越低,上限越差。 最坏的情况是n为2的幂,那么将精确执行log_2(n)乘法,并且上限以2为因数。最好的情况是n小于2的幂。 2:则上限仅偏离1。这与您的经验结果表相符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM