この記事は アドベントカレンダー2023 2 日目の記事です。
きのう :
みなさん, 論文読んでますか?
論文読んでまとめて入門記事を作って、競プロに新しい風を吹かせて欲しいんですが…
FPS や Monge のようにマトロイドやその他色々な分野についてすべてをまとめてブログにしてくれる人が必要という話になった
— tatyam (@tatyam_prime) November 26, 2023
今日は研究をしていたらおもしろいのを見つけて, しかも短いのでここにまとめておきます.
論文の本質が 1 ページくらいしかなく, とても短い!
みなさんも読んでみてはいかがでしょうか?
問題 : 最小全域木問題
連結無向グラフ と辺重み が与えられる.
辺集合の部分集合 であって が木になるもののうち, 辺重みの和 が最小のものを求めよ.
アルゴリズム
より実用的・単純になるように整理したものがこちらになります.
パラメータ を取る. (後で適当な大きさに決定する.)
前処理
頂点 に隣接する辺の集合を とする. を辺重み で ざっくりソート する.
ざっくりソート とは, を要素数 以下のいくつかのグループに分け, グループ内はソートされていなくても良いが, グループの間ではソートされているようにすること.
分けたグループを とすると,
クイックソートを途中でやめるとできる. 時間, 全体で 時間.
ブルーフカ法
ブルーフカ法をやる. 以下を全頂点が連結になるまで (最大 回) 行う.
- であるような各頂点 について, のうち辺の両端の頂点がまだ連結でない辺のうち, 重みが最小のものを見つける.
- これは償却 時間でできる. 最も辺重みが小さいグループについて, すでに両端が連結であるような辺を Union-Find で判定して取り除いたあと, 重みが最小の辺を線形探索する. すべての辺が削除されてしまった場合は, 次に辺重みが小さいグループを取り出し, これを繰り返す.
- この情報を集約し, 各連結成分についてそこから出る最も重みの小さい辺を見つけ, それらを採用して Union-Find に入れる.
であるような頂点のリストを管理しておくことで 時間のパートがなくなり, 全体で, 時間になる.
計算量
前処理が 時間, ブルーフカ法が 時間であるから, とすれば合わせて 時間.
なんかまだ計算量を減らす余地がありそう
はい. 時間になります. その分複雑になっていて実用的ではなさそうですが…
実装
誰か書いて計測して ♥️
ソートって高速なので, クラスカル法との区別はかなり大変. AVX512 sort とかあるし, ソート部分にかかる時間とソート以外の部分にかかる時間が同じくらいとかなりかねない
リストのリストは遅いから, CSR 形式にして…
少なくとも は必要かな〜
あした : @H1rono_K さんが書いてくれるらしいです! :tanosimi-: