用c++简化多项式中的项
simplifying terms in a polynomial by c++
我正在尝试编写一个函数来简化多项式中的项:
假设我们可以用双成员int数组来表示每个项,第一个成员表示变量,第二个成员表示系数。例如4a和3b可以分别用(1,4)和(2,3)表示。在这些例子中,我们已经用一个基于字母顺序的整数(a:1,b:2,c:3,…)显示了变量(a,b,..)
因此,多项式可以表示为向量<-这些术语的int。例如4a+2b+10c可以显示为类似于{(1,4)、(2,2)、(3,10)}。现在,目标是简化多项式。例如:
2a+3c-a+5t-3c=a+5t
我已经用C++编写了一个代码来完成这项工作,但对于大型多项式来说速度非常慢。
void simplify (vector<int*> &p)
{
vector<int*>:: iterator it1 = p.begin();
vector<int*>:: iterator it2;
while (it1!=p.end())
{
if ((*it1)[1]!=0) // if the coefficient is not equal to zero
{
it2 = it1+1;
while (it2!=p.end())
{
if ((*it1)[0]==(*it2)[0]) //if the variables are similar
{
(*it1)[1] += (*it2)[1];
(*it2)[1]=0; //set the coefficient equal to zero
}
it2++;
}
}
it1++;
}
it1 = p.begin();
while (it1!=p.end()) //removing the terms with zero coefficient
{
if ((*it1)[1]==0)
it1 = p.erase (it1);
else
it1++;
}
}
我感谢所有能向我展示代码问题以及如何提高代码速度的人。
您的代码中肯定会有一些变化。但由于你主要关心的是效率,我建议你采取的第一步行动是使用不同的算法。
您当前的算法为每个元素检查向量的剩余部分,寻找相同的符号,并将找到的符号相加,以获得最终系数。因此,您的算法是;
for i in range(0, p.size()):
for j in range(i+1, p.size()):
// do the processing
正如您自己可能注意到的,此算法的复杂性是O(N2),这是您的代码效率低下的主要原因。
作为一种选择,您可以对向量进行迭代,并将值放入std::集中。(假设STL不是禁区,考虑到您对std::vector的使用)以下是基于您的代码对我的想法的粗略实现。
void simplify (vector<int*> &p)
{
vector<int*>::iterator it1 = p.begin();
vector<int*>::iterator it2 = p.end();
map<int, int> m;
map<int, int>::iterator itMap1, itMap2;
while (it1!=it2)
{
if(m.find((*it1)[0]) != m.end())
{
m[(*it1)[0]] += (*it1)[1];
}
else
{
m[(*it1)[0]] = (*it1)[1];
}
it1++;
}
itMap = m.begin();
itMap2 = m.end();
p.resize(m.size());
it = p.begin();
while (itMap!=itMap2)
{
(*it1)[0] = itMap->first;
(*it1)[1] = itMap->second;
itMap++;
it++;
}
}
上面的实现遍历向量一次,其具有O(N)复杂度,N是向量的初始大小。在每次迭代中进行的操作的复杂性为O(logN)(由于std::map的实现),导致O(NlogN)的总体复杂性,比具有二次复杂性的初始算法好得多。
请注意,这只是基于您的代码的一个粗略的初始实现,对于您的初始代码和我建议的版本,还有其他可能的改进。一个例子是使用struct
或class
来包含每个术语,而不是指针,并使代码更可读、更紧凑。另一种可能的改进可以是使用CCD_ 3而不是CCD_。
我建议通过使用术语:的结构来提高代码的可读性
struct Term
{
int coefficient;
char variable_name;
int exponent;
};
上述结构对多项式项进行建模要比{6,2}容易得多
您的代码变得更加可读,这有助于减少缺陷的注入。
多项式变为:
typedef std::vector<Term> Polynomial;
换句话说,这意味着多项式是项的容器(向量)。
该结构还允许您按变量名和递减系数(或指数)对容器进行排序。
编辑1:输入术语
您可以重载术语的operator>>
以输入术语:
struct Term
{
// as above.
friend std::istream& operator>>(std::istream& input, Term& t);
};
std::istream& operator>>(std::istream& input, Term& t)
{
input >> t.coefficient;
input >> t.variable_name;
input >> t.exponent;
return input;
}
这允许您通过以下方式构建多项式:
Polynomial p;
Term t;
while (input >> t)
{
p.push_back(t);
}
在我看来,这比您的设计和实现简单得多,也不容易出错。
- c++模板来表示多项式
- 使用链表数据结构打印多项式
- 需要帮助重载多项式类运算符C++
- 如何修复此教科书程序以在C++中添加多项式?
- 如何对两个 4 位数字进行乘法,将它们视为 C++ 中的多项式
- 实现伪多项式DP子集和
- 递归程序获得勒让德多项式
- 在 NTL 中构造多项式的标准方法是什么?
- 最小二乘多项式拟合仅适用于偶数个坐标
- 多项式系数代码始终提供相同的答案
- 进入第二个多项式后如何修复分割错误?
- 用霍纳方法进行多项式求值的C++ constexpr
- 卡拉苏巴 - 多项式乘以 CUDA
- 使用链表添加多项式?援助
- 用Isringstream C 提取多项式的系数
- 用于多项式乘法的卡拉苏巴算法
- C :多项式矩阵的输出
- 多项式链接列表中的过载 运算符
- NTRUEncrypt:使用开源标准算法中的描述无法正确找到两个多项式的GCD,无法定义是否存在多边形的逆
- 二阶多项式计算器的输出不一致