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 ...
随机推荐
- [LeetCode&Python] Problem 653. Two Sum IV - Input is a BST
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...
- MAC安装python jupyter notebook
介绍: Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言. Jupyter Notebook 的本质是一个 Web 应用 ...
- MergeKLists
public ListNode mergeKLists(ListNode[] lists) { if(lists==null||lists.length==0) return null; Priori ...
- IDLE的使用
为什么要用IDE? 到现在为止,我们也是写过代码的人啦,但你有没有发现,每次写代码要新建文件.写完保存时还要选择存放地点,执行时还要切换到命令行调用python解释器,好麻烦呀,能否一气呵成,让我简单 ...
- HNOI2019 简要题解
HNOI 2019 简要题解 没想到自己竟也能有机会写下这篇题解呢. LOJ Luogu Day1T1 鱼 枚举\(AD\)两点后发现\(BC\)与\(EF\)相对独立,因此只需要计算合法的\(BC\ ...
- 【JVM】参数配置
[一]JVM参数配置释意 编号 配置项 例子 含义 备注 1 -Xmx -Xmx20m java应用最大可用内存为20M 整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小.持久代一般固 ...
- itcast-Hibernate orm元数据和 关系操作
在Hibernate安装包 project /etc/hibernate.property文件下 显示 ,格式化 映射导入映射文件 详解orm元数据 配置文件详解 generator主键生 ...
- centos7 添加第三方源
第三方源下载地址: http://repoforge.org/use/ 选择合适自己包 我选择的是EL7的 wget 下载这个包 接着使用rpm -ivh 包名 确认是否添加成功 ls /etc/yu ...
- code自动补全
软件安装完成后,第一次一定要使用这种方式创建文件,才会有代码自动提示: https://blog.csdn.net/haibin8473/article/details/79113650 https: ...
- SecureCRT突然卡死的问题
SecureCRT作为著名的SSHclient,经经常使用于登陆远程server. 在上面编辑文本,特别是用vi打开两个文本,而且须要切换时.非常easy出现卡死的现象,不能接受不论什么的键盘输入. ...