算法 《秦九韶算法java实践》
【历史背景】
秦九韶算法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法——正负开方术。它也能够配合牛顿法用来求解一元高次多项式的根。在西方被称作霍纳算法(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实践》的更多相关文章
- 算法 《霍纳的方法java实践》
[历史背景] 霍纳的方法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法--正负开方术. 它也能够配合牛顿法用来求解一元高次多项式的根.在西方被称作霍纳算法(Horner algorith ...
- Redis与Java - 实践
Redis与Java - 实践 标签 : Java与NoSQL Transaction Redis事务(transaction)是一组命令的集合,同命令一样也是Redis的最小执行单位, Redis保 ...
- 霍纳法则(Horner's rule)
卡在hdu 1402 的高精度乘法了,要用FFT(快速傅里叶变换),然后看到了这个霍纳法则,顺便就写下来了. 霍纳法则:求多项式值的一个快速算法. 简单介绍: 假设有n+2个数 , a0,a1,a2, ...
- 霍纳法则(Horner Rule)介绍及C语言实现
参考自:http://flynoi.blog.hexun.com/31272178_d.html 霍纳法则简介 假设有n+2个实数a0,a1,-,an,和x的序列,要对多项式Pn(x)= anxn+a ...
- Canny边缘检测算法(基于OpenCV的Java实现)
目录 Canny边缘检测算法(基于OpenCV的Java实现) 绪论 Canny边缘检测算法的发展历史 Canny边缘检测算法的处理流程 用高斯滤波器平滑图像 彩色RGB图像转换为灰度图像 一维,二维 ...
- 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)(转载)
算法竞赛中的常用JAVA API:PriorityQueue(优先队列) PriorityQueue 翻译过来就是优先队列,本质是一个堆, 默认情况下堆顶每次都保留最小值,每插入一个元素,仍动态维护堆 ...
- 算法竞赛中的常用JAVA API :HashSet 和 TreeSet(转载)
算法竞赛中的常用JAVA API :HashSet 和 TreeSet set set容器的特点是不包含重复元素,也就是说自动去重. HashSet HashSet基于哈希表实现,无序. add(E ...
- 8.算法竞赛中的常用JAVA API :Calendar日期类
8.算法竞赛中的常用JAVA API :Calendar日期类 摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法.Date类大部分方法已经 ...
- 7.算法竞赛中的常用JAVA API :String 、StringBuilder、StringBuffer常用方法和区别(转载)
7.算法竞赛中的常用JAVA API :String .StringBuilder.StringBuffer常用方法和区别 摘要 本文将介绍String.StringBuilder类的常用方法. 在j ...
随机推荐
- Swift - 网络请求报App Transport Security has blocked a cleartext错
使用Xcode7编写iOS9应用时,如果获取http://数据时会报如下错误: App Transport Security has blocked a cleartext HTTP (http:// ...
- C语言,C++,static
术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量.随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数.为了避 ...
- QString与中文,QString与std::wstring的相互转换(使用fromStdWString和u8关键字)
Qt版本:5.5.1 Qt的QString功能丰富,对非英语语言的支持也不是问题,但支持得不够直接.例如,像 ? 1 QString str("死亡使者赛维"); 这样直接用带中文 ...
- 基于visual Studio2013解决C语言竞赛题之1038数字验证
题目 解决代码及点评 /********************************************************************** ...
- 使用POI创建Excel文件下载
POIExcelUtils.java: package com.saicfc.pmpf.internal.manage.utils; import java.io.File; import java. ...
- TODO管理工具TaskWarrior (跨平台C++代码)
Taskwarrior 是一个基于命令行的 TODO 列表管理工具.主要功能包括:标签.彩色表格输出.报表和图形.大量的命令.底层API.多用户文件锁等功能. http://www.oschina.n ...
- 深入浅出Hadoop实战开发(HDFS实战图片、MapReduce、HBase实战微博、Hive应用)
Hadoop是什么,为什么要学习Hadoop? Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运 ...
- 【Cocos2d-X开发学习笔记】第28期:游戏中音乐和音效的使用
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 UI在游戏中占有很重要的地位,但吸引玩家的除了这 ...
- EXT2/EXT3文件系统(一)
整理自<鸟哥的Linux私房菜>,整理者:华科小涛http://www.cnblogs.com/hust-ghtao/ 1.文件系统概念引入 文件系统是一种存储和组织计算机数据的方法,它使 ...
- TEXT文本编辑框2
Result: When you double clicks on the TextEdit control nothing happens, since the flow-logic of the ...