C++ (有效地)动态存储多项式

C++ (有效地)动态存储多项式,c++,polynomials,C++,Polynomials,我试图实现的是使用数组存储未知大小的多项式。 我在互联网上看到的是使用一个数组,每个单元格都包含系数,度数是单元格数,但这并不有效,因为如果我们有一个多项式,比如:6x^14+x+5。这意味着从1到13的单元格中都有零。我已经研究过一些向量和链表的解决方案,但是没有(std::vectors或std::list)的使用,有没有其他有效的方法来解决这个问题呢?除非有令人信服的理由采取其他行动(这是一项编程任务,要求您使用C样式数组),您应该使用标准库中的std::vector。库的存在是为了让您的

我试图实现的是使用数组存储未知大小的多项式。
我在互联网上看到的是使用一个数组,每个单元格都包含系数,度数是单元格数,但这并不有效,因为如果我们有一个多项式,比如:6x^14+x+5。这意味着从1到13的单元格中都有零。我已经研究过一些向量和链表的解决方案,但是没有(std::vectors或std::list)的使用,有没有其他有效的方法来解决这个问题呢?

除非有令人信服的理由采取其他行动(这是一项编程任务,要求您使用C样式数组),您应该使用标准库中的
std::vector
。库的存在是为了让您的生活更轻松。在您的程序环境中,开销可能微不足道


您提到将多项式(如4*x^5+x-1)存储在
std::vector
中,其索引表示幂(如
[-1,1,0,0,0,4]
)是低效的。这是事实,但除非您存储次数大于1000的多项式,否则这种浪费是完全不重要的。对于“稀疏”多项式,高度,但系数很少,你可以考虑使用一对向量,第一个值的每对存储的权力和第二个值存储系数。

< P>除非有一个令人信服的理由采取行动否则(这是一个编程任务,在这里你需要使用C风格数组),您应该使用标准库中的
std::vector
。库存在的原因是:使您的生活更轻松。在您的程序上下文中,开销可能微不足道


您提到将多项式(如4*x^5+x-1)存储在
std::vector
中,其索引表示幂(如
[-1,1,0,0,0,4]
)是低效的。这是事实,但除非您存储次数大于1000的多项式,否则这种浪费是完全不重要的。对于“稀疏”多项式,高阶但系数小,可以考虑使用一对向量,每个值的第一个值存储幂和第二个值存储系数。

< P>一个稀疏多项式可以用一个映射来表示,其中零元素用不存在的键表示。
#include <map>

//example of sparse integer polynomial
class SparsePolynomial{
    std::map<int,int> coeff;
    int& operator[](const int& degree);
    int get(int degree);
    void update(int degree, int val);
};

虽然这种方法为我们提供了更高效的存储,但它比vector需要更多的访问和更新时间。然而,在稀疏多项式的情况下,差异可能很小。给定大小为
N
std::map
,元素的平均搜索复杂度为
O(logn)
。假设您有一个次数为
d
且非零系数数为
N
的稀疏多项式。如果
N
d
小得多,那么访问和更新时间将足够小,以至于不会引起注意。

稀疏多项式可以用一个映射表示,其中零元素用none表示Existent键。下面是此类的一个示例:

#include <map>

//example of sparse integer polynomial
class SparsePolynomial{
    std::map<int,int> coeff;
    int& operator[](const int& degree);
    int get(int degree);
    void update(int degree, int val);
};

虽然这种方法为我们提供了更高效的存储,但它比vector需要更多的访问和更新时间。然而,在稀疏多项式的情况下,差异可能很小。给定大小为
N
std::map
,元素的平均搜索复杂度为
O(logn)
。假设您有一个次数为
d
且非零系数数为
N
的稀疏多项式。如果
N
d
小得多,那么访问和更新时间将足够短,不会引起注意。

您说的“不使用向量”是什么意思这里有一些可能是为了澄清你的困惑。a怎么样?@我喜欢的一些讽刺:-)你可以使用@Someprogrammerdude建议的
std::map
,或者你可以使用
std::vector
,其中每一对都包含指数和相应的系数。你是什么意思“不使用向量"? 这里有一些可能是为了澄清你的困惑。a怎么样?@有些是我喜欢的讽刺:-)你可以使用@Someprogrammerdude建议的
std::map
,或者你可以使用
std::vector
,其中每对都包含指数和相应的系数。非常有用,上面的人也提到了我还不知道的映射,但您给出了一个非常感谢的具体示例。您认为内存空间或运行时更重要吗?我知道它们都是,但在你不得不继续的情况下,你会说记忆更有价值吗?我会说记忆空间更重要,原因有两个:(1)冯·诺依曼瓶颈。(2) 在这种情况下,
N
非常小,运行时的折衷可以忽略不计。非常有帮助,上面的人也提到了映射,我还不知道,但你给出了一个具体的例子,非常感谢。你认为什么是更重要的内存空间或运行时?我知道它们都是,但在你不得不继续的情况下,你会说记忆更有价值吗?我会说记忆空间更重要,原因有两个:(1)冯·诺依曼瓶颈。(2) 在这种情况下,
N
非常小,运行时的权衡可以忽略不计。是的,我实际上是在谈论稀疏多项式。我将搜索更多关于使用向量对的内容。是的,我实际上是在谈论稀疏多项式。我将搜索有关使用成对向量的更多信息。