算法概观
以有限的步骤,解决逻辑或数学上的问题,这一专门科目称之为算法。
算法分析与复杂度分析
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_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的标准实现。