找回密码
 立即注册
楼主: DomDomm

程序员必须掌握哪些算法?

[复制链接]
发表于 2021-7-10 16:13 | 显示全部楼层
题主的问题涉及到的范围非常广。根据所在领域的需求,每个程序员需要精通的算法是不同的。当然,作为一名程序员,还是需要掌握一些较为基础和经典的算法的,这些经典算法的思想往往能提供给我们解决新问题的思路。
算法和数据结构是每个计算机专业学生的必修课,其中涉及到的数据结构概念主要有数组、栈、队列、树、图等,主要的算法有排序算法、查找算法等等。下面是对一些经典算法的简单介绍。
排序算法:

    选择排序。不断选择数组中剩余元素之中的最小者,并将它和数组的第一个元素交换位置,直到整个数组都排序完毕。插入排序。将元素插入到其他已经有序的数组中的适当位置,当索引到达数组右端时,排序完成。归并排序。要将一个数组排序,先(递归地)将它分为两半分别排序,然后将结果归并起来。快速排序。将一个数组分成两个子数组,将两部分独立地排序。快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序则是当两个子数组都有序时整个数组也就自然有序了。
……
查找算法:

    顺序查找。从线性表的一端开始,顺序扫描,将给定的元素依次与扫描到的元素进行比较,直到找出与给定元素相同的元素,或将线性表中的元素都与其比较完为止。二分查找。二分查找是针对有序数组进行的。首先,假设数组中的元素是升序排序。将数组中间位置的元素与待查找的元素进行比较,如果二者相同则查找成功。否则,从该中间位置将数组分为前后两个子数组,如果中间位置的元素大于待查找元素,则进一步在前面的子数组中查找,否则进一步在后面的子数组中查找。重复以上过程,直到查找成功或子数组不存在为止。二叉查找树。在二叉查找树中使用递归算法查找元素:如果树是空的,则查找失败;如果待查找元素和根结点的元素相同,查找成功,否则就(递归地)在适当的子树中继续查找。如果待查找元素比较小就选择左子树,较大则选择右子树。散列表。使用三列的查找算法分为两步。第一步是利用散列函数将待查找元素转化为数组的一个索引,但有时会出现两个或多个元素散列到相同的索引值的情况。因此,散列查找的第二部是处理碰撞冲突,主要有拉链法和线性探测法两种方法。深度优先搜索。深度优先搜索的步骤为:访问图的一个顶点v,然后依次从v的未被访问的邻接点出发,对图进行深度优先遍历,直至图中和v有路径相通的顶点都被访问。如果此时图中尚有顶点未被访问,则从一个未被访问过的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。广度优先搜索。广度优先搜索从图的一个顶点v出发,访问v所有未被访问的邻接点。然后依次从这些邻接点出发,访问它们所有未被访问的邻接点。以此类推,直到途中所有访问过的邻接点都被访问到。
……


人工智能时代,机器学习算法工程师的需求量大大增加,各种机器学习算法层出不穷。机器学习算法主要分为两大类,一类是传统的机器学习算法,另一类则是如今非常火热的深度学习算法。
传统的机器学习算法有:

    k-近邻算法。k-近邻算法通过测量不同特征值之间的距离进行分类。当输入没有标签的新数据时,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似(最近邻)数据的分类标签。决策树。原理类似于“20个问题”游戏:参与游戏的一方在脑海里想某个事物,其他参与者向他提问题,只允许提20个问题,问题的答案也只能用对或错回答。问问题的人通过推断分解,逐步缩小待猜测事物的范围。在决策树算法中,用户输入一系列数据,然后给出决策。朴素贝叶斯。朴素贝叶斯是一种基于概率论的分类算法,在做决策时要求分类器给出一个最优的类别猜测结果,同时给出这个猜测的概率估计值。支持向量机。支持向量机是一种监督学习方法,是一种对数据进行二元分类的线性分类器。它通过对学习样本求解最大边距超平面来进行分类。支持向量机的各种衍生算法已经实现了多分类、回归等功能,在模式识别领域有广泛应用。AdaBoost元算法。AdaBoost算法是一种迭代算法,其原理是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个性能更强的分类器(强分类器)。k均值聚类算法。这是一种比较常用的聚类方法。首先,确定k个初始点作为质心。然后将数据集中的每个点分配到一个簇中。具体来讲,为每个点找距其最近的质心,并将其分配给该质心所对应的簇。这一步完成之后,每个簇的质心更新为该簇所有点的平均值。主成分分析(PCA)。这是一种经典的降维方法。将一个矩阵中的样本数据投影到一个新的空间中,将原来多个变量的复杂因素归结成为几个主要成分,使问题简单化,得到的结果更加科学有效。
……
深度学习方法有:

    卷积神经网络。卷积神经网络是基于人类视皮层中感受野的结构得到的模型,由输入层、卷积层、池化层、全连接层和输出层组成。通过增加卷积层和池化层,还可以得到更深层次的网络。卷积神经网络可用于语音识别和图像识别等领域。受限玻尔兹曼机。玻尔兹曼机起源于Hopfield这种相互连接型神经网络,在此基础上又提出了受限玻尔兹曼机。受限玻尔兹曼机是由可见层和隐藏层构成的,可见层和隐藏层又分别由可见变量和隐藏变量构成。它可以用于降维、分类、回归、协同过滤、特征学习以及主题建模的算法。自编码器。自编码器是一种有效地数据维度压缩算法,目的在于通过不断调整参数,重构经过维度压缩的样本,常用于数据降噪和降维。
……
以上是一些较为经典的算法。在不同的领域中,这些算法根据实际应用的需要又衍生出了各种变种算法,所以各位程序员或算法工程师还是需要针对具体的应用要求,对算法进行深入地研究与创新。
<hr/>参考资料:
[1]《算法(第4版)》,作者:[美]Robert Sedgewick Kevin Wayne,译者:谢路云
[2]《机器学习实战》,作者:[美]Peter Harrington,译者:李锐 李鹏 曲亚东 王斌
[3]《图解深度学习》,作者:[日]山下隆义,译者:张弥
对计算机知识感兴趣的知友可以关注 @人民邮电出版社,我们会持续为大家分享各种计算机专业知识和干货。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-21 05:37 , Processed in 0.061432 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表