自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 手写数据库轮子项目 MYDB 之十 | 客户端与服务端

MYDB 被设计为 C/S 结构。支持启动一个服务器,并有多个客户端去连接,通过 socket 通信,执行 SQL 返回结果。

2023-09-18 15:13:52 253

原创 手写数据库轮子项目 MYDB 之九 | TableManager (TBM) 字段解析与表管理

TBM,即表管理器的实现。TBM 实现了对字段结构和表结构的管理。

2023-09-18 15:13:37 314

原创 手写数据库轮子项目 MYDB 之八 | IndexManager (IM) 索引

IM,即 Index Manager,索引管理器,为 MYDB 提供了基于 B+ 树的非聚簇索引。索引的数据被直接插入数据库文件中,而不需要经过版本管理。

2023-09-18 15:13:20 210

原创 手写数据库轮子项目 MYDB 之六 | VersionManager (VM) 版本之记录的版本与事务隔离

由两个阶段组成,加锁阶段和释放锁阶段。在加锁阶段,事务需要获取所需数据的锁,锁定数据防止其他事务对其进行修改;在释放锁阶段,事务需要释放已经获取的锁,使得其他事务可以访问该数据。事务在释放锁之后,不能再申请和获得任何其他封锁。2PL 确实保证了调度序列的可串行化,但是不可避免地导致了事务间的相互阻塞,甚至可能导致死锁。MYDB 为了提高事务处理的效率,降低阻塞概率,实现了 MVCC。通过 MVCC 实现了类似共享锁和排他锁。两阶段提交协议与两阶段锁协议不同,是针对主从数据库之间的同步。

2023-09-18 15:13:00 283

原创 手写数据库轮子项目 MYDB 之七 | VersionManager (VM) 版本之死锁检测与 VM 的实现

两阶段锁协议(2PL)通常包括扩张和收缩两个阶段。在扩张阶段,事务将获取锁,但不能释放任何锁。在收缩阶段,可以释放现有的锁,但不能获取新的锁,这种规定存在着死锁的风险。2PL 会阻塞事务,直至持有锁的线程释放锁。可以将这种等待关系抽象成有向边,例如 Tj 在等待 Ti,就可以表示为 Tj --> Ti。这样,无数有向边就可以形成一个图(不一定是连通图)。检测死锁也就简单了,只需要查看这个图中是否有环即可。创建一个 LockTable 对象,在内存中维护这张图。

2023-09-18 15:12:23 138

原创 Leetcode刷题(总结)| 代码随想录

两个多月的时间很快就结束了,这当中夹杂着写论文和实习。很早就了解了代码随想录,也自己刷了一些题,但是如果没有加入训练营,想自己坚持下来是完全不可能的。每道题都有对应的视频讲解,看视频确实比文字方便接受多了,但是在第一次刷题的时候,思路几乎为0,每次遇到一道题,都想着去看看题解,后来时间紧张,每天要实习,背八股,还要学算法,就直接看完题解后再写了。当然这样肯定不利于掌握,之后二刷、三刷的时候再重新学习吧。

2023-09-12 21:02:46 76

原创 Leetcode刷题(单调栈)| 739.每日温度;496.下一个更大元素I;503.下一个更大元素II;42.接雨水;84.柱状图中最大的矩形

单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。要找大于 i 的元素,单调栈从栈顶到栈底元素是单调递增的。

2023-09-10 18:15:40 62

原创 Leetcode刷题(动态规划之五)| 1035.不相交的线;53.最大子序和;392.判断子序列;583.两个字符串的删除操作;72.编辑距离;647.回文子串;516.最长回文子序列

其实就是求两个字符串的最长公共子序列。

2023-09-07 22:17:57 54

原创 Leetcode刷题(动态规划之四)| 123.买卖股票的最佳时机III IV 冷冻期 含手续费;300.最长递增子序列 序列;718. 最长重复子数组;1143.最长公共子序列;

一天一共就有五个状态,dp[i][j] 中 i 表示第 i 天,j 为 [0 - 4] 五个状态,dp[i][j] 表示第 i 天状态 j 所剩最大现金。

2023-09-05 22:44:52 88

原创 手写数据库轮子项目 MYDB 之五 | DataManager (DM) 数据之页面索引与向上管理 DataItem

AbstractCache 抽象类是一个引用计数法的缓存框架。维护了三个 HashMap:cache(实际缓存的数据),references(缓存的数据的被引用数),getting(数据是否被线程正在获取)。

2023-08-30 16:07:00 261

原创 手写数据库轮子项目 MYDB 之四 | DataManager (DM) 数据之日志文件与恢复策略

MYDB提供数据库崩溃后的恢复功能,DM 模块在每次对底层数据操作时,都会记录一条日志到磁盘上。在数据库崩溃之后(即第一页校验不对时),再次启动时,可以根据日志的内容,恢复数据文件,保证其一致性。

2023-08-30 16:06:50 391

原创 手写数据库轮子项目 MYDB 之三 | DataManager (DM) 数据之数据页缓存与管理

本节我们介绍数据页在缓存中的定义和管理方法。DM 将文件系统抽象为一个个的页面,每次对磁盘中数据文件的读写是以页面为单位的。从磁盘中读进来的数据也是以页面为单位缓存的。

2023-08-30 16:06:35 291

原创 手写数据库轮子项目 MYDB 之二 | DataManager (DM) 数据之缓存

DM 管理数据库的 DB 文件和日志文件。它是上层模块和下层文件系统的中间层,向上提供数据的包装,向下将数据写入磁盘。DM 的主要职责有:1) 抽象 DB 文件为 DataItem 供上层模块使用,并提供缓存;2) 分页管理 DB 文件,并进行缓存;3)管理日志文件,保证在发生错误时可以根据日志进行恢复。

2023-08-30 16:06:22 260

原创 Leetcode刷题(动态规划之三)| 322.零钱兑换;279.完全平方数;139.单词拆分;198.打家劫舍;213.打家劫舍II;337.打家劫舍III;121.买卖股票的最佳时机 I II

硬币是要遍历的物品,总金额是背包的容量。本题是要求最少硬币数量,硬币是组合数还是排列数都无所谓!所以两个for循环先后顺序怎样都可以!

2023-08-29 21:43:38 90 1

原创 Leetcode刷题(动态规划之二)| 416.分割等和子集;1049.最后一块石头的重量II;494.目标和;518.零钱兑换II;377.组合总和Ⅳ

Leetcode最后一块石头的重量II让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。所以需要求背包容量为sum/2时,其能装满的程度。sum += i;//初始化dp数组i++) {//采用倒序j--) {//两种情况,要么放,要么不放。

2023-08-27 11:11:08 41

原创 Leetcode刷题(动态规划之一)| 509.斐波那契数;70.爬楼梯;746.使用最小花费爬楼梯;62.不同路径;63.不同路径 II;343.整数拆分;96.不同的二叉搜索树

dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。j * (i - j) 是单纯的把整数 i 拆分为两个数,也就是 i,i-j ,再相乘。j * dp[i - j]是将 i 拆分成两个以及两个以上的个数,再相乘。对于整数i,考虑从1到i作为根节点的情况,并且是相加。对于每个根节点的情况,是左右节点情况相乘。dp[i] 为正整数 i 拆分后的结果的最大乘积。

2023-08-21 21:40:49 98 1

原创 Leetcode刷题(贪心之三)| 435.无重叠区间;763.划分字母区间;56.合并区间;738.单调递增的数字;968.监控二叉树

每发现有两个的区间重叠了,count++。

2023-08-20 22:33:30 58 1

原创 Leetcode刷题(贪心之二)| 1005.K次取反后最大化的数组和;134.加油站;135.分发糖果;860.柠檬水找零;406.根据身高重建队列;452.用最少数量的箭引爆气球

将数组按照绝对值从大到小排列。从前向后遍历,遇到负数将其变为正数,同时k--。遍历结束后如果k还大于0,则反复反转数值最小的元素。

2023-08-20 22:15:18 97 1

原创 Leetcode刷题(贪心之一)| 455.分发饼干;376.摆动序列;53.最大子数组和;122.买卖股票的最佳时机II;55.跳跃游戏;45.跳跃游戏II

用小饼干喂给小胃口。

2023-08-14 21:47:47 88

原创 Leetcode刷题(回溯之二)| 93.复原IP地址;78.子集;90.子集II;491.递增子序列;46.全排列;47.全排列II;51.N皇后;37.解数独

递归参数:startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。我们还需要一个变量dotCount,记录添加逗点的数量。终止条件:dotCount表示逗点数量,dotCount为3说明字符串分成了4段了。然后验证一下第四段是否合法,如果合法就加入到结果集里。单层逻辑:[startIndex, i] 这个区间就是截取的子串,需要判断这个子串是否合法。如果合法就在字符串后面加上符号表示已经分割。如果不合法,那此树枝和本层之后的也不需要再遍历了,直接break退出循环。

2023-08-12 21:47:55 70 1

原创 Leetcode刷题(回溯之一)| 77.组合;216.组合总和III;17.电话号码的字母组合;39.组合总和;40.组合总和II;131.分割回文串

图片理解了,代码也就好写了可以有一个优化剪枝的操作。( k - path.size() ) 是还需要往集合中添加的元素数量,所以在这一层递归中,只能取到 n - (k - path.size() ) + 1。

2023-08-07 22:37:50 50

原创 手写数据库轮子项目 MYDB 之一 | TransactionManager (TM) 事务

TransactionManager (TM) 模块维护了一个自定义的 XID 格式的文件,并提供接口供其他模块来查询某个事务的状态。每个事物都有一个 XID,它表明了这个事物的唯一性。事物的 XID 从1开始不断递增。事物的状态包括:0 - active,正在进行,尚未结束1 - committed,已提交2 - aborted,已撤销(回滚)TM通过维护一个自定义的XID格式文件来保存当前和过去事物的状态。文件中前8个字节记录了文件管理的事务个数,从第9个字节开始,每个字节记录一个事物的状态。

2023-08-06 14:17:22 766

原创 力扣刷题(二叉树之五)| 235.二搜树的最近公共祖先;701.二搜树中的插入操作;450.删除二搜树中的节点;669.修剪二搜树;108.将有序数组转换为二搜树;538.把二搜树转换为累加树

这是一个有序树,只要从上往下遍历,遇到节点值在p和q值之间,那一定是找到了公共祖先,那么这个公共祖先一定是最近的吗?答案一定是的,当遇到公共祖先时,如果向左或向右遍历,那么都会错过p或q。

2023-08-03 21:36:46 27

原创 Leetcode刷题(二叉树之四)| 700.二叉搜索树中的搜索;98.验证二叉搜索树;530.二叉搜索树的最小绝对差;501.二叉搜索树中的众数;236.二叉树的最近公共祖先

利用二叉搜索树的性质,如果val小于root.val,搜索左子树,如果val大于root.val,搜索右子树。

2023-08-02 21:07:45 48

原创 Leetcode刷题(二叉树之三)| 404.左叶子之和;513.找树左下角的值;112.路径总和;106.从中序与后序遍历序列构造二叉树;654.最大二叉树;617.合并二叉树;

要想判断判断一个节点是不是左子叶,要通过其父节点判断左孩子是不是左子叶。1. 确定递归的参数和返回值。传入根节点,返回左右子树的左叶子之和。2.终止条件。当为null时,返回0。3. 确定单层递归的逻辑。通过后序遍历,求左右子树的左叶子节点之和。当碰到左叶子节点时,midvalue就是左叶子节点的值,否则当前节点为右叶子或者树节点,midvalue就是0,返回左右子树的左叶子节点之和。

2023-08-01 21:01:33 68

原创 力扣刷题(二叉树之二)| 226.翻转二叉树;101.对称二叉树;104.二叉树的最大深度;111.二叉树的最小深度;222.完全二叉树的节点个数;110.平衡二叉树;257.二叉树的所有路径

一、翻转二叉树递归三部曲1. 确定参数和返回值:参数是传入的节点,返回值是传出的节点。2. 确定终止条件:当前节点为空的时候,就返回。3. 确定单层递归逻辑:后续递归,先翻转左右子树,再交换左右孩子节点。

2023-07-30 15:31:39 53 1

原创 Leetcode刷题(二叉树之一)| 递归遍历;迭代遍历;层序遍历;

前中后序的递归遍历都是一个套路,在这里就只展示后序遍历。

2023-07-30 11:05:19 49 1

原创 Leetcode刷题(栈与队列之一)| 20.有效的括号;1047.删除字符串中的所有相邻重复项;150.逆波兰表达式求值

栈的经典题目,比较简单。

2023-07-29 20:09:34 56 1

原创 Leetcode刷题(字符串之一)| 344.反转字符串;541.反转字符串II;剑指Offer05.替换空格;151. 反转字符串中的单词;剑指 Offer58-II.左旋转字符串

非常简单,左右两个指针交换就完事了。

2023-07-20 14:07:47 75

原创 Leetcode刷题(哈希表)| 242.有效字母异位词;349.两个数组交集;202.快乐数;1.两数之和;454.四数相加II;383.赎金信;15.三数之和;18.四数之和

并不是一定要用哈希,对于这种只有26个英文字母的可能,用数组也足够了。

2023-07-18 17:50:28 74

原创 Leetcode刷题(链表)| 203. 移除链表元素;206. 反转链表; 24. 两两交换链表节点;19. 删除链表的倒数第N个节点;160. 链表相交;142. 环形链表 II

最重要的思想是设置一个,这样我们在处理节点删除、交换、插入、移动等操作时,就不需要为头节点单独写一种情况了。要移除某一个元素,那我们一定要找的是它的上一个元素,把上一个元素的 next 指向要移除元素的 next 就可以了。所以我们要定义 cur 和 pre。

2023-07-18 10:13:56 85

原创 Leetcode刷题(数组)| 704. 二分查找;27.移除元素; 977. 有序数组的平方;209. 长度最小的子数组;59. 螺旋矩阵II

很早之前就已经了解到了代码随想录,也自己刷了一部分题,但一直没有认真完成过。现在马上秋招,打算按部就班地在重新刷一遍,同时也开个博客记录下来自己的理解,方便以后查看。使用二分查找最重要的是前提是此外还提到了一个思想叫做比如区间取左闭右闭的话,那么每次区间二分,范围都是新区间的左闭右闭 ,后面做判断时 ,要一直基于这个左闭右闭的区间。二分法要注意边界问题:[left, right] 还是 [left, right)。二分法的时间复杂度是 O(logn)。

2023-07-17 20:47:41 125

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除