「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」。
本来想取名为《前端算法入门》的,但是又担心自己水平不够把大家带沟里了,所以此系列文章就改名为和我一起学习前端算法
前端要不要学习算法
算法,让很多前端同学听了就想逃的一个词。
算法不是后端应该考虑的嘛?这可能是大部分前端的内心想法。
没错,在当前的大环境下,一般情况下前端几乎不用管太多算法方面的问题。因为大多数情况下,前端面临的数据量是很小的,一次处理 1 万条数据的场景都很少遇到。在这样一个很低的数量级下,即使暴力解法的时间复杂度特别高,也不会对页面造成无法忍受的卡顿。顶多就是 “感觉页面有点卡” ,你要说延迟很高吧,也不至于。
我就有见过一个方法,将一个本来可以使用 O(1) 解决的问题,硬生生使用了 O(n4) 的暴力解法来处理。我当时大受震撼,但即使是这么离谱的情况,在数据量不到 100 的时候,带来的延迟也是不太明显的。
从这样的情况来看,的确前端学习算法好像没有那么必要。
但是,我想说的是,这都是通常的情况。我个人认为算法虽然使用概率不高,但是最起码需要知道常见解法,万一遇到了也知道怎么搜索。认为前端学习算法有以下几点理由:
- 个人实力进阶的需要。如果前端基础很扎实之后,想要继续进阶,算法是绕不过去的一道坎。
- 业务出现进阶的需求。业务出于种种原因,对页面性能、计算能力达到了更高的要求层次的时候,总不能每次都去求后端告诉你怎么写代码吧。
- 锻炼自己的逻辑思维,潜移默化的提升编码能力。这一点很难具体举例,但是算法好的同学写出来的代码会给人更简洁舒服的感觉。
- 面试的需要。现在还有多少不面试算法的公司?反正我每次面试都必被问到算法。
定义
算法(algorithm;算法),在数学(算学)和计算机科学之中,指一个被定义好的、计算机可施行其指示的有限步骤或次序,常用于计算、数据处理和自动推理。算法是有效方法,包含一系列定义清晰的指令,并可于有限的时间及空间内清楚的表述出来。
通俗的来讲,(计算机)算法是一系列程序指令,用于解决特定的运算和逻辑问题。
算法的核心是创建问题抽象的模型和明确求解目标,之后可以根据具体的问题选择不同的模式和方法完成算法的设计。
也就是说,我们可以通过学习常用的算法模式和实现方法,来获得解决绝大多数算法问题的能力。
那常用的设计模式和实现方法有哪些呢?
常用设计模式
完全遍历法和不完全遍历法:在问题的解是有限离散解空间,且可以验证正确性和最优性时,最简单的算法就是把解空间的所有元素完全遍历一遍,逐个检测元素是否是我们要的解。这是最直接的算法,实现往往最简单。但是当解空间特别庞大时,这种算法很可能导致工程上无法承受的计算量。这时候可以利用不完全遍历方法——例如各种搜索法和规划法——来减少计算量。
分治法:把一个问题分割成互相独立的多个部分分别求解的思路。这种求解思路带来的好处之一是便于进行并行计算。
动态规划法:当问题的整体最优解就是由局部最优解组成的时候,经常采用的一种方法。
贪心算法:常见的近似求解思路。当问题的整体最优解不是(或无法证明是)由局部最优解组成,且对解的最优性没有要求的时候,可以采用的一种方法。
线性规划法:寻找可行域的极值点,此值即为最优解。
简并法:把一个问题通过逻辑或数学推理,简化成与之等价或者近似的、相对简单的模型,进而求解的方法。
看定义可能会有点懵,这里我分别列举一下大家常见的例子可能就更能理解了。
- 完全遍历法/不完全遍历法:这大概是前端使用率最高的一种模式了。没错,就是你日常用的各种循环,没想到吧,大家天天都在用算法的设计模式🐶
- 分治法:这大概是面试频率最高的一种模式了。 快速排序 大家即使自己没写过,也会被面试官问过吧😢
- 动态规划法:leetcode 的 最长公共子序列 问题不知道大家有没有做过,这类问题的一种解法就是使用动态规划法
- 贪心算法:这种算法感觉前端日常几乎遇不到。但是如果大家有刷 leetcode 的话,可能经常会遇到最小生成树问题,这类问题使用贪心算法就比较合适
- 线性规划法:这种算法感觉前端也很少会遇到,因为几乎都是后端来解决这类问题,但是具体的场景却不少见。假设一个农夫有一块X 平方千米的农地,打算种植 A 或 B,或是两者依某一比例混合种植。该农夫只可以使用有限数量的肥料和农药,而单位面积的小麦和大麦都需要不同数量的肥料和农药,两者的出售价格分别为 M 和 N,求 A 和 B 分别种植多少收益最大。就看起来就头疼,不过头疼是后端的,前端不需要背负😂
- 简并法:Vue 的 diff 算法了解过嘛?本来两个树的完全 diff 是 O(n3) ,Vue 一通简化之后就转换成了 O(n) 了 🐂
常用实现方法
上面大家最熟悉的可能就是递归和迭代了,就前端日常使用来说,迭代基本就够用了😄
结语
时间太晚了,这篇文章就先讲到这里了。本文为系列问题,将和大家一起逐步的学习前端算法相关知识。后续的文章都将收录在 专栏 里方便大家查看,大家可以关注我或者收藏本专栏。
下一篇将简单介绍一下关于算法中大家经常听到的时间复杂度和空间复杂度等知识。
推荐阅读:漫画算法:小灰的算法之旅 / 魏梦舒 —— 北京:电子工业出版社