对于矩阵 A,B,CA,B,C 判断是否有 AB=CAB=C :随机一个行向量 xx 然后看 xABxAB 是否 等于 xCxC 。正确率约为 11 。


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

1-median

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

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

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

Hoeffding inequality:

设独立随机变量 X1,X2,…,Xm∈[s,t]X_1,X_2,\dots,X_m\in [s,t] ,X:=∑XiX:=\sum X_i ,则 Pr[X−E[X]≥z]≤2exp(−2z2m(t−s)2)Pr[X-E[X]\geq z]\le 2exp(\frac{-2z^2}{m(t-s)^2}) 。

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

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

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

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

看来,只需要选取合理的中心点 PP 即可。

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

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

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


Count-min Sketch

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

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

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

Markov inequality:

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

对 X=C′−CX=C'-C 用这个定理,就可以得到 Pr(X≥nϵ)≤1mϵPr(X\geq n\epsilon)\le \frac{1}{m\epsilon} 。

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

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


求绝对众数的一个算法:对每个二进制位求 00 和 11 谁出现的更多。


LSH

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

给定 nn 个大小为 mm 的集合 SiS_i, qq 次查询,给定 x,yx,y 计算 J(Sx,Sy)J(S_x,S_y) 。

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

离线下来,做 TT 轮,对每个元素随个哈希值,记一个集合 SiS_i 的权值是所有元素的哈希值的 min ,记为 ViV_i。每个询问记录一个计数器 cntcnt ,若 Vx=VyV_x=V_y 则将 cntcnt 加上 11 。

定理:Pr(Vx=Vy)=J(Sx,Sy)Pr(V_x=V_y)=J(S_x,S_y) 。挺显然的。

把 cntT\frac{cnt}{T} 当做答案即可。

chernoff bound:nn 个在 [0,1][0,1] 间随机且期望为 μ\mu 的随机变量 x1,x2,…,xnx_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 $ 。其中 tt 为 ≤μ\le \mu 的常量。

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


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

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

则 Pr(h(x)=h(y))=σ(x,y)Pr(h(x)= h(y))=\sigma(x,y) 。


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


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

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

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

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

误差分析:对查询 qq 设 q∗q^{*} 是最近点,r=distH(q,q∗)r=dist_H(q,q*) 。

设 p1=1−rd,p2=1−crd,k=Θ(logp2(1n))p_1=1-\frac{r}{d},p_2=1-\frac{cr}{d},k=\Theta(log_{p2}(\frac{1}{n})) 。

我们分析两件事情:

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

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

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

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

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


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

处理 c-最近邻:

哈希函数 hh 使得有参数 r,p1,p2r,p_1,p_2 ,满足

∣∣x−y∣∣≤r→Pr[h(x)=h(y)]≥p1||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$

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

令 k=O(log⁡n/log⁡(1/p2)),T=nρk=O(\log n/\log(1/p_2)),T=n^{\rho} 。

做 TT 轮,每轮造 kk 个独立的 LSH 然后拼起来。

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


画格子

近似直径

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

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

最小包围球和 ϵ\epsilon - Coreset

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

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

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

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

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

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

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

ϵ\epsilon - Coreset:找尽量小的点集 P⊆VP\subseteq V ,使得

∀c∈Rd,f(P,c)≥(1−ϵ)f(V,c)\forall c\in R^d,f(P,c)\geq (1-\epsilon) f(V,c) 。

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

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

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

四分树

近似最近邻查询

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

可以做到预处理 O(ndlog⁡Δ)O(nd\log \Delta) ,查询 O(ϵ−dlog⁡Δ)O(\epsilon^{-d}\log \Delta) 。

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

WSPD

给定 [Δ]d[\Delta]^d 上的点集 VV 。

一个 ϵ−\epsilon- WSPD 是两个等长的集合序列 A,BA,B 。令 m=∣A∣=∣B∣m=|A|=|B| ,满足 ∀1≤i≤m,Ai,Bi⊆V,max⁡(diam(Ai),diam(Bi))≤ϵ⋅dis(Ai,Bi)\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) ,且 ∪Ai×Bi=V×V\cup A_i×B_i=V×V 。

换句话说, ∀u,v∈V,u≠v,∃1≤i≤m\forall u,v\in V,u\neq v,\exists 1\le i\le m ,使得 u∈Ai,v∈Biu\in A_i,v\in B_i。

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

考虑建四分树, 设 OuO_u 表示节点 uu 子树内的输入点集合,WuW_u 表示这个节点代表的格子的点集。

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

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

最近点对精确求解

任取 ϵ<1\epsilon<1 并构造 ϵ−\epsilon- WSPD,若 ∣Ai∣=∣Bi∣=1|A_i|=|B_i|=1 则尝试更新答案。

近似直径:求 ϵ/2−\epsilon/2- WSPD,每对 Ai,BiA_i,B_i 中任取代表点 repiA,repiBrep^A_i,rep^B_i 更新答案。

原因考虑令 dis(u,v)dis(u,v) 是直径, u∈Ai,v∈Biu\in A_i,v\in B_i ,那么 dis(repiA,repiB)≥dis(u,v)−diam(Ai)−diam(Bi)≥(1−ϵ)dis(u,v)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) 。

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

欧氏最小生成树

考虑依据输入点集 VV 构造的完全图 GG 满足两个点间的边权是欧氏距离。

t−Spannert-\text{Spanner} G′G' 是 GG 的一个子图,使得

∀u,v∈V\forall u,v\in V ,disG′(u,v)≤t∣∣u−v∣∣dis_{G'}(u,v)\le t||u-v|| 。

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

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

令 u∈Ai,v∈Biu\in A_i,v\in B_i ,代表点为 u′,v′u',v' , l=∣∣u′−v′∣∣l=||u'-v'|| 。

∣∣u−v∣∣≥dis(Ai,Bi)≥8ϵmax⁡(diam(Ai,Bi))||u-v||\geq dis(A_i,B_i)\geq \frac{8}{\epsilon}\max(diam(A_i,B_i))

l≤dis(Ai,Bi)+diam(Ai)+diam(Bi)≤(1+ϵ4)∣∣u−v∣∣l\le dis(A_i,B_i)+\text{diam}(A_i)+\text{diam}(B_i)\le (1+\frac{\epsilon}{4})||u-v|| 。

disG′(u,v)≤disG′(u,u′)+disG′(v,v′)+l≤(1+ϵ)(∣∣u−u′∣∣+∣∣v−v′∣∣)+l≤(ϵ2+ϵ24+1)∣∣u−v∣∣≤(1+ϵ)∣∣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||

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

高维方法

随机平移四分树

例: O(d)−spannerO(d)-spanner

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

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

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

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

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

disG(x,y)≤O(d)∣∣x−y∣∣2dis_G(x,y)\le O(d)||x-y||_2 了。

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

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

Tree-Embedding

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

令这棵树是 TT ,结论是 ∣∣x−y∣∣2≤disT(x,y),E[disT(x,y)]≤O(dlog⁡Δ)∣∣x−y∣∣2||x-y||_2\le dis_T(x,y),E[dis_T(x,y)]\le O(d\log \Delta)||x-y||_2 。

原因是 E[disT(x,y)]≤∑iO(d2i)∗∣∣x−y∣∣2d2i=O(dlog⁡Δ)∣∣x−y∣∣2E[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

给定一些数据点和一个常数 RR ,每次查询给一个点 uu ,问有多少个数据点 viv_i 满足 ∣∣u−vi∣∣2≤R||u-v_i||_2\le R 。

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

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

降维

我们希望找到一种映射 f:Rd→Rmf:R^{d}\rightarrow R^m ,使得 ∀x,y∈P\forall x,y\in P ,∣∣f(x)−f(y)∣∣2∈(1±ϵ)∣∣x−y∣∣2||f(x)-f(y)||_2\in (1\pm \epsilon)||x-y||_2 ,其中 PP 是一个大小为 nn 的点集。

JL

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

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

结论:Pr[∣∣f(v)∣∣2∈(1±ϵ)∣∣v∣∣2]≥1−exp(−O(ϵ2m))Pr[||f(v)||^2\in (1\pm\epsilon )||v||^2]\geq 1-exp(-O(\epsilon^2m)) 。

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

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

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

线性回归

即给定 X∈Rn×dX\in R^{n×d} 和 y∈Rny\in R^n ,需要找到 ww 使得 ∣∣Xw−y∣∣2||Xw-y||^2 最小。

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

Subspace JL

考虑降维,尝试找到 A∈Rm×nA\in R^{m×n} 使得 ∣AXw−Ay∣∣2≤(1±ϵ)∣∣Xw−y∣∣2|AXw-Ay||^2\le (1\pm\epsilon )||Xw-y||^2 。

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

证明考虑,首先这里的 Xw−yXw-y 其实构成了 RnR^n 的一个 dd 维子空间。

设 UU 是 RnR^n 的一个 dd 维子空间,则 ∀v∈U\forall v\in U ,有 Pr[∣∣Av∣∣2∈(1±ϵ)∣∣v∣∣2]≥1−δPr[||Av||^2\in (1\pm \epsilon)||v||^2]\geq 1-\delta ,其中 m=O(dlog⁡(ϵ−1)+log⁡(δ−1)ϵ2)m=O(\frac{d\log(\epsilon^{-1})+\log (\delta^{-1})}{\epsilon^2}) 。这几乎就是 O(d)O(d) 。

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

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

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

Sparse S

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

Fast JL

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

降维-PCA

有缘再写。

Sparse Recovery

Linear sketch

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

这个的好处是,对于两个数据流 P1,P2P_1,P_2 维护的 Linear Sketch F1,F2F_1,F_2 ,有 F1+F2F_1+F_2 是 P1∪P2P_1\cup P_2 的 Linear Sketch。我们可以做数据流间的加减法。

k-sparse

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

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

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

先考虑 k=1k=1 怎么搞。

维护 s1=∑pxp,s2=∑pxp,s3=∑prpxps_1=\sum\limits_{p}x_p,s_2=\sum\limits_{p}x_p,s_3=\sum\limits_{p}r^px_p ,rr 是设定的一个常数。当然这里会让 s3s_3 模一个质数。

查看一下 rs2s1s1r^{\frac{s_2}{s_1}}s_1 是否与 s3s_3 相等即可。

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

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

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

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

小空间求近似直径

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

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

数据流 l0l_0 采样

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

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

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

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

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

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

求联通块个数

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

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

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

求近似MST

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

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