大家好,我是程序员小灰。
在过去,小灰一直在公众号上分享各种各样的算法漫画,今天我们来从全局视角讲一讲,究竟什么是算法。
什么是算法呢?
所谓算法,就是解决问题的一系列方法。
算法并不是一个新鲜的概念,从我们老祖宗生活的时代,人们就一直在发明和应用各种各样的算法。比如南北朝时期的著名数学家祖冲之,利用割圆术近似求解出了圆周率。
再比如古希腊数学家泰勒斯,利用相似三角形的原理推算出了埃及胡夫金字塔的高度。
祖冲之和泰勒斯,都是算法的创造者。
到了现代,随着电子计算机的发明,人们对算法的研究就更加深入了。
在计算机领域,算法的本质是一系列程序指令,用于解决特定的运算和逻辑问题。
按照专业程度来划分,算法可以分为基础算法和专业领域算法。
所谓专业领域算法,也就是服务于特定领域的算法,比如谷歌的阿尔法狗战胜了人类围棋冠军,背后是人工智能算法;在一些游戏当中,我们能够看到非常酷炫的3D效果,背后是3D图形渲染算法。
上面说的这些都是专业领域算法,由相应的算法工程师来研究和开发。
作为一名普通程序员,这些专业算法只需要有一定的了解即可,我们真正需要学好的是基础算法。=
基础算法包含哪些种类呢?
1.搜索算法
搜索算法用于从数据结构中找出特定的数据。这类算法有很多种,如深度优先搜索(DFS)、广度优先搜索(BFS)、二分查找算法等。
2.排序算法
排序算法用于将一组数据按照特定的顺序进行排列。常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。
3.图算法
图算法用于处理图形数据结构的问题,例如寻找最短路径,检查图的连通性等。常见的图算法有Dijkstra算法、Floyd算法、最小生成树算法等等。
4.动态规划算法
动态规划算法通过将问题分解为子问题,然后将子问题的解组合起来,以获得原问题的解。它通常用于求解具有重叠子问题和最优子结构特性的问题,例如背包问题,最长公共子序列等。
5.分治算法
分治算法通过将问题分解为几个小问题,然后逐个解决小问题,最后合并这些小问题的解以得到原问题的解。常见的分治算法如快速排序、归并排序、大整数乘法等。
6.贪心算法
贪心算法在每个决策点都采取当前看来最好的选择,希望通过这种方式得到问题的最优解。例如霍夫曼编码就是利用了贪心算法。
7.回溯算法
回溯算法通过试错的方式搜索问题的可能解,当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。常见的如八皇后问题,数独问题等。
可能有人要问了,我只要安心写好项目代码不就完了吗?为什么非要学习这些个算法呢?
如果你甘心在一家小公司,做简单的增删改查操作,每个月拿几千上万的工资,那没有问题。但如果你想要成为一名真正优秀的程序员,那你还是要好好学习算法。
因为算法是程序员的内功,虽然我们很少需要直接去实现某些算法,但我们要知道自己调用的类库、接口的底层算法实现是怎样的,从而做出更好的选择,写出更高效的代码。
说完了算法的基本概念,我们再来说一说程序员怎么提升自己的算法能力呢?
我们需要从基础和实战两个方向进行提升。
要学习基础,我们可以通过看书,看网上的视频课程,来了解各种常用的算法和数据结构原理。对于想要入门算法的朋友,推荐看看小灰自己出版的图书,《漫画算法》系列。
想要进阶的朋友,可以看看《算法4》、《算法导论》这两本书。
要提升实战能力,大家可以上LeetCode这个网站,有大量的算法题目可以去刷。网站当中的题目分为简单、中等、困难三个等级,大家可以根据自己的水平来进行选择。
除此之外,还有一个网站可以让我们以可视化的方式学习算法和数据结构,这个网站叫做VisualGo。在这个网站里,我们可以看到各种数据结构和算法运行过程的动态演示,非常形象生动。
再有一个提升方法,就是找时间多去其他公司面试,面试非常锻炼一个人的临场发挥能力。不过,如果大家是在职状态的话,一定不要请假过于频繁,不然你怕是连现在的功能都保不住了。
好了,关于算法的基本概念,以及提升算法能力的途径,我就为大家介绍到这里。
在下一篇分享当中,我将会为大家讲解什么是数据结构,敬请期待。
我是程序员小灰,欢迎大家的点赞和关注,感谢大家!
喜欢看视频版本分享的小伙伴,也可以关注这里: