首页 > 解决方案 > 动态数组推送与分配给静态大小数组:JavaScript 中的时间复杂度

问题描述

我有一个动态数组,如下所示:

const array1 = [];

    for(let i = 0; i < 5; i++)
    array1.push(i+1);

和另一个数组:

let Array2 = Array(6); //Note here the size is 6 as compared to the array1 which has initial size as 5.

for(let i = 0; i < 5; i++)
        Array2[i] = i+1;

现在我想将一个元素附加到数组的最后一个,如下所示:

array1.push(6);

上述操作是否会O(n)因为这个过程将导致array1被移动到一个新数组,然后6在最后追加,或者它只是 O(1)。

还有哪个声明更好? const array1 = [] 然后将元素添加到其中,或初始化一个空数组(其大小已知),然后将元素一一替换。

所以这里是同样的例子:

众所周知,前五个元素来自 for 循环(它调用另一个函数),最后一个元素来自一个函数getElement,如下所示:

Method 1:

const Array1 = [];

for(let i = 0; i < 5; i++)
Array1.push(getFirstFiveElements(i));
//Where getFirstFiveElements is another function



Array1.push(gettheSixthElement());

Method 2

const Array2 = Array(6);
for(let i = 0; i < 5; i++)
Array2[i] = getFirstFiveElements(i);



Array2[Array2.length - 1] = gettheSixthElement();

标签: javascript

解决方案


为什么我们需要初始化长度?理论上没有必要这样做。它甚至会导致令人困惑的行为,因为所有使用长度来确定数组是否为空的测试都会报告该数组不为空。一些测试表明,如果稍后填充数组,则设置大型数组的初始长度可能更有效,但性能增益(如果有)似乎因浏览器而异。


推荐阅读