程序设计实习 note

对于矩阵 \(A,B,C\) 判断是否有 \(AB=C\) :随机一个行向量 \(x\) 然后看 \(xAB\) 是否 等于 \(xC\) 。正确率约为 \(1\)


通过少量查询得到近似的中位数:如果要求排名误差在 \(2an\) 以内,只需要 \(O(\frac{1}{a^2})\) 次查询就可以做到很高的概率。

1-median

给定 k 维空间的若干点 \(A_1,A_2,\dots,A_n\) ,要求预处理之后高效进行查询:查询每次给定 \(B\) ,求 \(\sum dis(B,A_i)\) 。可以求近似解。

如果存在一个点 \(P\) 和一个常数 \(c\) 满足 \(\forall i,dis(A_i,P)\in [c,2c]\) ,那考虑以下算法:

直接在 \(n\) 个点里随 \(m\) 个取出来记为 \(C_1,C_2,\dots,C_m\),估计答案为 \(\frac{n}{m}\sum dis(B,C_i)\) 即可。道理在哪儿呢,考虑令 \(X_i=dis(A_i,B)\) ,根据三角形不等式有 \(X\) 极差 \(\le 4c\)

Hoeffding inequality:

设独立随机变量 \(X_1,X_2,\dots,X_m\in [s,t]\)\(X:=\sum X_i\) ,则 \(Pr[X-E[X]\geq z]\le 2exp(\frac{-2z^2}{m(t-s)^2})\)

看一下式子就可以发现:常数个 \(m\) 就能使误差极大概率控制在 \(\epsilon nc\) 以内。

具体的,需要 \(1-\delta\) 的正确率时我们取 \(m=O(\frac{1}{\epsilon^2}\log(\frac{1}{\delta}))\)

看来误差的分析是跟每次查询的点关系不大的,无论查询如何,我们都能将误差控制在 \(\epsilon nc\) ,也即 \(\epsilon \sum dis(A_i,P)\) 内。

考虑一般的情况,考虑按 \(dis(A_i,P)\) 倍增分块,将这些点分成 \(log_2V\) 层即可,我们仍然把误差控制在了 \(\epsilon \sum dis(A_i,P)\) 内。

看来,只需要选取合理的中心点 \(P\) 即可。

我们并不需要让 \(\sum dis(A_i,P)\) 严格最小:在最优值的常数倍以内都是能接受的。

直接在给出的点里随几个点,取最优的即可。

理由考虑计算这样随,\(\sum dis(A_i,P)\) 的期望,是不超过 \(2\) 倍的最优值的。


Count-min Sketch

先看这样一个问题:输入 \(N\)\([n]\) 上的整数,结束后给定 \(i\) ,(近似)回答 \(i\) 出现次数。

Count-min Sketch 支持用 \(\frac{poly\log n}{\epsilon}\) 的空间复杂度,查询、插入时间复杂度亦为 \(\frac{poly\log n}{\epsilon}\) ,做到:估计值 \(C'\) 和正式值 \(C\) 之间满足 \(C\le C'\le C+\epsilon N\)

考虑哈希,找一个哈希函数 \(h:[n]\rightarrow [m]\) ,我们开个大小为 \(m\) 的桶 \(t\) ,算 \(i\) 出现次数就看 \(t_{h(i)}\) 即可。如果哈希函数足够均匀随机那容易分析出来 \(\mathbb{E}[C']\le C+\frac{n}{m}\)

Markov inequality:

若随机变量 \(X\geq 0\) ,则 \(Pr(X\geq a)\le \frac{\mathbb{E}[x]}{a}\)

\(X=C'-C\) 用这个定理,就可以得到 \(Pr(X\geq n\epsilon)\le \frac{1}{m\epsilon}\)

看来取 \(m=\frac{2 }{\epsilon}\) 就有 \(\frac{1}{2}\) 的成功率了。

\(O(\log n)\) 个哈希函数,把求得的 \(C'\)\(\min\) ,成功率就非常高了。


求绝对众数的一个算法:对每个二进制位求 \(0\)\(1\) 谁出现的更多。


LSH

度量两个集合的相似度: \(J(A,B)=\frac{|A\cap B|}{|A\cup B|}\)

给定 \(n\) 个大小为 \(m\) 的集合 \(S_i\)\(q\) 次查询,给定 \(x,y\) 计算 \(J(S_x,S_y)\)

一个 \(O(T(nm+q))\) 的近似算法(Minhash

离线下来,做 \(T\) 轮,对每个元素随个哈希值,记一个集合 \(S_i\) 的权值是所有元素的哈希值的 min ,记为 \(V_i\)。每个询问记录一个计数器 \(cnt\) ,若 \(V_x=V_y\) 则将 \(cnt\) 加上 \(1\)

定理:\(Pr(V_x=V_y)=J(S_x,S_y)\) 。挺显然的。

\(\frac{cnt}{T}\) 当做答案即可。

chernoff bound:\(n\) 个在 \([0,1]\) 间随机且期望为 \(\mu\) 的随机变量 \(x_1,x_2,\dots,x_n\) ,有:

$Pr\left(|\frac{x_1+x_2+\dots+x_n}{n}-\mu|\geq \sqrt{\frac{\log(1/\delta)}{nt}}{\mu}\right)\le \delta $ 。其中 \(t\)\(\le \mu\) 的常量。

看来 \(T\)\(\frac{\log(1/\delta)}{\epsilon^2J(S_x,S_y)}\) 就能以 $\delta $ 的失败概率将相对误差控制在 \(\epsilon\) 内。然而 \(J(S_x,S_y)\) 很小时这个算法就很无力了,所以作业中绝对误差在一个范围内也是能接受的。


度量两个向量的相似度:\(\sigma(x,y)=1-\frac{\theta(x,y)}{\pi}\)

Simhash:在 \(d\) 维单位球面上随一个点,取出原点到它的向量 \(w\) ,然后设 \(h(x)=\text{sgn}(<x,w>)\) ,其中 \(\text{sgn}(x)=[x>0]\)

\(Pr(h(x)= h(y))=\sigma(x,y)\)


上面两个方法都被称为 Locality Sensitive Hashing(LSH)(狭义)就是对于定义的相似度 \(\text{sim}(x,y)\) ,有哈希函数 \(h\) 使得 \(Pr[h(x)=h(y)]=\text{sim}(x,y)\) 。这个东西在工业界是有用的,用于进行重复检测。


Hamming 空间(\(H^d\))的 c-近似 最近邻的专门算法

预处理 \(O(dn+n^{1+1/c})\) ,单次查询 \(O(n^{1/c})\)

算法流程:取 \(T=O(n^{\frac{1}{c}})\) ,做 \(T\) 轮以下事情:

\(d\) 个二进制位做一个随机的置换,每次查询找到:二进制下与查询点 lcp 最大的给定点,用这个给定点更新答案即可。

误差分析:对查询 \(q\)\(q^{*}\) 是最近点,\(r=dist_H(q,q*)\)

\(p_1=1-\frac{r}{d},p_2=1-\frac{cr}{d},k=\Theta(log_{p2}(\frac{1}{n}))\)

我们分析两件事情:

(1) 与 \(q\) 距离 \(>cr\) 的点很小概率能在 shuffle 后前 \(k\) 位相等

因为这个概率不超过 \(p_2^k=\frac{1}{poly(n)}\)

(2) \(q^{*}\) 很大概率能在 shuffle 后前 \(k\) 位相等

概率约为 \(p_1^k\) ,约为 \(\frac{1}{n^{1/c}}\) ,这里分析比较麻烦。

所以 \(T\)\(O(\frac{1}{n^{1/c}})\) 就能让成功率做到 \(\Omega(1)\) 了。


广义 LSH:\(Pr[h(x)=h(y)]\)\(sim(x,y)\) 正相关。

处理 c-最近邻:

哈希函数 \(h\) 使得有参数 \(r,p_1,p_2\) ,满足

\(||x-y||\le r\rightarrow Pr[h(x)=h(y)]\geq p_1\)

$ ||x-y||>cr\rightarrow Pr[h(x)=h(y)]\le p_2$

\(\rho=\frac{\log(p_1)}{\log(p_2)}\) ,那么存在 \(n^{1+\rho}\) 预处理, \(n^{\rho}\) 做查询的算法。

\(k=O(\log n/\log(1/p_2)),T=n^{\rho}\)

\(T\) 轮,每轮造 \(k\) 个独立的 LSH 然后拼起来。

查询直接找拼起来的哈希值与查询点相同的点,更新答案即可。


画格子

近似直径

首先容易 \(O(nd)\) 找到一个至少为最终直径 \(\frac{1}{2}\) 的答案,设之为 \(D'\) ,真实答案为 \(D\)

画格子,以 \(\frac{\epsilon D'}{\sqrt{d}}\) 为块长,把两个点的距离近似为它们所在格子的中心的距离,可以计算得误差不超过 \(\epsilon D'\) ,自然不超过 \(\epsilon D\)。这里格子个数 \(\le (\frac{D\sqrt{d}}{\epsilon D'})^{d}\le (\frac{2\sqrt{d}}{\epsilon})^{d}\) ,所以总复杂度 \(O(nd \log n) + (d/ϵ)^{O(d)} \)

最小包围球和 \(\epsilon\) - Coreset

给定一个 \(R^d\) 上的点集 \(V\),要找一个点 \(c\) 使得 \(f(V,c)=\max\limits_{v\in V} |c-v|\) 最小。设 \(f(V)\) 是这个最优值。

Welzl’s Algorithm(【模板】最小圆覆盖)

期望 \(O((d+1)(d+1)!n)\) 的时间复杂度。

相当于选 \(d+1\) 个点,由它们生成的球尽量小且能覆盖所有点。

观察:若 \(S\) 的最小包围球内没有 \(w\) ,那么 \(S\cup \{w\}\) 的答案一定包括 \(w\)

考虑递归求解前 \(n-1\) 个点的答案,如果 \(n\) 被覆盖就结束了,否则说明 \(n\) 一定在答案中,

然后重新递归求解前 \(n-1\) 个点的答案。这第 \(n\) 个点是能随机选取的,那计算一下就是上面的式子了。

\(\epsilon\) - Coreset:找尽量小的点集 \(P\subseteq V\) ,使得

\(\forall c\in R^d,f(P,c)\geq (1-\epsilon) f(V,c)\)

考虑任取一个点找最远点,设它们距离是 \(D'\) ,显然 \(f(V)\le D'\le 2f(V)\)

考虑画格子,以 \(\frac{\epsilon D'}{2\sqrt{d}}\) 为块长,每个格子任取一个点即可,误差不超过 \(\frac{\epsilon D'}{2}\le \epsilon f(V)\)

Coreset 的用处:可合并,考虑 \(\text{Coreset}(A)\cup \text{Coreset}(B)=\text{Coreset}(A\cup B)\) 。那如果点集会修改,就用线段树来处理,每个节点维护一个 Coreset ,上传就是直接合并,然后产生一点误差以减少这个点集。

四分树

近似最近邻查询

给定 \([\Delta]^d\) 上的点集 \(V\),每次查询给出一个 \(q\in [\Delta]^d\) ,问 \(V\) 中的最近邻。

可以做到预处理 \(O(nd\log \Delta)\) ,查询 \(O(\epsilon^{-d}\log \Delta)\)

考虑对 \(V\) 建四分树,查询直接在树上 bfs,然后考虑剪枝,设 \(\text{diam}(u)\) 是点 \(u\) 代表的范围的直径,\(rep_u\) 是节点 \(u\) 上任意一个节点,如果当前找到的最优答案 \(A\le |q-rep_u|-\text{diam}(u)\) 就可以直接剪掉 \(u\) 。显然是对的,复杂度证明比较麻烦。

WSPD

给定 \([\Delta]^d\) 上的点集 \(V\)

一个 \(\epsilon-\) WSPD 是两个等长的集合序列 \(A,B\) 。令 \(m=|A|=|B|\) ,满足 \(\forall 1\le i\le m,A_i,B_i\subseteq V,\max(\text{diam}(A_i),\text{diam}(B_i))\le \epsilon \cdot\text{dis}(A_i,B_i)\) ,且 \(\cup A_i×B_i=V×V\)

换句话说, \(\forall u,v\in V,u\neq v,\exists 1\le i\le m\) ,使得 \(u\in A_i,v\in B_i\)

结论:我们可以在 \(O(n\epsilon^{-O(d)}\log \Delta)\) 的时间内找到大小为 \(O(n\epsilon^{-O(d)}\log \Delta)\)\(\epsilon-\) WSPD。

考虑建四分树, 设 \(O_u\) 表示节点 \(u\) 子树内的输入点集合,\(W_u\) 表示这个节点代表的格子的点集。

\(sol(u,v)\) 表示现在需要覆盖 \(O_u×O_v\) 。令 \(\delta(u)=\text{diam}(u)\cdot [|O_u|\geq 2]\) 。不妨令 \(\delta(u)\geq \delta(v)\)

如果 \(\delta(u)\le \epsilon\cdot dis(W_u,W_v)\) 就直接把 \(\{O_u,O_v\}\) 加入答案;否则枚举 \(u\) 的儿子 \(u'\) ,递归 \(sol(u',v)\) 。显然是对的,复杂度证明比较麻烦。

最近点对精确求解

任取 \(\epsilon<1\) 并构造 \(\epsilon-\) WSPD,若 \(|A_i|=|B_i|=1\) 则尝试更新答案。

近似直径:求 \(\epsilon/2-\) WSPD,每对 \(A_i,B_i\) 中任取代表点 \(rep^A_i,rep^B_i\) 更新答案。

原因考虑令 \(dis(u,v)\) 是直径, \(u\in A_i,v\in B_i\) ,那么 \(dis(rep_i^A,rep_i^B)\geq dis(u,v)-\text{diam}(A_i)-\text{diam}(B_i)\geq (1-\epsilon)dis(u,v)\)

感性理解一下,其实是每个 \(A_i,B_i\) 覆盖的点对的 dis 差距不大。

欧氏最小生成树

考虑依据输入点集 \(V\) 构造的完全图 \(G\) 满足两个点间的边权是欧氏距离。

\(t-\text{Spanner}\) \(G'\)\(G\) 的一个子图,使得

\(\forall u,v\in V\)\(dis_{G'}(u,v)\le t||u-v||\)

\((1+\epsilon)-\text{Spanner}\) 求解方法:求出 \(\epsilon/8\)-WSPD ,每对 \(A_i,B_i\) 都找两个代表点连边,即可得到 \(G'\)

考虑按照 \(||u-v||\) 从小到大归纳证明正确性。

\(u\in A_i,v\in B_i\) ,代表点为 \(u',v'\)\(l=||u'-v'||\)

\(||u-v||\geq dis(A_i,B_i)\geq \frac{8}{\epsilon}\max(diam(A_i,B_i))\)

\(l\le dis(A_i,B_i)+\text{diam}(A_i)+\text{diam}(B_i)\le (1+\frac{\epsilon}{4})||u-v||\)

\(dis_{G'}(u,v)\le dis_{G'}(u,u')+dis_{G'}(v,v')+l\le (1+\epsilon)(||u-u'||+||v-v'||)+l\le (\frac{\epsilon}{2}+\frac{\epsilon^2}{4}+1)||u-v||\le (1+\epsilon)||u-v||\)

由此可以求出 \(G\) 的近似最小生成树:在 \(G'\) 上求生成树即可。

高维方法

随机平移四分树

例: \(O(d)-spanner\)

考虑对 \(n\) 个坐标加上一个相同的长为 \(d\) 的向量,然后再求四分树。接下来枚举树上每一个点,令一个点子树代表的坐标集合为 \(P\) ,则任取 \(P\) 中一个点 \(w\)\(\forall x\in P\) 连边 \((x,w)\)

进行 \(O(\log n)\) 次随机平移。

首先这样边数就只有 \(O(n\log n\log \Delta)\) ,接下来分析正确性。

首先随机平移后,考虑估计两个点被边长 \(2^i\) 的格子划分开的概率。设 \(f(x,y)\)\(x,y\) 两个点的曼哈顿距离,则被划分开的概率 \(\le \frac{f(x,y)}{2^i}\) (Union Bound) ,而 \(f(x,y)\le \sqrt{d}||x-y||_2\) 。综上,被划分开的概率 \(\le \frac{||x-y||_2\sqrt{d}}{2^i}\)

\(i_{xy}\) 满足 \(2^{i_{xy}}\)\(\sqrt{d}||x-y||_2\) 略大一点,那此时在一次平移后 \(x,y\)\(2^{i_{xy}}\) 的格子被分到一起的概率 \(\geq \frac{1}{2}\) 。而这样的格子的直径也就是 \(O(d)||x-y||_2\) ,自然生成图就满足

\(dis_G(x,y)\le O(d)||x-y||_2\) 了。

\(O(\log n)\) 次平移,\(x,y\) 不合法的概率就 \(\le \frac{1}{poly(n)}\) ,最后 Union bound 就结束了。

接下来介绍一个类似的方法。

Tree-Embedding

考虑直接建随机平移四分树,然后认为一条边的边权是 \(\sqrt{d}2^i\)

令这棵树是 \(T\) ,结论是 \(||x-y||_2\le dis_T(x,y),E[dis_T(x,y)]\le O(d\log \Delta)||x-y||_2\)

原因是 \(E[dis_T(x,y)]\le \sum\limits_{i}O(\sqrt{d}2^i)*\frac{||x-y||_2\sqrt{d}}{2^i}=O(d\log \Delta)||x-y||_2\)

用这个做高维 MST:直接求这棵树上所有叶子构成的虚树边权和即可。

高维欧式最小权匹配:从下往上贪心,遇到一起直接匹配。

Range Query

给定一些数据点和一个常数 \(R\) ,每次查询给一个点 \(u\) ,问有多少个数据点 \(v_i\) 满足 \(||u-v_i||_2\le R\)

考虑一种近似:允许计入 \(O(\alpha) R\) 内的点。

直接随机平移,以 \(\frac{\alpha R}{\sqrt{d}}\) 为边长划格子,枚举所有可能存在点与 \(u\) 距离 \(\le R\) 的格子,把这个格子的所有点都加入答案即可。期望要搜的格子数:\(2^{\frac{d}{\alpha^{2/3}}}poly(d)\)

降维

我们希望找到一种映射 \(f:R^{d}\rightarrow R^m\) ,使得 \(\forall x,y\in P\)\(||f(x)-f(y)||_2\in (1\pm \epsilon)||x-y||_2\) ,其中 \(P\) 是一个大小为 \(n\) 的点集。

JL

随机 \(m\) 个独立的单位高斯向量 \(w_1,w_2,\dots,w_m\),然后令 \(f(v)=\frac{1}{\sqrt{m}}(<w_1,v>,<w_2,v>,\dots,<w_m,v>)\)

\(m\)\(O(\epsilon^{-2}\log n)\) ,就大概率对任意点对都合法。

结论:\(Pr[||f(v)||^2\in (1\pm\epsilon )||v||^2]\geq 1-exp(-O(\epsilon^2m))\)

也就是说对于任意一对 \(x,y\)\(Pr[||f(x)-f(y)||_2\in (1\pm \epsilon)||x-y||_2]\geq 1-exp(-O(\epsilon^2m))\)

失败概率就是 \(exp(O(\epsilon^2m))\) ,通过 union bound 我们希望 \(exp(-O(\epsilon^2m))O(n^2)\le\) 一个任意的常数。于是 \(m\) 就需要取 \(O(\epsilon^{-2}\log n)\)

JL 是 Data oblivious 的。所谓 Data oblivious,即是这个算法的定义与具体的数据集无关。

线性回归

即给定 \(X\in R^{n×d}\)\(y\in R^n\) ,需要找到 \(w\) 使得 \(||Xw-y||^2\) 最小。

\(w=(X^TX)^{-1}X^Ty\) ,复杂度 \(O(nd^2)\) 。问题是 \(X^TX\) 可以是不可逆的,而且这样也挺慢。

Subspace JL

考虑降维,尝试找到 \(A\in R^{m×n}\) 使得 \(|AXw-Ay||^2\le (1\pm\epsilon )||Xw-y||^2\)

\(A=f(v)=\frac{1}{\sqrt{m}}(w_1,w_2,\dots,w_m)\) 即可。

证明考虑,首先这里的 \(Xw-y\) 其实构成了 \(R^n\) 的一个 \(d\) 维子空间。

\(U\)\(R^n\) 的一个 \(d\) 维子空间,则 \(\forall v\in U\) ,有 \(Pr[||Av||^2\in (1\pm \epsilon)||v||^2]\geq 1-\delta\) ,其中 \(m=O(\frac{d\log(\epsilon^{-1})+\log (\delta^{-1})}{\epsilon^2})\) 。这几乎就是 \(O(d)\)

这里的证明和之前的区别在于,不能直接 Union Bound 了。怎么处理

问题是这样的话算 \(AX\) 还是 \(O(nd^2)\) 的。

接下来考虑 \(X\) 这个矩阵比较稀疏的时候该怎么做。设 \(nnz(X)\)\(X\) 中非零元素的个数。

Sparse S

考虑这样构造矩阵 \(A\) :每一列随机一个位置为非零,其值在 \(\{-1,1\}\) 间随机。显然这样 \(AX\) 能直接在 \(O(nnz(X))\) 的时间内计算。但 \(m=O(\epsilon^{-2}d^2poly\log(\epsilon^{-1}d))\) 时才有类似保证,这几乎就是 \(O(d^2)\) 。总复杂度是 \(O(nnz(X)+d^4)\)

Fast JL

一种特殊构造的矩阵 \(A\) ,使得 \(AX\) 可以快速计算,这里略了。可以优化到 \(O(nnz(X)+d^3)\)

降维-PCA

有缘再写。

Sparse Recovery

Linear sketch

称一个(数据流)算法是linear sketch,如果可以把算法看作如下形式:
• 设 \(x\) 是频数向量,则算法在数据流下维护的是一个线性操作后的结果 \(Ax\)
• 算法在回答查询时,仅需要利用 \(Ax\) 回答(\(f(Ax)\)

这个的好处是,对于两个数据流 \(P_1,P_2\) 维护的 Linear Sketch \(F_1,F_2\) ,有 \(F_1+F_2\)\(P_1\cup P_2\) 的 Linear Sketch。我们可以做数据流间的加减法。

k-sparse

就是说有一个频数向量 \(x\) ,需要设计一个结构,使得:

判断是否 \(||x||_0\le k\) ,若 \(||x||_0\le k\) 则把 \(x\) 所有非零的位置找出来。

存在一个 \(O(k\text{poly}(\log(n)))\) 空间,单次修改 \(O(\text{poly}(\log(n)))\) 的算法。

先考虑 \(k=1\) 怎么搞。

维护 \(s_1=\sum\limits_{p}x_p,s_2=\sum\limits_{p}x_p,s_3=\sum\limits_{p}r^px_p\)\(r\) 是设定的一个常数。当然这里会让 \(s_3\) 模一个质数。

查看一下 \(r^{\frac{s_2}{s_1}}s_1\) 是否与 \(s_3\) 相等即可。

拓展一下,取 \(T\)\([n]\rightarrow[2k]\) 的随机哈希,我们维护 \(2k\) 个 1-sparse,每次 \(x\) 变化就修改对应的 1-sparse。

思考一下,如果最终 \(||x||_0\le k\) ,对于其中某一个非零元素,它在一个哈希中不被冲突的概率是 \(>\frac{1}{2}\) 的。也就是说,它成为某个 1-sparse 的唯一元素的概率 \(>1-(0.5)^{T}\)

如果 \(T\)\(O(\log k)\) ,一个元素就有 \(\frac{1}{O(k)}\) 的失败率,union bound 一下,失败率就是个常数了。于是直接把所有 1-sparse 提取的元素并在一起即可。

一个问题是怎么判断元素个数 \(\le k\) ,维护单独的一个 1-sparse \(B\) ,在我们用上述算法提取了一些元素后,将这些元素从 \(B\) 中删除,看看 \(B\) 是否为空即可。

小空间求近似直径

你要维护一个点集,支持加点删点,在最后查直径。空间很小,不能和点集大小相关。

考虑维护 \(\log \Delta\) 个结构,每个结构相当于以 \(2^i\) 为块长画格子后得到的点集做 \(k-sparse\) 。其中 \(k=O(\frac{1}{\epsilon})^d\) 。最后查直径就是找到最小的 \(i\) 使得非零位置个数 \(\le k\) ,然后暴力求这些格子间的直径即可。

数据流 \(l_0\) 采样

刚才这个 k-sparse 是要把所有非零位置(support)都给恢复。\(l_0\) - 采样要做的事:在 \(k\) 比较大的时候也有办法搞随机采样。

具体的,\(l_0\) 采样希望均匀随机地返回 \(supp(x)\) 中的一个数。

结论:存在空间 \(O(poly \log (n))\) 的算法,以 \(1-1/poly(n)\) 概率成功。

但是这个采样是伪的:确实输出了一个均匀采样,但是反复运行算法无法生成新的独立采样。

考虑维护 \(\log n\) 个 1-sparse \(S_0,S_1,\dots\) 。同时设一个哈希函数 \(h_i\) 使得 \(Pr[h_i(x)=1]=\frac{1}{2^i}\) ,每次 \(u\) 频数修改时,若 \(h_i(u)=1\) 则对 \(S_i\) 进行修改。

最后找到任意一个输出 Yes 的 sparse,把这个看做我们的采样。首先这个采样确实均匀,那成功率如何呢,可以感到它是一个常数,所以维护常数个这样的结构即可。

求联通块个数

就是说你要维护一个算法支持无向图上加边删边,最后求出这个图的所有连通分量。空间希望是 \(\tilde{O}(n)\)

考虑在每个点用 \(l_0\) 采样维护频数向量 \(x_{u,v}\) ,令 \(x_{u,v}=[(u,v)\in E](-1+2[u\le v])\)

然后用类似 borvuka 的方法,每个联通块找一条向外的边就好了。考虑这些的 \(x\) 的总和,发现内部的边都被抵消完了,所以直接采样就可以得到这样一条边。时空复杂度都是 \(O(n\log n)\)

求近似MST

就是说你要维护一个算法支持加边删边(带权),在最后求 MST,希望空间 \(\tilde{O}(n/ϵ)\)

考虑把边权离散化到最近的 \(1+\epsilon\) 的方幂,这样本质不同的边权只有 \(O(\frac{\log n}{\epsilon})\) 个,对每个边权维护上面那个题说的东西就好了。

posted @ 2025-03-04 20:32  grass8woc  阅读(174)  评论(0)    收藏  举报