社交或是其餘網絡一般能夠用圖來表示,即G=(V,E),其中V表明圖中全部節點的集合,E表明圖中全部邊的集合。本文討論的是無向圖。咱們先對圖中一些基本概念的表示以下: git
n github |
節點的個數 算法 |
m 網絡 |
邊的條數 app |
w(s,t) spa |
節點s,t之間邊的權重。對於無向無權重圖,全部的w(s,t) = w(t,s) =1 .net |
dG(s,t) 隊列 |
圖G中兩節點s,t之間最短路徑的長度,即爲這條最短路徑上全部邊的權重之和。同時dG (s,s)=0,無向圖中dG (s,t) = dG (t,s) ip |
σst ci |
圖G中兩節點s,t之間最短路徑的條數。同時σss =1,無向圖中σst =σts |
σst(v) |
圖G中兩節點s,t之間的全部最短路徑中通過節點v的條數 |
δst(v) |
即σst(v)/σst,表示點對s、t對節點v的pair-dependency |
Ps(t) |
從節點s到節點t的最短路徑上,節點t的前哨節點集。若v∈Ps(t),則表示從節點s到節點t的某條最短路徑上,最後一步是經過v到達t的 |
圖中各個節點的重要性能夠經過節點的中心性(Centrality)來衡量。在不一樣的網絡中每每採用了不一樣的中心性定義來描述網絡中節點的重要性。下面是一些基於最短距離度量節點中心性的方法:
能夠看到,closeness centrality考慮的是該節點到其餘各節點最短路徑的長度之和;graph centrality考慮的是該節點到離本身最遠的節點的最短路徑的長度;stress centrality考慮的是該節點出如今其餘兩節點之間的最短路徑上的次數;而本文討論的betweenness centrality考慮的是該節點出如今其餘兩節點之間的最短路徑上的比率。
定理:節點v出如今了節點s、t之間的某條最短路徑上當且僅當dG(s,t) = dG(s,v) + dG(v,t)
點對s、t對節點v的pair dependency爲δst(v) =σst(v)/σst;不妨將pair-dependency理解是對節點v重要性的一種度量,試想若是δst(v)等於1,那麼意味着節點s、t之間每條最短路徑都得通過節點v。若是從圖中撤掉節點v,那麼節點s、t之間最短路徑的長度就會增長。pair-dependency中的分子σst(v)能夠經過下式獲得:
因此若是結點v在節點s、t之間的某一條最短路徑上,那麼δst(v) = σst(v)/σst = σsv*σvt /σst。獲得了pair-dependency,經過下式計算betweenness centrality:
由此,betweenness centrality的計算只要分爲兩步:
第一步:計算各個點對之間最短路徑的長度和條數,用於計算pair-dependencies;
第二步:對於每一個節點,累積屬於本身的pair-dependencies。
實際中這兩步是交替進行的。對於每一個節點s,計算該結點到其餘節點的最短路徑和條數,記錄最短路徑上每一個節點的前哨節點,並按離源點s由遠及近的方式積累每一個點的pair-dependencies。
第一步:計算最短路徑的長度和條數
計算各個點對之間最短路徑的長度和條數可使用圖的遍歷算法。其中BFS和Dijkstra算法都能求單源最短路徑,過程都是從隊列中取出一節點做爲當前節點,再遍歷當前節點的相鄰結點,把他們標記爲已搜索,放進隊列中。
對於Ps(v)的定義 Ps(v) = { u∈V : (u,v)∈E , dG(s,v) = dG(s,u) + w(u,v) },咱們能夠獲得下式:
兩節點s,v之間最短路徑的條數等於節點s到各個v的前哨節點的最短路徑的條數之和。利用BFS求單源最短路徑時,則很容易獲得節點v的全部前哨節點:若是節點u的相鄰結點中包含節點v,且dG(s,u) + w(u,v) = dG(s,v) 或者當前dG(s,v) = -1(表示節點v以前未被搜索到過),那麼節點u就是節點v的一個前哨節點。
給定一個源點s,對於有向圖能夠在O(m+n log n)的時間內,計算s到其餘個點的σsx和dG(s,x)。對於無向圖,這個時間是O(m)。計算一個圖G中的全部σxx和dG(x,x),有向圖須要時間O(mn +n2 log n),無向圖須要時間O(mn)。
第二步:累積各個點的Pair Dependencies
節點s對節點v的依賴度(dependency)表示爲δs· (v):
若是節點s與節點v之間只有一條最短路徑,且節點v是節點w的前哨節點,那麼
通常的,節點s與節點v之間有多條最短路徑,則上式變爲:
前一種狀況假設節點s與節點v之間只有一條最短路徑,理解起來比較簡單。下面咱們來證實第二種比較通常的狀況。在證實以前先定義δst(v,e) =σst(v,e)/σst,其中σst(v,e) 表示圖G中兩節點s,t之間的全部最短路徑中通過節點v和邊e的條數。則
其中可能較難理解的是第二個等號,個人理解是若節點v在兩節點s,t之間的某條最短路徑上,那麼必定存在節點w使v∈Ps(w),固然有可能w就是t。同時咱們能夠獲得:
對於t!=w的狀況,σst(w)/σst表示節點w在兩節點s,t之間的某條最短路徑上,同時σsv/σsw表示該路徑是經過節點v到達的節點w,因此(σsv/σsw)*( σst(w)/σst)表示的是節點w跟其前哨節點v都在兩節點s,t之間的某條最短路徑上。根據以上兩式咱們獲得:
實現
無向圖中計算Betweenness Centrality的僞代碼:
能夠證實,在無向圖中,該算法的時間複雜度是O(nm),所需的空間是O(n+m)。
Betweenness Centrality 計算的詳細介紹參見《A Faster Algorithm for Betweenness Centrality》,上述僞代碼的Python實現參見 BetweennessCentrality.py。