Biconnectivity is one of the most fundamental graph problems. The canonical parallel biconnectivity algorithm is the Tarjan-Vishkin algorithm, which has $O(n+m)$ optimal work (number of operations) and polylogarithmic span (longest dependent operations) on a graph with $n$ vertices and $m$ edges. However, Tarjan-Vishkin is not widely used in practice. We believe the reason is the space-inefficiency (it generates an auxiliary graph with $O(m)$ edges). In practice, existing parallel implementations are based on breath-first search (BFS). Since BFS has span proportional to the diameter of the graph, existing parallel BCC implementations suffer from poor performance on large-diameter graphs and can be even slower than the sequential algorithm on many real-world graphs. We propose the first parallel biconnectivity algorithm (FAST-BCC) that has optimal work, polylogarithmic span, and is space-efficient. Our algorithm first generates a skeleton graph based on any spanning tree of the input graph. Then we use the connectivity information of the skeleton to compute the biconnectivity of the original input. All the steps in our algorithm are highly-parallel. We carefully analyze the correctness of our algorithm, which is highly non-trivial. We implemented FAST-BCC and compared it with existing implementations, including GBBS, Slota and Madduri's algorithm, and the sequential Hopcroft-Tarjan algorithm. We ran them on a 96-core machine on 27 graphs, including social, web, road, $k$-NN, and synthetic graphs, with significantly varying sizes and edge distributions. FAST-BCC is the fastest on all 27 graphs. On average (geometric means), FAST-BCC is 5.1$\times$ faster than GBBS, and 3.1$\times$ faster than the best existing baseline on each graph.
翻译:双连接是最基本的图形问题之一。 双连接算法是塔里扬- 维什金算法, 它在使用美元脊椎和美元边缘的图形上拥有美元( n+m) 的最佳工作( 运行数量) 和多对数跨度( 长期依赖操作) 。 然而, 塔里扬- Vishkin 在实践中没有广泛使用。 我们认为, 原因是空间效率低( 它产生一个以美元为边缘的辅助图形 ) 。 实际上, 现有的平行执行基于呼吸- 第一次搜索( BFS ) 。 由于 BFS 与图形直径成比例, 现有的双对齐( 以美元为单位) 最佳工作( 以美元为单位 ) 。 我们用的是 塔里特· 基( 美元) 平流- 平流数据, 包括我们目前运行的直径直的直通数据 。 我们用的是直通的直通数据, 直通的直通度( ) 直径) 和直径直径( 直径) 直径) 直径直通( ) 直径) 直径( 直径) 和直径) 直径) 。 我们用的是, 我们用的是, 平方- 直方- 直- 直- 直- 直- 直方- 直方- 平方- 直- 直方- 直方- 平方- 直- 直- 直- 直- 平方- 直- 直- 根基- 根基- 。