快速幂求x的n次方
来源:互联网 发布:java开发平台有哪些 编辑:程序博客网 时间:2024/04/28 20:33
问题
O(logn)的时间复杂度求x的n次方,x为自然数,n为整数?
举例解析
如果 power=5 为奇数,result保存当前的多余的一个4,并在返回结果时一并与结果相乘。
2^10 = (2*2) * (2*2) * (2*2) * (2*2) * (2*2)= 4 ^5 = 4^4 * 4
4^4 = (4*4) * (4*4) = 16 ^ 2
16^2 = 16 * 16 = 256
如果 power=1 时,结果返回base=256
256^1 = 256
数学证明
求x^y?y使用二进制数表示:y = 2^y0 + 2^y1 + 2^y2 + 2^y3 + ... + 2^ynx^y = x^(2^y0 + 2^y1 + 2^y2 + 2^y3 + ... + 2^yn) = x^(2^y0) * x^(2^y1) * x^(2^y2) * x^(2^y3) * ... * x^(2^yn-1) * x^(2^yn)证明:x^(2^yn) = (x^(2^yn-1))^(2^yn-1), yn = 2 * yn-1 ? x^(2^yn) = x^(2^(2 *yn-1)) = x^(2^yn-1 * 2^yn-1) = (x^(2^yn-1))^(2^yn-1)
递归版
int fast_pow(int base, int power) { if (base == 0) return 0; if (power == 0) return 1; if (power == 1) return base; if (power%2 == 1) return base*fast_pow(base*base, power/2); return fast_pow(base*base, power/2);}
非递归版
int fast_pow2(int base, int power) { if (base == 0) return 0; if (power == 0) return 1; if (power == 1) return base; int result = 1; // 在power为奇数时,保存当前的base值(value) int value = base; for (; power > 1; value*= value, power/=2) { if (power%2 == 1) result *= value; } return result * value;}
时空复杂度
f(n)函数为fast_power算法的执行的基本操作的执行次数f(1) = 0f(n) = f(n/2)+1 = f(n/2^2) + 1 + 1 ... = f(n/2^k) + k当n/2^k = 1,k=logn,f(n) = logn则fast_power算法的时间复杂度为O(logn)空间复杂度为O(1)
参考
Fast Power Algorithm: C/C++ and Python Code
快速冪 Exponentiation by squaring | 黃鈺程
Fast Power
0 0
- 快速幂求x的n次方
- 求矩阵的n次方 快速幂
- 求X的N次方
- 求x的n次方
- 快速幂非递归实现(即求x的n次方)
- c++ 求x的n次方
- 编写函数求x的n次方
- (二分法)求X的N次方
- c语言求x的n次方
- 习题- 二分法 求x的n次方
- 输入x和n,求x的n次方
- Pow(x, n) 求一个数的n次方
- x的n次方
- x的n次方
- X的n次方
- 编写一个求x的n次方的函数
- 求x的n次方和stdarg用法
- 递归练习之求 x 的 N 次方
- Android 仿iOS带有星期几的日期时间选择器
- 添加按钮常见问题(1)-------待修改添加
- Practice Round APAC test 2017--Problem A. Lazy Spelling Bee
- PAT 乙级 1003
- 第7周 项目6-停车场模拟
- 快速幂求x的n次方
- easyui easyui-textbox自定义验证
- SSRF简介
- UGUI 中Dropdown控件的使用经验
- 第七周项目1——建立顺序环形队列算法库
- 使用JSTL标签fmt格式化字符串型日期
- 计算机方向的一些顶级会议和期刊
- handler进程间通讯机制
- android studio创建项目Cannot resolve symbol 'toolbar'