在团队项目中,我们需要删除数组的第一个元素,因此我调用了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()
中明确指出:
复杂性
线性在第一个和最后一个距离的一半:交换元素。
答案 0 :(得分:2)
如何找到这些方法的时间复杂度?
您无法在标准中找到它们。
ECMAScript是脚本语言的标准。 JavaScript就是这样一种语言。
ECMA规范未指定边界复杂性。每个JavaScript引擎都可以自由实现自己的功能,只要它与标准版兼容。
因此,如果您愿意,您必须使用jsPerf进行基准测试,甚至查看特定JavaScript引擎的源代码。
或者,正如robertklep的评论所提到的那样:
“标准没有强制要求如何实现这些方法。此外,JS是一种解释型语言,因此JIT和GC之类的东西可能会根据数组大小和代码调用的频率开始发挥作用。单词:基准测试可能是您了解不同JS引擎执行情况的唯一选择“。
答案 1 :(得分:1)
一种无可争辩的方法是做一个比较基准(如果你做得正确,另一方不是恶意)。不关心理论上的复杂性。
否则你会花费很多时间来说服那些看不到明显的人:一个班次移动每个元素一次,而两个逆转移动两次。
顺便说一下,换班是最佳的,因为每个元素必须至少移动一次。如果正确实现为memmov,它会非常快(虽然单个反转不能那么快)。