有没有办法在保持 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) 的同时将两个嵌套数组相乘?的主要内容,如果未能解决你的问题,请参考以下文章