算法概述及基本算法

一.算法概述

算法,即解决逻辑或数学问题的步骤,STL中的算法是把常用的可复用的。某些算法要搭配固定的数据结构(如heap的算法,树的算法)。

1.算法分析与复杂度表示

算法分析即对算法的时间复杂度和空间复杂度分析,一般使用大O表示法,至于对算法复杂度的计算,这个又是另外一个学习的内容了,这里不作描述。

2.STL算法总览

img

img

img

img

3.质变算法mutating algorithms——会改变操作对象之值

算法操作的区间要么是一个单值,要么是迭代器区间[first,last)所指向的区间,质变算法就是会改变这个区间的值的算法,不过要注意,对于常数来说尝试改变会报错。

4.非质变算法nonmutating algorithms–不改变操作对象之值

这个和上面的相反,算法本身不会改变迭代器所指区间的值。

5.STL算法的一般形式

所有泛型算法的前两个参数都是一对迭代器,即[first, last),算法本身对迭代器的类别也会有一定的要求,没有达到一定的要求可能在编译阶段不会报错。

许多STL算法不止支持一个版本,例如有的自带缺省函数,有的也可以传入仿函数(有时以xxx和xxx_if区别),有的就地进行(在该容器进行),有点另地进行(在另一个容器副本进行)(有时以xxx和xxx_copy区别)。

二.算法的泛化过程

所谓算法的泛化,就是指让算法脱离特定的数据结构,使得泛化后的算法可以为多个数据结构所用(只要符合算法的接口),而STL的泛化很明显主要是用模板类和迭代器实现的。

三.数值算法

要使用数值算法,头文件需包含

1.accumulate(元素累计)

T accumulate(InputIterator frist,InputIterIator last,T init,[BinaryOperation binary_op])

基本计算单元为init = init op *first

在未提供二元操作函数的情况下,accumulate函数的作用是init+迭代器区间内的每一个数,

在提供二元操作函数的情况下,accumulate函数的作用是init = binary_op(init, *i)(原来这里就是一个加法)

2.adjacent_difference(相邻元素的差额)

基本计算单元为*++result = *first op *(first-1) 注意:这里的两个值都是指原序列的值

其实数值函数都差不多,都是有自有的函数,也可以重新传入函数,这个如果没有传入二元操作函数就是相邻元素的差额,如果传入了二元操作函数就是按传入的操作计算,注意value_type()提取的是真正类型的指针。

3.inner_product(内积)

基本计算单元为init = init op1 (*first1 op2 *first2)

一共有两个序列,然后对这两个序列的每个对应元素进行操作然后再对操作结果进行操作,如果要求一个序列内的结果,可以让first2=first1

4.partial_sum(局部求和)

基本计算单元为*++result = *result op *first 注意:partial_sum和adjacent_difference互为逆操作,即两个函数都执行后序列保持原状,但是两者的基本计算单元有本质的不同,partial是用的已改变的前一个,而adjacent用的是未改变的前一个。

5.power(幂次方)

这个没什么好说的,就是x执行n次op,只不过STL实现得很有技巧啊,因为最简单的实现方式就是执行n次,如果分成两半采用递归时间复杂度可以降为O(logn),但是递归始终有点不方便,还占栈,所以书上的代码原理是这样的:

如果n为偶数,则二进制最后一位必为0,那么就让n中的2直接进去,即Xn变为X2^n/2,一直这样直到n变为奇数,当n变为奇数后取出一X则n又变为偶数,最后乘以所有取出来的数即可。(注意:奇数右移1即隐含了减1的意思)

参考:

STL 中的 power 函数实现

STL源码剖析之算法:power

6.iota(在某区间填入某指定值的递增序列)

基本运算单元为*first++ = value++

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值