数据结构
文章平均质量分 77
sjystone
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
黑红树 RedBlackTree
RedBlackTree API int Size() 返回大小 int Size(Key low, Key high) 返回 low 到 high 间的元素个数 bool isEmpty() 是否为空 Key Min() 返回最小元素 Key Max() 返回最大元素 int height() 返回树的高度 Value get(Key key) 返回键对应的值 bool contains(Key key) 是否含有键key void put(Key key, Value val) 插入键key和对应的原创 2021-07-12 22:15:31 · 282 阅读 · 0 评论 -
渗透实验 - 并查集
#include <iostream> #include <cstring> #include <ctime> #include <cstdlib> using namespace std; const int N = 1000; class unionFind{ public: unionFind(int size); ~unionFind(); void union_node(int p, int q); int fin原创 2021-07-05 08:22:04 · 217 阅读 · 0 评论 -
平衡树Treap
平衡树Treap 由名字Treap可知,平衡树由tree和heap,即二叉搜索树and堆共同维护 即平衡树的每个节点都要储存key和val key满足二叉搜索树的性质,val满足堆的性质 ============================ 预备知识 1.二叉搜索树BST 满足以下两个条件的二叉树为BST 1.当前节点的左子树中的任何一个点的key都严格小于当前点的key 2.当前节点的右子树中的任何一个点的key都严格大于当前点的key BST的中序遍历: 按照 左子树 -> 根 -> 右原创 2021-04-05 16:16:02 · 276 阅读 · 0 评论 -
并查集
并查集 写在开头:配合例题食用效果极佳 并查集是通过数组p和find函数,实现集合之间的合并,元素查询的数据结构 两个操作: 1.合并两个集合 2.查找某个元素的祖宗节点 两个优化: 1.路径压缩 -> 时间复杂度降到o(logn) 2.按秩合并 -> 时间复杂度降到o(logn) 若两者一起使用 -> 线性 两个维护: 1.记录每个集合的大小(绑定到跟节点) 2.记录每个点到跟节点的距离(绑定到每个元素) 由此可延伸出维护点之间的距离(例0)和关系(例1) p[x]表示原创 2021-04-02 23:16:16 · 335 阅读 · 2 评论 -
线段树
线段树 储存方式 struct node{ int l, r; //当前节点的区间范围 int v; //其他需要储存的信息 } tr[N]; 需要储存的信息,需要看目前的信息,父节点可否由子节点信息直接得到,若不能需要增加新的储存信息(具体见例题2,3) u点的左儿子 2u u << 1 即 tr[u << 1] u点的右儿子 2u+1 u << 1 | 1 即 tr[u << 1 | 1] 五大基本操作 1.pu原创 2021-04-02 15:46:30 · 791 阅读 · 2 评论 -
树状数组
树状数组: 1.单点修改,区间求和 1.快速求前缀和 o(logn) 2.修改某一个数 o(logn) 2.拓展-区间加,求单点和(见例题简单的整数问题1) -> 结合差分 3.拓展-区间加,区间求和(见例题简单的整数问题2) lowbit函数用于取x二进制最低位的1与后面的0组成的数字 原理:二进制的负数是正数取反加一 int lowbit(int x) { return t & (-t); } 假设x = 2ik + 2ik-1 +…+ 2i1原创 2021-04-02 14:10:36 · 303 阅读 · 0 评论
分享