我有一個頂點列表,我必須從中選擇一個概率與deg(v)成比例的隨機頂點,其中deg(v)是頂點度。此操作的僞代碼看起來像:從概率與元素值成正比的集合中選擇元素
Select u ∈ L with probability deg(u)/Sigma ∀v∈L deg(v)
其中U是隨機選擇的頂點,L是頂點和v的列表是L.頂點的問題是,我不知道如何做到這一點。有人可以向我解釋,如何得到這個隨機頂點。如果有人能向我解釋這一點,我將不勝感激。僞代碼將更加欣賞;)。
我有一個頂點列表,我必須從中選擇一個概率與deg(v)成比例的隨機頂點,其中deg(v)是頂點度。此操作的僞代碼看起來像:從概率與元素值成正比的集合中選擇元素
Select u ∈ L with probability deg(u)/Sigma ∀v∈L deg(v)
其中U是隨機選擇的頂點,L是頂點和v的列表是L.頂點的問題是,我不知道如何做到這一點。有人可以向我解釋,如何得到這個隨機頂點。如果有人能向我解釋這一點,我將不勝感激。僞代碼將更加欣賞;)。
簡單的辦法是填充大小Sum(d(v))
的列表,每個v
- 你會堅持v
參考您的列表中的恰好d(v)
條目。
現在,在範圍[0,Sum(d(v)))
選擇均勻分佈的變量x
,並返回list[x]
此方法要求O(n^2)
空間(由於用於簡單圖Sigma(d(v)) is O(n^2)
),和初始化時間也O(n^2)
,但它是僅進行一次。假設你要選擇一個頂點很多次,每次你選擇它,除了第一個,將是O(1)
[假設O(1)
隨機化函數和隨機訪問列表]。
另一種解決方案;仍然簡單,並且不需要任何預處理或額外的存儲器(如果您有圖表中的邊緣列表):
選擇一個隨機邊,然後隨機選擇其中一個連接的節點;那是你的隨機頂點。概率與頂點度成正比 - 對於每個節點,概率是
P(v) = sum(P(e: e uses v))/2 = |{e: e uses v}|/(2*|E|) = deg(v)/(2*|E|)
這似乎是明顯的答案。當圖的邊緣包含相同的信息時,不需要創建輔助數據結構。 – VSOverFlow 2012-07-18 16:24:23
的確很聰明,恕我直言,以前的方法更一般地適用於每個你必須按比例選擇一個節點的情況,這個節點可以不是度數。 – user299791 2013-09-28 10:36:52