【发布时间】: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 其索引的查找字谜映射。不给出或考虑非字谜,只会给出字谜。
标签: javascript algorithm ecmascript-6 hash anagram