c++用模板实现稀疏多项式_用线性表实现一元多项式及相加运算

 本文主要讨论线性表在多项式计算中的应用,讨论内容涉及到一元n次多项式在计算机中的表示,及多项式相加运算。

01

在数学上,一个一元n次多项式可以按照升幂写成

Pn(x)= p0 + p1x + p2x2 + …… + pnxn

它由n+1个系数唯一确定。因此,一个一元n次多项式可以用一个线性表P来表示:

P = (p0,p1,p2,……,pn)

多项式每一项的指数隐含在线性表的序号里。假设Q是另外一个一元m次多项式,同样也可以用线性表Q来表示

Q = (q0,q1,q2,q2,……,qm)

如果m

因此,多项式P和Q相加的结果可以用线性表R表示

R =(p0+ q0,p1+ q1,p2+ q2,……,pm+ qm,pm+1,……,pn)

由此可以看出,一元n次多项式在计算机中可以用线性表来表示,其加法运算也可以在线性表的基础上进行。但在实际应用中,多项式的次数可能很高并且变化很大时,使得线性表最大长度很难确定,特别是在处理类似如下多项式时

T(x)= 12x2 + 2x12000+3x30000

虽然多项式只有3项非零元素,但仍然需要一个长度为30000的线性表来表示,造成对内存空间的浪费。在程序设计中,这种浪费是应当避免的。可以考虑用线性表存储多项式每项系数的同时,也存储相应的指数,这样就可以不用存储多项式的非零项了。

一般情况下,一元n次多项式也可以写成

Pn(x)= p1xe1+ p2xe2 + …… + pmxem

其中,pi是指数为ei项的非零系数,并且满足

0<=e1< e2

因此,若用一个长度为m,且每个元素有两个数据项(系数项和指数项)的线性表,便可唯一确定多项式P(x)

P = ((p1,e1),(p1,e2),……,(pm,em))

上面的式子在每项都不为零的情况下,仅只比存储每项系数的方案多存储一倍的数据。但是对于T(x)类的多项式,这种表示将极大节省存储空间。

用线性表存储多项式可以采用两种存储结构,一种是顺序存储结构,一种是链式存储结构。在实际应用中,具体采用什么存储结构,则要视作什么运算而定。一般来说如果仅是求多项式值的运算,宜采用顺序存储结构,当需要修改多项式的系数和值时宜采用链式存储结构。

例如  多项式

P(x)= 12 + 2x3+8x5+11x6

线性表的表示为

P = ((12,0),(2,3),(8,5),(11,6))

bb3b9e08706b758c3714f13dc731da74.png

461fb08feaaa7c95af200c9a3eb67abc.png

一元多项式相加的运算规则非常简单,两个多项式中指数相同的项对应系数相加,若相加的和不为零,则构成相加结果多项式中的一项,所有指数不相同的项均复制到相加结果多项式中。

02

下面用Java语言给出一元多项式表示及加法运算案例。前面讨论过,用线性表存储多项式时,宜采用系数项和指数项同时存储的结构。因此在案例中定义了PolyData类,用于存储多项式的项数据。

package com.milihua.algorithm.lineartable;public class PolyData {   /**     * 多项式系数项     */  public int coef;    /**     * 多项式指数项     */  public int expn;   /**     * 多项式项构造函数     */  PolyData(int coef,int expn){    this.coef = coef;    this.expn = expn;  }  public int getCoef() {    return coef;  }  public void setCoef(int coef) {    this.coef = coef;  }  public int getExpn() {    return expn;  }  public void setExpn(int expn) {    this.expn = expn;  }}

多项式存储采用LinkedList类,LinkedList是一个双向链表,当数据量很大或者操作很频繁的情况下,添加和删除元素时具有比ArrayList更好的性能。

package com.milihua.algorithm.lineartable;import java.util.Iterator;import java.util.LinkedList;import java.util.Scanner;public class Polynomial {  /**   * 存储第一个多项式的链表   */  LinkedList polyListOne = new LinkedList();  /**   * 存储第二个多项式的链表   */  LinkedList polyListTwo = new LinkedList();  /**   * 存储运算结果的多项式链表   */  LinkedList polyListResult = new LinkedList();  /**   * 添加数据到链表尾部   *    * @param inPolyData   * @return   */  public void addLastPol(LinkedList list, PolyData inPolyData) {    list.addLast(inPolyData);  }  /**   * 添加数据到链表   *    * @param inPolyData   * @return   */  public void addPol(LinkedList list, PolyData inPolyData) {    list.add(inPolyData);  }  /**   * 比较每项的指数大小   *    * @param aExpen   * @param bExpn   * @return 0两个指数相等,1第一个链表的指数大,-1第二个链表的指数大   */  public int compExpn(int aExpen, int bExpn) {    if (aExpen == bExpn) {      return 0;    } else if (aExpen > bExpn) {      return 1;    } else {      return -1;    }  }  /**   * 两个多项式链表相加   *    * @return   */  public void addPol() {    for (Iterator iter = polyListOne.iterator(); iter.hasNext();) {      PolyData poly = iter.next();      for (Iterator iterTwo = polyListTwo.iterator(); iterTwo.hasNext();) {        PolyData polyTwo = iterTwo.next();        switch (compExpn(poly.expn, polyTwo.expn)) {        case 0:          PolyData newPolyData = new PolyData(poly.coef + polyTwo.coef, poly.expn);          polyListResult.add(newPolyData);          polyListTwo.remove(polyTwo);          break;        case 1:          polyListResult.add(polyTwo);          polyListResult.add(poly);          polyListTwo.remove(polyTwo);          break;        case -1:          polyListResult.add(poly);          polyListResult.add(polyTwo);          polyListTwo.remove(polyTwo);          break;        }          break;      }    }  }  /**   * 遍历链表并显示出来   *    * @param list   */  public void display(LinkedList list) {    for (Iterator iter = list.iterator(); iter.hasNext();) {      PolyData poly = iter.next();      System.out.print(poly.getCoef() + "x^" + poly.getExpn() + "+");    }    System.out.println();  }  public LinkedList getPolyListOne() {    return polyListOne;  }  public void setPolyListOne(LinkedList polyListOne) {    this.polyListOne = polyListOne;  }  public LinkedList getPolyListTwo() {    return polyListTwo;  }  public void setPolyListTwo(LinkedList polyListTwo) {    this.polyListTwo = polyListTwo;  }  public LinkedList getPolyListResult() {    return polyListResult;  }  public void setPolyListResult(LinkedList polyListResult) {    this.polyListResult = polyListResult;  }}

Polynomial类是案例文件的主要处理类,在类中声明了三个LinkedList类,分别存储第一个多项式、第二个多项式以及两个多项式相加运算的结果。

Polynomial类的addPol()方法用于执行两个多项式的相加运算,具体算法过程是:

(1)遍历第一个多项式;

(2)在遍历过程中,处理每一个单项;

  • 遍历第二个多项式;

  • 比较两个单项式的指数;

  • 若指数相同,则两个单项式的系数相加,并形成新的单项式添加到运算结果列表中;若指数不相同,则两个单项式都添加到运算结果列表中。

addPol算法的执行频率为n*m,n为第一个多项式的单项式个数,m为第二个多项式的单项式个数,其算法复杂度为O(n^2)。

PolynomialTest类为测试类,代码如下:
package unittest;import java.util.Scanner;import com.milihua.algorithm.lineartable.PolyData;import com.milihua.algorithm.lineartable.Polynomial;public class PolynomialTest {  public static void main(String[] args) {    Polynomial  poly = new Polynomial();     //声明Scanner变量,并用new运算符实例化Scanner      Scanner sc = new Scanner(System.in);    System.out.println("----请输入第一个多项式\r\n输入方式为“系数,"        + "指数”\r\n结束请输入0----");    while(true)    {      String  str = sc.next();      if( str.equals("0") )      {        System.out.println("----第一个多项式输入结束----");        break;      }      String[] strArray = str.split(",");      if( strArray.length < 2 )      {        System.out.println("----输入的数据格式错误----");        break;      }      int coef = Integer.parseInt(strArray[0]);      int expn = Integer.parseInt(strArray[1]);      PolyData polyData = new PolyData(coef,expn);      poly.addPol(poly.getPolyListOne(),polyData);    }    poly.display(poly.getPolyListOne());    System.out.println("----请输入第二个多项式\r\n输入方式为“系数,"        + "指数”\r\n结束请输入0----");    while(true)    {      String  str = sc.next();      if( str.equals("0") )      {        System.out.println("----第二个多项式输入结束----");        break;      }      String[] strArray = str.split(",");      if( strArray.length < 2 )      {        System.out.println("----输入的数据格式错误----");        break;      }      int coef = Integer.parseInt(strArray[0]);      int expn = Integer.parseInt(strArray[1]);      PolyData polyData = new PolyData(coef,expn);      poly.addPol(poly.getPolyListTwo(),polyData);    }    poly.display(poly.getPolyListTwo());    poly.addPol();    poly.display(poly.getPolyListResult());  }}

用线性表存储一元多项式时,线性表的元素由两部分组成,一部分用于存储多项式的系数项,一部分用于存储多项式的指数项。这种存储结构对指数项很高且变化很大的多项式特别有用。在存储多项式时,线性表的存储结构可以采用顺序存储结构,也可以采用链式存储结构,推荐使用链式存储结构,存储空间灵活其运算方便。

一元多项式相加的运算规则非常简单,两个多项式中指数相同的项对应系数相加,若相加的和不为零,则构成相加结果多项式中的一项,所有指数不相同的项均复制到相加结果多项式中。多项式加法运算的时间复杂度为O(n)或O(n^2),算法不同,其时间复杂度也不同。本文给出的案例时间复杂度为O(n^2),时间复杂度为O(n)的算法,请自行给出。

9e9219063205740f9877937468030ed3.png—END—编程训练营APP创新在线学习模式,学习编程不再半途而废安卓手机应用商店搜索编程训练营下载

d3c478304d15da4dc3dc6c67af3a9e03.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cdh mysql sqoop 驱动_大数据技术之Sqoop学习——原理、安装、使用案例、常用命令...

第1章 Sqoop 简介Sqoop 是一款开源的工具&#xff0c;主要用于在 Hadoop(Hive) 与传统的数据库 (mysql,postgresql,...) 间进行数据的高校传递&#xff0c;可以将一个关系型数据库(例如&#xff1a;MySQL,Oracle,Postgres等)中的数据导入到 Hadoop 的 HDFS 中&#xff0c;也可以…

邮票的孔怎么做出来的_金银花茶是怎么做出来的呢

花期爱亦长&#xff0c;变换自然妆。蝶恋金银露&#xff0c;风柔满院香。说起金银花&#xff0c;可能大家都不陌生&#xff0c;它无论是作为观赏性盆景还是作为金银花养生茶都是非常适宜的。金银花被称为夏天第一花&#xff0c;夏天喝不仅能清热解暑&#xff0c;还能去除许多小…

github上成员贡献量_真祖传代码!你的GitHub代码已打包运往北极,传给1000年后人类...

公众号关注 “ML_NLP”设为 “星标”&#xff0c;重磅干货&#xff0c;第一时间送达&#xff01;晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI程序员们&#xff0c;激动的消息来了&#xff01;GitHub刚刚公布了一组照片&#xff0c;你的代码上周已经被打包运往北极保存。只要…

握手失败_主人用吃的训练小柴犬握手,老柯基看到后的表现出了吃货的本能!...

贪吃和贪玩是狗狗的天性&#xff0c;也是作为宠物狗它应该做的事情&#xff0c;没有哪一条狗是不贪吃的&#xff0c;如果有&#xff0c;那么肯定是条假狗&#xff01;养狗的人肯定都知道&#xff0c;只要在家你发出一丁点儿口袋的声音&#xff0c;你家狗子当时不管在干什么&…

indesign照片放入太大_猪肚鸡做法复杂,量太大,那来个简易版,用上大厨教的妙招更香了...

【猪肚鸡做法复杂&#xff0c;量太大&#xff0c;那来个简易版&#xff0c;用上大厨教的妙招更香了】天气越来越冷了&#xff0c;今天准备炖鸡汤&#xff0c;正好老妈给了小半个已经处理好的猪肚&#xff0c;所以决定炖个简易版胡椒猪肚鸡。说实话外面的胡椒猪肚鸡做法是比较复…

天气预测频繁2项集_986天气| 今年冬天比往年更冷?官方回应来了

4日下午&#xff0c;中国气象局召开新闻发布会&#xff0c;国家气候中心副主任贾小龙介绍&#xff0c;根据会商意见&#xff0c;我国今冬总体冷空气比较频繁&#xff0c;势力偏强&#xff0c;北方可能出现大范围低温雨雪天气过程。1隆冬季节北方或现大范围低温雨雪天气贾小龙表…

anaconda中安装xgboost_Anaconda是什么?Anconda下载安装教程 - python基础入门(16)

文章首发微信公众号&#xff0c;微信搜索&#xff1a;猿说python一.如果从事Python开发&#xff0c;配置环境需要安装两个包&#xff1a;第一个安装开发工具&#xff0c;俗称IDE : 推荐使用 Pycharm第二个安装开发工具包: Anacondaps:Windows 下 Pycharm下载/Anaconda安装详细步…

matlab非同秩矩阵相乘_线性代数精华——讲透矩阵的初等变换与矩阵的秩

这篇文章和大家聊聊矩阵的初等变换和矩阵的秩。矩阵的初等变换这个概念可能在很多人听来有些陌生&#xff0c;但其实我们早在初中的解多元方程组的时候就用过它。只不过在课本当中&#xff0c;这种方法叫做消元法。我们先来看一个课本里的例子&#xff1a;假设我们要解这个方程…

手持巡检仪_专业的三防产品设计-电力巡检仪设计

我个人认为所有科技的发展都是建立在人们的需求而产生的。让人们更加方便快捷舒适。在电力巡检的问题上&#xff0c;为了减少值班员抄表和记录因此设计出这款电力巡检仪设计。用于记录设备的运行、检修、备用状态,可查询当天的漏检项目情况&#xff0c;确保点检内容无遗漏&…

thinkphp v5.0.11漏洞_ThinkPHP5丨远程代码执行漏洞动态分析

ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的&#xff0c;在保持出色的性能和至简代码的同时&#xff0c;也注重易用性。但是简洁易操作也会出现漏洞&#xff0c;之前ThinkPHP官方修复了一个严重的远程代码执行漏洞。这个漏洞的主要原因是由于框架对控制器名没有…

本地提交spark_Spark 数据本地化级别

​​RDD 源码大家可以看到源码中的第五条注释说明&#xff0c;翻译过来的大概意思是提供一系列的最佳计算位置。我之前一直不太清楚 spark 是如何内部实现的&#xff0c;今天就带领大家来看一看 spark 的本地数据化级别在任务执行中的演变过程。1 数据的本地化级别有哪些&#…

街舞中的rolling机器人_首家!爆点!奈雪の茶、蛙小侠..开业倒计时!街舞PK…这个六一就差你来围观了...

说起济南的各大shopping mall世茂广场绝对是最得人心的总能迅速集结当下最火爆的品牌各种线上线下活动也是搞得新颖又有趣五一的“刘看山”还没结束呢这就马不停蹄的要上新活动了前方预警⚠奈雪の茶等一大波新店又要入驻啦 还有 “奔跑吧爸爸”亲子活动、街舞大赛 ……统统都在…

简述isodata算法的原理_基于UWB技术的室内定位方法简述

1. UWB室内定位概述&#xff1a;UWB室内定位技术与传统通信技术有极大的差异&#xff0c;它不需要使用传统通信体制中的载波&#xff0c;而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据&#xff0c;从而具有GHz量级的带宽。超宽带室内定位可用于各个领域的室内精…

slider获取点击 unity_Unity基础 | 70分钟带你轻松入门

Hello . 大家好今天给大家分享Unity3D的基础入门我是麦田这次录制的教程是面向零基础&#xff0c;想上手Unity的同学。所以就做了这一次大串讲。(只此一回&#xff0c;别无分号了。)时长1小时10分钟&#xff0c;我的建议是一口气看完。(因为我也是一口气讲完的)大家可以点击文末…

达梦数据库导入oracle数据_达梦数据库助力加速石油石化行业数字化转型升级

2020中国石油石化企业信息技术交流大会暨数字化转型、智能化发展高峰论坛于10月22日-23日在北京召开&#xff0c;武汉达梦数据库有限公司(简称达梦公司)作为国产数据库代表企业受邀参与此次活动&#xff0c;并以“国产数据库能源行业解决方案”为主题报告&#xff0c;为来宾介绍…

在lcd屏幕上窗口显示一个bitmap_SmartDrop——LED/LCD大屏内容投屏管理软件

产品简介SmartDrop是飞画推出的一款针对拼接大屏(LCD/LED)进行内容投屏管理的播控软件&#xff0c;支持LCD/LED两种应用环境&#xff0c;用户可以根据屏幕的使用场景进行选择安装LCD-Drop或LED-Drop。SmartDrop支持超高分辨率&#xff0c;显示窗口分辨率自定义,远程可视化控制&…

复杂电路简化经典例题_【中考物理】电路简化的10大原则和7大步骤

电路问题是初中物理比较难的知识&#xff0c;也是中考很重要的一部分。很多同学遇到电路类的题目&#xff0c;摆在面前的第一个问题就是不会简化电路图。今天给大家分享电路简化的10大原则和7大步骤&#xff0c;希望能够帮你解决这个难题&#xff01;电路简化的10大基本原则初中…

单关闭功能_广告弹窗关闭

相信现在大部分电脑都安装360安全卫士和搜狗拼音输入法&#xff0c;关于这两款软件各有吐槽&#xff0c;最讨厌的莫过于莫名奇妙的各种广告弹窗&#xff0c;让人不厌其烦。因为我们是免费&#xff0c;所以不要渴求太多。360安全卫士广告弹窗关闭办法1、打开360安全卫士点击右上…

忽视大小写函数_使用率低但功能强大的6个Excel函数公式应用技巧解读!

在Excel函数公式中&#xff0c;有部分函数的使用率是比较低的&#xff0c;但是其功能也是非常强大的。一、Median函数。功能&#xff1a;返回一组数的中值。中值就是一组数的中间数值&#xff0c;如果参数包含的数值是偶数&#xff0c;Median函数将返回位于中间两个值的平均值。…

创建路径_PS钢笔工具是建立路径的基本工具

PS“钢笔工具”是建立路径的基本工具&#xff0c;用来绘制任意形状的图形路径&#xff0c;钢笔工具通过设置锚点绘制形状路径。新建一个页面&#xff0c;选择钢笔工具&#xff0c;在页面上单击&#xff0c;建立路径的开始点&#xff0c;也就是路径的第一个锚点。再单击&#xf…