对于矩阵 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,估计答案为 nmdis(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[XE[X]z]2exp(2z2m(ts)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 支持用 polylognϵ\frac{poly\log n}{\epsilon} 的空间复杂度,查询、插入时间复杂度亦为 polylognϵ\frac{poly\log n}{\epsilon} ,做到:估计值 CC' 和正式值 CC 之间满足 CCC+ϵ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:

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

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

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

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


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


LSH

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

给定 nn 个大小为 mm 的集合 SiS_iqq 次查询,给定 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 的常量。

看来 TTlog(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 最大的给定点,用这个给定点更新答案即可。

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

p1=1rd,p2=1crd,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) qq^{*} 很大概率能在 shuffle 后前 kk 位相等

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

所以 TTO(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 ,满足

xyrPr[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(logn/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} 的答案,设之为 DD' ,真实答案为 DD

画格子,以 ϵDd\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(ndlogn)+(d/ϵ)O(d)O(nd \log n) + (d/ϵ)^{O(d)}

最小包围球和 ϵ\epsilon - Coreset

给定一个 RdR^d 上的点集 VV,要找一个点 cc 使得 f(V,c)=maxvVcvf(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

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

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

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

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

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

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

Coreset 的用处:可合并,考虑 Coreset(A)Coreset(B)=Coreset(AB)\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 上任意一个节点,如果当前找到的最优答案 Aqrepudiam(u)A\le |q-rep_u|-\text{diam}(u) 就可以直接剪掉 uu 。显然是对的,复杂度证明比较麻烦。

WSPD

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

一个 ϵ\epsilon- WSPD 是两个等长的集合序列 A,BA,B 。令 m=A=Bm=|A|=|B| ,满足 1im,Ai,BiV,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,vV,uv,1im\forall u,v\in V,u\neq v,\exists 1\le i\le m ,使得 uAi,vBiu\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)[Ou2]\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 的儿子 uu' ,递归 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) 是直径, uAi,vBiu\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 满足两个点间的边权是欧氏距离。

tSpannert-\text{Spanner} GG'GG 的一个子图,使得

u,vV\forall u,v\in VdisG(u,v)tuvdis_{G'}(u,v)\le t||u-v||

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

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

uAi,vBiu\in A_i,v\in B_i ,代表点为 u,vu',v'l=uvl=||u'-v'||

uvdis(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))

ldis(Ai,Bi)+diam(Ai)+diam(Bi)(1+ϵ4)uvl\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+ϵ)(uu+vv)+l(ϵ2+ϵ24+1)uv(1+ϵ)uvdis_{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 的近似最小生成树:在 GG' 上求生成树即可。

高维方法

随机平移四分树

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

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

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

首先这样边数就只有 O(nlognlogΔ)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)dxy2f(x,y)\le \sqrt{d}||x-y||_2 。综上,被划分开的概率 xy2d2i\le \frac{||x-y||_2\sqrt{d}}{2^i}

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

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

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

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

Tree-Embedding

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

令这棵树是 TT ,结论是 xy2disT(x,y),E[disT(x,y)]O(dlogΔ)xy2||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)xy2d2i=O(dlogΔ)xy2E[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 满足 uvi2R||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:RdRmf:R^{d}\rightarrow R^m ,使得 x,yP\forall x,y\in Pf(x)f(y)2(1±ϵ)xy2||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>)

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

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

也就是说对于任意一对 x,yx,yPr[f(x)f(y)2(1±ϵ)xy2]1exp(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(ϵ2logn)O(\epsilon^{-2}\log n)

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

线性回归

即给定 XRn×dX\in R^{n×d}yRny\in R^n ,需要找到 ww 使得 Xwy2||Xw-y||^2 最小。

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

Subspace JL

考虑降维,尝试找到 ARm×nA\in R^{m×n} 使得 AXwAy2(1±ϵ)Xwy2|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) 即可。

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

UURnR^n 的一个 dd 维子空间,则 vU\forall v\in U ,有 Pr[Av2(1±ϵ)v2]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_2P1P2P_1\cup P_2 的 Linear Sketch。我们可以做数据流间的加减法。

k-sparse

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

判断是否 x0k||x||_0\le k ,若 x0k||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_prr 是设定的一个常数。当然这里会让 s3s_3 模一个质数。

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

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

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

如果 TTO(logk)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 为块长画格子后得到的点集做 ksparsek-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)) 的算法,以 11/poly(n)1-1/poly(n) 概率成功。

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

考虑维护 logn\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[uv])x_{u,v}=[(u,v)\in E](-1+2[u\le v])

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

求近似MST

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

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