随笔分类 -  数据结构

摘要:using namespace std; tuple<int,float,string> t1={1,2.2,"str"}; tuple<int,float,string> t1(1,2.2,"str");//直接初始化 cout<<get<0>(t1)<<get<1>(t1)<<get<2>(t1 阅读全文
posted @ 2022-01-03 18:00 80k 阅读(116) 评论(0) 推荐(0) 编辑
摘要:课程中提供的,hash_val函数,输入参数为类的全部数据,返回值为std:stze_t的哈希值 1 2 template<class T> 3 inline void hash_combine(std::size_t & seed, const T & val){ 4 seed ^= hash<T 阅读全文
posted @ 2022-01-03 17:15 80k 阅读(170) 评论(0) 推荐(0) 编辑
摘要:整数哈希: 一般可以用取模的方式,模的数(数组长度)最好取质数且离2的幂尽可能远 哈希冲突可以用拉链法和开放寻址法解决 拉链法可以用链表进行模拟,插入时在哈希寻址处的链表头结点插入 开放寻址法则直接向后找(经验值,数据长度一般要开到题目数据范围的2-3倍),利用find函数找到数据的位置或应该插入的 阅读全文
posted @ 2021-12-23 10:43 80k 阅读(66) 评论(0) 推荐(0) 编辑
摘要:堆可以用二叉树存储。 当前节点比左右子节点的值都小或等于(小根堆)。 对于完全二叉树,根节点编号为1,则,对于编号为n的节点,左子节点编号为2n,右子节点标号为2n+1。 完全二叉树可以用一维数组存储(编号→下标) 基本操作:up和down up:当节点数值比父节点小时,交换当前节点与父节点的值,然 阅读全文
posted @ 2021-12-19 20:42 80k 阅读(58) 评论(0) 推荐(0) 编辑
摘要:Trie树可以用来存储前缀字符串/数组。 可以用数组进行模拟 son[N][26] 记录节点的son cnt[N] 记录以当前节点为最后字符的字符串出现的次数 idx当前用到的节点 例题 143. 最大异或对 #include<iostream> using namespace std; const 阅读全文
posted @ 2021-12-19 18:51 80k 阅读(67) 评论(0) 推荐(0) 编辑
摘要:KMP用于o(n)的字符串匹配。 使用next数组记录以当前阶段为后缀的,和以开始位置为前缀匹配的最长长度,即匹配过程中进行后移后保留的长度。 next数组的计算和匹配过程类似。 推荐数组从1开始计数 注意,自身match时,是不包含当前位置的前缀,而互相match时,是包含当前位置的前缀,所以两次 阅读全文
posted @ 2021-12-12 15:40 80k 阅读(109) 评论(0) 推荐(0) 编辑
摘要:可以用数组直观的模拟栈和队列,栈记录栈顶位置,队列记录头和尾。 单调栈和单调队列可以用来记录有单调性的数据,当插入新数据时,将违反单调性的数据删去,保持单调。 可以查找,距离最近的小于当前数据的位置,以及滑动窗口内的极值。 阅读全文
posted @ 2021-12-12 14:29 80k 阅读(35) 评论(0) 推荐(0) 编辑
摘要:链表一般不用结构体创建(new的使用很慢) 而是用邻接表进行表示 两个数组分别e[]和ne[]分别记录节点的值和下一个节点的编号 head记录头结点指向的位置,idx表示当前可以使用的节点 用数组模拟链表时,删除链表无法释放内存,但是运行速度快。 双链表则用e[]和l[]和r[]记录; 可以将单链表 阅读全文
posted @ 2021-12-12 10:50 80k 阅读(57) 评论(0) 推荐(0) 编辑
摘要:用于数据范围大但稀疏的数据 unique可以用来去重; unique(v.begin(),v.end()); 返回值指向最后一个无重复元素的下一位; 可以用 v.erase(unique(v.begin(),v.end()),v.end())去除有序数组中的重复元素。 对有序无重复数组,查找可以使用 阅读全文
posted @ 2021-12-11 10:50 80k 阅读(66) 评论(0) 推荐(0) 编辑
摘要:x&(-x)可以取得x的最后一位1. x&(x-1)可以去掉x的最后一位1. 阅读全文
posted @ 2021-12-11 10:44 80k 阅读(33) 评论(0) 推荐(0) 编辑
摘要:前缀和可以快速求部分和有一维和二维的实现。数组的下标最好从1开始前缀和下标从0开始,以统一求a1~ai时的接口 差分主要用于对某个区间同时进行加减前缀和的逆运算可以用o(n)的时间恢复原数组d[i]=a[i]-a[i-1];AcWing 797. 差分#include<iostream> using 阅读全文
posted @ 2021-12-09 10:47 80k 阅读(59) 评论(0) 推荐(0) 编辑
摘要:大整数用数组表示第一位写在index=0的位置,因为运算可能进位。vector<int> 自带size(),方便表示大整数;输出的时候要反向 高精度加法要记得最后加上carryvector<int> add(vector<int> &A, vector<int> &B){ if (A.size() 阅读全文
posted @ 2021-12-08 20:28 80k 阅读(56) 评论(0) 推荐(0) 编辑
摘要:可以用两个优先队列记录数据流及其中位数。通过在两个队列插入数据以及平衡数据,维持队列的top为中位数 阅读全文
posted @ 2021-12-07 20:20 80k 阅读(25) 评论(0) 推荐(0) 编辑
摘要:multimap按照key从小到大排序,且value不排序multiset<pair>按照pair从小到大排序,先比较key再比较value priority_queue<T> 传入less<T>时是大根堆,传入greater<T>时是小根堆,这和一般的算法是反的(例如sort())。 阅读全文
posted @ 2021-12-07 20:07 80k 阅读(17) 评论(0) 推荐(0) 编辑
摘要:采取「一边遍历一边统计」的方式,可以避免重复计算 v是由小到大排序的容器upper_bound(v.begin(), v.end(), val);可以利用二分查找返回第一个大于val的位置的迭代器lower_bound( begin,end,val);返回第一个大于等于的位置pair<Ty1,Ty2 阅读全文
posted @ 2021-12-07 20:07 80k 阅读(27) 评论(0) 推荐(0) 编辑
摘要:stol() string转longto_string();转string 阅读全文
posted @ 2021-12-07 19:54 80k 阅读(26) 评论(0) 推荐(0) 编辑
摘要:n为正整数时n & (n - 1)其中 &表示按位与运算。该位运算技巧可以直接将n二进制表示的最低位1移除。n & (-n),该位运算技巧可以直接获取 n 二进制表示的最低位的 1。由于负数是按照补码规则在计算机中存储的,n表示为(a10...0)2,-n表示为(ā01...1)2+1=(ā10.. 阅读全文
posted @ 2021-12-07 19:49 80k 阅读(110) 评论(0) 推荐(0) 编辑
摘要:__builtin_popcount(),统计二进制中1的个数。 阅读全文
posted @ 2021-12-07 19:48 80k 阅读(27) 评论(0) 推荐(0) 编辑
摘要:可以利用字典树(前缀树,Trie)解决数与数组中数据异或的最值问题。Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。 这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 阅读全文
posted @ 2021-12-07 19:45 80k 阅读(43) 评论(0) 推荐(0) 编辑
摘要:c++ 17标准支持 for (auto& [key, value] : map)vector擦除部分 vec.erase(vec.begin() + k, rec.end());vector用另一vector的一部分初始化 vector<T> v2(v1.begin()+n1,v1.end()-n 阅读全文
posted @ 2021-12-07 19:44 80k 阅读(27) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示