- 博客(171)
- 收藏
- 关注
原创 CMU15445 (Fall 2023) Project2 - EXTENDIBLE HASH INDEX 思路分享
如果你对文章的某些描述感到疑惑,或是发现了文章的错误,欢迎在评论区提出: )
2024-08-08 20:02:25
1517
4
原创 CMU15445 (Fall 2023) Project 1 - Buffer Pool 思路分享
操作系统为应用程序提供了默认的缓存机制,DBMS作为应用程序,为什么不使用默认的缓存机制呢?因为DBMS需要对数据进行(1)空间控制:将经常使用的page写入到磁盘的连续位置,预读取page, (2)时间控制:何时将数据写回磁盘,何时读取数据到内存,使得磁盘I/O次数最少。为此,DBMS需要高度定制缓存策略。在Project 1中,你需要实现DBMS的缓存池模块(Buffer Pool Manager),定制缓存策略,负责管理数据在磁盘和内存之间的流动。
2024-08-07 21:11:18
1244
2
原创 CMU15445 (Fall 2023) Project 4 - Concurrency Control 思路分享
Project 4需要我们为数据库实现MVOCC, 也就是基于时间戳的多版本并发控制(OCC + MVCC). 这是一种乐观的控制并发的手段,其原理类似CAS(Compare and Swap). 只不过在compare失败时,事务将被回滚。2023 Fall的PJ 1大概有240人完成,最后的PJ 4只有不到160人完成,我没算错的话,少了三分之一的人: ( “行百里者半九十”,希望各位读者能有始有终,坚持到最后捏: )如果你对文章的某些描述感到疑惑,或是发现了文章的错误,欢迎在评论区提出: )
2024-08-06 20:16:34
2174
17
原创 CMU15445 (Fall 2023) Project 3 - Query Execution 思路分享
在Project 3中,我们将实现数据库的查询执行部分。不同算子的具体执行逻辑编写优化规则,转换查询计划,以提高其执行效率相比于Projcet 2,本次项目侧重于源码阅读,我们需要看懂BusTub的查询执行逻辑,弄清楚每个组件之间的关系,否则我们将无从下手。此外,ButTub提供了Live Shell,我们可以在网页上运行SQL,或是用来debug。
2024-08-04 18:50:36
1705
8
原创 补题与周总结:leetcode第 376 场周赛
wa穿了第3题,赛时其实想到了思路:中位数贪心,从中位数开始,用左右指针找到第一个回文数,与该回文数的代价就是答案。但是没有考虑到左右指针同时找到回文数的情况,wa了一发之后开始改。用一个vector保存代价,只要数组长度大于2就返回其中的较小值。但是没有注意到自己的算法是左右指针同时找,可能出现同一个指针找到两次回文数的情况,此时就不是左右指针分别找到一次回文数。后面改成:数组长度大于5就返回最小值才ac,赛后重写用第一次的思路写了一遍,很快就ac了。
2023-12-20 22:40:12
251
原创 补题与总结:AtCoder Beginner Contest 333 D、E
C题写了个三指针,从小到大枚举出满足题意的数,其实可以直接暴力枚举满足题意的数,但是会有重复的,用set去重即可,赛时没想到,三指针磨了很久。以为D题读懂了题意,然后写写写,debug了很久,赛后重写了一遍,也就只有个dfs,5分钟写完+debug就过了。现在想想应该是刚打完acc的影响,脑子转不动了。E题也想到了贪心,但是题意理解做了(又读了假题),想了一个巨复杂的贪心,看着ac人数有点多,发现不对劲。记录未被击败的不同类型怪物出现次数,遇到药水时,若对应类型的怪物未被击败,那么拾取该药水,否则不拾取。
2023-12-18 22:28:32
170
原创 补题与总结:牛客小白月赛83(B~F)
赛时却wa穿了D,没想到正解,用了暴力超时,发现答案的数量远远低于询问的数量,想用记忆化优化,接着wa穿。F,补题时wa穿,对于我目前的实力还是略难了,就算赛时能利用题目性质和数据范围推导出结论,最后的代码实现也会漏掉很多细节,因为要考虑很多边界和结论的性质。模拟蛇的轨迹,将二维数组转换成一维字符串,保存数组下标与字符串下标之间的映射关系,同时用pos数组保存每个字符在字符串的出现位置(下标)。工作台有三种情况:铜、银、金。的数据范围,对于一个长度为32的序列,假设经过运算的答案为ans,那么。
2023-12-18 11:11:20
478
6
原创 补题与总结:acc第134场周赛
正解思路:若在x和y之间建立新边,若s,t之间的最短路发生变化,那么最短路一定会经过新边。即最短路为:min(s->x->y->t, s->y->x->t),考虑题目给定的图最多只有1000个点,暴力枚举经过新边的最短路不会超时(枚举次数为1000 * 1000 = 1e6),所以bfs预处理s,t到其他点的最短路,然后暴力枚举即可。一个原因可能是图论题练的少了,没有往枚举点对求最短路的方向想,二来是这题一眼看去确实像贪心,结论题,三是对于新边是否会影响最短距离这个问题没有深入思考。
2023-12-18 09:15:30
68
原创 redis五大常见数据结构的操作命令(string, hash, list, set和zset)
而list支持头尾的插入删除,所以可以将list作为栈 / 队列使用,虽然list支持下标的索引(最早的时候,redis通过list类型实现了消息队列,现在redis通过stream类型实现消息队列)共享会话:redis存储session信息,应用服务器不再独立地存储属于自己的session,而是共享redis的session信息,这将优化客户端的体验,也是比较符合逻辑的。WEIGHTS:key在运算中的权重,相当于一个系数,每个集合的分数都要乘以这个系数,可以为小数,默认为1。
2023-11-20 09:59:46
995
原创 redis-plus-plus常用函数介绍以及redis的一些边缘知识
将key以字符串的形式传入,get将返回key对应的value值。需要将一个url作为构造函数的参数传入,比如:“tcp://127.0.0.1:6379”,这个url中,tcp表示用tcp协议进行通信(redis是基于tcp的),127.0.0.1表示redis服务所在的IP地址,6379表示redis服务所在的端口号。keys的第二个参数为一个插入迭代器,我们需要先创建一个存储结果的容器,再创建一个指向该容器的插入迭代器,将其作为keys的第二个参数,keys的返回结果将保存到之前创建的容器中。
2023-11-02 16:15:49
1916
原创 学习redis之前的泛泛而谈(特性介绍,应用场景,Ubuntu安装与通用命令介绍)
redis最重要的概念:在内存中存储数据为什么要设计一个在内存中存储数据的数据库,定义的变量天然就存储在内存中,为什么不直接定义变量?另一个重要的概念:分布式,在单机系统中,使用redis显得多此一举,只有在分布式系统中使用redis才能发挥它真正的性能可以这样理解:redis基于网络,将内存中的变量,分享给其他进程甚至其他主机的进程使用为什么不直接使用MySQL?MySQL最大的问题在于慢,因为它使用硬盘进行存储。而某些应用对于速度相应的要求极高,此时只能使用redis。
2023-10-31 20:36:40
191
原创 MySQL 内外链接,索引,事务,用户管理以及用C语言链接Mysql
修改(update)记录时,加锁,将数据拷贝到undo log中,原数据的DB_ROW_PTR指向undo log中拷贝记录的地址,修改原数据的DB_TRX_ID为修改其的事务ID,并修改该记录。理论上说,先来的事务不应该看到后来事务的修改,后来的事务应该要看到先来事务的修改,让不同事务看到该看的内容。但是从数据上看,一致性由业务逻辑决定,只有业务的逻辑保证了数据的一致,才能体现一致性。虽然事务的执行顺序可能交织在一起,但事务的到来时间有先有后,事务到来的先后顺序由事务ID体现,越新的事务,ID越大。
2023-10-19 12:30:00
299
原创 MySQL 数据库基础概念,基本简单操作及数据类型介绍
一个汉字虽然是一个字符,但是汉字的大小通常不是一个字节。那么mysqld启动时就需要对OS申请一块空间,以执行sql操作,数据库的数据远大于可以使用的空间时,mysql就需要拥有自己的内存管理策略,即数据的换入与换出。不同引擎创建的表的逻辑结构是相同的,但是底层的物理结构却是不同的,体现在文件数量的不同,如InnoDb会创建两个文件,而MyISAM会创建三个文件。对于set,用where查询时,只能查询完全相同的set,比如爱好为’唱,跳’,只能查出爱好为’唱,跳’的人,'唱,跳,rap’的人则查不出。
2023-10-18 14:39:34
674
原创 Codeforces Round 887 Div.3 A~D
而1到2之间的数为3,是一个小于等于数组长度的数,若1到2之间的数为一个大于数组长度的数,比如1 4 2 5 3或者1 5 2 3 4,前三个数构成的子数组不再是全排列。由于被记录的下标中,要取出最大与最小值,并且每次的询问操作还是叠加的,这里用set保存被记录的下标,begin()和人begin()返回的就是最小与最大值。每次判断要反转的括号是否在set中,若不在,则说明该下标上的括号原本是正确的,反转后将该下标加入set,若存在,将该下标从set中删除。每一列中,相邻元素相差4,满足题意。
2023-08-24 14:27:09
229
原创 Day8.22 E. Unforgivable Curse (easy&&hard version)
考虑k会影响什么性质,上一题的k为3,只有长度大于等于6的字符串中的字符可以递达任意位置,所以我们只用比较每个字符出现的次数是否相等。考虑一个无限长的s串,任意一个字符能走到字符串中的任意位置,向右走:+4-3或-3+4,向左走:+3-4或-4+3。可以再进行分类,长度小于等于k的字符串中,所有字符都无法移动,长度大于k且小于等于2 * k的字符串中,在区间。当然,具体计算出来的需要必须合法,即左端点小于等于右端点,且左端点大于等于1,右端点小于等于n。k为3时,长度为5的字符串中,第3个字符无法移动。
2023-08-23 08:03:17
412
原创 Codeforces Round 879 Div.2
统计-1的数量cnt,当cnt为奇数或者n-cnt-cnt < 0(1的数量小于-1的数量)时,ans++,cnt–如下图,在三种情况中取阴影部分最大的情况,遍历所有区间,将每个区间都构造成得分最高区间,取所有情况的最大值。cnt = 2, ans = 4,A先修改,B反转,A再修改,此时两串反转后才相等,所以需要等B反转。发现规律,若cnt为偶数,ans为2 * cnt,cnt为奇数,ans为2 * cnt - 1。1234,1244,直到第4位时前缀才不同,数位差为:0+0+1,最后构造一个9。
2023-08-22 16:36:54
223
原创 Codeforces EDU 151 Div.2
通常求最小子段和,都是使用dp,然而这题求的并不是具体的最小子段和,这题求的是最小子段和的左区间,以及一个前缀和信息。将横纵方向分开来看,对于横坐标,若两者的终点都在起点的同一方向(都位于左边或左边),此时横向的最短距离等于横向距离离起点近的终点的横向距离,即。比较暴力的解法是枚举所有可能的序列,用爆搜判断该序列是否为s的子序列,只要有一个序列不是s的子序列就输出YES,否则输出NO。给定三个点,A为起点,BC为终点,从起点走到两个终点的最短路中,最长的公共路径长度是多少?问k为多少,最后的分数最高?
2023-08-21 12:40:28
302
原创 Codeforces Round 881 Div.3
每次check时,进行mid次操作,遍历所有区间,只要有区间的1数量大于0数量,check就返回true。那么在之后的操作中,1的数量只增不减。首先,分析题意:一个元素全为0的数组,给定m个区间与q个操作,每次操作将某个元素置为1,问第几次操作时,m个区间中至少有一个区间的1的数量大于0的数量。将数组中的每个数染色,同一颜色的数字中,将最大值与最小值相减得到分数,问:所有的染色方案中,总分最高是多少。显然,同一颜色的数字除了最大和最小,其他的数没有用,要使总分最高,同一颜色的数字要最少,最少为两个。
2023-08-18 19:47:00
259
原创 第二章 搜索 No.2多源bfs,最小步数与双端队列广搜
假设建立了虚拟源点,将虚拟源点入队,进行bfs。那么第一次扩展,虚拟源点会将其他所有源点入队,并更新它们的最短距离为0(因为源点为1,因此1到1的最短距离为0),然后再用这些源点向外扩展。与图论中的多源最短路:求任意两点间的最短距离不同,多源bfs求的是多个源点到多个终点中的最近终点距离,即多源bfs的源点与终点所属集合是任意两点间这个集合的子集。考虑将多源问题转换成单源问题,建立虚拟源点,在虚拟源点与其他源点之间建立权值为0的边,那么从虚拟源点到终点的最短距离在数值上与多个源点到终点的最短距离相等。
2023-08-17 07:14:30
174
原创 第二章 搜索 No.1BFS之Flood Fill与最短路模型
因为不仅要扩展高度相同的格子,还需要将当前格子与边界进行比较,若边界的高度为当前格子不同,而边界格子被标记过,那么就会错过比较。一般bfs的扩展都是4个或8个方向,虽然这题的扩展是8方向,但是扩展的位置与平时不同,所以需要特别小心地处理坐标。debug:st数组标记已经访问过的格子,并不是标记和当前bfs的连通块的高度相同的格子。若存在高于h的格子,higher为true,若存在低于h的格子,lower为true。所有高度相同的格子为一个连通块,bfs时判断连通块的相邻格子与连通块的高度h关系。
2023-08-16 16:28:24
204
原创 第三章 图论 No.13拓扑排序
条,由于这些边的权值相同,可以在这些边中创建一个虚拟点v,未经过的点分别向v连一条权值为0的边,v向经过的点分别连接一条权值为1的边。这样,从未经过的点到经过的点的权值和依然为1,但是需要建立的边数为。,假设图中有N个点,那么bitset的长度为N,每个点都用一个bitset记录其集合,1表示i能递达这个点,0表示不能递达。分析题意:对于每一条路线,未经过的站点的等级一定小于经过的站点等级,并且最低的站点等级为1级。一条路径中未经过的站点将向经过的站点连接一条权值为1的边,一共。
2023-08-15 14:50:47
1051
原创 第三章 图论 No.12欧拉回路与欧拉路径
小学一笔画问题,每条边只经过一次判断图是否存在欧拉回路:判断图是否连通(存在孤立边),再根据有向/无向具体判断对于无向图来说,欧拉路径中,起点和终点的度数为奇数,中间点的度数为偶数起点和终点:开始和结束时必须经过一条边,其余情况为:从一条边进入,再从另一条边离开,即度数为1 + 2 * n中间点:一条边进入,一条边离开,度数为2 * n欧拉回路中,所有点的度数为偶数七桥问题中,由于每个点的度数为奇数,所以不可能存在欧拉路径。
2023-08-14 11:10:59
2325
原创 第三章 图论 No.11二分图,匈牙利算法与点覆盖
矩阵的奇数格和偶数格(横纵坐标之和)染上不同的颜色,相同颜色的为一组,那么整个矩阵就能被分成两个集合,由于只有相邻格子之间存在边,所以集合中的不存在边,只有集合之间存在边。最终将得到最优解ans,所有大于ans的边组成的图为二分图,若是图中有边的权值小于ans,那么这个图就不是二分图。建图方式很特殊,将每个格子看成点,相邻格子之间连一条边,问题就转换成了从图中选择最多的边,使得每条边的点都不重复。从二分图的非匹配点开始,经过非匹配边,匹配边,非匹配边,匹配边…枚举所有奇数格(或者偶数格),试着将其匹配。
2023-08-13 11:06:12
851
原创 第三章 图论 No.10无向图的双连通分量
无向图有两种双连通分量边双连通分量,e-DCC点双连通分量,v-DCC桥:删除这条无向边后,图变得不连通,这条边被称为桥边双连通分量:极大的不含有桥的连通区域,说明无论删除e-DCC中的哪条边,e-DCC依旧连通 (该连通分量的任意边属于原图中的某条环)。此外,任意两点之间一定包含两条不相交(无公共边)的路径割点:删除该点(与该点相关的边)后,图变得不连通,这个点被称为割点点双连通分量:极大的不含有割点的连通区域每个割点至少属于两个连通分量。
2023-08-12 19:06:31
1134
原创 第三章 图论 No.9有向图的强连通与半连通分量
连通分量是无向图的概念,yxc说错了,不要被误导强连通分量:在一个有向图中,对于分量中的任意两点u,v,一定能从u走到v,且能从v走到u。强连通分量是一些点的集合,若加入其他点,强连通分量中的任意两点就不能互相递达半连通分量:在一个有向图中,对于分量中的任意两点u,v,一定存在从u走到v或者从v的路径应用:通过缩点(将所有强连通分量缩成一个点)的方式,那么一个有向图就转换成了一个有向无环图DAG(拓扑图)对于拓扑图,可以直接用bfs求最短路问题树枝边(x和y直接相连)
2023-08-10 10:42:44
931
原创 第三章 图论 No.8最近公共祖先lca, tarjan与次小生成树
当切除树边,不用再切除非树边就得到两个连通块时,由于题目限制,还需要切除一条非树边,假设非树边有m条,那么此时可以选择m条边中的任意一条切除,此时的方案数为m。时,即x往上跳k步和y往上跳k步后,位于同一个位置,此时找到了一个公共祖先,但不是最近公共祖先,所以这里要减小k的值,直到。假设现在已经用树边建立了一棵树,此时再添加非树边将构成环,将环中的所有树边权值加1,假设初始权值为0,此时可以使用树上差分。若切除树边后,还要再切除一条非树边,才能得到两个连通块时,此时的方案数为1,只能切除这条环中的非树边。
2023-08-08 21:46:12
1147
原创 第三章 图论 No.6负环之01分数规划与特殊建图方式
总结下:check判断图中是否存在一个环,其点权之和/边权之和大于等于mid,转换成图中是否存在一个正环(或权值和为0的环),若存在,则l = mid,否则r = mid,考虑新的建图方式,以单词的前两个字符为起点,最后两个字符为终点,建立一条有向边,权值为单词的长度。,最大的答案为每个单词长度都是1000,而最小的答案0是取不到的,最小的情况应该是1,0用来表示无解。debug:dis数组的类型开成int,想着边的权值为整数,int就行,然而边权被重置,类型是浮点数。
2023-08-07 15:25:20
2008
原创 第三章 图论 No.5最小生成树之虚拟源点,完全图与次小生成树
此时可以删除这条次大的边,更新次小生成树。每次kruskal选择当前最小边更新时,本质是在建立连通块,初始每个点各自为连通块,数量为n,每次更新连通块的数量-1,更新n-1次选择了n-1条边后,连通块的数量为1,此时最小生成树构建完成。先求最小生成树,枚举不在树中的边,同时删除最小生成树(构成环)中的最大边,使得最终得到的图仍然是一颗树,次小生成树一定在这些树中。与一般的最小生成树问题不同,本题需要在建立电站的电井之间建立电网,在两个电站之间建立电网需要花费金额,可以看成一条具有权值的边。
2023-08-06 20:19:28
1114
原创 第三章 图论 No.4最小生成树的简单应用
需要注意的是:题目给定的图可能存在多个连通块,若使用prim算法,需要对每个连通块求最小生成树,但是使用kruskal能直接求出所有连通块的最小生成树。需要注意的是,200万条边进行排序会消耗很多时间,由于边的权值只有1和2,所以可以先添加权值为1的边,再添加权值为2的边。添加所有必选的边,维护并查集,然后再对非必选的边做kruskal。的矩阵中,相邻两点之间存在一条边,那么矩阵中的边数应该为。点阵为图中的点,将二维坐标转换成一维,作为点的编号。裸题,稀疏图,套个kruskal的板子就行。
2023-08-05 21:52:48
1775
原创 第三章 图论 No.3 flody之多源汇最短路,传递闭包,最小环与倍增
在计算新连通块的直径最大值时,需要在原连通块与当前新连通块的直径中取max,由于每中不同连接方式都要与原连通块的直径取max,我们可以放到最后在与之取max。可以枚举所有的连接方式,维护出新连通块的直径最小值,将其与原连通块的两个直径比较,取三者的最小值即可。所以在循环k时,就可以枚举所有的i和j,得到包含i,j,k三点的最小环,在这些最小环中取min即可。,其中get_dis表示两点间的距离,dmax(i)表示在原连通块中,i与距离i最远的点的距离。直径概念:同一连通块中,两个距离最远的点之间的距离。
2023-08-05 16:47:24
2294
原创 第三章 图论 No.2单源最短路之虚拟源点,状压最短路与最短路次短路条数
而spfa的更新不具有拓扑序,即不存在最短路树,要是图中存在负权边,无法使用天然具有拓扑序的bfs和dijkstra时,只能先用spfa求出最短路,维护出最短路树,再求最短路条数。对于spfa,由于它是暴力算法的优化,每个点都会入队与出队多次,所以spfa的更新不具有拓扑序,已经出队(更新完成)的点可能影响被后续入队的点影响。对于BFS,由于每个点只会入队一次且只会出队一次,说明BFS的更新天然地具有拓扑序,因为出队的点不会被后续入队的点影响。这里涉及到二维坐标到一维的转换,然后用邻接表存储图。
2023-08-04 17:06:08
3003
原创 第三章 图论 No.1单源最短路及其综合应用
虽然这题的边权为正,但是这题的状态不是由之前的状态累加,而是从之前的状态中取min或者max,这就导致dijkstra每次的更新无法求得最优解,需要后续的再次更新,此时的时间复杂度无法保证,这是最关键的,所以不使用dijkstra。两种特殊情况:ans为0,说明1~n的所有路径中,至少存在一条路径,经过了k条权值大于0的边,那么第k+1条边的权值为0,需要支付金额为0。若每条边的权值为实际转账的金额比例,那么从起点到终点,这个比例越大,花费的初始金额就越少,所以这题需要找一条从起点到终点比例最大的路径。
2023-08-04 08:38:32
2456
原创 第四章 No.2单点线段树的介绍与使用
只要保证查询区间与根节点表示的区间有交集,由于我们每次递归查询的时候,只会选择有交集的区间进行递归,没有交集的区间就不会选择,所以每次判断的时候不会遇到当前区间与查询区间没有交集的情况。当前区间的前缀和要如何维护?有两种情况:1. 左子区间的最大前缀和 2. 左子区间和加上右子区间的最大前缀和,当前区间的最大后缀和也是同理,所以节点还需要维护。但是这题要查询的是最大连续子段和,不能从左右子区间的最大连续子段和推出当前区间的最大连续字段和,因为还有一种情况存在:左子区间的最大后缀+右子区间的最大前缀。
2023-07-31 10:38:22
235
原创 第四章 No.1树状数组的原理与使用
维护着数组中的某段区间和,并且这些区间之间存在着重叠,修改数组中的任意一个数后,必定会向上影响其的父节点的区间和,此时只能通过子节点不断地更新到根节点,才能维护正确的数据。经过归纳,求前i个数的和时,需要对树状数组中的数进行累加,这些数的下标从i开始,不断地减去最后一位1,直到i为0。这便是树状数组名字的由来,十分的形象,思考父子节点之间的关系。分别求出区间中的每个数吗?2. 求原数组的某个数时,使用树状数组的sum操作即可,时间复杂度为。的x即可,此时的x就是剩下身高中第k小的身高,这个用二分可以实现。
2023-07-29 10:54:56
281
原创 毕业!第六章 贪心(一、二)——区间问题,Huffman树,不等式与推公式
所有的区间按照右端点排序,每次选择一个区间,使之与已经选择的互不相交区间不相交。经典Huffman问题,节点权值与根节点的距离具有负相关性,权值越大的节点离根节点的距离越近,权值越小的节点离根节点的距离越远,此时合并果子消耗的体力最小。由于之后的区间右端点都是大于等于当前区间右端点的,所以只要后续区间与当前区间相交,那么当前区间的右端点也被后续区间包含。前面的数乘以的数较大,后续的数乘以的数较小,t乘以的数从大到小,要使得结果最小,就要使t从小到大。若后续区间与当前区间互不相交,那么选择该区间的右端点。
2023-07-23 07:06:47
566
原创 第五章 动态规划(三)计数,数位,状压,树形dp与记忆化搜索
核心:先放横着的,再放竖着的。即将当前列的二进制状态与前一列的二进制状态做按位与操作,得到的结果为0,说明没有方块冲突,当前列的方块可以摆放。当前列的方块摆放完成后,若出现连续的空格且空格数量为奇数,那么这个位置无法摆放竖着的方块,说明当前列的摆放是非法的。思考最后一步,枚举前一列的前一列的摆放状态k,在k的状态上摆放j状态,所有使得摆放后状态合法的k状态数量就是。注意,j为二进制表示,这是状态压缩的体现,1表示当前行的前一列已经摆放方格,0表示当前行的前一列没有摆放方格。
2023-07-22 08:54:02
125
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人