Javascript 是JS array.reverse()还是O(n)

Javascript 是JS array.reverse()还是O(n),javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我有一个大数组,我将反转它,然后用一个字符串连接它。我担心反转会在O(n)时间内遍历数组中的每个元素,虽然理论上只要翻转一个跟踪数组反转情况的布尔值就可以在O(1)时间内完成,然后不用使用连接函数,只循环遍历并以相反的顺序连接我自己 因此,不是: arr.reverse().join(',') 我可以这样做: let tmp = ''; for(let i=arr.length-1; i>=0; i--) tmp += arr[i] + ','; 然后删除最后一个逗号 Array.

我有一个大数组,我将反转它,然后用一个字符串连接它。我担心反转会在O(n)时间内遍历数组中的每个元素,虽然理论上只要翻转一个跟踪数组反转情况的布尔值就可以在O(1)时间内完成,然后不用使用连接函数,只循环遍历并以相反的顺序连接我自己

因此,不是:

arr.reverse().join(',')
我可以这样做:

let tmp = '';
for(let i=arr.length-1; i>=0; i--)
  tmp += arr[i] + ',';
然后删除最后一个逗号

Array.reverse()速度慢吗?我应该不担心几千项的计算效率吗

注意:我已经看过这个问题,它是不同的:。除非问题相同,否则请不要将其标记为重复。

时间复杂性O(n):

我应该不担心几千项的计算效率吗

对于几千个项目,您可能不会注意到差异。一般来说,大多数项目都很小,无法从这样的效率中获益。然而,另一方面,如果您在同一个项目中实现了其中两个或三个低效,您将开始看到时间延迟的问题


就尽可能保持时间效率而言,您的第二种方法可能是处理此问题的最有效方法,因为您将执行两个O(n)操作(切换数组中的所有元素,并在每个元素的末尾添加一个“,”),然后将它们组合到一个操作中。

array.prototype.reverse
是O(n)。“我应该不担心几千个项目的计算效率吗?”-取决于您对所述数千个项目进行反转的频率。使用基准来查看。但是,我怀疑Array.reverse()&&Array.join()可能在性能上非常有竞争力(如果需要制作阵列副本或反向还原,则性能会稍差)。这是因为高级函数允许更大的优化可能性。循环[向后]毕竟也是O(n);因此,这只是C的问题。重复的手动字符串连接性能将“取决于”基于浏览器实现,并且可能比简单实现中的O(n)差得多。这是因为JS必须保证字符串是可观察到的不可变的。Array.reverse是O(n),但它比javascript循环快得多。感谢您快速而详细的回答。认可的。这是真的,我只是将时间除以2,以获得更大的输入,所以如果这很重要,我应该这样做,但可能不是。