我有一个顶点列表,我必须从中选择一个概率与deg(v)成比例的随机顶点,其中deg(v)是顶点度。此操作的伪代码如下所示:
Select u ∈ L with probability deg(u) / Sigma ∀v∈L deg(v)
其中u是随机选择的顶点,L是顶点列表,v是L中的顶点。问题是我不明白如何去做。有人可以向我解释,如何获得这个随机顶点。如果有人能向我解释,我将不胜感激。伪代码将更加欣赏;)。
答案 0 :(得分:3)
最简单的解决方案是为每个Sum(d(v))
填充一个大小为v
的列表 - 您将在完全 {{1}中保留对v
的引用您列表中的条目。
现在,在范围d(v)
中选择一个均匀分布的变量x
,然后返回[0,Sum(d(v)))
此方法需要list[x]
空间(因为对于简单的图O(n^2)
),初始化时间也是Sigma(d(v)) is O(n^2)
,但只执行一次。假设您要多次选择一个顶点,每次选择它时,除了第一个顶点之外,都会O(n^2)
[假设O(1)
随机化函数和随机访问列表]。
答案 1 :(得分:2)
另一种解决方案;仍然很简单,不需要任何预处理或额外的内存(如果图中有一个边缘列表):
选择随机边缘,然后随机选择其中一个连接的节点;这是你的随机顶点。概率与顶点度成正比 - 对于每个节点,概率为
P(v) = sum(P(e: e uses v))/2 = |{e: e uses v}|/(2*|E|) = deg(v)/(2*|E|)