已排序数据的算法

  • 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. 51Nod 1459:迷宫游戏(最短路)

    1459 迷宫游戏  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...

  2. [zoj4045][思维+dfs]

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4045 题意:给一棵树.这棵树有n个节点,问你这个图能不能分成k个分块.这个 ...

  3. hdu4300 Clairewd’s message 扩展KMP

    Clairewd is a member of FBI. After several years concealing in BUPT, she intercepted some important ...

  4. hdu3068 最长回文 manacher

    给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 manacher裸题 #include<stdio. ...

  5. combineReducers 对数据进行拆分管以及使用immutable.js

    1 使用combineReaducers 整合reducers import { combineReducers } from 'redux-immutable'; import { reducer ...

  6. C# 用反射动态绑定事件

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  7. WCF 学习总结5 -- 消息拦截实现用户名验证(转)

    WCF建立在基于消息的通信这一概念基础上.通过方法调用(Method Call)形式体现的服务访问需要转化成具体的消息,并通过相应的编码(Encoding)才能通过传输通道发送到服务端:服务操作执行的 ...

  8. 剑指offer-在数组中查找两个数,是的他们的和正好是S(一次性跑通)(时间复杂度还可以降低)

    /*对于一个递增的序列,存在2个数字的和相等,要想这2个数字的乘积最小,则这2个数字的距离最远*/ /*思想:j指向最后一个元素,然后i从前扫描看sum-a[j]在这个序列中吗?若不在j--*/ im ...

  9. ncm 让跨项目配置一致性简单的工具

    多团队写作,确保node 项目依赖以及配置一致性是比较难搞的,所以一些大型的团队 以及框架都是使用单体仓库的模式,比如lerna 等工具. ncm 借鉴了helm .mrm.kyt.yarn 等开发工 ...

  10. GBDT(Gradient Boosting Decision Tree) 没有实现仅仅有原理

                阿弥陀佛.好久没写文章,实在是受不了了.特来填坑,近期实习了(ting)解(shuo)到(le)非常多工业界经常使用的算法.诸如GBDT,CRF,topic model的一些算 ...