一、前端为什么学算法
一个字:卷
现在,算法已经是面试时的必考题了,当了不包括一些小公司。但是绝大部分公司在招聘人员时都会考算法。你不会算法,见你就失去了竞争力,就失去了工作机会。为了生活,作为一个合格的前端工程师,我们必须卷起来,学习算法。
四个字:水平提升
当然,学习算法带给我们的好处远远不止是一个工作机会,掌握算法带给我们的好处还有我们编程水平的飞速提升。这是我们真正需要的。我们在工作中可以用算法解决很多复杂的问题,会简化我们的思考过程,帮助我们更好的编程。同时,掌握算法我们也可以参加一些竞赛,获得荣誉,丰富我们的履历。
总之,算法是工作的敲门砖,还是我们coding的一大利器。
二、算法
说起算法,我们同时就必须知道程序和数据结构的概念。因为,我们我们写的代码最终会组成程序运行在浏览器中。
程序 = 数据结构 + 算法
数据结构
数据结构就是计算机存储、组织数据的方式
算法
一系列解决问题的指令
二者结合起来就是我们算说的程序,用白话说,算法就是我们操作数据结构的指定,当然这很片面,但是对于我们学习算法来说,已经足够。学些算法,我们首先就要认识这些数据结构的特点。
三、如何利用leetcode学习算法
个人建议是:按照类别学习算法,举个例子,我们先学栈,那我最近一周或两周就刷关于栈的问题,但是要注意,不是盲目的做完就完事。
- 我们要总结规律,形成自己固定的套路
能做到举一反三,不要因为题目换一种描述方式就写不出固定的东西。
- 及时反思,取长补短
当我们每刷完一到题目时,我们要去题解区对比一下别人解决这个问题的方式,如果发现不一样,我们尝试理解一下别人的方式,看一看有没有我们能学习到的东西,看一看我们思考方式的不同,对比一下优缺点。及时反思自己的问题。当然,我们可能也写的更好,这时我们也可以去写题解,把我们的方式分享出去,与大家共同进步
- 重视时间复杂度和空间复杂度
我发现身边有很多人,是为了刷算法而刷算法。就是盲目的完成,刷完就完事,从来不考虑复杂度问题。其实我开始的时候也是这样的,后来却发现,这种做法十分不利,因为有一些问题,暴力方式就能解决,但是性能确十分的差,我们应该杜绝这种行为,学会分析复杂度,让我们的代码性能得到提升。同时,有些面试算法题明确要求复杂度,如果我们忽略了这方面知识,那我们就会一头雾水。
所以,掌握复杂度分析是十分必要的。
四、时间复杂度
-
一个函数,用大写O表示,例如O(n)、O(1)、O(logN)等
-
定性描述该算法的运行时间(当然前提是不考虑底层的复杂度,通常来说我们涉及到的都是不考虑底层复杂度的)
-
我们最常用到的就是O(n)、O(1)、O(logN)、O(n^2)
(图片来自于my.oschina.net/u/1246663/b…
4.1 O(1)
不论什么时候,只会被执行一次
let i = 1
i+=1
4.2 O(n)
会执行n次
for(let i = 0; i < n; i+=1) {
console.log(i)
}
下面得这种情况是O(1)+O(n),但是我们要取增长趋势较快的,忽略较慢得的,所以复杂度还是O(n)
let i = 1
i+=1
for(let i = 0; i < n; i+=1) {
console.log(i)
}
4.3 O(n^2)
O(n)*O(n)=O(n^2)
for(let i = 0; i < n; i+=1) {
for(let j = 0; j < n; j+=1) {
console.log(i,j)
}
}
4.4 O(logN)
let i = 1
while(i < n){
console.log(i);
i *= 2
}
五、空间复杂度
- 一个函数,用大写O表示,例如O(n)、O(1)、O(n^2)等
- 算法在运行过程中临时占用储存空间大小的量度
5.1 O(1)
只声明了一个变量,单个变量占用的内存永远是1
let i = 1
i+=1
5.2 O(n)
占用了n个内存单元
const arr = []
for(let i = 0; i < n; i+=1) {
arr.push(i)
}
5.3 O(n^2)
其实就是矩阵(行列这种)
const arr = []
for(let i = 0; i < n; i+=1) {
arr.push([])
for(let j = 0; j < n; j+=1) {
arr[i].push(j)
}
}