数组方法的复杂性

时间:2017-09-26 08:13:39

标签: javascript arrays algorithm performance time-complexity

在团队项目中,我们需要删除数组的第一个元素,因此我调用了Array.prototype.shift()。现在一个人看到Why is pop faster than shift?,因此建议首先使用Array.prototype.pop()Array.prototype.reverse()反转数组,弹出和反转。

由于我的方法需要O(n)I 认为,而另一个需要O(n),加上O(n),因此这将会更慢(?)。当然,渐近符号也是如此。但请注意我使用的动词,想想!

当然我可以写一些,使用jsPerf和基准,但这需要时间(与通过时间复杂性符号决定相反(例如O(n 3 )vs O (n)算法)。

但是,在使用我的意见时说服某人要比将他指向标准要困难得多(如果它涉及复杂性)。

那么如何找到这些方法的时间复杂度呢?

例如在C ++ std::reverse()中明确指出:

  

复杂性

     

线性在第一个和最后一个距离的一半:交换元素。

2 个答案:

答案 0 :(得分:2)

  

如何找到这些方法的时间复杂度?

无法在标准中找到它们。

ECMAScript是脚本语言的标准。 JavaScript就是这样一种语言。

ECMA规范未指定边界复杂性。每个JavaScript引擎都可以自由实现自己的功能,只要它与标准版兼容。

因此,如果您愿意,您必须使用jsPerf进行基准测试,甚至查看特定JavaScript引擎的源代码。

或者,正如robertklep的评论所提到的那样:

“标准没有强制要求如何实现这些方法。此外,JS是一种解释型语言,因此JIT和GC之类的东西可能会根据数组大小和代码调用的频率开始发挥作用。单词:基准测试可能是您了解不同JS引擎执行情况的唯一选择“。

此声明有进一步的证据([0] [1] [2])。

答案 1 :(得分:1)

一种无可争辩的方法是做一个比较基准(如果你做得正确,另一方不是恶意)。不关心理论上的复杂性。

否则你会花费很多时间来说服那些看不到明显的人:一个班次移动每个元素一次,而两个逆转移动两次。

顺便说一下,换班是最佳的,因为每个元素必须至少移动一次。如果正确实现为memmov,它会非常快(虽然单个反转不能那么快)。