【问题标题】:Representing a polynomial with linked lists [closed]用链表表示多项式
【发布时间】:2016-03-21 06:19:07
【问题描述】:

提前致谢。 对于我的 c++ 类,我的任务是使用链表表示一个多项式,例如 (MyPoly= 7x^6*y^4 + 4x^4*y^5 - 8x^5*y^3 – 9x + 8),并构建 Node 和 Poly 类来帮助表达它。

我不知道如何用链表中的 X 和 Y 来表示多项式。

我想建立一个链表来表示像7 6 4 -> 4 4 5 -> -8 5 3 ->-9 1 0 -> 8 0 0 ->NULL 这样的多项式

我是新手,所以任何示例代码或伪代码都会有很大帮助。

Attempted setup

我在这里想出了这段代码(起点),但我认为它只适用于有一个变量而不是两个(7x^6*... 但不是 7x^6*y^4)。再次感谢:)。

【问题讨论】:

  • 不要发布代码链接,也不要将代码发布为图片。将代码作为测试复制并粘贴到问题的主体中。
  • 为什么是链表而不是数组或地图?具体要求是什么(需要支持哪些操作?可以使用STL容器吗(如std::list,std::vector,std::map
  • 只是 x,y ?可能的 z,t...?
  • @MikeMB 这是一个班级的作业。大概与课程中的链表有关。

标签: c++ class linked-list polynomials


【解决方案1】:

您有没有想过,或者您是否可以使用多项式的Horner's representation?这不仅是计算多项式值的一种更有效的方法,而且在许多情况下可以导致更稀疏的数据结构。例如多项式:

等价于下面的表达式:

所以有3点需要注意:

  • 实际上,此架构的一个显着之处(尽管与您的问题没有直接关系)是它的计算快得多,因为您节省了大量的乘法。
  • 多项式的索引直接取决于表达式的长度
  • 表达式中的所有元素都是同构,与度数无关。这对于每个 arity 也是如此。

所以在这个幸运的情况下,我选择的多项式可以非常容易且有效地存储为以下列表/数组:

[7, 5, 1, -4, 1, 8, 1, -7]

或者,如果您愿意,作为 [x_mult|sum] 数字的链表: [7|5]->[1|4]->[1|8]->[1|-7]

虽然您知道具有偶数索引的元素乘以 x,并添加到后面的元素,但架构非常简单。

#include <iostream>
using namespace std;

int main()
{
  // the x you want to calculate
  int x = 1;
  // the horner-representation of your polynom
  int A[8] {7, 5, 1, -4, 1, 8, 1, -7};
  int partial;
  int result = 1;
  // run calculations following horner-schema
  for (int i = 0; i < 8; i++) {
    if (i%2==0){
      partial = A[i]*x; // this mult. is only needed at i=0
      result *= partial;
    } else{
      partial = A[i];
      result += partial;
    }
  }
  cout << "x=" << x << ", p(x)=" << result << endl;
  return 0;
}
  • 问题:如果您抑制奇数索引,并且将“1”视为理所当然,将前 7 个存储在其他位置,则可以大大提高其性能和内存使用率。此外,由于索引直接取决于列表的长度,所以像 这样的多项式 将有一个非常低效的表示。

  • 内存问题的解决方法:一种可能的解决方法是将您的 ListElement 继承为 ExpandedListElement,以便其容器中的数字不会被解释为因素,而是作为 数字重复次数。所以 ExpandedListElement [1000|a] 意味着,您的列表有一千个 ListElement,看起来像这样:[1|a]。所以给定的 x^1000+3 示例将有两个元素:ExpandedListElement[999|0]-->ListElement[1|3]。您还需要一个方法来执行循环,我省略了(如果您需要此解决方法,请告诉我,我会发布它)。

我没有对它进行广泛的测试,但我认为它对于两个或多个变量也是一种好方法。我也留下了其余的 OO 实现细节,但核心 DS 和操作在那里,应该很容易嵌入到类中。如果您尝试一下,请告诉我它是如何工作的!

干杯

安德烈斯

【讨论】:

  • 您能否提供一些信息如何同时使用 x 和 y?
  • 这篇link下的论文“关于多元霍纳方案”(Pena, Sauer)在第 3 页有一个算法,但基本上似乎是向节点添加更多字段的问题
  • 感谢您的参考。
  • 不客气! Humam Helfawi 提供的解决方案似乎是一个很好的起点
【解决方案2】:

我认为,您可以用矩阵而不是链表或其他东西来表示多项式。

   |X^0|x^1|x^2|x^3  
---|---|---|---|---  
y^0|   |   |   |     
---|---|---|---|---  
y^1|   |   |   |  
---|---|---|---|---  
y^2|   |   |   |  
---|---|---|---|---  
y^3|   |   |   |  

在每个单元格中,您应该保留 x^x' 和 y^y' 的系数。您可以更轻松地定义操作。

您可以使用Boost.uBLAS 进行矩阵运算。

【讨论】:

  • 这不能回答问题。此外,如何将 x^3999718 + y^7514296 + x^255714y^652779 表示为矩阵?会不会太浪费了?
【解决方案3】:

快速解决方案不太干净:

MyPoly= 7x^6*y^4 + 4x^4*y^5 - 8x^5*y^3 – 9x + 8

#include <list>
class factor;
class polynomial{
public:
    std::list<factor> factors;
};

class factor{
public:
    factor()=default;
    factor(int constant,int x_pow,int y_pow):constant(constant),x_pow(x_pow),y_pow(y_pow){}
    int constant;
    int x_pow;
    int y_pow;

};
int main()
{
    polynomial MyPoly;
    MyPoly.factors.emplace_back(7,6,4);
    MyPoly.factors.emplace_back(4,4,5);
    MyPoly.factors.emplace_back(8,5,3);
    MyPoly.factors.emplace_back(9,1,0);
    MyPoly.factors.emplace_back(8,0,0);
}

【讨论】:

    【解决方案4】:

    这是一种方法:

    设计注意事项:
    1. 将多项式视为节点列表
    2. 每个节点可以包含子节点。

    所以,你的类定义是:

    class Polynomial
    {
       list<nodes> termList;
    }; 
    
    class Node
    {
       list<SubNodes> subnodelist;
    
    };
    
    template<class T>
    class subNode
    {
       int coefficient;
       int power;
       T variable;
    };
    

    注意:未测试代码的正确性。

    【讨论】:

    • 你的系统如何表示 5x^2y^3?
    • 将其设置为任意变量(x,y,z 无所谓)并将幂设置为零...
    • 您可以按照自己的方式处理边缘情况...
    • 如果 5x^2y^3 是边缘情况,什么不是边缘情况?如果它们中的大多数无论如何都是 1,为什么还要在你拥有它的地方设置系数?
    • 正如我所说,你可以按照你想要的方式处理它..这是我能想到的最简单的设计..这里不需要花哨的技巧。同意边缘案例部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多