マップに関する処理を集めたユーティリティモジュール.
Copyright (c) 2017 DWANGO Co., Ltd. All Rights Reserved.
any_error() = {error, term()}
graph(V) = #{V => [V]}
vertex() = term()
vertex_not_found() = {error, {vertex_not_found, vertex()}}
dfs_post_order/3 | 有向グラフに対してpost-orderedな深さ優先探索を行う. |
graph_with_vertices/2 | map で表現されたグラフに、存在しない頂点を追加する. |
VertexFun = fun((vertex(), [VertexFunOK]) -> VertexFunRet)
VertexFunRet = VertexFunOK | any_error()
VertexFunOK = term()
DFSRet = VertexFunRet | vertex_not_found()
Graph
: map
形式で格納されたグラフ.RootVertex
: 探索を開始する頂点.VertexFun
: 訪れた頂点を処理する関数.
有向グラフに対してpost-orderedな深さ優先探索を行う.
Graph
は始点=>[終点のリスト]
という要素を持つmap
で頂点間の接続関係が記述されている.
一度訪問した頂点は訪問対象から除外されるため,結果として行われるのは,
RootVertex
から到達可能なサブグラフから得られるスパニングツリーに対する探索となる.
post-orderedな探索であるため,葉から先に探索され,次に共通の先祖へと遡ってゆく.
探索された頂点に対しては順次VertexFun
が適用される.
兄弟関係にある頂点について適用されたVertexFun
の戻り値はlist
でコレクションされ,
親の頂点に適用されるVertexFun
の第二引数へと渡される.
時間計算量: O(|E|+|V|log|V|), |E|:枝の数, |V|:頂点の数
空間計算量: O(|V|), |V|:頂点の数
Graph
: map
形式で格納されたグラフ.Vertices
: 追加したい頂点のリスト.
map
で表現されたグラフに、存在しない頂点を追加する.
Graph
は頂点=>[頂点のリスト]
という要素を持つmap
で頂点間の接続関係が記述されている.
追加する頂点は,Vertices
としてリストの形で渡す.
Graph
が既に持っている頂点は追加しない.
時間計算量: O(|V|log|Vall|), |V|:追加しようとしている頂点の数, |Vall|:すべての頂点の数
空間計算量: O(|Vall|), |Vall|:すべての頂点の数