- 博客(56)
- 收藏
- 关注
原创 CS231n-2017 Lecture5卷积神经网络笔记
卷积神经网络与常规神经网络相似,都由神经元层连接而成,区别在于CNN基于输入数据为图像的假设,从而使结构发生了相应地变化。
2025-07-22 16:30:21
868
原创 CS231n-2017 Lecture4神经网络笔记
我们之前的线性分类器可以接受输入,进而给出评分,这是一种线性变换,再此基础上,我们对这种线性变换结果进行非线性变换,并输入到下一层线性分类器中,这个过程就像是人类大脑神经的运作一样,神经元接受信号,并输出神经递质给下一个神经元,表示是兴奋(正权重)/抑制(负权重)
2025-07-21 14:26:42
725
原创 CS231n-2017 Lecture4反向传播笔记
我们先正向传播计算出各个门输入及其局部梯度信息,这些门会组成一棵树,最后的输出门就是根节点,我们对根节点进行dfs,递归其每一棵子树,并利用上文的链式法则梯度计算方法递归,即可算出关于所有叶子结点(即原始变量输入)的梯度。
2025-07-21 11:47:50
355
原创 CS231n-2017 Lecture3线性分类器、最优化笔记
上节讲到,图片可以被展开成一个向量,对于这个向量,假设它有D维,那么它就是D维空间的一个点,又假设我们的标签集合总共有K种,我们可以定义一个K维标签得分向量,每一个维度对应着其相应标签的得分。那么我们就可以想办法建立一个线性映射,将一个图片向量映射成一个标签向量,将其中得分最高的维度所对应的标签作为这张图片的标签,这就是线性分类器的本质即:设训练集有N个元素,其中, 每个有其对应的标签向量。
2025-07-19 23:48:51
544
原创 CS231n-2017 Lecture2图像分类笔记
在已有固定的分类标签集合的前提下,能够对输入的图像进行识别处理,从集合中找到该图像所对应的标签。对于计算机而言,图像并非直观的图像,而是一个的像素集合,对于每个像素,其又有RBG三个颜色通道。因此,一张图片可以被认为是一个的三维数组,数组内每个元素都是在范围内的整型。而计算机图像分类的任务,就是将这样的一个三维数组映射到其对应的标签上。
2025-07-19 22:52:53
845
原创 C++ lambda函数
捕捉所有父作用域的变量的引用(除了捕获列表内显式指定过的),包括this指针,即相当于[&var1, &var2...],把所有var都打进去。捕捉所有父作用域的变量值(除了捕获列表内显式指定过的),包括this指针,即相当于[var1,var2...],把所有var都打进去。当加上时,lambda函数的operator()取消其const属性,此时函数体内可修改按值捕获的变量的值。参数列表,和正常函数的参数列表一样,指定lambda函数的operator()所接受的参数个数及其类型。
2025-06-15 17:02:08
261
原创 23树与左倾红黑树
1.树的一个结点可以容纳2个元素,记为first,second2.树的一个节点可以有3个儿子,记为left,middle,right3.left的所有元素<first,first<middle的所有元素<second,second<right的所有元素。
2025-06-04 11:07:38
1109
原创 C++中的各式类型转换
函数参数列表接受类类型变量,传入的单个参数不是类对象,但可以通过这个参数调用类对应的构造函数,那么编译器就会将其隐式转换为类对象class A{private:int a;//隐式将int转换为A对象A obj = 1;//同上return 0;
2025-05-13 23:04:59
845
原创 各种莫队算法
莫队算法,是一种以分块为基础的维护区间[1,n]的离线算法,主打一个优雅的暴力应用场景:对于q个询问,每次询问区间[l,r]算法核心:我们将区间[1,n]按每块长度为进行分块,则block[i]表示下标为i的元素所在的块的编号。我们对q个询问以block[l]作为第一关键字,r作为第二关键字由小到大排序,然后再逐一处理询问。
2024-09-30 22:11:19
1191
原创 上下界网络流
我们知道,仅有上界的网络流,可以通过bfs寻找增广路进行扩流从而找到最大流。但如果给每条边的流量加一个下界,我们应该怎么办呢?设边w的流量上界为sup,下界为inf一个思路是先把每条边下界需要流的inf流量流满,然后再给出sup-inf的边,代表可流可不流,这样,就可以在保证取到流量下界的同时不超出流量上界。那么我们具体该怎么实现呢?
2024-09-30 21:24:26
835
原创 网络流最大流,费用流
网络流,指的是在一个每条边都有容量的有向图分配流,使得一条边的流量不会超过他的容量有向图称为网络,顶点称为结点,边称为弧源点:只出不进的顶点汇点:只进不出的顶点容量和流量:每条有向边上有两个两,容量和流量。
2024-09-08 11:21:11
1067
原创 轮廓线dp、插头dp
轮廓线:对于一个n*m棋盘上的决策,当我们考虑到(i,j)这个格子时,第i行前j-1个格子的下边以及第j个格子的左边以及第j到第m-1-j个格子的上边所组成的一条线,我们称之为轮廓线轮廓线dp:当我们在棋盘第(i,j)格子上放置棋子时,我们的决策受到且仅受到(i,j)格子左边以及上边的状态的影响,我们这个时候就可以 采取轮廓线dp的方法来解决题目大意:给出n*m的棋盘,其中为1的格子必须铺线,为0的格子禁止铺线,棋盘上可形成多条回路,求所有合法方案数。
2024-09-08 10:19:43
1046
原创 树上dp之换根dp
换根dp是树上dp的一种我们在什么时候需要用到换根dp呢?当题目询问的属性,是需要当前结点为根时的属性,这个时候,我们就要使用换根dp换根dp的基本思路:假设题目询问的的属性为x通常我们会进行两次dfs第一次dfs,我们选取任意一个结点作为给出的无根树的根,对其进行dfs,并求出这个根的x,以及一些其他辅助数组(即节点与其子树的一些属性关系)第二次dfs,我们记dp[i]为对于结点i而言,节点i作为树的根时,我们要求的属性x。
2024-08-13 22:46:07
1228
原创 状态压缩动态规划——状压dp
状压dp:意思是将状态进行压缩,从而更容易地写出状态转移方程通常做法:将每个状态(一个集合)用二进制表示,每个位的1就代表着这个编号的元素存在,0就代表着这个编号的元素不存在,如二进制100110,即是集合{1,2,5}的压缩通过状态压缩,我们可以使得状态通过位运算来判断是否可以转移。
2024-08-09 22:33:33
1657
原创 Dplyr With Data Transition
8/1变量有以下几种类型:下面重点介绍以下五个函数:格式:(下文中表示表达式),例如筛选出所有1月1日的航班:如需同时输出结果,则可以添加一个括号:数据集赋值操作类似。附:如果想要确定一个值是否为缺失值,可以使用函数:Arrange()格式;,其中x表示列名。如果列名不止一个,那么久使用后面的列在前面排序的基础上继续排序:需要注意的是该操作会修改数据集。使用可以按列进行降序排列:缺失值总是排在最后:这可能比较费解,因为常识上缺失值应该对应无穷小,因此对于这一悖论需要额外注意。倘若需要将缺
2024-08-04 01:27:08
945
原创 可持久化线段树/平衡树
对于一棵树来说,我们每次单点修改的时候,无非就是修改了它的左子树或者是右子树,那么对于新的版本来说,当他修改的是左子树的节点的时候,显然我们可以继续沿用历史版本的右子树,也就是只要复制并修改一棵左子树就可以了;这就是可持久化的核心思想。操作和可持久化线段树类似,我这里采用的是FHQ-Treap实现的平衡树,在split的过程中会修改树的值,因此在split的时候需要开新点,由于merge的时候连接的都是split开的新点,所以merge就不用再开新点了。
2024-07-03 12:33:20
688
原创 树上差分的公式推导
其实这两者在这个节点这里是等效的,所以我们随机减免一个就可以了,我们这里选择给dep[x]的权值减1。我们再来分析lca到y的路径上的结点j,对于这个结点j,如果x出发的人能够被他观测到,那么应该满足关系式:dep[x]-dep[lca]+dep[j]-dep[lca]=w[j],这样一来,我们就可以得到:dep[j]-w[i]=2*dep[lca]-dep[x],也就是说,对于路径上的每个这样的结点j,我们只需要计数2*dep[lca]-dep[x]的个数,就可以知道他可以观测到多少个人了。
2024-07-03 01:46:52
366
原创 树状数组——点修区查与区修点查
树状数组是一种代码量小,维护区间的数据结构他可以实现:1.区间修改,单点查询2.单点修改,区间查询当然,二者不可兼得,大人全都要的话,请选择线段树。
2024-07-01 01:18:45
264
原创 动态DP&动态树分治
这是一条子节点向父结点转移的方程,因此,我们只需要对树的根节点进行dfs,先更新子节点的值,再用其来更新父节点的值,最终就可以得到根的两个dp值,f[root][0]和f[root][1],我们只需要取两者中的较大者,就是该棵树的最大权独立集。我们可以想象一下,我们现在对结点u进行了点权修改,显然u的子树的dp值是不需要修改的,u的兄弟结点的dp值也是不需要修改的,我们需要修改的只有u节点到根结点这一整条路径上的结点的dp值。其中f[x][0]表示不选择节点x加入点集,以x为根的这棵树的最大点权和。
2024-06-30 22:25:36
1510
原创 LCT——Link Cut Tree及其应用
我们知道,想要维护树上的一段区间,我们可以采用重链剖分来将其划分但是,树链剖分只能够维护静态(树的形态不发生变化)的树,倘若我们需要动态对树的形态进行修改,比如将某个结点换为树的根、树中边的增删、子树合并和分离操作等,并需要在线地回答相关询问,那么每一次修改后,轻重链都需要重构,效率就会大大降低所以,我们需要一种数据结构能够动态地维护树上的区间这就是今天要用到的LCTLCT是在1982年由Tarjan大佬等人提出的。
2024-06-30 01:06:50
804
原创 离散化,矩阵快速幂,广义矩阵乘法
对于一个线性的递推式,我们可以将其写成1行n列的矩阵形式,并找到一个矩阵A,使得矩阵[矩阵之间的乘法具有结合性,因此,我们可以采用普通快速幂的思想,对矩阵进行快速幂运算。在这种情况下,我们将opt1和opt2相应地将矩阵乘法中的乘法和加法操作替换掉。那么,对于一个数列1,50,666,8558555,9989898989而言。就得到了广义矩阵乘法,其满足矩阵的结合律,可以使用快速幂。那么这个1,2,3,4,5就是上述原数组离散化后的id。其实我们可以把他们看作1,2,3,4,5。
2024-06-28 23:00:02
835
原创 树链剖分及其应用
1.重儿子:假设节点u有n个子结点,其中以v子节点的为根子树的大小最大,那么v就是u的重儿子。只需要让top[u]的深度较大的一方跳到其top[u]的父亲结点上,自然就到了另一条新链了。首先,我们可以很简单地通过dfs获取一个结点的dep,fa和siz,从而也就获得了siz。假设他们在同一条链上,也就是top相同,那么他们的lca就是深度比较小的一方。siz[u]:以u节点为根的子树的大小。重儿子的top就等于自己u节点的top。top[u]:u结点所在的链的顶点。4.重边:结点u与重儿子连接的边。
2024-06-27 00:50:07
525
原创 差分数组与树上差分
假设我们现在需要维护一段区间,实现对一段区间[L,R]的数的加/减,以及对区间中某个数的查询最简单的方法把这段区间的数都记录到数组a[N]中,每次修改都对区间[L,R]的每一个数进行加减操作,然后在查询第k个数的时候返回a[k]在上述算法中,修改操作的复杂度是o(n),而查询操作的复杂度是o(1)这种操作在查询次数大,修改次数小的时候很高效但在修改次数大,查询次数少的时候,就显得很慢了那么在这个时候,我们可以使用差分数组来维护这段区间。
2024-06-26 21:06:14
506
原创 动态开点线段树,线段树合并
而动态开点线段树,就是对于给定的区间[L,R],我一开始是一棵空的线段树,或者说有一个节点(L到R),当我需要插入某个下标为k的数的时候,我再一路创建所表示区间包含k的结点并修改(如果这个结点先前没有被创建的话),从而节省了大量的内存。当我们递归到一个结点,如果x或y在这里没有结点,那么直接搬用对方的结点过来即可(如果双方在这里都没有结点,那么这里就仍然为空节点了)对于传统线段树,我们都是把区间开满,然后要修改哪个区间,就去找包含那个区间的结点。当我们递归到叶子结点的时候,合并权值。也就是需要合并线段树。
2024-06-26 20:36:44
396
原创 倍增法找lca——最近公共祖先
在这种情况下,我们只需要x和y同步往上爬,直到他们两个的祖先重合,就可以得到x与y的公共祖先了。这个时候,我们就应当先找到一个x的祖先,这个祖先和y的深度相同,然后再按照情况2处理。这和把一个十进制的数转为一个二进制的数是一样的,我们都是从最高位往最低位填1。所以想要实现这样的算法,我们需要记录各个点的深度,以及他们。2.dep[x]<dep[y]或dep[y]<dep[x]一个最简单的办法就是沿着x和y的父节点一个一个往上找。对于结点x和y,需要找他们的最近公共祖先。这个时候,x与y的lca一定是y。
2024-06-26 20:02:56
758
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人