簡體   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