【历史背景】

秦九韶算法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法——正负开方术。它也能够配合牛顿法用来求解一元高次多项式的根。在西方被称作霍纳算法(Horner
algorithm或Horner scheme),是以英国数学家威廉·乔治·霍纳命名的。

【原理解释】

设有n+1项的n次函数

f(x)=anxn+ an-1xn-1+an-2xn-2+ an-3xn-3+…… a2x2+a1x+
a0

将前n项提取公因子x,得

f(x)=(anxn-1+ an-1xn-2+an-2xn-3+…… a2x+a1)+ a0

再将括号内的前n-1项提取公因子x,得

f(x)=((anxn-2+ an-1xn-3+an-2xn-4+…… a2)x+ a1)x+a0

如此重复提取公因子x,最后将函数化为

f(x)=(((anx+ an-1)x+ an-2)x+……+a1)x+a0

令f1= anx+ an-1

f2=f1x+ an-2

f3=f2x+ an-3

。。。

fn=fn-1x+ a0    则fn即为所求

【代码演示样例】

AlgorithmCalculatorService.java

       /**
* 获取系数集合
* @param N 多项式个数
* @return 系数集合
*/
public static ArrayList<Double> getCoefficientList(Integer N) {
ArrayList<Double> AnList = new ArrayList<Double>();
//随机生成N个0到10之间的系数
Random random = new Random();
while(N > 0) {
AnList.add((double) (Math.round(random.nextFloat()*100)/10.0)); //随机一个[0-10]之间的一位小数
N--;
}
return AnList;
} /**
* 运行传统算法并获取结果
* 模板为 An*X^n + An-1*X^n-1 + ... A1X + A0
* @param AnList 系数集合
* @param X X值
* @return 计算结果
*/
public static String getResultByTrandition(ArrayList<Double> AnList, Float X) {
int N = AnList.size() - 1;
Double result = 0D;
long start = System.currentTimeMillis(); //获取当前时间,单位为毫秒
for(Double An : AnList) {//遍历系数集合,每一次循环计算出一项的值,并相加
Double Xn = 1D;
int i = 0;
while(i<N) {
Xn = Xn*X;
i++;
}
N--;
result = result + An*Xn;
}
long end = System.currentTimeMillis();
String resultMsg = "计算结果: " + result + " ,耗时为:" + (end - start) + "毫秒!";
return resultMsg;
} /**
* 运行秦九韶算法并获取结果
* 模板为((...(An*X + An-1)X + An-2)X + ... + A1)X + A0
* @param AnList 系数集合
* @return 计算结果
*/
@SuppressWarnings("unchecked")
public static String getResultByHorner(ArrayList<Double> anList, Float X) {
ArrayList<Double> AnList = (ArrayList<Double>) anList.clone();
Double V = (double)AnList.get(0);
AnList.remove(0);
long start = System.currentTimeMillis(); //获取当前时间,单位为毫秒
for(Double An : AnList) {
V = X*V + An;
}
long end = System.currentTimeMillis();
String resultMsg = "计算结果: " + V + " ,耗时为:" + (end - start) + "毫秒!";
return resultMsg;
} public static void main(String[] args) {
ArrayList<Double> anlist = getCoefficientList(5);
String msg1 = getResultByTrandition(anlist, 3F);
System.out.println("传统算法: " + msg1);
String msg2 = getResultByHorner(anlist, 3F);
System.out.println("九韶算法: " + msg2);
}

【执行结果】

传统算法: 计算结果: 8.992778799971419E137 ,耗时为:20毫秒!

九韶算法: 计算结果: 8.992778799971422E137 ,耗时为:0毫秒!

【结果分析】

当数据量较大时,在耗时方面秦九韶算法相比传统算法占领明显优势!

算法 《秦九韶算法java实践》的更多相关文章

  1. 算法 《霍纳的方法java实践》

    [历史背景] 霍纳的方法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法--正负开方术. 它也能够配合牛顿法用来求解一元高次多项式的根.在西方被称作霍纳算法(Horner algorith ...

  2. Redis与Java - 实践

    Redis与Java - 实践 标签 : Java与NoSQL Transaction Redis事务(transaction)是一组命令的集合,同命令一样也是Redis的最小执行单位, Redis保 ...

  3. 霍纳法则(Horner's rule)

    卡在hdu 1402 的高精度乘法了,要用FFT(快速傅里叶变换),然后看到了这个霍纳法则,顺便就写下来了. 霍纳法则:求多项式值的一个快速算法. 简单介绍: 假设有n+2个数 , a0,a1,a2, ...

  4. 霍纳法则(Horner Rule)介绍及C语言实现

    参考自:http://flynoi.blog.hexun.com/31272178_d.html 霍纳法则简介 假设有n+2个实数a0,a1,-,an,和x的序列,要对多项式Pn(x)= anxn+a ...

  5. Canny边缘检测算法(基于OpenCV的Java实现)

    目录 Canny边缘检测算法(基于OpenCV的Java实现) 绪论 Canny边缘检测算法的发展历史 Canny边缘检测算法的处理流程 用高斯滤波器平滑图像 彩色RGB图像转换为灰度图像 一维,二维 ...

  6. 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)

    算法竞赛中的常用JAVA API:PriorityQueue(优先队列) PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆 ...

  7. 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)

    算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...

  8. 8.算法竞赛中的常用JAVA API :Calendar日期类

    8.算法竞赛中的常用JAVA API :Calendar日期类 摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法.Date类大部分方法已经 ...

  9. 7.算法竞赛中的常用JAVA API :String 、StringBuilder、StringBuffer常用方法和区别(转载)

    7.算法竞赛中的常用JAVA API :String .StringBuilder.StringBuffer常用方法和区别 摘要 本文将介绍String.StringBuilder类的常用方法. 在j ...

随机推荐

  1. Swift - iOS中各种视图控制器(View Controller)的介绍

    在iOS中,不同的视图控制器负责不同的功能,采用不同的风格向用户呈现信息.下面对各个视图控制器做个总结: 1,标准视图控制器 - View Controller 这个控制器只是用来呈现内容.通常会用来 ...

  2. RAC 11.2.0.4 安装 遇到 INS-06001

    今天安装11.2.0.4的grid软件,在配置passwordless SSH的时候,点击setup 出现此错误 开始网上搜了一把.说什么的都有,什么系统bug啊什么的 但是我另外一套rac却很正常就 ...

  3. 《火球——UML大战需求分析》(第1章 大话UML)——1.5 小结和练习

    说明: <火球——UML大战需求分析>是我撰写的一本关于需求分析及UML方面的书,我将会在CSDN上为大家分享前面几章的内容,总字数在几万以上,图片有数十张.欢迎你按文章的序号顺序阅读,谢 ...

  4. teamviewer无法启动

    在 Linux.Mac OS X和 Windows下都可以用,但在 Linux 下无法启动时怎么办? 笔者回家工作时,都会用 Teamviewer 连线到其他 Linux 桌面,但某天起 Teamvi ...

  5. jQuery.localStorage() - jQuery SDK API

    jQuery.localStorage() - jQuery SDK API jQuery.localStorage() From jQuery SDK API   Jump to: navigati ...

  6. 四个流行的Java连接池之Proxool篇

    Proxool是一个JavaSQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装.可以非常简单的移植到现存的代码中.完全可配置.快速,成熟,健壮.可以透明地为你现存的JDBC驱 ...

  7. jqueryui datepicker refresh

    http://stackoverflow.com/questions/6056287/jquery-ui-datepicker-prevent-refresh-onselect 给选中的TD加背景色

  8. JS、JQury - 文本框内容改变事件

    例子: 效果: 前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="De ...

  9. JS - 焦点图

    下载地址:http://www.lanrentuku.com/js/jiaodiantu-1076.html 修改焦点图: CSS代码: /* 懒人图库 搜集整理 www.lanrentuku.com ...

  10. Linux教程:如何在Linux下进行C++开发?

    Linux是一类Unix计算机操作系统的统称,Linux操作系统的内核的名字也是“Linux”, 在Linux下进行C++开发,需要注意许多问题,比如:减少不必要的编辑动作,减少编辑的时间. Wind ...