【历史背景】

霍纳的方法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法——正负开方术。

它也能够配合牛顿法用来求解一元高次多项式的根。在西方被称作霍纳算法(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 algorithm ...

  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. JavaFX的扩展控件库ControlsFX介绍

    声明:   本博客文章原创类别的均为个人原创,版权所有.转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http://www.wjfxgame.com. ...

  2. 不用Root权限获取已经安装的Apk安装包

    在安卓设备上安装的apk都会被保留一份在/data/app目录下,但是该目录对于普通用户来说只有可执行权限,是无法访问的. 但是其子文件具有可读权限. 意思也就说我们直接去查看/data/app这个目 ...

  3. HDU-2647拓扑排序

    这道题不能用矩阵表示,因为1w*1w绝对超内存,分析数据,前一个a的钱要多于后一个b,所以我们要把b作为出度,a为入度,如果不明白这个地方,举例:b——>a——>c——>d ,b为8 ...

  4. [C++基金会]位计算 游戏开发中的应用

    定义的位操作:通俗点说,,位计算是计算机操作二进制整数. 无论整数可以用二的方式来表示进度,不同类型的其长度的整数位的是不一样的.INT8要么char靠8个月2 位表示,INT16或者short是由1 ...

  5. Unable to start MySQL service. Another MySQL daemon is already running with the same UNIX socket

    Unable to start MySQL service. Another MySQL daemon is already running with the same UNIX socket 特征 ...

  6. Android (1) - Activity

    onCreate(Bundle status) --> setContentView(View view) --> findViewById(int id) Intent intentFo ...

  7. nyoj 228 士兵杀死(五岁以下儿童)【树状数组】

    分析:这个问题问的是,因为它是一个单独的更新.因此,让我们更新,然后在c[i]表现为1~i之间,还原之后看起来像一个. #include <cstdio> #include <cst ...

  8. HTTP/1.1

    HTTP真的很简单   原文:HTTP Made Really Easy因为我本身网络基础就很差,所以看到这篇文章一方面是学习网络知识,另一方面为了锻炼我蹩脚的英语水平,文中如有错误,欢迎浏览指正! ...

  9. Java乔晓松-android的四大组件之一Service(服务的绑定)

    android的四大组件之一Service(服务的绑定) 怎么绑定服务,又怎么解除服务,代码如下: MainActivity.java源码: package com.example.lesson14_ ...

  10. 1pdf

    Document doc = new Document(new iTextSharp.text.Rectangle(564, 351));  PdfWriter writer= PdfWriter.G ...