我的 JS 字谜图解决方案的时间、空间复杂度
Posted
技术标签:
【中文标题】我的 JS 字谜图解决方案的时间、空间复杂度【英文标题】:Time, space complexity for my JS anagram map solution 【发布时间】:2020-04-15 02:23:00 【问题描述】:当前设置,A
和 B
可能是更大的字谜,但我在这里选择了一个简单的示例。
目标是找到一个索引映射P
,从A
到B
。映射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]
?如果它们的长度甚至不一样怎么办?
a
、b
、c
和d
应该代表什么?
@ASDFGerte 其索引的查找字谜映射。不给出或考虑非字谜,只会给出字谜。
【参考方案1】:
传播运算符 (...acc
) 是an O(n) operation 在被传播的对象之上。这会严重影响您的时间复杂度。
此外,由于A
和B
是字谜,您可以使用相同的符号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)