Lect3-The Principle of Inclusion and Exclusion

Principle of Inclusion and Exclusion 对于任意有限集合 $ A_1, A_2, \dots, A_n $,容斥原理如下: $$ \left| \bigcup_{i=1}^{n} A_i \right| = \sum_{i=1}^{n} \left| A_i \right| - \sum_{1\leq i< j\leq n} \left| A_i \cap A_j \right| + \dots + (-1)^{n} \left| \bigcap_{i=1}^{n} A_i \right| $$ 可更紧凑地表示为 $$ \left| \bigcup_{i=1}^{n} A_i \right| = \sum_{k=1}^{n} (-1)^{k-1} \sum_{S \subseteq [n], |S|=k} \left| \bigcap_{i \in S} A_i \right| $$ 或 $$ \left| \bigcup_{i=1}^{n} A_i \right| = \sum_{\emptyset \neq S \subseteq [n]} (-1)^{|S|-1} \left| \bigcap_{i \in S} A_i \right| $$ ...

September 28, 2025 · 6 min · diefish

CS0901 HW2

Problem 1 用生成函数求解递推式 $$ a_{n} = 4a_{n-1} - 5a_{n-2} + 2a_{n-3} $$ 初始值为 $ a_{0}=0,a_{1}=3,a_{2}=7 $。 解: 设数列 $ \{ a_{n} \} $ 的生成函数为 $ F(x) $,那么根据递推式和初值 $ a_{0}=0,a_{1}=3,a_{2}=7 $ 得到 $$ F(x) = 4xF(x) - 5x^{2}F(x) + 2x^{3}F(x) + 3x - 5x^{2} $$ 得到 $$ F(x) = \dfrac{5x^{2}-3x}{2x^{3}-5x^{2}+4x-1} = \dfrac{3x-5x^{2}}{(1-x)^{2}(1-2x)} $$ 我们希望分解成 $$ \dfrac{A}{1-x} + \dfrac{B}{(1-x)^{2}} + \dfrac{C}{1-2x} $$ 待定系数可以解得 $$ F(x) = \dfrac{-3}{1-x} + \dfrac{2}{(1-x)^{2}} + \dfrac{1}{1-2x} $$ 展开得到 $$ F(x) = \sum_{n=0}^{\infty} (-3+2(n+1)+2^{n})x^{n} $$ 因此 $$ a_{n} = -3+2(n+1)+2^{n} = 2^{n} + 2n - 1 $$ ...

September 24, 2025 · 4 min · diefish

MATH1205H HW1

Exercise 1 Let $ f:\mathbb{R}\to\mathbb{R} $ be a function. Prove that the following are equivalent: (i) There is a constant $ a\in\mathbb{R} $ such that for every$ x\in\mathbb{R} $ we have$ f(x)=ax $. (ii) For all $ x_1,x_2,c,x\in\mathbb{R} $ we have $ f(x_1+x_2)=f(x_1)+f(x_2) $ and $ f(cx)=c\,f(x) $. (i ⇒ ii) Assume there exists $ a\in\mathbb{R} $ such that $ f(x)=a x $ for all $ x\in\mathbb{R} $ . Then for any $ x_1,x_2,c,x\in\mathbb{R} $ , ...

September 24, 2025 · 4 min · diefish

Lect2-Generating Functions

考虑上一节引入的二项式定理 $$ (1+x)^{n} = \sum_{k=0}^{n} \binom{ n }{ k } x^{k} $$ 这可以理解成我们把二项系数转换成了一个函数,这使得我们能更有效地操作和分析序列,这个工具被成为生成函数。 Ordinary Generating Functions 给定序列 $ \{ a_{n} \}_{n\geq 0} $,由 $ \{ a_{n} \} $ 定义的普通生成函数 (OGF) 为: $$ G(x) = \sum_{n\geq 0} a_{n}x^{n} $$ 虽然看起来 OGF 并没有被很好的定义,对于和某些数列,这个形式不会收敛,但是实际上生成函数并不能被看成一个真正的函数,它是一个形式幂级数,并且不被要求收敛。 以下是一些生成函数的基础例子: $$ G(x) = 1+x+x^{2}+x^{3} +\dots = \dfrac{1}{1-x} $$ $$ G(x) = 1+ax+a^{2}x^{2} + a^{3}x^{3} + \dots = \dfrac{1}{1-ax} $$ 给定一个序列,写出他的生成函数是很容易的。尽管找到他的闭合形式不容易,但是我们一般不需要这样做。相反,我们需要考虑给定一个闭合形式,需要如何知道其对应的序列。 我们约定 $ [x^{n}]G(x) $ 表示生成函数中 $ x^{n} $ 的系数。 ...

September 23, 2025 · 5 min · diefish

Lect3-Conditional Probability

Introduction 条件概率指一个事件在另一个事件发生的条件下发生的概率,用记号 $ \mathbb{P}(A|B) $ 表示,仅在 $ \mathbb{P}(B)>0 $ 时有定义: $$ \mathbb{P}(A|B) = \dfrac{\mathbb{P}(A \cap B)}{P(B)} $$ 可以写成 $$ \mathbb{P}(A \cap B) = \mathbb{P}(B)\cdot \mathbb{P}(A|B) $$ 对于 $ n $ 个事件,连续使用上式,即可得到 $$ \mathbb{P}\left( \bigcap_{i=1}^{n}A_{i} \right) = \prod_{k=1}^{n} \mathbb{P}\left( A_{k}\bigg|\bigcap_{i=1}^{k-1}A_{i} \right) $$ 这个式子被称为 链式法则。 Independence 对于事件 $ A,B $,如果 $ \mathbb{P}(A\cap B)=\mathbb{P}(A)\mathbb{P}(B) $,或者等价地 $ \mathbb{P}(A|B)=\mathbb{P}(A) $,那么我们称 $ A $ 和 $ B $ 是独立的。这表明 $ A $ 或 $ B $ 自己是否发生对对方是否发生没有影响。 ...

September 22, 2025 · 3 min · diefish

Lect2-Probability Space

Motivation 例题:在圆上“随机”选一段弧,问弧长大于圆周的 $ \frac{1}{3} $ 的概率?(Bertrand paradox) 至少三种自然的“均匀化”模型会给出不同答案: 对弧长参数均匀(在 $ [0, 2\pi) $ 上均匀取长度,再随机起点)。 对端点在圆上独立均匀(等价于随机两点确定弧,需指定取较短或较长弧)。 对中心角或几何构造的中间量均匀(如均匀选角度后裁剪)。 核心问题:如何定义“随机”?不同“随机化”方案导致不同答案。 讨论概率问题必须先明确概率空间(样本空间、事件族与概率测度),否则“概率”无从谈起。 Probability Space 一个概率空间由三元组 $ (\Omega, \mathcal{F}, \mathbb{P}) $ 构成: $ \Omega $:样本空间(一次随机试验所有可能结果)。 $ \mathcal{F} \subseteq 2^{\Omega} $:事件族(允许讨论与运算的集合)。 $ \mathbb{P} : \mathcal{F} \to [0,1] $:概率测度(赋予事件概率)。 记号说明: $ \Omega $:样本空间。 $ 2^{\Omega} $:$ \Omega $ 的幂集(所有子集的集合)。 为什么 $ \mathbb{P} $ 要定义在 $ \mathcal{F} $ 上而非直接在 $ \Omega $ 上? 离散可数时,取 $ \mathcal{F} = 2^{\Omega} $ 可行,且对单点赋值即可确定所有事件的概率。 连续时不同:单点的概率通常为 $ 0 $,但不可数并可有正概率;且 $ 2^{\Omega} $ 中存在不可测集合,无法一致赋值(见下文 Vitali set 与 Axiom of Choice)。因此需选择一个足够大又可控的 $ \sigma $- 代数作为事件族。 Sigma-Algebra 要求 $ \mathcal{F} $ 构成一个 $ \sigma $- 代数(域): ...

September 17, 2025 · 4 min · diefish

CS0901 HW1

Problem 1 (1) 求 $$ \sum_{k=0}^{n} \binom{ 2n }{ 2k } $$ 解 $$ \begin{align*} & \sum_{k=0}^{n} (-1)^{k}\binom{ n }{ k } = 0 \\ \implies & \sum_{k=0}^{2n} (-1)^{k}\binom{ 2n }{ k } =0 \\ \implies & \sum_{k=0}^{2n} \binom{ 2n }{ 2k } = \sum_{k=1}^{2n} \binom{ 2n }{ 2k - 1 } \end{align*} $$ 同时由于 $$ \sum_{k=0}^{2n} \binom{ 2n }{ 2k } + \sum_{k=1}^{2n} \binom{ 2n }{ 2k - 1 } = \sum_{k=0}^{2n} \binom{ 2n }{ k } = 2^{2n} $$ 得到 $$ \sum_{k=0}^{2n} \binom{ 2n }{ 2k } = 2^{2n-1} $$ ...

September 17, 2025 · 9 min · diefish

Lect1-Counting

Product and Sum Principles 加法原理(分类计数) 若一个任务可分解为若干个互斥的子类,第 $ i $ 类有 $ a_i $ 种方案,则总数为 $ \sum_i a_i $。 解释:互斥保证不重不漏,求和即“或”的计数。 乘法原理(分步计数) 若一个任务分为若干个有序步骤,步骤 $ i $ 有 $ b_i $ 种选择且相互独立,则总数为 $ \prod_i b_i $。 解释:有序步骤逐个做决定,“且”的计数对应乘法。 Constructing Maps 有些组合证明可以依赖于构造映射: 单射:不同原像映到不同像,用于证明下界或“可嵌入性”。 满射:像覆盖全体,用于证明上界可达或构造覆盖。 双射:建立集合 $ A $ 与 $ B $ 的一一对应,从而数 $ |A|=|B| $;这是“数某一个量 ⇒ 构造双射”的核心思想。 Twelvefoldway 将 $ n $ 个球放入 $ m $ 个盒子,球与盒子可“可区分/不可区分”,以及盒子容量约束“任意/至多 1/至少 1”。 $ n $ $ m $ 任意 $ \leq 1 $ $ \geq 1 $ 不同 不同 $ m^{n} $ $ m^{\underline{n}} $ $ m!\left\{ {n \atop m} \right\} $ 同 不同 $ \binom{ n+m-1 }{ m-1 } $ $ \binom{ m }{ n } $ $ \binom{ n-1 }{ m-1 } $ 不同 同 $ \sum_{k=0}^{\min(n,m)} \left\{ {n \atop k} \right\} $ $ [n \leq m] $ $ \left\{ {n \atop m} \right\} $ 同 同 $ p_{\leq m}(n) $ $ [n \leq m] $ $ p(n,m) $ “把 $ n $ 个不同球分成 $ k $ 个非空无序盒”对应第二类斯特林数 $ \left\{ {n \atop k} \right\} $。 ...

September 16, 2025 · 4 min · diefish

Lect1-Introduction

课程讲义 在这门课里,我们会专注于所谓的 科尔莫哥洛夫(Kolmogorov)的公理体系,它使得我们能够使用数学分析的工具来研究概率。 St. Petersburg Paradox 圣彼得堡悖论。假设一个基于抛硬币赌博的游戏,庄家会一直扔硬币直到结果是正面,如果扔了 $ k $ 次,那么就会给玩家 $ 2^{k} $ 元的奖金。现在的问题是你愿意花多少钱来购买一次玩这个游戏的机会。 一个很自然的想法是计算游戏的期望,那么我们很容易发现期望收益是 $$ \sum_{k \geq 1} 2^{k}\cdot 2^{-k} = 1 + 1 + \dots = +\infty $$ 这说明平均每一轮我们的收益是无穷大,然而在现实生活中你真的愿意花大价钱去玩这个游戏吗?或者可以写一个简单的程序模拟一下就会发现,在比如门票定为 $ 100 $ 元,玩几百局,还是会轻易地输掉几万块钱。我们生活中一个常见的直觉是如果重复一个随机过程足够多次,平均收益就会逐渐趋近于期望收益,这在概率论中叫做大数定律(Law of large numbers),但是在现实生活中我们并没有能力重复足够多游戏轮数去达到这个期望值。那么现在的问题就是如果定价用 $ a\cdot n $ 元来购买 $ n $ 次游戏机会,$ a $ 定为多少是合理的? 用这门课中后续会学习到的数学工具,我们可以得到答案为 $ \log n $ (这个结果也符合我们实际的直觉)。 随机游走 对二维随机游走问题的一个简化的建模是在 $ \mathbb{Z}^{2} $ 的网格上随机游走,从原点 $ (0,0) $ 出发,每次以 $ \dfrac{1}{4} $ 的概率往上下左右四个方向移动。我们现在询问,这个随机游走的路径是否会无数次回到原点?用 $ T $ 来表示第一次回到原点的时间,那么可以证明无数次回到原点等价于 $ \mathbb{P}[T < \infty] = 1 $ ,也就是 $ T $ 以 $ 1 $ 的概率是有限的,当然目前只能从直觉上去理解,这个写法需要在后续的课程中去严格定义。 ...

September 15, 2025 · 2 min · diefish

23. 文件系统的实现

File Allocation Table 要设计并实现一个文件系统,我们首先需要关注并解决存储媒介带来的两大核心挑战: 读写放大 (Read/Write Amplification):现代存储设备(无论是机械硬盘还是固态硬盘)的物理特性决定了,它们最高效的读写方式是操作连续的大块数据区域,我们称之为一个块 (Block)。如果需要修改一个块中哪怕一个字节的数据,也必须将整个块读入内存、修改、再完整写回。这种“操作少量数据却导致整块数据被读写”的现象就是读写放大,它会严重影响性能。 局部性 (Locality):程序的内存访问行为通常具有局部性原理 (Principle of Locality),即在一段时间内,访问的地址会集中在某个区域。文件系统可以通过合理的数据排布,让物理上相邻的数据块在逻辑上也相关联(例如,属于同一个文件),从而在读取一块数据时,可以利用预读机制将后续可能被访问的数据也加载到内存缓存中,提高效率。 在软盘上实现文件系统 我们的需求是为一个存储容量很小的设备(如软盘)设计一个文件系统。在这种场景下,使用复杂的树形数据结构(如 B+ 树)会因为元数据本身占用过多空间而显得浪费。因此,一个简单的链式结构是更合适的选择。 目录的实现 在简单的文件系统中,目录本身可以被实现为一个普通的文件。这个文件的特殊之处在于,它的内容遵循一种固定格式,即一个目录项数组。 1 2 3 4 5 6 // 一个简单的目录项 (dentry) 结构 struct dentry { char filename[256]; // 文件名 unsigned int start_block; // 文件数据起始块的编号 unsigned int size; // 文件大小 (以字节为单位) }; 当我们需要打开一个目录时,文件系统只需读取这个文件的内容,并将其解析为一个 struct dentry 数组即可。 文件数据的存储 用链表来组织一个文件的所有数据块,主要有两种实现思路。 方法一:在每个数据块后放置指针 这种方法非常直观。每个数据块的末尾都留出一小块空间,用于存放下一个数据块的地址或编号。 优点:实现简单,逻辑清晰。 缺点: 极差的随机访问性能:要访问文件的第 N 个数据块,必须从第一个块开始,依次读入前 N-1 个块来找到第 N 块的指针。这需要 N-1 次磁盘 I/O,对于大文件而言是毁灭性的。 空间浪费:每个数据块都不能被 100% 用来存储文件内容,必须牺牲一部分空间给指针。 方法二:将指针集中存放在文件系统的某个区域 为了解决上述问题,我们可以将所有数据块的“链表指针”抽离出来,集中存放在一个被称为文件分配表 (File Allocation Table, FAT) 的核心数据结构中。 FAT 本质上是一个大数组。数组的下标与磁盘上的数据块编号一一对应。数组中存储的值则是该文件链表中的下一个数据块的编号。 ...

August 31, 2025 · 2 min · diefish