–中国大学生MOOC 王宏志老师大数据算法 听课笔记–
什么是亚线性算法?
亚线性算法与线性算法相比,顾名思义区别就在“亚”字上。表示时间/空间复杂度低于线性算法的一种算法的统称。
具体定义:时间/空间/IO/通讯/能量等消耗o(输入规模)。
【注】:消耗为o(输入规模)而非O(输入规模)。
亚线性
水库抽样算法
水库抽样是一种经典的亚线性空间算法。
问题背景:
有时候我们需要在海量数据中进行均匀的抽样,但是由于海量数据无法进行存储,所以我们只能让它从我们面前流过一次。
问题描述:
输入:一组数据,其大小未知
输出:这组数据的k个均匀抽样
要求:
- 仅扫描数据一次
- 空间复杂性为O(k) 和抽样大小有关,和整个数据无关
- 扫描到数据的前n个数字时(n>k),保存当前已扫描数据的k个均匀抽样
算法步骤:
- 申请一个长度为k的数组保存抽样。
- 保存首先接收到的k个元素
- 当接收到第i个新元素t时,以k/i的概率随机替换A中的元素(即生成[1,i]间随机数j,若j<=k,则以t替换A[j])
算法原理:
当接收到第i个新元素t时,以k/i的概率保存在水库中,所以在接收第i+1个数时,第i个数还能保存在水库当中的概率是1-1/(i+1),因为在接收到第i+1个数时要以k/(i+1)的概率随机替换,而第i个数被选中的概率是1/k,它们相乘即为1/(i+1)。1/(i+1)为第i个元素被换出水库的概率,所以1-1/(i+1)就是在接收第i+1个元素时第i个元素在数组中的概率。同理,在接收第i+2个元素时,第i个元素让然保留在水库中的概率为1-1/(i+2)。以此类推,当接收第n个元素时,第i个元素保存在水库中的概率为1-1/n。只有这些事件都放生了,最终第i个元素才能保留在水库当中。因此第i个元素最终被保留在水库抽样当中的概率,就是这些事件的概率的乘积,即
算法伪代码:
Init : a reservoir with the size: k
for i= k+1 to N
M=random(1, i);
if( M < k)
SWAP the Mth value and ith value
end for
平面图的直径近似算法
平面图的直径近似算法是一种经典的亚线性时间算法。
【注释】:在图论中,平面图是可以画在平面上并且使得不同的边可以互不交叠的图。
【注释】:近似算法是计算机科学中算法研究的一个重要方向。所谓“近似”,就是指结果不一定是最优的,但是也在可以承受的范围内,而且可以比精确求解消耗更少的资源。
问题背景:
当输入的距离矩阵过大时,我们无法通过正常的算法对其进行求解。所以我们希望通过近似算法对其求得一个尽量相似的解。
问题描述:
输入:m个顶点的平面图,任意两点之间的距离存储在矩阵D中,即点i到点j的距离为Dij
- 输入大小是n=m的平方
- 最大的Dij是图的直径
- 点之间的距离对称且满足三角不等式
输出:该图的直径和距离最大的Dij
要求:运行时间为o(n)
算法步骤:
- 任意选择k<=m
- 选择使得Dkl最大的l
- 输出Dkl和(k, l)
算法原理:
根据三角不等式,我们可以得到Dij <= Dik + Dkj,又因为Dkl是我们所求最大值,所以有Dik <= Dkl,Dkj <= Dkl.可以得到Dij <= Dkl+Dkl <= 2Dkl。得到近似比2。