我的 JS 字谜图解决方案的时间、空间复杂度

Posted

技术标签:

【中文标题】我的 JS 字谜图解决方案的时间、空间复杂度【英文标题】:Time, space complexity for my JS anagram map solution 【发布时间】:2020-04-15 02:23:00 【问题描述】:

当前设置,AB 可能是更大的字谜,但我在这里选择了一个简单的示例。

目标是找到一个索引映射P,从AB。映射P[i] = j 表示A 中的第[n] 个元素出现在B 中的索引j

const A = [12, 28, 46, 32, 50]
const B = [50, 12, 32, 46, 28]

const hash = B.reduce((acc,cur,idx) => ( ...acc, [cur]: idx ), );

const result = A.reduce((acc,cur) => [...acc, hash[cur]], []);

return result

结果应该是

[1, 4, 3, 2, 0]

我认为我的解决方案的时间/空间复杂度是:哈希:时间 = O(a), 空间 = O(c)结果 : 时间 = O(b), 空间 = O(d) 最终答案是时间 = O(a + b),空间 = O(c + d) 时间和空间的最终最终答案是O(n)?

尽管由于hash 使用时间O(1) 生成结果,但总的来说我认为时间是O(n) 因为n 是数字。我这样想对吗?

大家对此有何看法? (如果我是对还是错,不确定)。

我想你们中的一些人会问为什么不使用 indexOf(),根据我的研究,它看起来就像在引擎盖下的一个循环,所以我会运行 O(2n)。所以大中型字谜将是致命的。

【问题讨论】:

扩展运算符的粗心使用可能会破坏您的时间和空间复杂性。此外,它不是“散列”,它可能是散列映射,或者只是一个映射(另见内置的 Map)。我不完全理解,代码的任务是什么,但是如果某些数字不止一次出现怎么办?什么,如果它不是一个字谜,并且没有hash[cur]?如果它们的长度甚至不一样怎么办? abcd应该代表什么? @ASDFGerte 其索引的查找字谜映射。不给出或考虑非字谜,只会给出字谜。 【参考方案1】:

传播运算符 (...acc) 是an O(n) operation 在被传播的对象之上。这会严重影响您的时间复杂度。

此外,由于AB 是字谜,您可以使用相同的符号n 来表示它们的长度相同。

我不确定空间复杂度,但我认为时间复杂度是:

哈希:时间 = O(n^2)

结果:时间 = O(n^2)

最终答案是时间 = O(2n^2),即 ~O(n^2)。


建议的改进:

不要使用扩展运算符,它没有必要而且速度很慢。 Array.map 而不是 Array.reduce 因为结果更干净 hash 没有散列任何东西,所以名称不清楚,它更多的是数字到索引的映射 - map 更清楚

const A = [12, 28, 46, 32, 50]
const B = [50, 12, 32, 46, 28]

const map = B.reduce((acc,cur,idx) =>  acc[cur] = idx; return acc; , );
const result = A.map(cur => map[cur]);

console.log(result);

这个版本是一个非常简单的 O(2n) -> ~O(n)。

【讨论】:

以上是关于我的 JS 字谜图解决方案的时间、空间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

如何计算该解决方案的时间和空间复杂度?

Javascript - 查找字谜的更好解决方案 - 时间复杂度 O (n log n)

在 O(1) 空间和 O(n) 时间中查找 2 个字符串是不是是字谜

做字谜组的更好方法

优化 DP 解决方案的空间复杂度

递归算法的空间复杂度