程序设计实习 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})\) 个,对每个边权维护上面那个题说的东西就好了。

浙公网安备 33010602011771号