自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [shell] $@ 与 eval

@的用法以及与$*的区别可以参考测试脚本如下一般情况下,我们可能会这样执行脚本输出如下,可见"$*"会把所有的参数包裹在单引号里作为一个完整的参数,这样bash -c才能正常运行。然后我们这样执行一次脚本输出如下,可以看出只有"$@"可以保证参数的一致性。如果这个脚本继续调用其他脚本,并切希望把参数继续传递下去,那么最好使用。

2023-08-28 01:12:14 311

原创 [kubeflow] training-operator源码解析

现在是2023/8/18,kubeflow/common已经被到了training-operator主分支,更有利于源码阅读。我所使用的master分支的版本是。不得不说,第一次看training-operator源码,很头大,文件太多了…哪怕顺着TFJob的Reconcile函数来看,里面的函数调用也是错综复杂。TFJobReconciler,JobController,ControllerInterface这几个结构体怎么你中有我,我中有你,着实把我看蒙了。直到看到这篇文章。

2023-08-22 15:18:25 483

原创 [kubeflow] controller-runtime源码解析

在上一篇文章中,我们从零搭建了一个简单的training-operator项目,最终就差完成controller的Reconcile函数逻辑。这次从TFJob的Reconcile函数为入口,探究training-operator到底是怎么工作的。现在是2023/8/18,几个月前的把kubeflow/common合到了training-operator主分支,更有利于源码阅读。我所使用的master分支的版本是。

2023-08-19 04:45:58 427 1

原创 [kubeflow] 从零搭建training-operator项目

最近一直在看源码,思考怎么从零搭建一个类似的项目呢?网上查了很多资料,点开的chrome标签页密密麻麻,这里把自己的学习过程记录下来,代码在。training-operator里面主要是一些CRD和相关的controller。其中包括了tfjob,pytorchjob,mpijob,mxjob,paddlepaddlejob等等。这里我们主要关注tfjob和pytorchjob。之所以称之为tfjob,是因为契合支持tensorflow的分布式训练。

2023-08-17 22:07:33 668

原创 transformer学习

主要参考tensorflow的官方文档:理解语言的 Transformer 模型还有一篇英文文章讲得也不错:The Illustrated Transformer根据tensorflow的官方文档写的代码,包含了数据集:

2023-08-03 23:33:04 895

原创 [k8s] command和args

k8s中的command和args可以覆盖docker镜像中的entrypoint和cmd。其中,k8s-command可以覆盖docker-entrypoint,k8s-args可以覆盖docker-cmd。在k8s pod yaml中,对于command和args字段缩进与不缩进的区别:不缩进加不加引号都行;中不用缩进(有短横线的地方表示这是数组中的一个元素,短横线不需要缩进。注意上面command中的init.sh必须写绝对路径,而且是可执行文件。关于pod yaml中的数组缩进,

2023-07-20 17:32:46 634

原创 [k8s] 八股文

最近在基于k8s做集群管理系统,心里有一些问题,在这里记录一下。

2023-04-23 16:09:59 1202 1

原创 [C/C++] 静态类型与动态类型

反过来基类的指针或引用,转为派生类时,可能会出问题,因为基类不包含派生类。static_cast在编译期强制转换,不做安全检查(因为没法做安全检查,编译期间不知道动态类型),非常危险。dynamic_cast可以根据动态类型做安全检查,如果动态类型不是指向派生类指针,就不做转换。基类的指针或引用,转为派生类时,需要在运行期间做安全检查,因为编译期间不知道指针或引用是不是指向派生类,而我们想访问派生类自己特有的类成员。基类的指针或引用,调用虚函数时,会发生动态绑定,根据指针或引用的动态类型来执行对应的函数。

2023-04-07 20:00:02 154

原创 [C/C++] 手写一个简单的共享指针

使用 valgrind 工具查看是否有内存泄露。行为像指针的类(共享指针)

2023-04-05 11:44:57 462

原创 [leetcode 198] 打家劫舍

ignore[i] 可能会比 choose[i] 大,因为 choose[i] 必须取第 i 件物品,因此无法取第 i-1 件物品,但第 i-1 件物品可能价值很大。我们使用 choose[i] 表示取(必须取)第 i 件所能得到的最大值,ignore[i] 表示放弃(必须放弃)第 i 件所能得到的最大值。其实可以把上面提到的两种状态合并,即我们只用一个数组dp,dp[i] 表示到第 i 件物品所能取得的最大值,第 i 件物品我们可取可放弃。简单来说就是相邻物品不能同时取。

2023-03-28 09:50:32 191

原创 [leetcode 309] 最佳买卖股票时机含冷冻期

buy[0] 和 sell[0] 的初始化很简单,buy[1] 会遇到sell[-1],当作零处理,即比较前两值股票的最小值,sell[1] 则是按照转移方程处理。保证 n=2 的时候符合答案。,因此必须要使用两个数组 buy 和 sell 分别表示。这两个数组是相互依赖的。第 i 只股票获得的最大利润,可以选择买,也可以不买。sell[i] 表示。第 i 只股票获得的最大利润,可以选择卖,也可以不买。买和卖是不同的两种状态,相互转换而来,题目要求。(卖是从买的状态转换来的)(前面的卖了才能继续买)

2023-03-28 00:37:40 304

原创 [leetcode] 动态规划

先啃懂,即物品有限。,即物品无限。注意,要求序列。要注意这两种情况的区别!前者先循环容量再循环物品,后者先循环物品再循环容量。P1832 A+B Problem(再升级)[| 题解 ]零钱兑换( LeetCode 322 )零钱兑换 II( LeetCode 518 )组合总和 Ⅳ(leetcode 377)完全平方数( LeetCode 279 )单词拆分(leetcode 139)。物品被划分为若干组,每组中的物品互相冲突,最多选一件。,第 i 种物品最多有 n[i] 件可用。

2023-03-26 23:34:23 285

原创 实验室机器管理

k8s 机器重启后,使用 df -h 命令查看有无 /data 盘,没有则需要手动挂载,前提是确保该机器可以 ping 通 169.252.198.3。

2023-03-12 19:32:49 68

原创 [leetcode] 质因数分解

第一次参加周赛,遇到了质因数分解…

2023-03-06 11:42:32 488

原创 [个人笔记] 镜像使用最新 gym 环境

缺点是新版本 atari 返回值有 5 个,没法使用 baselines 的向量环境。很重要的一点,卸载旧的 ale-py。

2023-02-28 20:54:38 151

原创 [C++] 二分查找 lower_bound() 与 upper_bound()

当有序数组中有多个重复元素时,二分查找就出现了 lower_bound 和 upper_bound,这两个函数都可以直接调用。自己实现 lower_bound 和 upper_bound。二分查找,非常适合在有序数组中进行查找,时间复杂度为。

2023-02-07 21:37:39 242

原创 [C++] 字符串 string

string 转 int,long,long long。string 删除所有空格。int 转 string。

2023-02-07 12:04:40 151

原创 [C++] 数据结构 priority_queue

如果存储的是 pair 类型,默认会使用 pair 中的第一个元素进行比较,第一个元素相等你则会比较第二个。优先队列(priority_queue)其实就是堆,默认是大顶堆,即 top() 会返回堆顶元素(最大)。如果想要自定义比较函数,比较麻烦…

2023-02-06 11:41:52 389

原创 [leetcode 215] 数组中的第K个最大元素

快排每次 partition 过程一定会确定 pivot 的位置,我们根据 k 的值对其中一侧继续 partition 直到 pivot = k。内存无法存放,那就不能用排序(涉及到内存和外存的交换,速度会很慢)。最差情况是数组已有序,每次 pivot 都在数组末尾,而 k 在另一侧,时间复杂度为。时间内维护好,通过 pop 可以删除最大值或者最小值,通过 top 可以查看其最值。优先队列内的元素是有序的,push 新元素后,可以在。理想情况,假设每次 pivot 都在中间位置,那么时间复杂度为。

2023-02-04 09:22:08 527

原创 [leetcode 450] 删除二叉搜索树中的节点

题目: https://leetcode.cn/problems/delete-node-in-a-bst/description/先找到该结点,然后删除,分为两种情况递归写法迭代

2023-01-23 11:25:24 94

原创 [leetcode 516] 最长回文子序列

确定了 dp[i][j] 的定义后,在二维表格中可以表示下图,i 递减,j 递加,只在上半区进行遍历(在下半区也是可以的,只不过遍历顺序要调整,dp[i][j]的意义刚好反过来)。首先定义 dp[i][j] 的意义,dp[i][j] 表示以 [i, j] 内的字符的最长回文序列长度,然后 i 和 j 分别减小和增加,从而向两边扩散。注意,在对角线上,单个字母一定是长度为1的回文序列。

2023-01-19 23:08:03 95

原创 [leetcode 72] 编辑距离

时,dp[i-1][j-1] 已经表示 hor 变成 ro 的最少操作数目,因此 dp[i][j] 无需增加。空字符串变为空字符串无需操作,horse 变为空字符串需要删除5次,空字符串变为 ros 需要插入3次。这题应该是字符串dp的终极形态了吧🤣,不看答案完全不会…看了答案发现原来还是dp…熟记 dp[i][j] 的含义,上面的就很好理解了。,我们可以做3种操作:插入,删除,替换。使用 dp[i][j]下面就是初始化的问题。

2023-01-19 15:51:23 1423

原创 [leetcode 1723] 完成所有工作的最短时间

感觉和 [leetcode 198] 划分为k个相等的子集 有点相似,这题更像是划分为k个。

2023-01-19 13:37:07 1577

原创 [leetcode 98] 验证二叉搜索树

一种方法是中序遍历,问题是如果全部遍历,存储在数组里,那样太慢了。我想发现第一个不符合的节点后立马返回,这样就需要一个值存储 last 节点的值,本题的树节点范围是。,如果 last 一开始为 INT_MIN 会有问题,所以使用了 long,注意,last 我使用了地址传参,这样可以再递归中改变 last 的值。第一次做一维很简单,只考虑判断每次递归时 root 与 左右子树的比较,这样显然不对。

2023-01-09 17:45:11 82

原创 [leetcode 101] 对称二叉树

看到题目,一开始感觉没法用递归,因为传统二叉树递归的参数只有一个root,显然没法解决对称的问题。于是想到中序遍历(左中右),因为是对称的,所以中序遍历的结果一定是回文序列,通过这个来判断是否对称。然而,虽然对称二叉树一定是回文序列,但回文序列不一定是对称二叉树。递归,还是得递归,把参数由 root 改为 left 和 right 不就行了嘛!两个参数分别表示两棵树,一个往左,一个往右。能不能使用迭代解决呢?使用两个队列,left 和 right 各一个。

2023-01-09 16:06:36 85

原创 [leetcode 113] 路径总和 II

下面的代码不使用地址传参,而是复制传参,这样就不需要 pop_back 操作了,同样可以ac,但是。这道题目是二叉树的经典回溯题目。思考:如果仅要求找到任意一条符合条件的路径,这样如何。

2023-01-08 13:57:23 61

原创 [C++] vector 用法

leetcode 上刷题的时候,vector 是最常用的容器,记录一下用法。vector 完全可以当作栈来使用,push_back 与 pop_back。因此,remove 需要搭配 erase 才能完全删除元素。

2023-01-06 14:57:20 443

原创 [leetcode 946] 验证栈序列

非常经典的栈题目,考研中经常出现。思想就是模拟栈,下面是我第二次写这道题时的代码。

2023-01-03 19:08:18 62

原创 [leetcode 224] 基本计算器

非常经典的题目,一定一定要熟记!

2023-01-03 14:59:58 202

原创 [leetcode] unordered_map 与 unordered_set

leetcode刷题的时候,常用的容器便是 unordered_set 与 unordered_set。这里记一下用法。

2023-01-02 21:55:00 117

原创 c++中移位运算符优先级

然后我意识到移位运算符得优先级低于加法,也就是说应该携程下面形式。的值可能会超过 int 最大范围,因此得更改写法。然后发现程序死循环了,我写成下面的形式就没问题。今天写二分代码的时候,我计算mid使用移位。

2023-01-02 17:06:11 112

原创 [leetcode 425] 用最少数量的箭引爆气球

这里我是以第一个元素排序(sort默认排序方式)。我们维护一个当前重叠区间的右侧最小值min_end,当这个下一个区间的左侧值大于该值时,需要一支箭把重叠的cnt个气球引爆,然后cnt变为1。注意,cnt初始值为1,min_end初始值为points[0][1]。非常奇怪的一个细节是,如果我在sort中使用自己的comp函数,会超时😢,不知道为什么。官方题解中,通过第二个值及进行排序,更容易理解!这样做就不需要min操作了。啊啊啊终于开始贪心了,最害怕这种题目了😨!这样就省的复制了,更快!

2022-12-31 17:35:44 54

原创 [leetcode 11] 盛最多水的容器

经典不看答案不会写系列。

2022-12-31 14:16:18 69

原创 [面试题 16.16] 部分排序

然后我就傻傻的按照这个写,嵌套for循环,第一个for循环确定m,第二个for循环找m之后的最大值,然后超时了哈哈🤣。啊呀,我也看出来规律了。

2022-12-31 11:04:52 78

原创 [leetcode 977] 有序数组的平方

仔细观察,发现:小于零的部分平方后是降序,大于零的部分平方后是升序,找到分界点然后归并排序!值得注意的是,如果数组中全部是正数或者全部是负数,那么分界点应该如何确定?这道题目,直接排序就可以哈哈,不过时间复杂度会超过。

2022-12-24 15:47:05 70

原创 [leetcode 23] 合并K个升序链表

但是更好的方法是归并,让链表先两两合并,最后合并两个链表。这道题让我意思到归并排序中的边界条件的重要性!只有当输入的数组为空时,start 才会小于 end,否则 start >= end,在其他的一些题目中,我没有意识到这个问题的重要性,但此题中必须要考虑。我建议在调用递归函数前处理数组是否为空的情况。最容易想到的方法是:先创建一个哨兵结点,使用 for 循环一个一个合并数组中的所有链表。

2022-12-23 22:22:12 92

原创 [leetcode] 总结篇

哨兵结点,快慢指针:fast 一次走两步,slow 一次走一步;fast 先走 k 步,slow 才开始走,速度相同。

2022-12-23 21:53:35 303

原创 [leetcode 1] 两数之和

收到上一题的影响,我第一反应是双指针:先把数组排序,首位两个指针分别记为 low 和 high,判断 nums[low]+nums[high] 和 target 的大小,根据情况移动 low 或者 high。😢,其实也行,就是排序的时候不是原数组,二是下标。官方的解答,使用哈希表,非常精妙!但是万万没想到,题目要求输出的是。

2022-12-23 20:36:10 68

原创 [leetcode 315] 计算右侧小于当前元素的个数

暴力 for 循环肯定会超时。,但是这样依旧超时😨。

2022-12-21 21:38:40 135

原创 [剑指 offer 51] 数组中的逆序对

注意看,当 12 大于 9 时,那么 12 之后的所有数目肯定也大于 9,即有 4 个逆序对,100 大于 26 时,有一个逆序对…第一种标准解法是归并排序。题目看起来很简单,但是 for 循环会超时。为什么归并排序可以起到作用呢?

2022-12-21 16:35:19 78

空空如也

空空如也

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

TA关注的人

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