本文主要讨论线性表在多项式计算中的应用,讨论内容涉及到一元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))

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

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)的算法,请自行给出。

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

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

  1. 线性表实现多项式相加c语言,用线性表实现多个多项式相加

    今天开始想复习一下数据结构,就从线性表开始吧. 今天是用线性表实现多个多项式相加这个题目,自变量是x. 题目描述如下: 在数学上,一个一元多项式Pn(x)可按降幂写成:Pn(x) = pn x^n + ...

  2. dropdownlist三级联动怎么实现_一张表实现三级联动

    今天是七夕,七夕快乐,大家今天有没有人约呢? 相信大部分的Access玩家都是玩Excel的高手,很多的功能在Excel中实现对大家来说都是小菜,比如今天要讲的联动. 那么,我们现在就来讲一下在Acc ...

  3. 子窗体中组合框联动_一张表实现组合框联动

    嗨,大家中午好! 最近,有网友给我私信,想要一个联动的示例,一个有关于部门联动的操作. 其实关于联动的操作有很多,可以是组合框的联动,列表框联动,组合框与列表框也可以联动,哪怕是放到子窗体中也是可以联 ...

  4. java 一元稀疏多项式简单计算器_一元稀疏多项式简单的计算器

    共回答了25个问题采纳率:92% 一元稀疏多项式计算器设计程序代码 #include #include #include #include #define maxlen 10 #define larg ...

  5. XDOJ 一元稀疏多项式计算器 C

    前言 让汗水成为铠甲,把困顿化为良机. 题干 问题描述 一元 n 次多项式p0 x^0+···+pi x^i···+pn x^n项数较少时成为一元稀疏多项式, 例如:3 + 6 x^3 − 2 x^8 ...

  6. MFC版链表实现稀疏多项式相加减

    链表实现多项式运算(加减)MFC可视化版 题目 设计一个一元稀疏多项式简单计算器. 基本要求 (1)输入并建立两个多项式: (2)多项式a与b相加,建立和多项式c: (3)多项式a与b相减,建立差多项 ...

  7. 设计一个一元稀疏多项式简单计算器

    目录 1.题目 2.需求分析 3.程序设计 4.测试结果 5.源码 1.题目 [问题描述] 设计一个一元稀疏多项式简单计算器. [基本要求] (1)输入并建立两个多项式: (2)多项式a与b相加,建立 ...

  8. 完整版一元稀疏多项式计算器

    一元稀疏多项式计算器 [问题描述]: 设计一个一元稀疏多项式简单计算器. [基本要求]: 一元稀疏多项式简单计算器的基本功能是: (1)输出并建立多项式: (2)输出多项式,输出形式为整数序列:n,c ...

  9. 一元稀疏多项式加减法计算器

    实验一:一元稀疏多项式计算器 [问题描述]: 设计一个一元稀疏多项式简单计算器. [基本要求]: 一元稀疏多项式简单计算器的基本功能是: (1)输出并建立多项式: (2)输出多项式,输出形式为整数序列 ...

最新文章

  1. 引入spring-boot-starter-actuator,控制台没有mapper的映射信息打印问题
  2. 1、数据库是什么?关系型数据库和非关系型数据库又是什么?
  3. qprocess调用linux命令
  4. Apache+Tomcat中支持“UTF-8”编码的中文地址
  5. JAVA Spring 事物 ( 已转账为例 ) 基于 AOP 注解
  6. (转)用Java获得当前性能信息
  7. vue 离开页面事件_【必看】58 道 Vue 常见面试题集锦,涵盖入门到精通,自测 Vue 掌握程度...
  8. VS2013 使用QCustomPlot等三方库如何配置
  9. LInux:shell 命令:字符串截取
  10. 看了5种分布式事务方案,最终选择了Seata,真香!
  11. TCP慢开始与拥塞避免
  12. Javascript 已被弃用的或删除的特性(V客学院知识分享)
  13. Java中关于字符类型在Unicode表中表示
  14. CMMI认证需要什么条件?
  15. 联想服务器win7系统安装教程,一键安装联想win7系统步骤指南
  16. c语言 char *str 与char str[]区别
  17. ffmpeg 为取经而来_取经路上的妖魔鬼怪,傻傻分不清楚
  18. 学计算机应用表白,521.1314表白的数学题 学霸间的表白方式
  19. 手机微信语音批量转文字 使用百度语音识别
  20. 想学脑电,没有数据为什么不看这里?

热门文章

  1. Oracle tips
  2. linux mariadb 升级,linux mariadb
  3. mysql varchar 2000能存_mysql 数据库 varchar 到底可以存多少数据呢,长文慎入
  4. 快学Scala习题解答—第三章 数组相关操作
  5. mysql distinct两列_正在检索两列,并对MySQL中的每列应用“distinct”
  6. Java Double类hashCode()方法及示例
  7. php ues incolde,17秋东财《大学英语2》在线作业三答案
  8. 第 2-4 课:克隆和序列化 + 面试题
  9. Redis持久化的几种方式——深入解析RDB
  10. Net操作Excel(终极方法NPOI)