《STL源码剖析》学习--6章--power算法分析
最近在看侯捷的《STL源碼剖析》,其中有許多不太明白之處,后經分析或查找資料有了些理解,現記錄一下。
6章--power算法分析
書本中的算法如下所示:
template <class _Tp, class _Integer, class _MonoidOperation> _Tp __power(_Tp __x, _Integer __n, _MonoidOperation __opr) {if (__n == 0)return identity_element(__opr);else {while ((__n & 1) == 0) {__n >>= 1;__x = __opr(__x, __x);}_Tp __result = __x;__n >>= 1;while (__n != 0) {__x = __opr(__x, __x);if ((__n & 1) != 0)__result = __opr(__result, __x);__n >>= 1;}return __result;} }template <class _Tp, class _Integer> inline _Tp __power(_Tp __x, _Integer __n) {return __power(__x, __n, multiplies<_Tp>()); }
此處的冪運算X^N,采用的思路是將十進制N化解為二進制,N=(2^0)*N0+(2^1)*N1+……,其中Ni為化為二進制時第i位(0或1)。
如:N=40,化為二進制時為101000,此時X^40 =X^[ (2^0)*0 +(2^1)*0+(2^2)*0+(2^3)*1+(2^4)*0+(2^5)*1]
可以化簡為X^[(2^3)*1+(2^5)*1 ] = [X^(2^3)]*[X^(2^5)] ,X^[(2^i)*Ni] 后一項X^ {[2^ (i+1)] * Ni+1 },若Ni+1與Ni都為1,則前式后一項為前一項自己的平方。
冪運算用乘法來做,用移位運算和乘法運算來實現。
程序的思路:
(1)特殊情況,若N==0,則返回自己,與數學中X^0=1不相同。
(2)非特殊情況,
首先找到N化為2進制時最低位為1的那位,代碼如第一個while循環,每次檢測最低位是否為1,再進行右移判斷,
?如N化為二進制為101000,退出while時,N=101,x = X^(2^3),從此處可以看出x相同于數制的位權。(程序中的中間值x這里我用小x表示,初值用X表示);
?然后對N去掉后面零的值逐位判斷,每次都增大x,得到位權,如果為1,則與result相乘,直到N==0。
我們都知道,stl中的算法幾乎總是最高效的,思考一下為什么不用N個數相乘呢?如果用N個數相乘O(N),而用此二分法則是O(logN),且從前面非0的位開始,提高了效率。
同時感覺進制轉換算法與此類似。
總結
以上是生活随笔為你收集整理的《STL源码剖析》学习--6章--power算法分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2010 MFC exe独立系统环境
- 下一篇: 《STL源码剖析》学习--6章--_ro