【历史背景】

秦九韶算法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法——正负开方术。它也能够配合牛顿法用来求解一元高次多项式的根。在西方被称作霍纳算法(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. Android 之SparseArray<E>详解

    SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch) pr ...

  2. Light OJ 1318 Strange Game 组合数+高速幂+分解因子

    长度为l的用k种字符组成的字符串有k^l中 当中m个字符要不同样 那就是k^l*C(l, m)*(k-1)^m 有反复 要除以2 可是你mod n了 不能直接除 n不一定是素数 所以不能乘以逆元 所以 ...

  3. Cocos2dx系列笔记7:一个简单的跑酷游戏《萝莉快跑》的消化(附下载)

    懒骨头(http://blog.csdn.com/iamlazybone) 或许有天 我们羡慕和崇拜的人 因为我们的努力 也会来了解我们 说不定 还会成为好友 骨头喜欢这样与哲哲共勉 多少个夜晚 一张 ...

  4. 利用Ihttpmodel实现网站缓存,解决Server.Transfer 直接输出HTML源代码的问题

    今天在用.NET利用IHttpModel实现网站静态缓存的时候,不知道最后为什么用 Server.Transfer(html)的时候结果输出的是HTML的源代码. 贴上源代码 using System ...

  5. hdu - 3572 - Task

    题意:有N个作业,M台机器,每个作业1天只能同1台机器运行,每台机器1天只能运行1个作业,第i个作业需要pi天完成,且只能从Si到Ei中选Pi天,问能否完成所有作业(T <= 20, N< ...

  6. 基于visual Studio2013解决面试题之0909移动星号

     题目

  7. django-cookieless 0.7 : Python Package Index

    django-cookieless 0.7 : Python Package Index django-cookieless 0.7 Download django-cookieless-0.7.ta ...

  8. KMP算法 KMP模式匹配 一(串)

    A - KMP模式匹配 一(串) Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:131072KB  ...

  9. Ural1109_Conference(二分图最大匹配/匈牙利算法/网络最大流)

    解题报告 二分图第一题. 题目描写叙述: 为了參加即将召开的会议,A国派出M位代表,B国派出N位代表,(N,M<=1000) 会议召开前,选出K队代表,每对代表必须一个是A国的,一个是B国的; ...

  10. mysql-5.6.13在windows平台下的安装、使用(图解)

    本文同步至:http://www.waylau.com/mysql-5-6-13-windows-platform-installation-use-graphic/ 一. 首先电脑要具备.Net F ...