用链表表示多项式

时间:2016-03-21 06:19:07

标签: c++ class linked-list polynomials

提前致谢。 对于我的c ++类,我的任务是使用链接列表表示一个多项式,例如sum(HD$VAL >==24 & !is.na(HD[,1])) ,并构建Node& Poly类帮助表达它。

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

我想建立一个链表来表示像sum(HD$VAL >==24 & !is.na(HD[,2]))

这样的多项式

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

Attempted setup

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

4 个答案:

答案 0 :(得分:1)

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

等同于以下表达式:

所以有三件事需要注意:

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

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

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

或者如果您愿意,可以作为 [x_mult | sum] 数字的链接列表: [7 | 5] - > [1 | 4] - > [1 | 8] - GT; [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]意味着,你的列表有一千个ListElements,如下所示:[1 | a]。所以x ^ 1000 + 3给出的例子有两个元素:ExpandedListElement [999 | 0] - &gt; ListElement [1 | 3]。你还需要一个方法来执行循环,我省略了(如果你需要这个解决方法让我知道,我会发布它。)

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

干杯

安德烈

答案 1 :(得分:0)

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

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

在每个单元格中,你应该保持x ^ x&#39;的系数。和y ^ y&#39;。您可以更轻松地定义操作。

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

答案 2 :(得分:0)

快速解决方案不那么干净:

  

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);
}

答案 3 :(得分:-1)

这是一种方法:

设计考虑因素:
1.将多项式视为节点列表
2.每个节点可以包含子节点。

所以,你的类定义是:

class Polynomial
{
   list<nodes> termList;
}; 

class Node
{
   list<SubNodes> subnodelist;

};

template<class T>
class subNode
{
   int coefficient;
   int power;
   T variable;
};

注意:未对代码进行正确性测试。