日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《STL源码剖析》学习--6章--power算法分析

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《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算法分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。