最近在看侯捷的《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算法分析相关推荐

  1. STL源码剖析学习七:stack和queue

    STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...

  2. STL源码剖析学习二:空间配置器(allocator)

    STL源码剖析学习二:空间配置器(allocator) 标准接口: vlaue_type pointer const_pointer reference const_reference size_ty ...

  3. STL源码剖析学习之increment、decrement、dereference实现源码

    //STL之increment.decrement.dereference实现源码 //学习目的:STL实现原理.操作符(++i,i++,*等操作符的重载) //increment/dereferen ...

  4. STL源码剖析(第二章 空间配置器)

    1.1 空间配置器 以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象(所有的数值)都存放在容器之内,而容器一定需要配置空间以置放资料.并且allocator称之为&qu ...

  5. STL源码剖析—学习记录

    提示:建议看完侯捷老师的STL标准库视频后,再看这本书,会看的下去一些!本人对其中重点内容和概念进行了提取,希望对一起前行的人有些许帮助,码字不易,欢迎点个赞呦! 文章目录 一.可能令你困惑的C++语 ...

  6. STL源码剖析 第七章 仿函数(函数对象)

    函数对象:具有函数性质的对象 使得用户像使用函数一样使用它 一般函数提供两个版本,第一个版本使用operator < ;第二版本需要用户 指定某种操作 第二版本就是设计一个函数,将函数指针作为算 ...

  7. STL源码剖析学习十四:算法之set相关算法

    STL中定义的set要求元素不得重复且已经排序 set算法要求的都是有序区间,但元素可以重复出现 另外提供的hash版本的set因为其元素无序,因此不能作为set函数的参数 set算法前4个参数分别表 ...

  8. 《STL源码剖析》学习--6章--_rotate算法分析

     最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...

  9. 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1

    最近在看侯捷的<STL源码剖析>,虽然感觉自己c++看得比较深一点,还是感觉还多东西不是那么明白,这里将一些细小的东西或者概念记录一下. 有些东西是根据<C++编程思想>理解的 ...

最新文章

  1. Linux软件包命令
  2. Science给博士新生的“欢迎”信:5点期望太扎心!
  3. 洛谷 P1663 山
  4. git 如何清理操作日志_git如何清空所有的commit记录
  5. Ubuntu18.04安装Docker
  6. PHP 中使用工厂模式
  7. 2017.10.11 network 网络扩容 思考记录
  8. 挑战练习6.4 报告编译版本
  9. 最大子段和动态规划_动态规划解决最大正方形问题
  10. ARKit入门到精通 1.0 - 实战案例 AR打地鼠-史小川-专题视频课程
  11. 机器人应用(Skill)精选丨让HEXA机器人成为直播网红,还可以接收红外信号
  12. 基础知识 | 贴片电阻快速扫盲
  13. 计算机专业在经济社会的应用,计算机技术对社会发展的影响
  14. 使用 className 修改样式属性
  15. python io多路复用
  16. (二)使用npm搭建React项目
  17. 最新美团代付源码+支持多模板/多支付通道/全开源
  18. Fragment 中 commit already called
  19. 大话SEO网站优化|SEO优化入门技术详解
  20. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.my.mapper.UserM

热门文章

  1. 【机器学习PAI实践三】雾霾成因分析
  2. spring resource
  3. LESSON 12.1-12.6 梯度提升树的基本思想梯度提升树的参数
  4. 机器学习算法基础——数据特征预处理
  5. 在Docker启动Cloudera并开始体验
  6. 【深度学习下一大突破】吴恩达对话 Hinton、Bengio、Goodfellow(视频)
  7. Redis - RedisTemplate及4种序列化方式深入解读
  8. Spring Session - 使用Spring Session从零到一构建分布式session
  9. JavaScript-WebStorm中配置Github并将代码托管到Github
  10. C++五子棋(一)——开发环境