有没有办法在保持 O(n) 的同时将两个嵌套数组相乘?

Posted

技术标签:

【中文标题】有没有办法在保持 O(n) 的同时将两个嵌套数组相乘?【英文标题】:Is there a way to multiply two nested arrays by each other while maintaining O(n)? 【发布时间】:2022-01-04 22:57:42 【问题描述】:

我想将这两个数组相乘。在我使用其值的乘积减少任何嵌套数组之后。

[ [ 1 ], [ 1 ], [ 1, 2 ], [ 1, 2, 3 ] ]

[ [ 2, 3, 4 ], [ 3, 4 ], [ 4 ], [ 1 ] ]

答案应该是:

[24, 12, 8, 6]

澄清:

24 = 1 * 2 * 3 * 4

如果有任何其他方法,请告诉我。代码不能高于 O(n) 并且不使用除法运算符

【问题讨论】:

【参考方案1】:

在谈论像 O(n) 这样的 big-o 复杂性时,重要的是要知道 n 指的是什么。在简单数组的情况下,它通常是数组大小。但是,在您的情况下,您有数组数组,因此 n 可以引用内部或外部数组的大小。

为了简化它,将外部数组视为包含x 数组,将内部数组视为包含y 元素。然后它需要 2y-1 对每个内部数组进行乘法运算。由于有x 内部数组,它总共需要x(2y-1) 乘法。在 big-o 中,这将是 O(xy)。

所以回答你的问题。

如果您的 n 指的是内部数组的数量内部数组中的元素数量,那么是的,它将是 O(n)。

但是,如果您的n 指的是内部维度和外部维度(即两者同时增长),那么不,它将是 O(n^2)。

表格形式:

--------------------------------------------------
| Outer dimension | Inner dimension | Complexity |
--------------------------------------------------
|    growing      |     constant    |   O(n)     |
--------------------------------------------------
|    constant     |     growing     |   O(n)     |
--------------------------------------------------
|    growing      |     growing     |   O(n^2)   |
--------------------------------------------------

为了明确一点:没有魔法可以将最后一个情况变成 O(n)。

【讨论】:

2y-1 会出现在哪里? @greybeard 要将 y 元素相乘,您需要 y-1 乘法。然后你有2个内部数组所以你得到2 * (y-1)然后你需要将两个结果相乘,即2 * (y - 1) + 1或只是2y - 1 (你用each“省略”了句子中的括号。)

以上是关于有没有办法在保持 O(n) 的同时将两个嵌套数组相乘?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 O(n) 时间内打印字符串的所有子字符串?

谁能告诉我一个算法来创建一个函数,该函数将数组的所有可能分区返回到 n 个子集中,同时保持数组的顺序?

保持 Numpy 数组 2D

如何在布局中保持统一对齐

8在一个数组中找出和为n的两个数

在一个语句中查找无序数组中的最大(或最小)元素,同时保持顺序[重复]