承接自上文。本文大部分材料来自SIGMOD 19年Tamer Ozsu老师的一篇论文1。
图分割算法的特性罗列如下(截图自原文):
流式图分割 (SGP: Streaming Algorithms for Graph Partitioning)
流式图分割在2012年KDD的一篇文章中给出了定义2。有别于传统的图分割,流式图分割一次处理部分图数据,并对于拿到的部分图数据分配到各个节点当中,之后不再迁移已经分配好的数据。所以流式图分割有几个优点:1)可以处理很大的图,理论上只要集群可以容纳,那么就可以处理多大的图。2)一般只加载一次图。3)相比于基于哈希的分配方式,可以有效的保留部分图的性质,进而提升算法性能。
图分割类型
图的分割按点边不同可以分成点分割(vertex-cut)和边分割(edge-cut)两种。直观就是从点切开还是从边切开,从点切开那么就是同一个点可能在多个节点当中存在多份镜像/拷贝。从边切开,那么一条边就有可能存在两个分区当中。
→ \rightarrow → 点分割(侵删):
→ \rightarrow → 边分割(侵删):
- 对于点分割来说,目标函数一般是要复制因子尽可能的小,就是不同节点中拷贝的点尽可能的少。
C ( P t ) = ∑ u ∈ V ∣ A ( u ) ∣ ∣ V ∣ C(P^t) = \frac{\sum\limits_{u\in V}|A(u)|}{|V|} C(Pt)=∣V∣u∈V∑∣A(u)∣
a. A ( u ) A(u) A(u)表示点 u u u出现在的分区集合。 ∣ A ( u ) ∣ |A(u)| ∣A(u)∣表示 u u u总共出现在几个分区中。
b. P t P^t Pt表示 t t t时刻的分区状态。
c. C ( P t ) C(P^t) C(Pt)表示 P t P^t Pt当前的复制因子。
- 对于边分割来说,目标函数一般是要割(cut)尽可能的小,因为cut越小,那么一般来说通讯的代价也相应会比较小。遗憾的是Minimum k-cut的复杂度是NPC的,当图分割成k份,k是作为输入时。(注:有 O ( ∣ V ∣ k 2 ) O(|V|^{k^2}) O(∣V∣k2)复杂度的算法。wiki: Minimum k-cut)。
C ( P t ) = ∑ ( u , v ) ∈ E