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,一经查实,立即删除!

相关文章

Win11如何重置电脑 Win11重置电脑教程

我们升级Win11之后&#xff0c;因为对系统的不熟悉可能会进行很多错误的设置&#xff0c;结果造成系统出现了很多问题&#xff0c;这时候我们不想要重装&#xff0c;想要将设置全部恢复到最初的样子需要怎么操作&#xff0c;如果你还不会可以看下面Win11系统恢复重置的教程。 …

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

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

Win11怎么设置耳机和音响一起响

许多用户在使用电脑的时候&#xff0c;都会进行一系列的设置。而不少用户在使用的时候还有一些特殊的需求&#xff0c;例如有些小伙伴在使用Win11的时候想要设置耳机和音响同时响&#xff0c;那么具体的话要怎么设置呢?下面小编就带着大家一起看看吧! 操作方法&#xff1a; …

Win7旗舰版电脑开机慢的解决方法

随着人们生活水平的不断提高&#xff0c;很多朋友都拥有了电脑&#xff0c;Win7旗舰版系统电脑开机慢应该怎么办呢?还不知道的朋友快来跟着系统之家小编一起学习一下Win7旗舰版电脑开机慢的解决方法吧。 Win7旗舰版电脑开机慢的解决方法 1、进入系统桌面&#xff0c;鼠标右键…

Javamysql语法转化oracle_MySQL与Oracle的语法区别详细对比

Oracle和mysql的一些简单命令对比1) SQL> select to_char(sysdate,yyyy-mm-dd) from dual;SQL> select to_char(sysdate,hh24-mi-ss) from dual;mysql> select date_format(now(),%Y-%m-%d);mysql> select time_format(now(),%H-%i-%S);日期函数增加一个月&#x…

UC浏览器电脑版怎么设置字体大小 UC浏览器字体设置教程

对于一些视力不好的小伙伴进行浏览网页的时候&#xff0c;要是浏览器的字体更大些的话看着就会轻松多了&#xff0c;下面小编就为你带来UC浏览器字体设置教程。 UC浏览器电脑版怎么设置字体大小&#xff1a; 打开UC浏览器&#xff0c;点击“菜单”按钮&#xff0c;然后从弹出…

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

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

python画资本市场线_金融学笔记:CAPM,从资本配置线 CAL、资本市场线 CML,到证券市场线 SML...

在这里&#xff0c;我们已有了均值&#xff0d;方差前沿&#xff1a;其中是风险资产的协方差矩阵&#xff0c; 但其实在本文中&#xff0c;均值&#xff0d;方差前沿的具体数学形式并不重要&#xff0c;以上内容可以忽略。我们现在可画出均值&#xff0d;方差前沿的图像&#x…

Win10 C盘空间越来越小怎么办

Win10系统c盘空间自动变小了怎么办?相信很多朋友会发现C盘的空间莫名其妙的越来越少&#xff0c;不知道是哪些文件占用了C盘的空间&#xff0c;下面小编就为大家带来Win10系统C盘变小的解决方法。 对于很多PC用户来说&#xff0c;如今都用上了SSD与最新的Win10操作系统&#…

Win10乱码了怎么解决 Win10系统乱码解决办法

用电脑时&#xff0c;如果突然发现电脑出现乱码的现象&#xff0c;那一瞬间会觉得很头皮发麻&#xff0c;刚好最近就有小伙伴来问win10改了系统语言还是乱码的问题&#xff0c;今天小编来跟大家说说win10乱码了怎么办的解决方法&#xff0c;大家一起来看看吧。 1、进入控制面板…

filter java oauth_java – 带有自定义安全过滤器的Spring Boot OAuth2

我有一个带有OAuth2授权和资源服务器的spring boot设置.用户可以通过向/ oauth / token发出POST请求来获取令牌.到现在为止还挺好.但是,我不想通过BASIC auth保护/ oauth / token,而是通过自定义安全过滤器.我尝试了以下内容,但从未调用过DemoAuthenticationFilter&#xff1a;…

2345王牌浏览器网页加载慢怎么办 网页加载慢解决

2345王牌浏览器网页加载慢怎么办?相信很多2345王牌浏览器用户都碰到过这个问题&#xff0c;今天小编就给大家带来这个解决办法&#xff0c;让你拥有极速加载网页。 2345王牌浏览器网页加载慢解决办法 1、打开清除上网痕迹。 入口一&#xff1a;标签栏居中&#xff0c;菜单栏…

eclipse不进入断点_Eclipse 调试中不支持运行到断点问题

引用eclipse debug URLClassPath.getLoader(int) file结果在这个地方[url]http://www.eclipse.org/forums/index.php?tmsg&S73b3719b575dd532260d1809694f886b&th77485&goto241565[/url]找到了一些简介.就是因为,其它的项目有的断点.把那些断点去掉就可以了.This…

华硕主板专用Ghost Win11 64位专业体验版 V2021.08

华硕主板专用Ghost Win11 64位专业体验版是微软最新发布的电脑操作系统&#xff0c;目前Win11系统已经更新至第六个预览版本&#xff0c;增加和修复了众多的内容&#xff0c;这里小编为大家带来最新版下载&#xff0c;用户可以一键快速安装! 华硕主板专用Ghost Win11 64位专业…

双鉴探测器是哪两种探测方式结合_双鉴探测器的原理及应用

所谓双鉴探测器&#xff0c;是指将两种不同技术原理的探测器整合成一体&#xff0c;当两种探测器都报警时才发出报警的装置。该类探测器是入侵探测器的一种&#xff0c;它兼具两种探测器的优点&#xff0c;误报警率显著降低。目前&#xff0c;市面主流的双鉴探测器是用微波(或超…

雨林木风win11 64位安全旗舰版镜像V2021.09

雨林木风win11 64位安全旗舰版镜像V2021.09是一款安装起来稳定可靠的新版装机系统&#xff0c;该系统提升了菜单栏的合理布局和视觉冲击&#xff0c;让客户感受到完美的视觉效果&#xff0c;用户可以直接在本站下载安装 雨林木风win11 64位安全旗舰版镜像V2021.09 一、系统特…

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

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

Win11更新卡在0%怎么办 Win11更新卡在0%解决方法

Win11更新卡在0%怎么办?最近有的用户在升级最新版的Win11系统时&#xff0c;出现了卡在0%&#xff0c;更新不动的情况&#xff0c;不知道如何解决?这可能是因为微软服务器问题&#xff0c;也可能是系统出现了一定的更新错误&#xff0c;这里小编为大家带来几种解决方法介绍&a…

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

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

Win11右键刷新怎么恢复 Win11右键刷新恢复教程分享

Win11系统是现在非常火热的电脑操作系统&#xff0c;最近微软取消了Win11右键菜单中的刷新功能&#xff0c;这让很多用户使用起来非常不习惯&#xff0c;这个可以恢复到之前吗?其实我们可以通过修改注册表的方式来恢复这个右键刷新&#xff0c;下面就一起来看看具体的方法吧。…