求幂运算、多项式乘法及Horner法则的应用
2016-04-09 22:41
609 查看
一,两种不同的求幂运算
求解x^n(x 的 n 次方)
①使用递归,代码如下:
分析:
每次递归,使得问题的规模减半。2到6行操作的复杂度为O(1),第7行pow函数里面的x*x操作复杂度为O(1)
故时间复杂度公式:T(N)=T(N/2)+O(1) => T(N)=O(logN)
②普通方式求幂
显然,时间复杂度为O(N)
二,求解多项式乘法
公式:f(x,n) = a(0)x^0 + a(1)x^1 + a(2)x^2+...+a(n)x^n
比如:f(10,4)=a(0)10^0 + a(1)10^1 + a(2)10^2 + a(3)10^3+a(4)10^4
代码如下:
Horner法则求解多项式乘法,参考:
对比采用Horner法则计算多项式乘法与这篇文章: 字符串转换成数字
可以看出,二者有很大的相似性。其实,不难看出,字符串转换成数字使用的正是Horner法则。
由此,得到启发,在进制转换中,如:八进制转十进制,相当于 x = 8。
故可写出一个常用的进制转换程序,如下:
十六进制转十进制,相当于 x = 16。
因此,进制转换、字符串转换成数字、多项式求值都可以使用Horner法则来求解。
求解x^n(x 的 n 次方)
①使用递归,代码如下:
private static long pow(int x, int n){ if(n == 0) return 1; if(n == 1) return x; if(n % 2 == 0) return pow(x * x, n / 2); else return pow(x * x, n / 2) * x; }
分析:
每次递归,使得问题的规模减半。2到6行操作的复杂度为O(1),第7行pow函数里面的x*x操作复杂度为O(1)
故时间复杂度公式:T(N)=T(N/2)+O(1) => T(N)=O(logN)
②普通方式求幂
private static long pow2(int x, int n){ if(x == 0) return 0;//0^n == 0 long p = 1; for(int i = 0; i < n; i++) p *= x; return p; }
显然,时间复杂度为O(N)
二,求解多项式乘法
公式:f(x,n) = a(0)x^0 + a(1)x^1 + a(2)x^2+...+a(n)x^n
比如:f(10,4)=a(0)10^0 + a(1)10^1 + a(2)10^2 + a(3)10^3+a(4)10^4
代码如下:
public static long poly(int[] arr, int x, int n){ long sum = 0; for(int i = 0; i <= n; i++){ sum += arr[i] * pow(x, i); } return sum; } private static long pow(int x, int n){ if(n == 0) return 1; if(n == 1) return x; if(n % 2 == 0) return pow(x * x, n / 2); else return pow(x * x, n / 2) * x; }
Horner法则求解多项式乘法,参考:
public static long poly2(int[] arr, int x, int n){//arr存储系数, x 表示基数, n 表示幂 long poly = 0; for(int i = n; i >= 0; i--) poly = poly * x + arr[i]; return poly; }
对比采用Horner法则计算多项式乘法与这篇文章: 字符串转换成数字
public int atoi(char[] s){ int result = 0; for(int i = 0; i < s.length; i++) result = result * 10 + s[i] - '0';// 相当于 poly2(...)中的 x=10 return result; }
可以看出,二者有很大的相似性。其实,不难看出,字符串转换成数字使用的正是Horner法则。
由此,得到启发,在进制转换中,如:八进制转十进制,相当于 x = 8。
故可写出一个常用的进制转换程序,如下:
//x 表示进制, 若x=8,表示将8进制转换成10进制 public static long convert(char[] arr, int x){ long result = 0; for(int i = 0; i < arr.length; i++) result = result * x + arr[i] - '0'; return result; } //str 表示原来进制的数,如:convert("456", 8) 456 --> 302 public static long convert2(String str, int x){ long result = 0; for(int i = 0; i < str.length(); i++) result = result * x + Integer.valueOf(str.charAt(i) - '0'); return result; }
十六进制转十进制,相当于 x = 16。
public static long convert2(String str, int x){//x = 16 long result = 0; char c; str = str.toUpperCase();//"abF8"-->"ABF8" for(int i = 0; i < str.length(); i++) { c = str.charAt(i); if(c >= 'A' && c <= 'F') result = result * x + (c - 'A') + 10; else result = result * x + c - '0'; } return result; }
因此,进制转换、字符串转换成数字、多项式求值都可以使用Horner法则来求解。
相关文章推荐
- move_upload_file 因为文件字符集编码iconv引起的问题
- 不用加减乘除做加法
- 【js】:javascript中的数据类型
- 常见算法之归并排序java实践
- 手机各类传感器的区别与可获得数据
- 宿主机为linux、windows分别实现VMware三种方式上网(转)
- 链表中环的入口结点
- NoSQL 简介
- GDOI2016模拟3.9 暴走的图灵机 矩阵乘法优化暴力
- Subline Java 环境搭建
- SQLiteOpenHelper类的简化操作数据库(api查询方式)
- python3.0与python2.0有哪些不同
- 数组的一些内置方法
- 百度 罪犯转移
- Land oj 1611 - Null (水)
- 统计文本中某值字段数量-cat-awk-sort-uniq-c
- Excuses, Excuses!
- 4.1 左值到右值的转换 中英文对照(C++标准中文版 ISO/IEC 14882:2014)
- hdu1098(基础)
- 1002. A+B for Polynomials (25)