Pow(x, n)

方法一:暴力法

方法二:递归快速幂算法

方法三:迭代快速幂算法

方法四:位运算法

方法一:暴力法

思路

只需模拟将 x 相乘 n 次的过程。

如果 \(n < 0\),我们可以直接用 \(\dfrac{1}{x}\), \(-n\) 来替换 \(x , n\) 以保证 \(n \ge 0\)。该限制可以简化我们的进一步讨论。

但我们需要注意极端情况,尤其是负整数和正整数的不同范围限制。

算法

我们可以用一个简单的循环来计算结果。

class Solution {

public:

double myPow(double x, int n) {

long long N = n;

if (N < 0) {

x = 1 / x;

N = -N;

}

double ans = 1;

for (long long i = 0; i < N; i++)

ans = ans * x;

return ans;

}

};

复杂度分析

时间复杂度:\(O(n)\)。我们将 x 相乘 n 次。

空间复杂度:\(O(1)\)。我们需要一个变量来存储 x 的最终结果。

方法二:递归快速幂算法

class Solution {

public:

double fastPow(double x, long long n) {

if (n == 0) {

return 1.0;

}

double half = fastPow(x, n / 2);

if (n % 2 == 0) {

return half * half;

} else {

return half * half * x;

}

}

double myPow(double x, int n) {

long long N = n;

if (N < 0) {

x = 1 / x;

N = -N;

}

return fastPow(x, N);

}

};

复杂度分析

时间复杂度:O(log(n))O(log(n))。每次我们应用公式$ (x ^ n) ^ 2 = x ^ {2 * n}\(,\)n$ 就减少一半。 因此,我们最多需要 \(O(log(n))\)次计算来得到结果。

空间复杂度:\(O(log(n))\)。每次计算,我们都需要存储 \(x ^ {n / 2}\) 的结果。 我们需要计算 \(O(log(n))\)次,因此空间复杂度为 \(O(log(n))\)。

方法三:迭代快速幂算法

递归或迭代的快速幂实际上是实现同一目标的不同方式。

class Solution {

public:

double myPow(double x, int n) {

long long N = n;

if (N < 0) {

x = 1 / x;

N = -N;

}

double ans = 1;

double current_product = x;

for (long long i = N; i ; i /= 2) {

if ((i % 2) == 1) {

ans = ans * current_product;

}

current_product = current_product * current_product;

}

return ans;

}

};

复杂度分析

时间复杂度:\(O(log(n))\)。对于 n 的每个二进制位,我们最多只能乘一次。所以总的时间复杂度为 \(O(log(n))\)。

空间复杂度:\(O(1)\)。我们只需要两个变量来存储 x 的当前乘积和最终结果。

位运算实现pow(x,n)

根据暴力法的思路来看特别简单,但通过位运算呢?

我举个例子吧,例如 n = 13,则 n 的二进制表示为 1101, 那么 m 的 13 次方可以拆解为:

\(m^{1101} = m^{0001} * m^{0100} * m^{1000}\)。

我们可以通过 & 1和 >>1 来逐位读取 1101,为1时将该位代表的乘数累乘到最终结果。直接看代码吧,反而容易理解:

int pow(int n){

int sum = 1;

int tmp = m;

while(n != 0){

if(n & 1 == 1){

sum *= tmp;

}

tmp *= tmp;

n = n >> 1;

}

return sum;

}

时间复杂度近为 \(O(logn)\),而且看起来很牛逼

mysql中如何幂次方的函数_幂次方的四种快速取法(不使用pow函数)相关推荐

  1. C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能...

    本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...

  2. mysql中以下正确的sql是_总结MySQL中SQL语法的使用

    --where子句操作符: where子句操作符 = 等于 <> 不等于(标准语法) != 不等于(非标准语法,可移植性差) < 小于 <= 小于等于 > 大于 > ...

  3. mysql中的运算符的执行顺序_【MySQL】执行顺序

    我去找你❤️ 我给你买❤️ 我带你去❤️ 我很爱你❤️ 我们回家❤️ 我们结婚❤️ 你听过最孤独的话是什么? 同学,code就剩你没提交了 今天讨论的话题是 MySQL执行顺序 ??? 先养眼,再看题 ...

  4. 在mysql中如何为连接添加索引_在MySQL中如何为连接添加索引

    http://hackmysql.com/case4 译文: 我先通过一个简单的例子说明在MySQL中如何为连接添加索引,然后再看一个有挑战性的例子. 简单的3个表的连接 表结构很简单,3个表tblA ...

  5. mysql中查询名字第二位为_(12) 查询出名字倒数第二位为S的员工信息。_学小易找答案...

    [单选题]排序用到的表空间是 ( ) [填空题]设有如下关系表R: R(NO,NAME,SEX,AGE,CLASS) 主关键字是NO 其中NO为学号,NAME为姓名,SEX为性别,AGE为年龄,CLA ...

  6. mysql中实现分类统计查询的步骤_在MySQL中如何进行分组统计查询

    昨天和大家分享了MySQL中,如何进行聚合函数及统计函数查询,若是不清楚的话,可以去看一下我的那个文章.今天继续和大家分享,在MySQL中如何进行分组统计查询,这个在实际应用中,也会经常运用到,比如以 ...

  7. mysql中索引的作用是什么_详解mysql中索引的作用

    1. 索引是什么,首先我们可以举个例子,字典大家应该都使用过,我们可以使用目录快速定位到所要查找的内容,那么索引跟目录的作用类似,在数据库表记录中,利用索引,可以快速过滤查找到数据记录. 2. 索引类 ...

  8. 用于在MYSQL中创建存储过程的关键字是_下面选项中,用于在删除存储过程时,检测存储过程是否存在的关键字是_学小易找答案...

    [判断题]秦陵兵马俑三号坑设计的是 军事指挥部 . [单选题]以下不是超塑性变形特点的是:( ) [判断题]如果从表中的外键引用了主表中的值,则不能删除主表中被引用的数据. [单选题]下面选项中,用于 ...

  9. mysql中a b为什么是假_[灵魂拷问]MySQL面试高频问题(工程师方向)

    前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面 ...

最新文章

  1. ATS 5.3.0中开启最高级别的缓存调试信息
  2. 有逼格的产品经理的工作台长啥样?
  3. POJ 1183 反正切函数的应用(数学代换,基本不等式)
  4. [导入]正则表达式学习心得体会(2)
  5. 【读书笔记】深入分析Java Web技术内幕-Cookie与Session
  6. 老段51CTO会员卡 限时半价
  7. 基线_Origin入门教程(九):扣除基线常用小妙招
  8. python 解压缩字符串_在C中压缩字符串,在python中解压缩
  9. js基础-14-JS阻止事件冒泡和默认事件
  10. 微信公众账号分为哪几类?区别是什么?
  11. 页面增加问号图标,鼠标放置会提示文字信息。(记录日志)
  12. 联发科mt8516价格_揭秘联发科MT8516单颗芯片破千万背后的故事
  13. 零基础入门:基于开源WebRTC,从0到1实现实时音视频聊天功能
  14. 悼念蓝色理想FLASH区版主:手工感情==生命如此之脆弱
  15. 钉钉发布会发了个“ / ”,还说这玩意能替我们上班?
  16. 挑战程序设计竞赛: Jess's Reading Problem
  17. Fabric v2.2源码分析 Broadcast广播交易服务(二)
  18. java 数字翻译成英文_java 英文翻译成数字
  19. 对QQ和搜狗拼音的期望 - 2010.6
  20. memoized函数

热门文章

  1. 图解 DNS服务器解析过程
  2. JavaScript关于console的使用
  3. 爱心----孩子自信的源泉
  4. C++面试 左值、右值、左值引用、右值引用
  5. 服务器安装信任描述文件,OS X Server:在使用 TLS、TTLS 或 PEAP 时如何在“配置描述文件”中配置 RADIUS 服务器信任...
  6. 吴恩达机器学习系列课程笔记——第五章:Octave教程(Octave Tutorial)
  7. 萝莉状态栏android4.4,教你如何让Windows 7任务栏功能更丰富
  8. 文本分类(1)-文本预处理
  9. 现代企业6S规范管理有哪些?
  10. ❤️软件设计师之系统安全分析与设计大总结(莽起来)❤️