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ˉ=n∑u∈Vd(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 n−cycle 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 (n−cn )−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+β)(i−1)<d(v)<(1+β)i},0<i≤t−1,其中 β \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+β)(i−1)∣Bi∣<d(Bi)<(1+β)i∣Bi∣。
进一步地 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=0t−1(1+β)(i−1)∣Bi∣<∑u∈Vd(u)<∑i=0t−1(1+β)i∣Bi∣。
于是我们可以得到: ∑ 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} n∑i=0t−1(1+β)(i−1)∣Bi∣<dˉ<n∑i=0t−1(1+β)i∣Bi∣。
经过这样的转化,我们就将问题转化成了对 B i n \frac{B_i}{n} nBi的估计,计算的算法如下。
算法的思想其实很简单,将 B i n \frac{B_i}{n} nBi理解为一种概率,就是随机选一个点,这个点属于 B i B_i Bi的概率,这样理解算法就很简单了。
选一个点,这个点属于 B i B_i Bi的概率,这样理解算法就很简单了。
算法的思想和计算都很简单,只是进行了一个非常巧妙的转化,但是这个算法仍然是有问题的,这将会在下周一的文章中指出并提出新的算法来解决问题,敬请期待。