javascript - 动态数组推送与分配给静态大小数组: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();
解决方案
为什么我们需要初始化长度?理论上没有必要这样做。它甚至会导致令人困惑的行为,因为所有使用长度来确定数组是否为空的测试都会报告该数组不为空。一些测试表明,如果稍后填充数组,则设置大型数组的初始长度可能更有效,但性能增益(如果有)似乎因浏览器而异。
推荐阅读
- sql-server - 在 SQL 的存储过程中使用递归?
- function - 我如何把它变成一个函数?
- python - 维度超出范围(预计在 [-4, 3] 范围内,但得到 64)
- visual-studio-code - 在 VSCode 中,为什么 Prettier 会格式化我的代码,然后将其突出显示为错误?
- pascal - Pascal readkey 命令问题
- swiftui - SwiftUI 的 .addArc 方法中的切线参数是什么?
- javascript - 将编辑按钮添加到 JavaScript / JQuery 中添加的任务列表项?
- python - 有没有办法从网站上点击 recaptcha 元素
- c++ - C++ 避免输入构造函数
- android - 片段 RadioButton 中的空指针崩溃