1.算法定义
一系列用来解决单个或多个问题,或有执行计算功能的命令的集合。而联系上输入与输出,算法就是将输入转换为输出的一系列计算步骤的集合。
算法是一种以数学为本质的计算方法。然而作为方法,则必有正确(可行)、不正确(不可行),高效、低效之分。若一个算法对每一个恰当的输入(严格地符合问题的前提条件,且可以为空)都以正确的输出终止程序,则可以称该算法是正确的,并正确地解决了给定的问题。若算法以不正确的输出而终止程序,或根本无法终止程序(如程序陷入死循环),则这个算法是不正确的。
2.时间复杂度
一个高级语言编写的程序的运行时间主要取决于三个因素:算法的方法、策略(复杂度),问题的输入规模,计算机执行指令的速度。问题的输入规模是客观的、限定的,要加快算法的效率绝不能影响问题的输入规模;计算机执行指令的速度虽然可以有显著提升,但其发展时间较长,也不是确定的,总不能终日盼着计算机性能的提升。所以提高算法的效率,减少程序运行时间,改进算法的策略是至关重要的。
如果输入规模极为庞大,时间复杂度的差距能使计算机运算的效率提升很多个数量级。
以经典的排序算法为例。简单、基础的插入排序算法(后文将详细介绍),其时间复杂度是O( n2 )。但有更高效的算法可以解决排序问题,如归并排序(后文将详细介绍),其时间复杂度为O(nlgn)。
如图所示,实线代表n2,虚线代表nlgn。从图1-4中可以基本看出n2和nlgn的增长趋势。当n=1000时,lgn大致为3,nlgn大致为3000,而n=1000000时,lgn大致为6,nlgn大致为6000000。如此看来结果一目了然,当输入的规模较小时,插入排序通常会比归并排序运行时间短,但当输入规模逐渐增大时,归并排序的速度将远超插入排序。
3.空间复杂度
空间复杂度是对算法运行过程中最大存储空间需求的度量。
在大多数情况下,算法自身占用的空间对算法整体的空间复杂度的影响有限。毕竟一个手写的算法的长度是有限的,而代码用字符串的方式存储,不会占用过多空间。在绝大多数情况下,算法的输入、输出数据所占用的存储空间是由要解决的问题决定的,它不随算法的不同而改变。算法在运行过程中临时占用的存储空间随算法的不同而异。有的算法只需要占用少量的临时工作单元,而且这些临时工作单元不随问题规模的大小而改变。有的算法需要占用的临时工作单元数量与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序就属于这种情况。
4.算法的应用
-
深度学习(Deep Learning)
深度学习是当前非常火热的一个领域,特别是在计算机视觉、自然语言处理和语音识别方面。例如,深度残差网络(ResNet)被广泛应用于图像分类任务中,能够极大地提高分类的准确性。 -
强化学习(Reinforcement Learning)
强化学习算法允许智能体通过与环境交互来学习最佳行为策略。这类算法被用于游戏AI、机器人控制、自动驾驶汽车等领域。例如,AlphaGo使用了强化学习来掌握围棋游戏。 -
卷积神经网络(Convolutional Neural Networks, CNNs)
卷积神经网络在图像和视频识别、推荐系统、医学图像分析等方面有着广泛的应用。它们可以高效地处理像素数据,捕捉空间层次结构特征。 -
自然语言处理算法(NLP Algorithms)
包括Transformer模型在内的自然语言处理算法在机器翻译、文本生成、情感分析等任务中表现突出。例如,BERT(Bidirectional Encoder Representations from Transformers)模型已经被用于多种自然语言处理任务。 -
聚类算法(Clustering Algorithms)
聚类算法如K-means或DBSCAN在市场细分、社交网络分析、推荐系统等领域中被广泛应用,用于发现数据集内的内在结构或模式。
5.参考
算法设计与分析