已排序数据的算法

  • Binary search, merge, set operations
  • 每个已排序数据算法都有一个同名的更一般的形式

vector vec = {8,9,9,9,45,87,90}; // 7 items

1. 二分法搜索

// 搜索元素
bool found = binary_search(vec.begin(), vec.end(), 9); vector<int> s = {9, 45, 66};
bool found = includes(vec.begin(), vec.end(), // Range #1
s.begin(), s.end()); // Range #2
// s的所有元素是否都在vec中
// vec和s都必须已排序 // 搜索位置
itr = lower_bound(vec.begin(), vec.end(), 9); // vec[1]
// 搜索第一个可插入的位置,插入后仍然是排序的 itr = upper_bound(vec.begin(), vec.end(), 9); // vec[4]
// 寻找最后一个可插入的位置,插入后仍然保持排序 pair_of_itr = equal_range(vec.begin(), vec.end(), 9);
// 返回第一个和最后一个位置

2. 合并

vector<int> vec = {8,9,9,10};
vector<int> vec2 = {7,9,10};
merge(vec.begin(), vec.end(), // Input Range #1
vec2.begin(), vec2.end(), // input Range #2
vec_out.begin()); // Output
//vec和vec2都必须已排序
// 重复的元素保留
// vec_out: {7,8,9,9,9,10,10} vector<int> vec = {1,2,3,4,1,2,3,4,5} // vec中两部分都已排序
inplace_merge(vec.begin(), vec.begin()+4, vec.end());
// vec: {1,1,2,2,3,3,4,4,5}

3. 集合操作

//    - 输入数据都必须已排序
// - 结果也是排序的
vector<int> vec = {8,9,9,10};
vector<int> vec2 = {7,9,10};
vector<int> vec_out[5];
set_union(vec.begin(), vec.end(), // Input Range #1
vec2.begin(), vec2.end(), // input Range #2
vec_out.begin()); // Output
// 并集,两者都有的元素在结果中只保留一个
// vec_out: {7,8,9,9,10} set_intersection(vec.begin(), vec.end(), // Input Range #1
vec2.begin(), vec2.end(), // input Range #2
vec_out.begin()); // Output
// 交集,两者都有的元素才保存在结果中vec_out
// vec_out: {9,10,0,0,0} vector<int> vec = {8,9,9,10};
vector<int> vec2 = {7,9,10};
vector<int> vec_out[5];
set_difference(vec.begin(), vec.end(), // Input Range #1
vec2.begin(), vec2.end(), // input Range #2
vec_out.begin()); // Output
// 差集,vec有且vec2没有的元素保存
// vec_out: {8,9,0,0,0} set_symmetric_difference(vec.begin(), vec.end(), // Input Range #1
vec2.begin(), vec2.end(), // input Range #2
vec_out.begin()); // Output
// 交集的补集,只有其中1方有的元素
// vec_out: {7,8,9,0,0}

数值算法

  • Accumulate, inner product, partial sum, adjacent difference

1. 累积

int x = accumulate(vec.begin(), vec.end(), 10);     //默认 +
// 10 + vec[0] + vec[1] + vec[2] + ... int x = accumulate(vec.begin(), vec.end(), 10, multiplies<int>()); //自定义运算
// 10 * vec[0] * vec[1] * vec[2] * ...

2. 内积

//vector<int> vec = {9,60,70,8,45,87,90};     // 7 items
int x = inner_product(vec.begin(), vec.begin()+3, // Range #1
vec.end()-3, // Range #2
10); // Init Value
// 10 + vec[0]*vec[4] + vec[1]*vec[5] + vec[2]*vec[6] int x = inner_product(vec.begin(), vec.begin()+3, // Range #1
vec.end()-3, // Range #2
10, // Init Value
multiplies<int>(),
plus<int>());
// 10 * (vec[0]+vec[4]) * (vec[1]+vec[5]) * (vec[2]+vec[6])

3. 部分和

partial_sum(vec.begin(), vec.end(), vec2.begin());
// vec2[0] = vec[0]
// vec2[1] = vec[0] + vec[1];
// vec2[2] = vec[0] + vec[1] + vec[2];
// vec2[3] = vec[0] + vec[1] + vec[2] + vec[3];
// ... partial_sum(vec.begin(), vec.end(), vec2.begin(), multiplies<int>());

4. 邻差

adjacent_difference(vec.begin(), vec.end(), vec2.begin());
// vec2[0] = vec[0]
// vec2[1] = vec[1] - vec[0];
// vec2[2] = vec[2] - vec[1];
// vec2[3] = vec[3] - vec[2];
// ... adjacent_difference(vec.begin(), vec.end(), vec2.begin(), plus<int>());

STL基础--算法(已排序数据的算法,数值算法)的更多相关文章

  1. 大数据排序算法:外部排序,bitmap算法;大数据去重算法:hash算法,bitmap算法

    外部排序算法相关:主要用到归并排序,堆排序,桶排序,重点是先分成不同的块,然后从每个块中找到最小值写入磁盘,分析过程可以看看http://blog.csdn.net/jeason29/article/ ...

  2. STL基础--算法(修改数据的算法)

    修改元素的算法 copy, move, transform, swap, fill, replace, remove vector<int> vec = {9,60,70,8,45,87, ...

  3. 数据结构和算法(Golang实现)(22)排序算法-希尔排序

    希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机 ...

  4. 数据结构和算法(Golang实现)(20)排序算法-选择排序

    选择排序 选择排序,一般我们指的是简单选择排序,也可以叫直接选择排序,它不像冒泡排序一样相邻地交换元素,而是通过选择最小的元素,每轮迭代只需交换一次.虽然交换次数比冒泡少很多,但效率和冒泡排序一样的糟 ...

  5. 数据结构和算法(Golang实现)(26)查找算法-哈希表

    哈希表:散列查找 一.线性查找 我们要通过一个键key来查找相应的值value.有一种最简单的方式,就是将键值对存放在链表里,然后遍历链表来查找是否存在key,存在则更新键对应的值,不存在则将键值对链 ...

  6. 数据结构和算法(Golang实现)(29)查找算法-2-3树和左倾红黑树

    某些教程不区分普通红黑树和左倾红黑树的区别,直接将左倾红黑树拿来教学,并且称其为红黑树,因为左倾红黑树与普通的红黑树相比,实现起来较为简单,容易教学.在这里,我们区分开左倾红黑树和普通红黑树. 红黑树 ...

  7. 数据结构和算法(Golang实现)(27)查找算法-二叉查找树

    二叉查找树 二叉查找树,又叫二叉排序树,二叉搜索树,是一种有特定规则的二叉树,定义如下: 它是一颗二叉树,或者是空树. 左子树所有节点的值都小于它的根节点,右子树所有节点的值都大于它的根节点. 左右子 ...

  8. 数据结构和算法(Golang实现)(28)查找算法-AVL树

    AVL树 二叉查找树的树高度影响了查找的效率,需要尽量减小树的高度,AVL树正是这样的树. 一.AVL树介绍 AVL树是一棵严格自平衡的二叉查找树,1962年,发明者Adelson-Velsky和La ...

  9. STL基础--算法(不修改数据的算法)

    不修改数据的算法 count, min and max, compare, linear search, attribute // 算法中Lambda函数很常用: num = count_if(vec ...

随机推荐

  1. 九度OJ-1042-最长公共子序列(LCS)

    题目1042:Coincidence 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4045 解决:2208 题目描述: Find a longest common subsequence ...

  2. Seaweedfs-启动脚本

    #!/bin/bash if [ ! -e /sunlight/shell/main.sh ];then echo " [ Error ] file /sunlight/shell/main ...

  3. Map 按Key排序 和 按Value排序

    https://www.cnblogs.com/binz/p/6671917.html 一.根据value排序 通用方法 public class MapUtil { public static &l ...

  4. 在Java中,以下关于方法重载和方法重写描述正确的是?

    public class TTTTT extends SuperC{ public String get(){ return null; } } class SuperC{ Object get(){ ...

  5. java中的Object类和其clone()

    1.Object是所有类的父类,任何类都默认继承Object,即直接或间接的继承java.lang.Object类.由于所有的类都继承在Object类,因此省略了extends Object关键字. ...

  6. Dynamic Code Evolution for Java dcevm 原理

    在hostswap dcevm中我们对Dynamic Code Evolution VM有了一个简单的了解,这篇文章将介绍Dynamic Code Evolution VM的实现原理. 有两个概念需要 ...

  7. openresty router && template 试用

      router 是一个比较方便的 openresty 路由组件,我们可以用来编写灵活强大的 web 应用,类似的 lua-resty-route 也是很不错的,但是如果是比较简单的直接可以使用 lu ...

  8. Modularizing your graphQL schemas

    转自: https://tomasalabes.me/blog/nodejs/graphql/2018/07/11/modularizing-graphql.html Modularizing you ...

  9. masterlab 敏捷项目管理工具

    masterlab 是一个参考了gitlab 以及jira 的开源项目管理工具,基于php开发,同时官方也提供了一个 docker-compose 运行的项目 clone 代码   git clone ...

  10. 04基于python玩转人工智能最火框架之TensorFlow开发环境搭建

    MOOC_VM.vdl.zip 解压之后,得到一个vdl文件.打开virtual box,新建选择类型linuxubuntu 64位. 选择继续,分配2g.使用已有的虚拟硬盘文件,点击选择我们下载的文 ...