1、基本概念
算法是指解决问题的方案的准确而完整的描述,对于规范的输入,在有限时间内要获得所需要的输出。不同的算法可能使用不同的时间、空间或效率完成同样的任务。
2、评估方法
想要评估一个算法的好坏,目前可以通过时间复杂度和空间复杂度来进行衡量。
时间复杂度,是指算法执行指令所需的计算量。算法的执行时间和其所要处理的数据之间存在某种函数关系,当数据量足够大时,只有最高次方的项目才具有主导地位。目前我们使用Big-O标记法,例如对于单次for循环的时间复杂度可以表示为O(n),双次for循环的时间复杂度可以表示为O(n*n),以此类推。
空间复杂度,是指算法执行过程中临时占用的存储空间的大小的度量,其表示方法与时间复杂度一致。
一个算法的时间复杂度和空间复杂度往往是相互影响的,当降低一方的复杂度时,另一方的复杂度就会增加,因为在设计算法时,需要根据实际需求进行取舍,综合进行考虑。
3、操作类型
根据应用于算法的数据在算法前后的变化,可将算法分为质变算法和非质变算法。
质变算法,是在算法过程中会更改输入数据内部的元素内容,例如排序算法,因而不可作用于常数区间。
非质变算法,是在算法过程中不改输入数据内部的元素内容,例如查找算法。
4、算法的泛化
在设计算法时,算法的输入参数若是特定类型,则针对不同的参数类型,需要实现不同的接口,不利于算法的复用。STL为了解决这一问题,设计了迭代器这一对象。不同数据类型的迭代器,需要实现相同的接口,可供算法内部进行调用,从而实现算法的泛化。
5、一般形式
STL提供的算法,都是采用一对迭代器来标识算法的操作区间。为了保证算法最大的公用性,迭代器定义为算法所需的最低程度的类型。将无效的迭代器传给算法,会导致错误,但却不能保证在编译时期就可被捕捉出来。
STL提供的算法,虽然进行了泛化,但还是提供了多个不同的版本,以针对不同的需求。有的是以函数重载的方式,如unique()默认使用quality进行比较,也可以由用户传入一个仿函数进行比较的操作;有的是直接使用不同的函数名进行定义,如find和find_if、replace和replace_copy等。
6、综合结果
STL设计算法时,力求做到与数据进行分离,实现最大限度的通用。在算法内部,也使用各种技巧,以达到最好的算法效率。提供给用户的接口都是简单易用的,算法本身的稳定性也是很有保证的,大大减轻开发人员的工作量。