亚时间线性算法
图直径问题
定义:m个顶点的图,任意两点的距离储存在矩阵D中,求两点之间的最远距离。
算法:随机选择一行k,在这一行中找出最大的值作为直径。
算法分析:该算法的近似比为2
D
i
j
≤
D
i
k
+
D
k
j
≤
D
k
l
+
D
k
l
≤
2
D
k
l
D_{ij} \leq D_{ik} +D_{kj} \leq D_{kl} +D_{kl} \leq 2D_{kl}
Dij≤Dik+Dkj≤Dkl+Dkl≤2Dkl
排序链表搜索的亚线性算法
定义:
排序双向有序链表R,给定元素x,判断x是否在R中。
这个R的数据结构,可以通过索引访问元素意味着可以随机抽取,并且每个元素都有指针可以访问相邻的有序元素。
算法:
1随机在R中抽取
θ
(
R
)
\theta(\sqrt R)
θ(R)个元素。构成集合S
2在S中找出p,q使得
p
≤
x
≤
p
p \leq x \leq p
p≤x≤p且在S中p,q间没有其他元素。
3在p元素开始搜索x,搜索到返回是。
算法分析:
时间复杂度为
O
(
n
)
O(\sqrt n)
O(n),算法运行的时间为
O
(
n
)
O(\sqrt n)
O(n)+(p,q间的元素个数)。S中的元素是随机选取,pq以|S|/n的概率选取且是相邻的,所以在R中pq间元素个数的期望为n/|S|
多边形交集问题
定义:判断两个简单多边形A,B是否相交
算法:
1 在A,B中等概率的选择
θ
(
n
)
\theta (\sqrt n)
θ(n)个顶点构成集合
C
A
,
C
B
C_A,C_B
CA,CB
2 在
O
(
n
)
O(\sqrt n)
O(n)的时间内检查
C
A
,
C
B
C_A,C_B
CA,CB是否相交,如果不相交则生成一条分隔
C
A
,
C
B
C_A,C_B
CA,CB的直线L
3 根据L判断A,B是否相交
我们使用L来定义
P
A
,
P
B
P_A,P_B
PA,PB a 是在L上A的点,a1,a2是a相邻的两个点如果这两个点在于
C
A
C_A
CA在同侧,则
P
A
P_A
PA为空。由于是简单多边形所以这两个点只有一个可能在
C
A
C_A
CA的另一侧,我们这样这个点的方向遍历知道点再次通过L,我们将遍历的点构成
P
A
P_A
PA。其大小为
O
(
n
)
O(\sqrt n)
O(n)
所以A,B 相交可以转化为A与PB相交或者B与PA相交,现在将说明输入判断B与PA相交,首先判定
C
b
和
P
A
C_b和P_A
Cb和PA是否相交,再按照一开始的方法确定分隔线Lb,通过Lb生成Qb,那么B与PA相交等价于Qb与PA相交,而两者的期望规模都是
O
(
n
)
O(\sqrt n)
O(n)
所以我们可以在 O ( n ) O(\sqrt n) O(n)的时间内解决该问题。
连通分量个数估计
算法思想:
我们可以通过bfs精确的求出连同分量的个数,这样每个点都要访问一次,时间复杂度为
O
(
n
d
)
O(nd)
O(nd),d为节点的最大度数。
我们可以通过随机化的方法进行估算,节点u所在的连同分量的结点数即为
n
u
n_u
nu,那这个点的权重为
1
/
n
u
1/n_u
1/nu。这样精确的连同分量的个数是所有点的权重相加,但是我们考虑到如果
n
u
n_u
nu过大则对最后的贡献很少,所以我们可以设置一个阈值(
2
/
ϵ
2/\epsilon
2/ϵ),当超过该值时我们停止bfs对该连同分量的搜索。
算法:
随机取s(
θ
(
1
/
ϵ
2
)
\theta(1/\epsilon^2)
θ(1/ϵ2))个点进行bfs的搜索,根据阈值与确定该点的权重,将这s个点的权重相加的到N,则连同分量的估计为
N
n
/
s
Nn/s
Nn/s
算法分析
时间复杂度:
O
(
d
ϵ
3
l
o
g
(
1
/
ϵ
)
)
O(\frac{d}{\epsilon^3}log(1/\epsilon))
O(ϵ3dlog(1/ϵ))
循环的轮数为
1
/
ϵ
2
1/\epsilon^2
1/ϵ2,每一轮访问
2
/
ϵ
2/\epsilon
2/ϵ个结点,在bfs的过程中代价为
d
/
ϵ
d/\epsilon
d/ϵ.因为在bfs的过程中需要确定点是否被访问所以要建立访问节点的平衡二叉树这样插入、访问的代价为
l
o
g
(
2
/
ϵ
)
log(2/\epsilon)
log(2/ϵ),最终证明出时间复杂度。
质量分析
P
r
[
∣
C
‘
−
C
∣
>
ϵ
n
]
≤
1
/
3
Pr[|C`-C|>\epsilon n]\leq1/3
Pr[∣C‘−C∣>ϵn]≤1/3