Javascript 数组方法和示例的时间复杂度为 0。
大家好,几周前我开始学习一些使用 JavaScript 作为编程语言的计算机科学算法。通常,在完成算法实现后,我喜欢用大 0 符号来计算复杂度。这就是我想写这篇文章的原因,旨在了解最常用的 JS 数组方法的时间复杂度。
那么,我们先来快速定义一下该方法,他的时间复杂度,以及一个小例子。
变异方法。
1. push()
- 0(1)
在数组末尾添加一个新元素。
const names = ['Luis','John','Jose'];
names.push("Aaron");
console.log(names); // (4) ["Luis", "John", "Jose", "Aaron"]
2. pop()
- 0(1)
删除数组的最后一个元素
const names = ['Luis','John','Jose','Aaron'];
console.log(names.pop()); //Aaron
console.log(names); // (3) ["Luis", "John", "Jose"]
3. shift()
- 0(n)
删除数组的第一个元素
const names = ['Luis','John','Jose','Aaron'];
console.log(names.shift()); // Luis
console.log(names); // (3) ["John", "Jose", "Aaron"]
4. unshift()
- 0(n)
在数组开头添加一个或多个元素
const names = ['Luis','John','Jose'];
console.log(names.unshift("Aaron")); // 4
console.log(names); // (4) ["Aaron", "Luis", "John", "Jose"]
5. splice()
- 0(n)
删除、添加或替换索引指示的新元素。
const names = ['Luis','John','Jose','Aaron'];
console.log(names.splice(0,0,"Fernando")); // Add Michelle
console.log(names.splice(0,1,"Michelle")); // replace Fernando to Michelle
console.log(names.splice(0,1)); // remove Michelle
console.log(names);
6. sort()
- 0(n log(n))
修改数组,通过比较函数排序,如果未提供此比较函数,则默认顺序是按数组中 Unicode 值的位置排序。
const names = ['Luis','Jose','John','Aaron'];
console.log(names.sort()); // (4) ["Aaron", "John", "Jose", "Luis"]
/*complex sorting*/
const users = [
{name:'Luis', age:25},
{name:'Jose', age:20},
{name:'Aaron', age:40}
];
const compareFuc = (item1,item2) => {
return item1.age - item2.age;
};
console.log(users.sort(compareFuc));
/**
[{name: "Jose", age: 20}, {name: "Luis", age: 25}, {name: "Aaron", age:40}]
*/
访问器方法
1. concat()
- 0(n)
使用两个或多个数组的并集创建一个新数组。
const names1 = ["Luis","Jose"];
const names2 = ["John","Aaron"];
const newArray = names1.concat(names2,["Michelle"]);
console.log(newArray); // (5) ["Luis", "Jose", "John", "Aaron", "Michelle"]
2. slice()
- 0(n)
返回子数组在起始和结束两个索引之间的副本。
重要提示:如果修改原始数组,副本数组中的值也会被修改。
const users = [
{name:'Luis', age:15},
{name:'Jose', age:18},
{name:'Aaron', age:40}
];
const adults = users.slice(1, users.length);
console.log(adults); // (2) [{name: "Jose", age: 18}, {name: "Aaron", age: 40}]
3. indexOf()
- 0(n)
返回数组中存在的元素的第一个索引,如果不存在则返回-1
。
const names = ['Luis','Jose','John','Aaron'];
console.log(names.indexOf("John")); // 2
console.log(names.indexOf("Michelle")); // -1
迭代方法
1. forEach()
- 0(n)
仅对数组中的每个元素执行一个函数。
const names = ['Luis','Jose','John','Aaron'];
names.forEach(item => {
console.log(item);
});
/* Print all user names
Luis Jose John Aaron
*/
2. map()
- 0(n)
使用回调函数的结果创建一个新数组(此函数对每个项目执行,与 forEach 相同)
const users = [
{name:'Luis', age:15},
{name:'Jose', age:18},
{name:'Aaron', age:40}
];
const userDescriptions = users.map(item => {
return `Hello my name is ${item.name} and I have ${item.age} years old.`
});
console.log(userDescriptions);
/*["Hello my name is Luis and I have 15 years old.",
"Hello my name is Jose and I have 18 years old.",
"Hello my name is Aaron and I have 40 years old."] */
3. filter()
- 0(n)
创建一个新数组,其中包含满足给定过滤条件的元素。
const users = [
{name:'Luis', admin:true},
{name:'Jose', admin:true},
{name:'Aaron'}
];
const adminUsers = users.filter(item => item.admin);
console.log(adminUsers); // [{name: "Luis", admin: true},{name: "Jose", admin: true}]
4. reduce()
- 0(n)
对每个元素应用缩减函数后返回单个值。
const users = [
{name:'Luis', age:15},
{name:'Jose', age:18},
{name:'Aaron', age:40}
];
const reducer= (accumulator, item)=> accumulator + item.age;
const totalAge = users.reduce(reducer,0);
const ageAverage = totalAge / users.length;
console.log(`Total ${totalAge}, Average ${ageAverage}`); // Total 73, Average 24.333333333333332
奖金!!!
1. some()
- 0(n)
如果找到一个或多个符合给定条件的项目,则返回布尔值 true,否则返回 false(如果数组为空也如此)。
const users = [
{name:'Luis', admin:true},
{name:'Jose'},
{name:'Aaron'}
];
const adminExists = users.some(item => item.admin);
console.log(adminExists); // true
2. every()
- 0(n)
如果所有项目都符合给定条件,则此函数返回布尔值 true,否则返回 false。
const users = [
{name:'Luis', active:true},
{name:'Jose', active:true},
{name:'Aaron', active:false}
];
const isAllUsersActive = users.every(item => item.active);
console.log(isAllUsersActive); // false
结论
我认为了解我们用来创建算法的常见数组方法的时间复杂度非常重要,这样我们就可以计算整个结构的时间复杂度。
希望以上信息对您有所帮助。如有任何疑问,请在评论区留言。欢迎大家留言。😉
文章来源:https://dev.to/lukocastillo/time-complexity-big-0-for-javascript-array-methods-and-examples-mlg