STL基础--算法(已排序数据的算法,数值算法)
已排序数据的算法
- 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基础--算法(已排序数据的算法,数值算法)的更多相关文章
- 大数据排序算法:外部排序,bitmap算法;大数据去重算法:hash算法,bitmap算法
外部排序算法相关:主要用到归并排序,堆排序,桶排序,重点是先分成不同的块,然后从每个块中找到最小值写入磁盘,分析过程可以看看http://blog.csdn.net/jeason29/article/ ...
- STL基础--算法(修改数据的算法)
修改元素的算法 copy, move, transform, swap, fill, replace, remove vector<int> vec = {9,60,70,8,45,87, ...
- 数据结构和算法(Golang实现)(22)排序算法-希尔排序
希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机 ...
- 数据结构和算法(Golang实现)(20)排序算法-选择排序
选择排序 选择排序,一般我们指的是简单选择排序,也可以叫直接选择排序,它不像冒泡排序一样相邻地交换元素,而是通过选择最小的元素,每轮迭代只需交换一次.虽然交换次数比冒泡少很多,但效率和冒泡排序一样的糟 ...
- 数据结构和算法(Golang实现)(26)查找算法-哈希表
哈希表:散列查找 一.线性查找 我们要通过一个键key来查找相应的值value.有一种最简单的方式,就是将键值对存放在链表里,然后遍历链表来查找是否存在key,存在则更新键对应的值,不存在则将键值对链 ...
- 数据结构和算法(Golang实现)(29)查找算法-2-3树和左倾红黑树
某些教程不区分普通红黑树和左倾红黑树的区别,直接将左倾红黑树拿来教学,并且称其为红黑树,因为左倾红黑树与普通的红黑树相比,实现起来较为简单,容易教学.在这里,我们区分开左倾红黑树和普通红黑树. 红黑树 ...
- 数据结构和算法(Golang实现)(27)查找算法-二叉查找树
二叉查找树 二叉查找树,又叫二叉排序树,二叉搜索树,是一种有特定规则的二叉树,定义如下: 它是一颗二叉树,或者是空树. 左子树所有节点的值都小于它的根节点,右子树所有节点的值都大于它的根节点. 左右子 ...
- 数据结构和算法(Golang实现)(28)查找算法-AVL树
AVL树 二叉查找树的树高度影响了查找的效率,需要尽量减小树的高度,AVL树正是这样的树. 一.AVL树介绍 AVL树是一棵严格自平衡的二叉查找树,1962年,发明者Adelson-Velsky和La ...
- STL基础--算法(不修改数据的算法)
不修改数据的算法 count, min and max, compare, linear search, attribute // 算法中Lambda函数很常用: num = count_if(vec ...
随机推荐
- 带列表写入文件出错先 json.dumps
output = json.dumps(output, ensure_ascii=False).encode('utf-8')
- group_concat的使用以及乱码
1.group_concat子查询返回数字是乱码,既不是utf8也不是gbk,后来看了下子表的字段编码是gbk的,但sql整体返回的是utf8,group_concat前 把字段转换成utf8的,运行 ...
- c++中的stl
String Vector Set List Map 1.string char* s1 = "Hello SYSU!"; //创建指针指向字符串常量,这段字符串我们是不能修改的 ...
- C++学习(十六)(C语言部分)之 数组三
复习 以及 测试 /* 一维数组 数组是相同的数据的一个集合 <类型><数组名>[下标表达式]={数组元素 初始值}; 数组名和变量的命名规则是一样的 数组名是一个地址 数组下 ...
- 莫队算法 [国家集训队]小Z的袜子
题目链接 洛古 https://www.luogu.org/problemnew/show/P1494 大概说下自己的理解 先来概率的计算公式 ∑C(2,f(i)) / C(2,r−l ...
- 学习笔记TF014:卷积层、激活函数、池化层、归一化层、高级层
CNN神经网络架构至少包含一个卷积层 (tf.nn.conv2d).单层CNN检测边缘.图像识别分类,使用不同层类型支持卷积层,减少过拟合,加速训练过程,降低内存占用率. TensorFlow加速所有 ...
- 使用ionic开发时用遇到监听手机返回按钮的问题~
当时用的是ionic开发一个app,需求是,当按下手机的返回按钮,在指定的页面双击退出,而在其他页面点击一次返回到上个页面: 其实用ionic自带的服务就可以解决: //双击退出 $ionicP ...
- golang-test-tool-gotests
gotests介绍 gotests是一个Golang命令行工具 ,让Go测试变得容易.它根据目标源文件的函数和方法签名生成表驱动的测试(TDD).任何测试文件中新的依赖都会被自动倒入 Demo 下面是 ...
- linux——git安装使用
系统环境centos7 安装git命令 yum install git -y 安装好之后使用命令查看git版本 git –version [root@bogon ~]# git --version g ...
- Distributed Phoenix Chat with PubSub PG2 adapter
转自:https://www.poeticoding.com/distributed-phoenix-chat-with-pubsub-pg2-adapter/ In this article we’ ...