在浙江大学的《数据结构》一课中,大多数内容都是与数据结构和数据结构的相关算法有关,里面并没有一期内容专门介绍基本的算法思想(虽然没有介绍,但是其实处处体现着基本的算法思想,但是毕竟人家课叫数据结构,所以算法部分可能会设计的比较少)。那这期CS专题,就让我们来一览基本算法思想。
以下是本期内容的大纲:
CS专题——基本算法思想汇总 - 图1

暴力枚举

暴力枚举应该很多新手小白非常熟悉(毕竟只会这一种doge),在代码中体现为多层循环嵌套,无脑循环,这种算法的笨拙之处在于往往进行了很多重复的计算。但是不得不说,暴力枚举的代码非常好理解,在数据结构和算法中的具体例子有:floyd算法等。在刷题时实在做不出来可以用暴力枚举的方法捞分,至少能做对一些实例。

递归与回溯

递归的思想应该是许多数据结构的基础,尤其是数和图这两种数据结构,基本上就是基于递归的思想建立起来的,递归的思想也有很多具体的实例:数据结构有树和图,具体问题有斐波那契数列等;回溯的话其实也是递归,只是递归完return之后的这个部分叫做回溯,所以往往我们把递归和回溯放在一起说叫“递归回溯”,回溯思想的使用也有很多具体例子,如八皇后问题等。但是递归回溯这个方法有个不可忽视的问题,那就是——容易爆栈,这也与递归函数的性质有关。

分而治之

其实坦白说,递归是分而治之思想的一个子集,分而治之的思想主要是:把一个大的问题拆分成多个小问题分别解决,小问题还可以拆分成更小的问题,所以和递归很像。分而治之也有很多具体的实例:数据结构如树和图,还有大名鼎鼎的查找算法——二分查找也是基于分而治之的思想的。

动态规划

动态规划的思想是:“用时间换空间”,通过提供外部记忆的方式来减少递归时不必要的计算量,所以也称为“记忆化搜索”。例如斐波那契数列中其实我们有很多的重复计算,如果我们能将这些计算第一次出现的结果保存起来,之后再碰到相同的问题时直接到记忆里去提取结果即可,无需计算。常见的动态规划的应用有:0-1背包问题、迪杰斯特拉最短路算法等。

贪心算法

贪心算法的思想是“我每一步都要最好的”,所以最终的结果只能是局部最优结果,至于是不是全局最优结果,与问题本身有关,所以贪心得到的结果不一定最优,贪心算法的一个应用是:机器学习中的梯度下降法,最后得到的结果是全局最优点当前仅当损失函数是凸函数。除此之外,Prim和Kruscal等算法都是贪心算法的体现。

排序算法

这个就不说了,老生常谈了,很多问题在正式处理之前都需要把序列调整成有序序列,这个时候排序算法就排上用场了,大家一定要把十种排序算法都手撕一遍。

哈希算法

介绍哈希算法之前我们先介绍下数据,数组中我们查找一个元素,直接根据其索引就能找到与索引对应的数组元素,而哈希算法也是一样,我们希望通过某个数组元素的值找到对应的索引或者另一个数组的元素,也就是把某个数组元转化为索引,例如将字符串作为索引,通过字符串这个索引找到对应的数字等等。所以我们需要某个哈希函数来帮助我们进行这种转化。

总结

以上介绍的七种算法思想只是最常用的算法思想,而且只是一种思想,并不是某种对应的算法,我们如果能掌握思想,能看清问题的本质,就能从本质上将算法思想结合到算法和数据结构中,从而更好更高效地解决问题。这些算法思想都有一些常见的例子,如八皇后问题、0-1背包问题、旅行商问题等等,结合这些例子,算法思想会更加容易理解哦!
欢迎对ECE/CS/AI感兴趣的小伙伴关注我,如果你对我的内容有什么建议的话,或者你也对算法和数据结构感兴趣的话,可以单独找我讨论,也欢迎在评论区留下你的声音。