前言
不积硅步无以至千里,不积小流无以成江河。
进入硕士学习阶段后,相较于我的师兄师姐,我感觉自己对于专业认识的沉淀比较匮乏。不是说不明白,而是缺少说出“精通”二字的勇气。因此,我打算借“博客”的形式对一些我认为作为一名IE工程师必须要掌握的方面的内容进行梳理巩固。例如:建模仿真、运筹算法、网页前端以及一些文献知识。俗话说:教是最好的学习方法。尽管整理的内容比较基础,但是我相信周期性的积累能够让我有所成长。
算法 序
1、什么是算法:
1)概念
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。简单来说,算法是一个能够解决问题的清晰流程。这个流程可以具象为一个个可执行的动作,也可以抽象成一个程序,这其中的过程考研一个IE工程师的经验和功底。
2)算法应该具备的重要性质
输入项(Input):一个算法有零个或多个输入,以刻画运算对象的初始情况。
输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
有穷性(Finiteness):指算法必须能在执行有限个步骤之后终止,不出现循环;
确定性(Definiteness):指算法的每一步骤必须有确切的定义;
可行性(Effectiveness):指算法中执行的任何步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)。
3)设计算法需要满足的要求
正确性(Validity):算法程序没有语法错误且能够达到解决问题的基本目的
可读性(Readability):便于阅读、理解和交流。
健壮性(又称作鲁棒性、容错性,Robustness):指一个算法对不合理数据输入的反应能力和处理能力。
高效性(Efficiency):同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。花最短的时间、最少的钱,办最大的事。一般一个算法的评价主要从时间复杂度(Time Complexity)和空间复杂度(Space Complexity)来考虑。
2、算法效率评价指标
1)时间复杂度(Time Complexity)
指执行算法所需要的时间。但通常一个算法的执行时间,很难在执行前用物理上的时间概念去计算。
因此,我们通常使用“大O(Big O)表示法”进行描述(大O符号:是用于描述函数渐进行为的数学符号)。首先,我们先了解一个概念,叫时间频度。时间频度(也称作语句频度,记作T(n))表示一个算法中的语句执行次数。时间复杂度即不包括这个函数的低阶项和首项系数的时间频度。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。
时间复杂度通过对其函数的形式分为:常数时间(也可以称作常数阶)、线性时间、对数时间、幂时间、线性对数时间、多项式时间等等。对其中比较常见的时间进行说明:
常数时间:O(1)
线性时间:O(n)
对数时间:O(logn)
幂(2次幂)时间:O(n^2)
指数时间:O(2^n)
线性对数时间:O(nlog(n))……
其中,时间复杂度按照O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)排列。
2)空间复杂度(Space Complexity)
指对一个算法在运行过程中临时占用存储空间大小的量度,也就是额外占取的空间的大小。空间复杂度本质上算的是变量的个数。即随着变量的变化,所需开辟的内存空间会随着变量的变化而变化的函数。但由于目前设备的存储空间都较大,相比而言现在算法不那么关注空间复杂度,但我们仍需有所了解。空间复杂度的计算规则基本跟时间复杂度类似,也使用“大O表示法”。这里需要清楚,函数运行时所需要的栈空间,例如:存储参数、局部变量、一些寄存器信息等,在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
常见的空间复杂度一般有:O(1)、O(n)、O(n^2)、O(logn)等。
接下来,我打算从一些经典算法以及思想进行持续性整理,希望大家能够从这篇博客了解到算法的基本概念和框架。