当前位置: 首页 > 面试题库 >

Javascript ES6集合的计算/时间复杂度

井昊乾
2023-03-14
问题内容

ES6规范为键集合(Set,Map,WeakSet和WeakMap)提供什么时间复杂度(大O表示)?

我的期望,我期望的大多数开发人员,是规范和实现将使用被广泛接受的高性能算法,在这种情况下Set.prototype.hasadddelete在平均情况下都是O(1)。这同样适用于MapWeak–等效物。

对我来说,实现的时间复杂性是否在例如ECMAScript 2015 Language Specification-6th Edition — 23.2Set Objects中规定,并不是完全显而易见的。

除非我误会了它(确实很可能这样做),否则ECMA规范要求实现(例如Set.prototype.has)必须使用线性时间(O(n))算法。令我惊讶的是,规范中没有要求或什至不允许使用性能更高的算法,并且我对解释为何如此的原因非常感兴趣。


问题答案:

从该段开始,您就链接到:

集合对象必须使用[机制]实现,这些机制平均提供的访问时间与集合中元素的数量成线性关系。

您将为Maps,WeakMaps和WeakSets找到相同的句子。

看起来ECMA规范要求实施(例如Set.prototype.has)必须使用线性时间(O(n))算法。

没有:

Set对象规范中使用的数据结构仅用于描述Set对象所需的可观察的语义。它并非旨在成为可行的实施模型

可观察的语义主要与可预测的迭代顺序有关仍然可以高效且快速地实现。规范确实希望实现可以使用哈希表或具有恒定访问权限的类似内容,尽管也允许使用树(具有对数访问复杂性)。



 类似资料:
  • 我在考虑如何正确计算这个函数的时间复杂度: 我假设它是 O(n),其中 n 是列表的长度。我们的 while 循环是 O(n),for 循环也是 O(n), 这意味着我们得到了 2*O(n),等于 O(n)。 我说的对吗?

  • 我已经通过谷歌和堆栈溢出搜索,但我没有找到一个关于如何计算时间复杂度的清晰而直接的解释。 说代码像下面这样简单: 说一个像下面这样的循环: 这将只执行一次。 时间实际上被计算为而不是声明。

  • 我正在尝试分析一个算法的时间复杂度。 下面的算法旨在只检查数组的一部分,所以如果它没有多大意义,请不要担心。 我对计算循环周围的时间复杂度很困惑,请看看我的评论。 这是否意味着我们有: T(N) = (C2 C4 C5)N (C1 C3 C6) T(N) = C7*N (C8) T(N)=N?? 循环中的所有内容都是*N? 先谢谢!

  • 我遇到了一个问题,需要计算非常大的阶乘的值。我用两种不同的方法在C中解决了这个问题,但只想知道我的复杂性分析是否准确。 在任何一种方法中,我都将非常大的数字表示为向量,其中表示最低有效数字,最后一个索引处的值表示最高有效数字。版本1的代码可以在这个要点中找到。 给定上面的代码,似乎是其中是给定的整数,是向量表示的数字。我的逻辑是,我们将执行一些与结果数字的长度成比例的步骤,以便生成一个表示的向量。

  • 每个顶点可以连接到(V-1)个顶点,因此每个顶点的相邻边数是V-1。假设E代表连接到每个顶点的V-1条边。 查找和更新最小堆中每个相邻顶点的权重为O(log(V))+O(1)或 因此,从上面的步骤1和步骤2,更新顶点的所有相邻顶点的时间复杂度是e*(logV)。或. 因此所有V顶点的时间复杂度为V*(E*logv),即。 但Dijkstra算法的时间复杂度为O(ElogV)。为什么?

  • 如何计算以下函数的时间复杂度? 现在,我知道循环具有O(n)时间复杂度,但在这种情况下,I以更快的速度增长。一次又一次地迭代,我发现,对于每一个第m次迭代,I=m^2。但我仍然不知道如何计算大O。