提前致谢。
对于我的c ++类,我的任务是使用链接列表表示一个多项式,例如sum(HD$VAL >==24 & !is.na(HD[,1]))
,并构建Node& Poly类帮助表达它。
我不知道如何用链表中的X和Y来表示多项式。
我想建立一个链表来表示像sum(HD$VAL >==24 & !is.na(HD[,2]))
我是新手,所以任何示例代码或伪代码都会有很大的帮助。
我在这里提出了这个代码(起点),但我认为它只适用于单个变量而不是两个(7x ^ 6 * ...但不是7x ^ 6 * y ^ 4)。再次感谢:)。
答案 0 :(得分:1)
你有没有想过,或者你被允许使用Horner's representation多项式?它不仅是计算多项式值的更有效方法,而且在许多情况下可以导致更稀疏的数据结构。例如,多项式:
等同于以下表达式:
所以有三件事需要注意:
所以在这个幸运的情况下,我选择的多项式可以非常容易和有效地存储为以下列表/数组:
[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;
};
注意:未对代码进行正确性测试。