LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1163|回复: 12

x^n的快速算法

[复制链接]
发表于 2005-11-1 11:39:03 | 显示全部楼层 |阅读模式
计算x^n的一个快速算法,时间复杂度大约是Log2(N)。
采用二分法:比方说算x^10:
x^10 = (x^5) * (x^5)
x^5   = (x^2) * (x^2) * x
x^2   = x * x
存在的问题:没有验证是否溢出。
实际意义不是很大,纯粹是为了好玩,不知道有没有人做过了。

  1. double
  2. fastpower(double x, unsigned long n)
  3. {
  4.         int i = 0;
  5.         double ret = x;
  6.         unsigned long m = n;
  7.         if(!n)
  8.                 return 1;
  9.         /* to get the effective bits (low non-zero bits)
  10.          * i.e. 5(101)->3, 1024(10000000000)->11
  11.          * */
  12.         for(i = 0; m; i++)
  13.                 m >>= 1;

  14.         /* most significant bit -> least significant bit
  15.          * if the bits is 1: result = pri^2 * x;
  16.          * if the bits is 0: result = pri^2
  17.          * */
  18.         for(i -= 1; i > 0; i--){
  19.                 ret *= ret;
  20.                 if(n & (1 << (i-1))){
  21.                         ret *= x;
  22.                 }
  23.         }

  24.         return ret;
  25. }
复制代码
发表于 2005-11-1 13:22:55 | 显示全部楼层
不错,不错。
回复 支持 反对

使用道具 举报

发表于 2005-11-1 22:16:12 | 显示全部楼层
这个的时间复杂度为什么是log2(n)?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-2 19:09:36 | 显示全部楼层
Post by pank7.yardbird
这个的时间复杂度为什么是log2(n)?

为什么不是?
从我上面的例子看起来不是吗?我指的是乘法的复杂度
回复 支持 反对

使用道具 举报

发表于 2005-11-3 17:25:54 | 显示全部楼层
我们是否可以考虑一下 n 的取值范围?
回复 支持 反对

使用道具 举报

发表于 2005-11-8 12:09:28 | 显示全部楼层
用数组再结合楼主的二分法就完美了
回复 支持 反对

使用道具 举报

发表于 2005-11-8 12:17:44 | 显示全部楼层
假设X=10
10X10,和100X100,和100000X100000
计算的时间会一样?
算时间复杂度都是算指令周期的,一般来说只有加法,逻辑运算等是一个指令周期的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-8 17:22:33 | 显示全部楼层
Post by jszhang3
用数组再结合楼主的二分法就完美了

数组?怎么用?你的意思是防止溢出,还是什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-8 17:26:27 | 显示全部楼层
Post by gooddaytolinux
假设X=10
10X10,和100X100,和100000X100000
计算的时间会一样?
算时间复杂度都是算指令周期的,一般来说只有加法,逻辑运算等是一个指令周期的。

没有这样算吧?
要是这样的话,你根本就没有办法估算时间的复杂度了,因为很多时候,你根本就不知道编译器将它编译成什么指令了,这时你又怎么计算指令周期呢?
一般时间复杂度都是计算循环体中的某一个步骤,至于这个步骤的时间跟规模的关系,这不是这个算法的复杂度的事情了,应该归到这个步骤的复杂度中去考虑。
回复 支持 反对

使用道具 举报

发表于 2005-11-8 21:44:52 | 显示全部楼层
Post by pupilzeng
没有这样算吧?
要是这样的话,你根本就没有办法估算时间的复杂度了,因为很多时候,你根本就不知道编译器将它编译成什么指令了,这时你又怎么计算指令周期呢?
一般时间复杂度都是计算循环体中的某一个步骤,至于这个步骤的时间跟规模的关系,这不是这个算法的复杂度的事情了,应该归到这个步骤的复杂度中去考虑。

首先 时间复杂度是一个理论问题,和编译器无关 。
其次 时间复杂度是用来衡量算法的所需要的计算时间的,如果用步骤作为时间复杂度计量单位,每个步骤得复杂度千差万别,怎么用时间复杂度比较两个算法的优劣。

ps:你最好仔细看看时间复杂度的定义和计算方法
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表