【问题标题】:How to use linked list to implement the multiplication of two polynomial in O(M^2N)?如何使用链表实现O(M^2N)中两个多项式的乘法?
【发布时间】:2015-03-21 06:12:22
【问题描述】:

这是“C 中的数据结构和算法分析”练习 3.7 中的练习。 假设在链表中实现了两个多项式。一个有 M 项。另一个有 N 项。练习要求我在 O(M^2N) 中实现两个多项式的乘法(假设 M 是较小的那个)。如何解决?

【问题讨论】:

  • 最好能展示你目前写的代码并提出具体问题。
  • 不,我指的是(M 的平方)乘以 N。
  • 程序太长,无法粘贴到这里。但到目前为止,我编写了一个具有 O(MNlog(MN)) 时间复杂度的乘法函数。这个想法是首先使用多项式 A 的每一项乘以多项式 B 的每一项,然后我将得到 MN 个新项。然后根据项的指数以不递减的顺序对这 MN 个项进行排序。我使用的排序算法是归并排序。然后最后检查所有已排序的项以将具有相同指数的项组合起来。
  • 对不起,我忘记了问题的一项要求。乘法的答案必须按项的指数降序排序。

标签: c algorithm list linked-list polynomial-math


【解决方案1】:

我可以告诉你。

假设多项式是 1+x+x^3 和 1+x^2。

使用(1,1)--->(1,1)--->(1,3)创建一个链表P

创建另一个链表Q (1,1)--->(1,2) 其中(a,b)表示x^b的系数。

现在对于 P 中的每个节点,将其与 Q 的每个节点相乘。

怎么样?我们将创建一个节点 res,其中 (x,y)

x= P->coeff * Q->coeff.

还有y=P->exp+Q->exp

将此新节点添加到将包含答案的多项式。


在插入answer 多项式期间,您必须记住两件事-

i) 保留一个排序列表(根据 exp 排序)(增加可能因为我在这里增加了 - 你也可以减少)。

ii) 在添加新节点的情况下获取正确的位置,如果存在具有相同 exp 值的节点,则仅添加系数并删除您将要插入的节点。

好的!现在打印多项式。

复杂性分析。

【讨论】:

  • 感谢您的回答。我对你的方法有疑问。如何保证算法的复杂度为 O(M^2 * N)?
【解决方案2】:

你可以找到我的多项式乘法实现here,它从以下格式的文件中读取多项式: 假设 2X^5 + 3x^3 + 5X 是一个多项式表达式,其链表表示如下: | 2 | 5 | -|---> | 3 | 4 | -|---> | 5 | 1 |空|

关于时间复杂度,我通过将第一个多项式的每个项乘以第二个多项式的每个项,然后将共同项(即具有相同的次数)加在一起来执行乘法。 如果第一个多项式大小为 N,第二个多项式大小为 M,则通过将它们逐项相乘,我们得到 N*M 的复杂度。 请注意,输出多项式的大小最多为 N+M(在将常用项相加之后,因此如果您假设 M>N,并且在项乘法的每一步中,您将向包含相同程度(如果存在,则添加新单元格),您可以获得所需的复杂性。

【讨论】:

  • 感谢您的回答!!但我仍然怀疑你算法的时间复杂度。我认为你的复杂度是 O((N+M)*MN)。问题要求复杂度应为 O(MMN),M 是 M 和 N 之间较小的那个。
【解决方案3】:

假设 M

将 M 项的多项式中的每个项乘以整个 N 项的多项式。每一步你都会得到一个带有 N 项的临时结果多项式,然后将结果多项式与这个临时多项式联合,这在最后一步导致 O(MN+N)。

提醒有 O(MN) 次乘法。
联合操作总共需要 O((N+N)+(2N+N)+(3N+N)+...+(MN+N))=O(M^2N)。

所以总体复杂度为 O(MN)+O(M^2N) = O(M^2N)

【讨论】:

  • 另外,MN乘法后可以使用哈希表对两个多项式求并,其整体复杂度可以为O(MN)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多