自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spark源码中的线程池

线程池类型Spark 应用场景设计哲学关键配置参数​​核心调度、网络通信​​稳定压倒一切​​​​事件总线、资源清理​​顺序性保证正确性​​​​结果处理、临时任务​​弹性应对突发流量​​​​资源分配、心跳检测​​时间驱动型任务​​。

2025-09-28 15:02:10 1112

原创 Synchronized和Lock锁

线程 A 读磁盘块时,线程 B 无法读内存块(即使空闲)!资源可拆分(如银行柜台、Spark 的磁盘/内存/元数据)中的体现,以及为什么它比直接锁整个对象(或方法)更灵活。线程 C 更新元数据时,所有其他操作都要等待!​买基金,也被迫等待,即使两个柜台完全独立!线程 C 可以同时更新元数据(锁。​:银行的两个柜台可以同时工作。线程 B 可以同时读内存块(锁。​存钱时,整个银行网点被锁住(​(线程)需要办理不同业务。​ 因为是静态方法,锁是​。​,它们会竞争同一把锁(​:不同柜台的业务可以​。

2025-09-24 01:21:53 681

原创 Spark源码中的ReentrantLock

这时,如果将锁交给执行时间很短的任务,那么可以充分利用在被唤起线程真正开始执行之前的数据准备时间,从而提高了性能。从此处可以看出,当线程持有锁的时间比较长(执行任务需要的时间长)或者请求锁的平均时间间隔比较长,则应该使用公平锁。这意味着等待时间最长的线程会优先获取锁,可以有效防止某些线程在极高并发下发生“饥饿”(Starvation)现象,保证了元信息更新的公平性。因为文件操作(创建子目录)的竞争通常不会特别激烈,非公平锁的吞吐量更高,避免了线程切换的开销。​: 管理磁盘上块的创建、存储和删除。

2025-09-23 22:18:59 348

原创 Spark源码中的AQS思想

虽然在 Spark 源码中找不到直接继承的类,但 ​​AQS 所代表的“通过一个状态变量和一個等待队列来构建同步器”的核心架构思想,是 Spark 并发设计的灵魂所在​​。​​在单机层面​​:Spark 使用volatileCAS和基于 AQS 的并发工具(如)来实现高效、无锁的并发控制。​​在分布式层面​​:Spark 将这种思想扩展,用 ​​Driver 作为中央协调器​​,维护着​​全局状态​​和​​全局任务队列​​,通过 ​​RPC 消息机制​。

2025-09-23 00:00:35 726

原创 Spark源码中的volatile

分享几个spark中的案例关于volatile,希望对大家有帮助。

2025-09-22 23:21:57 5403

原创 Spark源码中的CAS思想

在 Spark 源码中,CAS 思想主要体现在以下几个方面:​​状态标志位管理​​: 例如组件(RpcEndpoint, ListenerBus)的启动、停止状态。使用确保状态转换的原子性和线程安全,避免重复启动/关闭。​​无锁计数器和累加器​​: 使用等进行计数,避免带来的性能开销。​​无锁数据结构​​: 最典型的例子是中的页表管理,使用实现高性能的无锁内存分配,这是支撑 Spark 高效内存计算的关键之一。​​乐观锁控制​。

2025-09-22 21:04:08 658

原创 Spark源码学习分享之submit提交流程(1)

上述命令会进入SparkSubmit类中,先简单看下这个文件有哪些主要的方法,然后再从main方法逐步跳转,查看具体程序运行过程。

2025-09-16 13:32:03 944

原创 层序遍历之我要打十个

size控制当天队列还有几个元素是当前层的,剩下的都是下一层的。由于当前层元素list是遍历完当前层所有元素再添加进res列表,所以,list的定义要在当前层循环之外。

2025-02-27 13:41:55 333

原创 代码随想录算法训练营Day22|77、组合216、组合综合17、电话号码的字母组合

回溯三部曲:1、确定函数头2、确定终止条件3、确定单层逻辑(for循环横向遍历,遍历的时候把递归当作一个黑盒)思路和上一题差不多,注意sum如果已经大于目标值,没必要再组合下去了,我们组合出来的和都是递增的。

2025-01-07 15:36:22 366

原创 ds刷题day3|76. 最小覆盖子串、3. 无重复字符的最长子串、11. 盛最多水的容器、LCR 007. 三数之和

不断移动右指针,如果指针指向的元素是目标元素,则存入哈希表中。检查是否满足要求,如果满足,就移动左指针,并且把左指针遍历的元素移除哈希表。

2024-12-30 22:42:20 411

原创 ds刷题Day2|1. 两数之和、27. 移除元素、88. 合并两个有序数组

一个数有没有在表中出现过,考虑使用哈希表。

2024-12-25 00:06:28 261

原创 ds刷题DAY1|66.加一、485. 最大连续 1 的个数

从数组尾部开始遍历,遇到不是9的直接加一并返回;遇到等于9的变成0,并且继续判断下一位。如果全部为9,创建一个新数组,长度为原长度加一,首位为1,其他为零。比较巧妙地一点是在非1地时候赋值给max,需要注意的是最后一个位置如果为1的时候,会导致for循环内少赋值一次,所以最后返回前,要再赋值一次。

2024-12-24 15:30:37 263

原创 prim算法

第二步记录每个节点到已生成最小生成树的距离,用一个midDir一维数据记录,初始值每个节点都不连通,设为一个大数;第一步输入数据,没有路径的地方需要设置成一个大数,类似此路不通的意思。2、遍历完后,找到了最小结点,把它加入到最小生成树,isAddTree = true。定义min:记录节点到最小生成树的最小距离.初始设为MAX_VALUE,因为第一个节点要加入。刚学习prim算法,看了好久,最后还是抄了一遍理解清楚了,现在梳理一下框架。min等于它到最小生成树的距离;3、更新当前结点到最小生成树的距离。

2024-10-15 19:13:16 498 1

原创 代码随想录一刷总结

中间也走过一些弯路,执着于看答案的代码,看懂了再写,但是通过记忆保留下来的代码还是有很多小bug。后来尝试自己在草稿纸上画图,自己写流程,然后把这些流程转换成代码,bug就少了很多。我也初次意识到代码能力只是一部分,逻辑思路清晰了,能事半功倍。现在对于递归,回溯,动态规划,深搜广搜,心中都有了框架。所以给自己定个二刷的目标:解题的思路要熟练清晰,能把解题思路用在包装了的题目上。到现在,有些题目可以自己只听思路,写代码实现。从8月31号开始加入算法训练营,经过六十多天,还是有比较多的收获的。

2024-10-07 17:35:00 298

原创 代码随想录day52|字符串接龙、有向图的完全可达性、岛屿的周长

经过上面的练习,大家可能会感觉 广搜不过如此,都刷出自信了,本题让大家初步感受一下,广搜难不在广搜本身,而是如何应用广搜。深搜有细节,同样是深搜两种写法的区别,以及什么时候需要回溯操作呢?简单题,避免大家惯性思维,建议大家先独立做题。

2024-09-27 17:53:17 293

原创 代码随想录Day53|102.沉没孤岛 、103.水流问题 、104.建造最大岛屿

【代码】代码随想录Day53|102.沉没孤岛 、103.水流问题 、104.建造最大岛屿。

2024-09-26 02:38:34 333

原创 代码随想录Day51|99.岛屿数量 深搜 99.岛屿数量 广搜 岛屿的最大面积

【代码】代码随想录Day51|99.岛屿数量 深搜 99.岛屿数量 广搜 岛屿的最大面积。

2024-09-23 18:59:29 190

原创 代码随想录Day50|98. 所有可达路径

【代码】代码随想录Day50|98. 所有可达路径。

2024-09-19 15:07:25 216

原创 代码随想录算法训练营Day16|647. 回文子串、516.最长回文子序列

递推公式:如果第i个元素和第j个元素相等,则在dp[i][j] = dp[i+1][j-1]+2。如果不相等,dp[i][j] = max(dp[i+1][j],dp[i][j-1])dp[i][j]:从第i个元素到第j个元素的最长回文子序列。初始化:dp[i][i] = 1。遍历顺序:从下到上,从左到右。

2024-09-19 00:01:44 272

原创 代码随想录算法训练营day45|115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离

这题第一次理解还是很难的,看代码随想录看不懂,去看了b站的视频才明白。明白了思想代码就很容易了。583. 两个字符串的删除操作。

2024-09-18 17:00:56 262

原创 代码随想录算法训练营Day44|1143.最长公共子序列、1035. 不相交的线、53. 最大子数组和392.判断子序列

dp[i][j]:ch1从[0,i-1]和ch2从[0,j-1]的最长公共子序列长度。递推公式:如果遍历的当前字符相等, dp[i][j] = dp[i-1][j-1] +1;相当于dp数组的左上角不然吧左边和上边的最大值复制下来。初始化,因为i代表i-1,所以初始化的时候第一行第一列初始化成0。遍历顺序,横向遍历和纵向遍历都可以,但必须是从小到大。

2024-09-17 23:28:22 330

原创 代码随想录算法训练营Day43|300.最长递增子序列、

遍历顺序:外层遍历i,内层遍历j,内层遍历的时候从小到大或者从大到小都可以,因为j一直小于i,i以前的j都更新过了最长长度。dp[i][j]:nums1以i-1位置元素和nums2以j-1位置元素结尾的最长重复子串长度。dp[i]:这里含义是以第i个元素结尾的子序列的最长长度,但是未必会比第i-1个长。递归公式:只有当nums[j]<nums[i]的时候才需要更新。这题简单一些,注意递推的时候只能从前一个元素推过来即可。初始化:都初始化成1,因为最少也是一个元素。这里的i不一定紧贴着j,可以跳跃。

2024-09-12 18:04:38 277

原创 代码随想录算法训练Day42|188.买卖股票的最佳时机4、309.最佳买卖股票时机含冷冻期\714.买卖股票的最佳时机含手续费

虽然是困难,但是做了3之后也还好,不过是把状态替换成需要循环更新的状态而已。

2024-09-11 18:02:38 232

原创 代码随想录算法训练Day41|121、买卖股票的最佳时机1、122、买卖股票的最佳时机2、123、买卖股票的最佳时机3

数组第二个维度表示: 1第一次持有,2第一次不持有。3第二次持有,4第二次不持有。状态转移方程很容易能推到出来。需要注意的是初始化的时候可以当天买入当天卖出。当天持有状态 = (前一天持有,前一天不持有-当天价格)的最大值。遍历顺序:看状态都是由前一个状态推出来的,自然是从前向后。dp[i][0]:第i天的时候不持有股票,手头最大金额。dp[i][1]:第i天的时候不持有股票,手头最大金额。初始化:初始化第一天两个状态即可,后面都会更新。

2024-09-10 19:13:34 215

原创 代码随想录算法训练营Day39|198.打家劫舍 123

做完背包问题,打家劫舍感觉容易好多。主要理解每一家都又两个状态偷和不偷即可。好像回到了最初的爬楼梯。dp[i]: 偷到第i家时候的最大值递推: dp[i] = Math.max(dp[i-2]+nums[i], dp[i-1]);偷第i家和不偷第i家的最大值。初始化:头两家初始化就好了。注意可能数组只有一个元素,导致越界。

2024-09-09 01:28:13 431 1

原创 代码随想录Day39|322. 零钱兑换、279.完全平方数、139.单词拆分

dp[i] : 背包为i容量,这里应该必须是从字符串的[0,i],能用字典单词组合成功为true,否则为false。这里dp[j]是加新单词之前的状态,如果新单词能找到,新单词之前的字符串也能找到,才输出dp[i]=true。递推公式:dp[j] = Math.min(dp[j],dp[j-coins[i]]+1);递推公式:dp[j] = Math.min(dp[j],dp[j-nums[i]]+1);递推公式:dp[i] = set.contains(substring[j,i]) && dp[j]

2024-09-08 17:08:44 479

原创 代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

打印dp数组:手推的时候,我把这题类比成爬楼梯,外层遍历的是腿长,代表我一次能跨几个台阶,内层遍历的就是台阶高度了。然后能跨两步的时候,是把一步一步跨的dp[j],加上当前台阶减去两步的最大方法数(dp[j-2]),加起来。这里计算的是方法数,不是步数,所以不需要再加1.因为在j-2的台阶往j台阶。要么一步一步跨(dp[j] 就是这种情况),要么跨两步(就是dp[j-2])。遍历顺序:外层遍历物品,内层遍历背包,遍历出来是组合数。如果反过来,外层遍历背包,内层遍历物品,遍历出来是排列数。

2024-09-07 21:41:16 803 1

原创 代码随想录Day36|1049.最后一块石头的重量II、494、目标和

和昨天的分割等和子集几乎一样。dp[j]:容量为j的时候,能装下石头重量的最大值。递推公式: dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);第一个stones代表重量,第二个代表价值。初始化:dp[0]初始化为0就好。遍历顺序:先遍历物品,再遍历空间。遍历空间的时候从大到小,避免重复添加。sum += i;

2024-09-06 12:09:53 501

原创 代码随想录算法训练营Day35|01背包的二维dp数组和一维dp数组解法、416. 分割等和子集

第一行从能放下第一个物品的容量开始更新,往后容量都是这个物品的价值,因为物品只有一件,所以不管你包多大,只算当前装进去的物品价值。递推公式:max(dp[i-1][j],dp[i-1][j-weight[i]] + value[i]);如果从前往后遍历的话,会导致一个物品放入多次,而从后往前遍历的话,因为前面的数据都不包含当前物品。dp[i][j]:从0到i物品中取,放入最大容量为j的行李空间中,能装的最大价值是多少。dp[j]:放入最大容量为j的行李空间中,能装的最大价值是多少。

2024-09-04 18:12:24 1024

原创 代码随想录算法训练营Day33| 62.不同路径 、63. 不同路径 II 、343. 整数拆分 、96.不同的二叉搜索树

因为j是从1开始遍历的,比如j=2时,对其拆分只能拆分成1*1,j=1时,dp[i-j]中必然也拆分出更下一层的j=1,这时候的1*1已经计算过了。递推公式:dp[i] = Math.max(dp[i],Math.max(j*(i-j),j*dp[i-j]))。0 : dp[i-1][j] + dp[i][j-1].到障碍表当中查,如果当前有障碍就记录当前位置的路径0条。递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]。dp[i]:数值为i时,当前格子有几种到达路径。

2024-09-02 15:37:32 410

原创 代码随想录Day31|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

状态转移方程: dp[i] = dp[i-1] + dp[i-2];状态转移方程: dp[i] = dp[i-1] + dp[i-2];dp[i]:表示第i个斐波那契数。dp数组: 1 1 2 3 5 8。dp[i]:表示第i个斐波那契数。dp数组: 1 1 2 3 5 8。初始化: 0 ,1;遍历顺序:从前到后;遍历顺序:从前到后;

2024-09-01 18:42:28 261

原创 代码随想录Day31|56. 合并区间、738.单调递增的数字

738.单调递增的数字。

2024-08-31 20:44:50 248

原创 代码随想录算法训练营Day30|452. 用最少数量的箭引爆气球、435. 无重叠区间、763、划分字母区间

452. 用最少数量的箭引爆气球思路:先按照左边界对气球排序;然后遍历,如果当前气球左边界大于上一个气球有边界,说明不重合,弓箭术加一。如果重合,更新当前气球的右边界为当前和上一个有边界的最小值。

2024-08-30 16:48:01 265

原创 代码随想录算法训练营Day29|134、加油站、135、分糖果、860.柠檬水找零、406. 根据身高重建队列

思路:不能一次性顾左右,必须往返两次来增加糖果。注意第二次分糖果时,第i个持有糖果可能本来就比第i+1个多一个以上,所以不能直接取第i+1个持有糖果数+1,否则可能下一位的糖果不增反减。思路:统计每个站点的余量,然后累加,如果到某个站点为负数了,则之前遍历过的都不可能为起始站,因为每个都继承了前面的正数量的汽油,因此起始站重新设为下一个站点。思路:只有收到二十块钱需要贪心思路--优先找零十块。

2024-08-30 01:33:51 213

原创 代码随想录算法训练营Day28|122、买卖股票的最佳时机、55、跳跃游戏、45、跳跃游戏2、1005.K次取反后最大化的数组和

思路:记录当天和前一天的波动是正还是负数,将所有正数收集起来即可。思路:更新每一步的覆盖范围,一旦覆盖范围超过数组长度,就说明下一步一定能到。如果当前范围走到头了还到,就进入下一步的覆盖范围。

2024-08-28 21:57:03 240

原创 代码随想录算法训练营Day27|455、分发饼干

思路:最优子问题是从大到小遍历每个小孩的胃口,用从大到小的饼干来喂,感觉有点类似双指针。

2024-08-28 00:27:15 324

原创 代码随想录算法随想录Day24|78、子集、90、子集II

【代码】代码随想录算法随想录Day24|78、子集、90、子集II。

2024-08-27 16:28:30 184

原创 代码随想录算法训练营Day23|39、组合总和、131、分割回文串93、复原IP地址

思路:类似组合问题。递归回溯函数的时候由于分割过的字符纵向上不能再分割,所以回溯函数中传入的是i + 1.

2024-08-27 00:07:09 157

原创 代码随想录算法训练营Day21|669.修剪二叉搜索树、 108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

当前节点如果小于左边界,则当前结点的左子树一定小于左边界,不再考虑。当前节点的右子树需要再修剪,修剪后的结果进行返回,代替当前节点的位置。思路:因为要转换成平衡二叉树,所以要先找到中间节点,再递归左右子树。思路:递归当前子树的左右子树去修剪。思路:右中左遍历,好像一个指针就够了。遍历到节点为空就返回。108.将有序数组转换为二叉搜索树。538.把二叉搜索树转换为累加树。

2024-08-21 21:50:25 251

原创 代码随想录Day20|235. 二叉搜索树的最近公共祖先 、

5、左右孩子都不空,先让右孩子代替当前节点,再把左孩子接到右孩子的最左边的节点(该节点恰好比被删除节点大一些)。思路:当该节点在两个目标节点中间时,一定是他们最近的公共祖先;3、遍历到的当前节点左孩子为空,右孩子不为空。直接把右孩子代替当前节点。当前节点就是删除节点,判断其左右孩子情况,选择删除方式。2、遍历到的当前节点为叶子节点,直接删除该叶子节点。代码框架:当前节点为空,返回空。1、没有找到要删除的节点,直接返回空。当前节点比目标值小,递归遍历右子树。450.删除二叉搜索树中的节点。

2024-08-21 17:26:32 207

空空如也

空空如也

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

TA关注的人

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