大数据 | 大数据基础--算法之亚线性时间算法:计算图的平均度算法一

    科技2025-01-08  13

    http://burningcloud.cn/article/119/index.html 亲爱的读者朋友大家晚上好,前几篇文章我们介绍了点集合的直径和连通分量的数量等几个问题,这次我们来分析图的平均度的计算,这个问题的定义非常简单。

    定义

    已知: G = ( V , E ) G=(V,E) G=(V,E)

    求:平均度 d ˉ = ∑ u ∈ V d ( u ) n \bar{d} = \frac{\sum_{u\in V}d(u)}{n} dˉ=nuVd(u)

    假设: G G G是简单图,没有平行边和自环; G G G由邻接链表和存储度数的数组表示,如图中的 d ( v ) , n o d e ( v ) d(v),node(v) d(v),node(v)所示。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9z8TlfVX-1602083571244)(1601198667811.png)]

    分析

    对于一些特殊的图,如 n − c y c l e   g r a p h n-cycle\ graph ncycle graph,就是说这个图就是一个长度为 n n n的环,这样的图的平均度就是2。对于 c l i q u e   g r a p h clique\ graph clique graph,也就是图中的一个局部完全子图,比如说 ( n − c n ) − c y c l e + c n − c l i q u e   g r a p h (n-c\sqrt{n})-cycle + c\sqrt{n}-clique\ graph (ncn )cycle+cn clique graph,它的平度 d ˉ ≈ 2 + c 2 \bar{d} \approx 2 + c^2 dˉ2+c2,这个计算非常简单,请自行进行推导。

    但是对于一个通常的图就需要一个通用的方法,最简单的可以用随机采样的方法,也就是在图中随机选择 s s s个点,求这些点的度的平均值,就是最后的估计值。当然了方法很简单,但是算出的结果也很粗糙。

    下面我们来看一个看起来比较正常的算法,算法的idea是这样的:将具有相似或者相同度数的节点分组,然后估算每个分组的平均度数。

    首先我们来将所有的点进行分桶,分成 t t t个桶,第 i i i个桶里的点集合为 B i = { v ∣ ( 1 + β ) ( i − 1 ) < d ( v ) < ( 1 + β ) i } , 0 < i ≤ t − 1 B_i=\{v|(1+\beta)^{(i-1)} < d(v) < (1+\beta)^{i}\},0<i\leq t-1 Bi={v(1+β)(i1)<d(v)<(1+β)i},0<it1,其中 β \beta β是超参数。

    于是 B i B_i Bi中的点的总度数有上下界如公式所示: ( 1 + β ) ( i − 1 ) ∣ B i ∣ < d ( B i ) < ( 1 + β ) i ∣ B i ∣ (1+\beta)^{(i-1)}|B_i| < d(B_i) < (1+\beta)^{i}|B_i| (1+β)(i1)Bi<d(Bi)<(1+β)iBi

    进一步地 G G G的总度数可以表示为: ∑ i = 0 t − 1 ( 1 + β ) ( i − 1 ) ∣ B i ∣ < ∑ u ∈ V d ( u ) < ∑ i = 0 t − 1 ( 1 + β ) i ∣ B i ∣ \sum_{i=0}^{t-1}(1+\beta)^{(i-1)}|B_i| < \sum_{u\in V}d(u) < \sum_{i=0}^{t-1}(1+\beta)^{i}|B_i| i=0t1(1+β)(i1)Bi<uVd(u)<i=0t1(1+β)iBi

    于是我们可以得到: ∑ i = 0 t − 1 ( 1 + β ) ( i − 1 ) ∣ B i ∣ n < d ˉ < ∑ i = 0 t − 1 ( 1 + β ) i ∣ B i ∣ n \frac{\sum_{i=0}^{t-1}(1+\beta)^{(i-1)}|B_i|}{n} < \bar{d} < \frac{\sum_{i=0}^{t-1}(1+\beta)^{i}|B_i|}{n} ni=0t1(1+β)(i1)Bi<dˉ<ni=0t1(1+β)iBi

    经过这样的转化,我们就将问题转化成了对 B i n \frac{B_i}{n} nBi的估计,计算的算法如下。

    算法

    V V V取出样本集合 S S S S i ← S ∩ B i S_i \gets S \cap B_i SiSBi ρ i ← S i S \rho_i \gets \frac{S_i}{S} ρiSSi返回 d ˉ ^ = ∑ i = 0 t − 1 ρ i ( 1 + β ) i \hat{\bar{d}} = \sum_{i=0}^{t-1}\rho_i(1+\beta)^{i} dˉ^=i=0t1ρi(1+β)i

    算法的思想其实很简单,将 B i n \frac{B_i}{n} nBi理解为一种概率,就是随机选一个点,这个点属于 B i B_i Bi的概率,这样理解算法就很简单了。

    评价

    选一个点,这个点属于 B i B_i Bi的概率,这样理解算法就很简单了。

    评价

    算法的思想和计算都很简单,只是进行了一个非常巧妙的转化,但是这个算法仍然是有问题的,这将会在下周一的文章中指出并提出新的算法来解决问题,敬请期待。

    Processed: 0.020, SQL: 8