首页 > 编程语言 >整理一些学过的数据结构和算法

整理一些学过的数据结构和算法

时间:2023-05-01 14:22:27浏览次数:54  
标签:sum 异或 查询 算法 学过 数据结构 节点 字典

匆匆忙忙中学了很多算法,但基本都是打个板子就跑路了,有些算法有个人比较深入和独特的见解,但大部分,只是实现例题的需求,对算法的作用似懂非懂,所以写篇博客整理一下。


无旋平衡树(treap)


高级数据结构:树和堆

可以允许的操作:插入,删除,查询某数排名,查询某排名的树(第K大),求某数的前驱,后驱(X的前一个数或后一个)

特点:使用随机数pri对每一个数划分优先级,实现堆。键值key对每一个数排序,实现树,满足每一个结点的左儿子比他小,右儿子比他大。

核心:分裂与合并(split&merge)


分块


区间信息维护与查询

可以允许的操作:单点更新,区间更新,区间查询

特点:O根号类暴力算法,简单快捷,效率较差

核心:打懒标记add[ ],和区块和sum[ ]


可持久化线段树


可以允许的操作:查询区间内第K小的数


补充:

前置:权值线段树

节点范围是一个区间,节点储存该值域内的元素个数,如图

如此,每加入一个数,就会产生一个新的权值线段树,但都分开存储,占用的空间太大了,于是:

可持久化线段树来喽!

每插入一个节点,新建一个根节点,将改变了的节点重建,其他重复节点沿用。

实例:依次插入{3,1,4,2,3,5,3,4}


树上差分


序列查分(略)

顾名思义:差分

可以允许的操作:统计若干操作后点(边)被使用(经过了)多少次

核心:从S走到T,

sum[s]++;
sum[t]++;
sum[LCA(s,t)]--;
sum[fa[LCA(s,t)][0]]--

经典例题:松鼠的新家洛谷P3258

可持久化字典树(Tire)


解决问题:异或和问题,求最大异或和
思路:每次在字典树中找相反位

前置题目,用字典树解决最大异或和The XOR-longest Path
因为这道题还是比较巧妙,所以说两句,因为开始我也没想出来怎么用字典树。
因为是一棵树,所以两点之间路径长是固定的,以任意一个点为根DFS遍历整棵树,求出根到每个点的路径长f[ ],所以问题变成求两个f[ ]异或值最大,用字典树解决。

可持久化字典树核心操作:插入(insert),查询(query)。
上易懂图
image

image

清晰易懂,我甚至感觉我不需要多讲什么了。


Update日志:

2023.3.25第一次更新了三个知识点
2023.5.1第二次更新了可持久化字典树,并移植到博客园上

标签:sum,异或,查询,算法,学过,数据结构,节点,字典
From: https://www.cnblogs.com/alloverzyt/p/17366495.html

相关文章

  • 5471: 数据结构实验--图的最小代价生成树 prim
    描述  求带权无向图的最小代价生成树。    输入  输入数据为多组,每组数据包含多行,第一行为2个整数n,e,n为图的顶点数,e为边数,接下来是e行,每行3个整数,前两个整数是一个顶点对,代表一条边所依附的两个顶点,第3个整数是边的权值。所有值不超过20。  输出......
  • 数据有偏差,照样能学对!20年前就有这么强的算法了?
    文|白鹡鸰给小铁比了个心编|小轶背景“每个人都依赖自己的知识和认知,同时又为之束缚,还将此称为现实;但知识和认识是非常暧昧的东西,现实也许不过是镜花水月——人们都是活在偏见之中的,你不这样认为吗?这双眼睛,又能看多远呢?”机器学习,作为模仿人类思维方法进行建模的过程,虽然从数......
  • 数据结构-莫队二次离线
    莫队二次离线问题:给一个序列a,每次询问区间里面有几个逆序对刚刚又睡了半小时,终于睡醒了\(n,m\leq1e5\)实现询问首先想一想莫队:对于初始询问区间[l,r],将右指针r扩展到r+1,对于答案的贡献就是[l,r]里面大于a[r+1]的数量,写成数学公式就是\(\sum_{i=l}^r(a[i]>a[r+1])\)然后可......
  • 【字节二面算法】NO662 二叉树最大宽度
    [字节二面算法]662.二叉树最大宽度给你一棵二叉树的根节点root,返回树的最大宽度。树的最大宽度是所有层中最大的宽度。每一层的宽度被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的n......
  • 「学习笔记」SPFA 算法的优化
    与其说是SPFA算法的优化,倒不如说是Bellman-Ford算法的优化。栈优化将原本的bfs改为dfs,在寻找负环时可能有着更高效的效率,但是最坏复杂度为指数级别。voiddfs_spfa(intu){ if(fg)return; vis[u]=true; for(pilit:son[u]){ intv=it.first; llw=......
  • 线索化二叉树的递归算法
    //线索化二叉树的递归算法#include<stdio.h>#include<malloc.h>typedefstructBiTNode{intdata;structBiTNode*lchild,*rchild;//存储二叉树的左孩子和右孩子}BiTNode,*BiTree;typedefstructThreadNode{intdata;structThreadNode*......
  • 【数据结构】栈
    1 前言这节我们来看看计算机中的常见的栈结构。2 栈定义栈是一个后进先出(LastInFistOut,LIFO)的线性表,它要求只在表尾进行删除和插入操作。所谓的栈,其实就是一个特殊的线性表(顺序表、链表),但是它在操作上有一些特殊的要求和限制:栈的元素必须“后进先出”栈的操作只能......
  • m分别使用meanshift和camshift两种算法实现人员跟踪并输出人员移动曲线matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要       meanshift算法其实通过名字就可以看到该算法的核心,mean(均值),shift(偏移),简单的说,也就是有一个点,它的周围有很多个点 我们计算点 移动到每个点 所需要的偏移量之和,求平均,就得到......
  • 文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题
    八、可以扩展我们的记号到有两个参数n和m的情形,其中的n和m可以按不同速率独立地趋于无穷。对于给定的函数g(n,m),用O(g(n,m))来表示以下函数集:O(g(n,m))={f(n,m):存在正常量c、和,使得对所有n>=n0或m>=m0,有0<=f(n,m)<=cg(n,m)}对Ω(g(n,m))和θ(g(n,m))给出相应的定义。文......
  • 文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题
    八、可以扩展我们的记号到有两个参数n和m的情形,其中的n和m可以按不同速率独立地趋于无穷。对于给定的函数g(n,m),用O(g(n,m))来表示以下函数集:O(g(n,m))=对Ω(g(n,m))和θ(g(n,m))给出相应的定义。文心一言:chatgpt:类比于单个参数的情形,我们可以定义类似的记号:O(g(n,......