多项式计算之秦九韶算法

多项式求值与秦九韶算法

一、引言

  多项式函数常常用于描述现实世界的各种规律,而在用计算机计算多项式的值的时候,不同算法的计算时空复杂度通常不一样。如一个n次多项式

  f(x)=a[n]x^n+a[n-1]x^(n-1)+......+a[1]x+a[0],我们的常规计算办法是,直接计算,这样我们的时间复杂度为:O(n^2)

下面我们介绍秦九韶算法:

其核心思想:后面每一次计算都依赖于前面计算的结果,这样以减少重复的计算。

简单引例:

计算 x^8 直接算将算8次乘法,而这8次都是必要的吗?显然不是,当我们知道x^2的值后,计算x^4只需要用x^2*x^2即可。秦九韶算法正是这样来减少计算量的。

一、推导

  

  

  a0--->an依次是最高项,到常数项系数

  从而bn就是所求的解

三、算法描述

       由以上推导知,bn就是我们所求的值,要求bn就得逆推到b0,由于b0=a0我们就可以求出b1依次下去就可以求出bn。

数据结构:

1.数组

1.a[]用于保存系数

ps:一般做法还需要保存b[],我们这里只是用到前一项,所以一个常数即可

c++实现:

#include <iostream>
using namespace std;
inline double calculate(double x, double* a, int n)
/*x:f(x)中的x。a是系数数组
*/
{double b = a[0];for (int i = 1 ; i <= n; i++){b = b * x + a[i];}return b;
}

int main(int argc, char const argv[])
{
double x = 0;
int n = 0;
cout << “最高项幂:”;
cin >> n;
double
a = new double[n+1];
cout << “\n请输入个项系数(系数为0输入0):”;
for (int i = 0; i <= n; i++)
{
cin >> *(a + i);
}
cout<<"\n要计算的x:";
cin>>x;
double res = calculate(x, a, n);
cout << res << endl;
return 0;
}

 MyTest.cpp : 定义控制台应用程序的入口点。
/*
时间测量函调用
*/#include "stdafx.h"
#include <stdio.h>
#include <time.h>
#include <math.h>
#pragma warning(disable:4996)
#define  MAXN 10
#define MAXK 1e4
//代表10的7次方
/*f(x)=a0 +a1*x+a2*x*x+a3*x*x*x +...+an*x的N次方  */clock_t start,stop;
/*clock_t是clock()函数返回的变量的类型*/
double duration;
/*记录被测函数运行的时间,以秒为单位*/double f1(int n, double a[], double x){int i;double p = a[0];for (i = 1; i <= n; i++){p += a[i] * pow(x, i);}return p;
}/*         秦九韶算法          */
double f2(int n, double a[], double x){int i;double p = a[n];for (i = n; i > 0; i--){p = a[i - 1] + x*p;}return p;
}int _tmain(int argc, _TCHAR* argv[])
{/*不在测试范围内的准备函数,写在开始之前*/int i;double a[MAXN];for (i = 0; i < MAXN; i++)a[i] = (double)i;start = clock();for (i = 0; i < MAXK;i++)f1(MAXN - 1, a, 1.1);stop = clock();duration = ((double)(stop - start)) / CLK_TCK / MAXK;/*其他不在测试范围外的处理写在后面*/printf("ticks1 = %f\n", (double)(stop - start));printf("duration1 = %6.2e\n", duration);start = clock();for (i = 0; i < MAXK;i++)f2(MAXN - 1, a, 1.1);stop = clock();duration = ((double)(stop - start)) / CLK_TCK/MAXK;/*其他不在测试范围外的处理写在后面*/printf("ticks2 = %f\n", (double)(stop - start));printf("duration2 = %6.2e\n", duration);/*%6.2e  表示6表示输出长度(包含小数点),2表示输出小数点位数,d表示输出为十进制e表示用科学计数法表示*/return 0;
}

秦九韶算法的思想与解多项式算法时间比较附代码相关推荐

  1. 秦九韶多项式运算时间java,秦九韶算法的思想与解多项式算法时间比较附代码...

    #include #pragma warning(disable:4996) #define MAXN 10 #define MAXK 1e4 //代表10的7次方 /*f(x)=a0 +a1*x+a ...

  2. 【算法知识】详解堆排序算法

    点击蓝色字关注我们! 什么是堆 「堆」首先是一个完全二叉树,「堆」分为「大顶堆」和「小顶堆」: 「大顶堆」 : 每个节点的值大于或等于其左右孩子节点的值,称为大顶堆. 「小顶堆」同理就是每个节点的值小 ...

  3. 【算法知识】详解基数排序算法

    已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 [算法知识]详解快速排序算法 [算法知识]详解归并排序算法 基本思想 基数排序的思想是将整数按位数切 ...

  4. 【算法知识】详解归并排序算法

    已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 [算法知识]详解快速排序算法 基本思想 归并排序的基本思想是: 先将序列一次次分成子序列,直到子序列 ...

  5. 【算法知识】详解快速排序算法

    基本思想 已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 本文的思路是以从小到大为例讲的. 快速排序的基本思想是任取待排序序列的一个元素作为中心元素 ...

  6. 基于多次傅里叶变换算法的快速相位解包裹算法研究

    ▒▒本文目录▒▒ 一.前言 二.快速相位解包裹算法实例分析 三.参考文献 一.前言 一般而言,干涉相位图中的相位值通常被限制在主值区间内,这种相位被称为缠绕相位.在缠绕相位图中,像素点的相位值在-π或 ...

  7. 201-冒泡排序算法的思想和性能分析(时间、空间复杂度 稳定性)

    1.冒泡排序 特点: 相邻元素两两比较,把值大的元素往下交换. 缺点: 数据交换的次数太多了. 2.冒泡排序算法的思想 上图是无序的数据,要进行排序. 冒泡排序就是: 每一趟都是从开始的这个元素,两两 ...

  8. 基于蜜蜂优化算法优化的卷积神经网络(CNN)图像分类——附代码

    目录 摘要: 1.蜜蜂优化算法: 2. 卷积神经网络(CNN) 输入层 隐含层 输出层 ​3. 本文Matlab代码:​ 摘要: 本文通过蜜蜂优化算法,优化了卷积神经网络(CNN)中的超参数,主要是网 ...

  9. 基于蝗虫(蚱蜢)优化算法优化的支持向量机分类模型及其MATLAB实现-附代码

    基于蝗虫(蚱蜢)优化算法GOA优化的支持向量机分类模型SVM及其MATLAB实现-附代码 文章目录 基于蝗虫(蚱蜢)优化算法GOA优化的支持向量机分类模型SVM及其MATLAB实现-附代码 1. 模型 ...

  10. 图像处理/计算机视觉/python环境下如何用滤波器、算法恢复图片,对图片去污【附代码】

    图片修复.图片恢复 一.问题描述 二.效果图 三.代码附录 一.问题描述 利用算法处理受损受污染的图片,使其尽量复原 二.效果图 三.代码附录 去污算法一 import cv2 from matplo ...

最新文章

  1. php 当前页面下载文件,php实现当前页面点击下载文件的简单方法
  2. 从视觉系统的原理入手 破解VR眩晕症
  3. 锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)
  4. Hadoop sqoop数据导入导出工具安装
  5. OpenStack基金会携手Intel、Hyper发布开源Kata Containers项目
  6. 关于python类的继承正确的说法是_2017美团点评的运维岗校招笔试题,测测你会几题?...
  7. 在Pivotal Web Service上发布Spring Boot应用
  8. Pytorch transforms.Resize()的简单用法
  9. mysql常见排错_mysql 一些排错技巧
  10. 令人疑惑的defaultValueAttribute
  11. C++“准”标准库Boost学习指南(3):Boost.Utility
  12. 基于STM32F429的DCMI实现OV7725-NF无缓存摄像头的图像采集HAL库
  13. 极域电子教室怎么修改学生端频道号
  14. ROS学习笔记9 —— launch文件
  15. 使用idea连接阿里云RDS数据库
  16. The 12th tip of DB Query Analyzer, powerful in text file process
  17. vlookup 函数使用方法
  18. WORD表格数据运算技巧
  19. 统计单词数,题解简单易懂量少
  20. python + pyqt +opencv 有界面,对lable中的图片进行图像旋转,向右平移,向下平移,二值化,灰度,边缘检测

热门文章

  1. Linux命令行配置无线,Linux_CentOS-6.4无线上网命令行配置介绍,待连接的WIFI的ssid为“thmrdq - phpStudy...
  2. 顶级在线图片处理工具Photopea
  3. 怎样将jpg、png制作成windows桌面ico图标文件
  4. 计算机ping命令6,Mac电脑ping命令区别和IPv6命令
  5. 英伟达显卡算力榜(nvidia GPU compute capability)
  6. win10计算机系统优化设置,小编教你windows10设置优化提高系统性能
  7. android hci设备,android-hci相关操作
  8. 壳聚糖/葡聚糖/纳米羟基磷灰石复合水凝胶/鱼明胶-半乳糖壳聚糖水凝胶肝支架的制备
  9. 路由器,猫,交换机的区别
  10. QUST程序设计赛F题:Bash博弈