算法概观

以有限的步骤,解决逻辑或数学上的问题,这一专门科目称之为算法。

算法分析与复杂度分析

big-O

STL算法总览

见6.1.2表

质变算法 mutating algorithms

概念:在运算过程中会更改区间内(迭代器所指)的元素内容。

例子:copy、swap、replace、fill、remove等

注意:不能用于const_iterator

非质变算法 nonmutating algorithms

概念:在运算过程中不会更改区间内(迭代器所指)的元素内容。

例子:find、search、count

STL算法的一般形式

●所有泛型算法的前两个参数都是一对迭代器,通常称为first和last,用以标示算法的操作区间。

●区间采用前闭后开表示法,写成[first,last)

●能经过increment操作符的反复运用,从first到达last

●STL算法声明中要表现出所需要的最低程度的迭代器类型,如find()需要一个InputIterator,这是最低要求,也可以接受更高类型的迭代器。但是如果交给find()一个Outtput Iterator会出错(不能保证编译期间捕捉到,因为迭代器类型只是typedef)

●许多STL算法不只支持一个版本,一个版本采用缺省运算行为,另一个版本(后缀为_if)提供额外参数(仿函数)

算法的泛化过程

如何在未知的数据结构上实现算法?

●操作对象的型别抽象画

●操作对象的标示法
用两个迭代器表示操作区间

●区间目标的移动行为抽象化
迭代器可以重载自增操作符,原生指针不能,list中++可以变为next

运用实例

见6.3

基本算法<stl_algobase.h>

SGI把常用的一些算法定义于<stl_algobase.h>之中,其它算法定义于<stl_algo.h>

copy 各种方式强化效率

功能:将[first, last)内的元素复制到输出空间[result, result + (last - first))内
STL源码剖析 6、算法

其他<stl_algobase.h>内基本算法

equal,fill,fill_n,iter_swap等见书

set相关算法 见6.5

heap相关算法 见6.6

其他(数据处理)算法

sort

http://feihu.me/blog/2014/sgi-std-sort/

由于快速排序有着恶化的问题,因此Musser在1996年发表了一遍论文,提出了Introspective Sorting(内省式排序),它是一种混合式的排序算法,集成了前面提到的三种算法各自的优点:
●在数据量很大时采用正常的快速排序,此时效率为O(logN)。
●一旦分段后的数据量小于某个阈值,就改用插入排序,因为此时这个分段是基本有序的,这时效率可达O(N)。
●在递归过程中,如果递归层次过深,分割行为有恶化倾向时,它能够自动侦测出来,使用堆排序来处理,在此情况下,使其效率维持在堆排序的O(N logN),但这又比一开始使用堆排序好。

由此可知,它乃综合各家之长的算法。也正因为如此,C++的标准库就用其作为std::sort的标准实现。

相关文章: