【发布时间】:2017-01-30 16:44:24
【问题描述】:
我正在尝试编写一个函数来简化多项式中的项:
假设我们可以用一个双成员整数数组来表示每个项,其中第一个成员显示变量,第二个成员是系数。例如 4a 和 3b 可以分别表示为 (1, 4) 和 (2, 3)。在这些示例中,我们根据字母顺序 (a:1, b:2, c:3, ...) 通过整数显示变量 (a, b, ..)。
因此,多项式可以表示为这些项的向量。例如 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++;
}
}
感谢所有可以向我展示代码问题以及如何提高代码速度的人。
【问题讨论】:
-
我很想听听使用
vector<int*>而不是vector<int>的解释。 -- 但是对于大型多项式来说它非常慢。 -- 您正在运行发布、优化的构建,还是“调试”、未优化的构建?如果它是一个调试/未优化的构建,那么你得到的任何时间都是没有意义的。 -
此外,要从符合条件的容器中删除项目,无需编写循环。
p.erase(std::remove_if(p.begin(), p.end(), [](auto val) { return *val == 0; }), p.end()); -
其实这个函数是我原来函数的简化版,因为它是一个有很多类的大型项目的一部分。所以我只是试图展示算法并找出它可能存在的问题。
-
另外,你如何表示负系数?例如:
4a - 5b。这是 (1, 4), (2, -5) 吗?如果是这样,那么这不是一个非常困难的任务,并且比您发布的要简单得多。您只需对第一个成员进行排序,然后为相同的排序成员添加第二个成员。此外,std::vector<std::pair<int, int>>比std::vector<int *>更有意义。 -
感谢您的提示。我的另一个问题是,在这种情况下使用向量、列表或其他容器有什么区别。
标签: c++ vector iterator traversal