一、算法的本质
算法的本质是【穷举】。
这是站在计算机思维上得出的结果。计算机思维,是能够站在计算机的视角,抽象、简化实际问题,然后用编程的方式去解决问题,这是【数据结构与算法】中的算法。对比于数学思维,数学思维重点在数学建模和调参经验,计算机只是做计算的工具,这是【算法工程师】提到的算法。
计算的特点就是快。所以大道至简,计算机解决问题就是【穷举】。如果能找到一些更巧妙地定理那最好,如果没有,那就穷举,只要复杂度允许,没有什么答案是穷举不出来的。
但,算法问题的本质都是穷举吗?例外肯定有,类似一些一行代码就能解决的算法题,这些题目类似脑筋急转弯,都是通过观察,发现规律,最后找到最优解;再比如密码学、机器学习相关的算法,本质上是数学理论的推导。这些算法本质上是数学问题,不应该作计算机算法。
说回穷举,穷举有2个关键点:无遗漏 和 无冗余
遗漏会导致答案出错;冗余会拖慢算法速度。所以,一道算法题我们可以从这两个维度去考虑。
1、如何穷举?即无遗漏的穷举出所有的可能解。
2、如何聪明地穷举?即避免无必要的冗余计算。
据此我们可以把算法分成两类:
1、难点在【如何穷举】
一般是递归类问题,最典型的就是动态规划问题。
动态规划问题,无非是先写出暴力穷举解法(状态转移方程),加个备忘录就成自顶向下的递归解法,再改一改就成了自底向上的递推迭代解法。动态规划问题会在后文详细讨论。
2、难点在【如何聪明地穷举】
一些耳熟能详的非递归算法技巧,都可以归为这一类。像KMP算法、Union Find并查集算法等。