【发布时间】:2015-09-14 12:07:25
【问题描述】:
ES6 规范为键控集合(Set、Map、WeakSet 和 WeakMap)提供了多少时间复杂度(以大 O 表示法)?
我的期望和大多数开发人员的期望是规范和实现将使用widely accepted 高性能算法,在这种情况下Set.prototype.has、add 和delete 都为 O(1) in平均情况。 Map 和 Weak– 等效项也是如此。
实施的时间复杂度是否是强制性的,对我来说并不完全清楚,例如在ECMAScript 2015 Language Specification - 6th Edition — 23.2 Set Objects。
除非我误解它(我当然很有可能这样做),看起来 ECMA 规范要求实现(例如 Set.prototype.has)使用线性时间(O(n) ) 算法。让我感到非常惊讶的是,规范不会强制甚至不允许更高性能的算法,我很想解释为什么会这样。
【问题讨论】:
-
所有的 O(1) 算法也是 O(n) 的,因此引入规范性能较低的实现不会造成任何伤害。性能较差的实现可能对资源受限的系统感兴趣,因为它们很可能需要更少的代码/空间。
-
@arturgrzesiak 密钥集合的 O(1) 性能通常通过 O(1) 哈希加上 O(n) 碰撞桶来实现。 O(n) 最坏情况对于大多数实际用途而言在天文数字上是罕见的。这些技术的空间复杂度一般为 O(n)。
-
“集合对象必须使用哈希表或其他机制实现,平均而言,这些机制提供的访问时间与集合中元素的数量呈次线性关系。”——来自该页面。
标签: javascript time-complexity ecmascript-6