这是我参与更文挑战的第10天,活动详情查看:更文挑战
前言
相信很多人在工作或者面试中经常听到算法两个字,特别是现在的互联网大数据时代,对于面试大厂的开发来说算法几乎是必考的题目。那么算法究竟是什么呢?为什么前端也需要学习算法呢?
为什么学习算法
数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。学习数据结构与算法会潜移默化的影响我们编码的风格和习惯,会在不自觉之间考虑逻辑的运行性能,久而久之,我们的编码能力也会有飞跃式的进展,不过这个过程是长期的,不能一蹴而就。
- 学习算法可以培养逻辑思维能力,对于程序员来说逻辑思维能力强,在写的代码中bug就越少,考虑的更周全
- 写出更加高效的代码,算法就是用来解决特定问题的准确方式,这样就避免绕弯路的可能
- 算法修炼的是一个人的基础功底,学好算法可以更加深入了解计算机,我们不能局限于使用层面,要深入原理,才会真正领悟其真谛
- 在未来人工智能、大数据时代,算法的重要性会更加明显 PS:对升职加薪有帮助
什么是算法
- 算法是指解题方案的正确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
- 算法是针对某种问题的解决方案,对于给定输入,在规定要求内得到输出。
- 一个算法的优劣程度可以用空间复杂度和时间复杂度来衡量。
- 不同的算法有自己的特点,可能用不同的时间、空间、效率来解决问题,使用什么算法取决于你的需求。
算法的特征
- 有穷性:是指算法必须能在执行有限个步骤之后终止;
- 确切性:是指算法的每一步骤必须有确切的定义;
- 输入项:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
- 输出项:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
- 可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)。
算法的评定
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。
- 时间复杂度:是指执行算法所需要的计算工作量。
- 空间复杂度:是指算法需要消耗的内存空间。
算法的使用方法
- 递推法:是按照一定的规律来计算序列中的每个项,通常是通过计算机前面的一些项来得出序列中的指定项的值。其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快和不知疲倦的机器特点。
- 递归法:程序调用自身的编程技巧称为递归(recursion)。递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 PS: 递归就是在过程或函数里调用自身;在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
- 穷举法:又称暴力破解法。基本思路是,对于要解决的问题,列举出它的所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解。
- 贪心算法:是一种对某些求最优解问题的更简单、更迅速的设计技术。是一种改进了的分级处理方法。用贪心法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题, 通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。
- 分治法:是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。分治法所能解决的问题一般具有以下几个特征:
- 该问题的规模缩小到一定的程度就可以容易地解决;
- 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
- 利用该问题分解出的子问题的解可以合并为该问题的解;
- 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
- 动态规划法:是指用于求解包含重叠子问题的最优化问题的方法。动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。
- 迭代法:也称辗转法。是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。
- 分支界限法:基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索。
- 回溯法:是一种选优搜索法,按选优条件向前搜索,以达到目标。基本思想是,在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。