ES6规范为键集合(Set,Map,WeakSet和WeakMap)提供什么时间复杂度(大O表示)?
我的期望,我期望的大多数开发人员,是规范和实现将使用被广泛接受的高性能算法,在这种情况下Set.prototype.has,add并delete在平均情况下都是O(1)。这同样适用于Map和Weak–等效物。
Set.prototype.has
add
delete
Map
Weak–
对我来说,实现的时间复杂性是否在例如ECMAScript 2015 Language Specification-6th Edition — 23.2Set Objects中规定,并不是完全显而易见的。
除非我误会了它(确实很可能这样做),否则ECMA规范要求实现(例如Set.prototype.has)必须使用线性时间(O(n))算法。令我惊讶的是,规范中没有要求或什至不允许使用性能更高的算法,并且我对解释为何如此的原因非常感兴趣。
从该段开始,您就链接到:
集合对象必须使用[机制]实现,这些机制平均提供的访问时间与集合中元素的数量成线性关系。
您将为Maps,WeakMaps和WeakSets找到相同的句子。
看起来ECMA规范要求实施(例如Set.prototype.has)必须使用线性时间(O(n))算法。
O(n)
没有:
该Set对象规范中使用的数据结构仅用于描述Set对象所需的可观察的语义。它并非旨在成为可行的实施模型。
Set
可观察的语义主要与可预测的迭代顺序有关仍然可以高效且快速地实现。规范确实希望实现可以使用哈希表或具有恒定访问权限的类似内容,尽管也允许使用树(具有对数访问复杂性)。