数据结构与算法分析JAVA 2.14 考虑下列算法(Horner法则)

问题
解析
关于这个式子,如果 N 取 4,a这个数组是{4,8,0,1,2},那么

一般来说,程序会写成一个累加,比如:

public static void fun(int[] a, int n, int x) {  long sum = 0; for(int i=0; i<n; i++) {  sum += a[i]*Math.pow(x, i); } System.out.println(sum); } 

此时,这个程序的运行时间是多少?
是O(N)吗?
答案不是,虽然我们只用了一个循环,但是每次循环中,Math.pow(x, i) 又会做 i 个步骤,所以肯定是比N大的

那么如何让运行时间变成 N 呢?

此题给出的方法如上图所述
这样做的缘由是将 F(X) 这个式子,拆成了由(aX+b)这样的简单式子累加
如:

变成

X [ X ( X ( X ( 4 ) + 8 ) ) + 1] + 2

这样就能使得运行时间为O(N)了
代码:

public static void Hornor(int[] a, int n,int x) {  long poly = 0; for(int i=0; i<n; i++) {  poly = (long)(x * poly + a[i]); } System.out.println(poly); } 

最后附上测试代码(包括随机生成一个数组)

package Chapter2; import java.util.Random; /** * * @author Crissu * */ public class Two_forteen {  public static void main(String[] args) {  // TODO Auto-generated method stub int N = 10000000; int[] a = new int[N]; CreateArray(a, N); Hornor(a, N, 2); } public static void CreateArray(int[] a, int n) {  Random rr = new Random(); for(int i=0; i< n; i++) {  a[i] = i+1; } for(int i=1; i<n; i++) {  int tmp = a[i]; int tt = rr.nextInt(i)+1; a[i] = a[tt]; a[tt] = tmp; } } public static void Hornor(int[] a, int n,int x) {  long poly = 0; for(int i=0; i<n; i++) {  poly = (long)(x * poly + a[i]); } System.out.println(poly); } } 
全部评论

相关推荐

10-09 19:35
门头沟学院 Java
洛必不可达:java的竞争激烈程度是其他任何岗位的10到20倍
点赞 评论 收藏
分享
贺兰星辰:不要漏个人信息,除了简历模板不太好以外你这个个人简介是不是太夸大了...
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务