Skip to content

Repository files navigation

様々なアルゴリズムの実装例

データ構造や数論的アルゴリズムまで、様々な分野のアルゴリズムたちを C++23 で実装しています。
アルゴリズム系の研究開発において計算機実験が必要になる場面や、 プログラミングコンテストに参加する場面などを想定して、 「実装例」または「ライブラリ」として使用することを念頭に置いています。

目次

分類 内容 具体例
DATA STRUCTURE : BASIC 基礎的なデータ構造 Union-Find など
DATA STRUCTURE : SEGMENT 区間クエリに強いデータ構造 セグメント木、BIT など
DATA STRUCTURE : ADVANCED その他の高度なデータ構造 永続データ構造など
GEOMETRY 計算幾何 円の交点など
GRAPH グラフアルゴリズム 強連結成分分解など
MATH : LINEAR ALGEBRA 線形代数アルゴリズム 行列計算など
MATH : POLYNOMIAL 多項式・FPS アルゴリズム 多項式補間、FPS 合成など
MATH : COMBINATORICS 組合せ論的アルゴリズム modint、Nim など
MATH : NUMBER THEORY 整数論的アルゴリズム 素因数分解、最大公約数など
NETWORK FLOW ネットワークフローアルゴリズム Ford-Fulkerson 法など
OPTIMIZATION 最適化のアルゴリズム 動的計画法など
SEARCH 探索のアルゴリズム 全探索, 二分探索など
STRING 文字列アルゴリズム Suffix Array、KMP 法など
TREE 木上のデータ構造とアルゴリズム Euler ツアー、木の直径など
OTHERS その他 xorshift、サイコロなど

難易度表記の目安

  • (★☆☆☆):一般教養、NoviSteps グレード基準で 2Q 以下相当
  • (★★☆☆):初等典型、NoviSteps グレード基準で 1Q, 1D 相当
  • (★★★☆):中堅典型、NoviSteps グレード基準で 2D, 3D 相当
  • (★★★★):高度典型、NoviSteps グレード基準で 4D 以上相当

 

基礎的なデータ構造 (DATA STRUCTURE : BASIC)

Union-Find など、基礎的なデータ構造の実装です。

Union-Find

ヒープ・キュー

ハッシュ・ハッシュテーブル

順序付き集合

その他

 

区間系データ構造 (DATA STRUCTURE : SEGMENT)

セグメント木や BIT など、区間クエリに強いデータ構造の実装です。

セグメント木

さまざまなセグメント木

BIT (Binary Indexed Tree)

セグメント木・BIT の応用

Sparse Table

ウェーブレット行列

Splay 木

  • (★★★★) Splay 木
  • (★★★★) 遅延伝播反転可能 Splay 木

赤黒木

  • (★★★★) 赤黒木

その他平衡二分探索木

  • (★★★★) RBST
  • (★★★★) Treap
  • (★★★★) AVL 木
  • (★★★★) 遅延伝播反転可能 RBST
  • (★★★★) 遅延伝播反転可能 Treap

 

高度なデータ構造 (DATA STRUCTURE : ADVANCED)

その他の高度なデータ構造の実装です。

高度なヒープ

  • (★★★★) Skew Heap (マージ可能ヒープ)
  • (★★★★) Paring Heap (マージ可能ヒープ)
  • (★★★★) Radix Heap
  • (★★★★) Fibonacci Heap

動的データ構造

  • (★★★★) 動的 bitset
  • (★★★★) 動的 Union-Find
  • (★★★★) 動的セグメント木
  • (★★★★) 動的二次元セグメント木
  • (★★★★) 動的 BIT
  • (★★★★) 動的二次元 BIT
  • (★★★★) 動的ウェーブレット行列

並列データ構造

永続データ構造

  • (★★★★) 永続配列
  • (★★★★) 永続 queue
  • (★★★★) 永続セグメント木
  • (★★★★) 完全永続 Union-Find
  • (★★★★) 永続赤黒木

その他

  • (★★★☆) 根付き木のハッシュ
  • (★★★★) 領域 Union-Find
  • (★★★★) Dynamic Connectivity

 

幾何 (GEOMETRY)

幾何アルゴリズムです。

基本要素

点, 線分, 三角形などの位置関係

射影, 交差判定, 距離

直線や円の交点

多角形

ボロノイ図

三次元幾何

その他

  • (★★☆☆) 垂直二等分線
  • (★★★☆) 最近点対
  • (★★★☆) 線分併合
  • (★★★☆) 線分アレンジメント
  • (★★★☆) 双対変換
  • (★★★★) kd 木

 

グラフ (GRAPH)

グラフアルゴリズムです

グラフ

グラフ探索

連結成分分解

最短路問題

全域木, 路

グラフ上の指数時間アルゴリズム

一般グラフのマッチング

その他

 

線形代数 (MATH : LINEAR ALGEBRA)

行列計算など、線形代数に関するアルゴリズムです

体上の行列

環上の行列

行列式

F2 体上の線形代数

その他の行列アルゴリズム

  • (★★★★) Strassen 法
  • (★★★★) 余因子行列
  • (★★★★) 多項式行列の prefix product M(0)M(1)...M(K-1)
  • (★★★★) ハフニアン (完全マッチングの個数に帰着)
  • (★★★★) パフィアン

さまざまな行列

  • (★★★★) Black Box Linear Algebra (行列式計算 in O(N^2 + N T(N)))
  • (★★★★) 巡回行列 (行列式計算 in O(N^2))
  • (★★★★) 上三角 Toeplitz 行列 (行列式計算 in O(N^2))
  • (★★★★) K 重対角行列 (行列式計算 in O(NK^2))
  • (★★★★) 二項係数行列の作用
  • (★★★★) スターリング数行列の作用

 

多項式・FPS (MATH : POLYNOMIAL)

多項式や FPS に関するアルゴリズムです

FFT, NTT, Convolution

形式的冪級数 (FPS)

FPS のアルゴリズム

さまざまな FPS

  • (★★★★) オンライン FPS
  • (★★★★) 多変数 FPS

多項式の基底変換

多項式のアルゴリズム

さまざまな値の高速計算

  • (★★★★) 自然数の k 乗和 (Faulhaber の公式)
  • (★★★★) Σ{i=0}^{n-1} r^i i^d
  • (★★★★) Σ{i=0}^{∞} r^i i^d
  • (★★★★) Σ{i=0}^{n-1} a^i f(i)
  • (★★★★) N! mod P (by FPS, O(√P log P))
  • (★★★★) Tetration
  • (★★★★) 二項係数の prefix sum の多点評価
  • (★★★★) Karatsuba 法

 

組合せ (MATH : COMBINATORICS)

数え上げなど、組合せ数学に関するアルゴリズムです。

Modint

二項係数

写像12相

その他の数

  • (★★★☆) ベルヌーイ数
  • (★★★☆) モンモール数

集合冪級数 (SPS)

ゲーム

  • (★★☆☆) Nim
  • (★★☆☆) Grundy 数
  • (★★★★) Nim Product
  • (★★★★) Grundy 数と多項式環の変換
  • (★★★★) 超現実数

その他

  • (★★☆☆) LIS and LDS
  • (★★★★) プリューファーコード
  • (★★★★) 半環

 

整数 (MATH : NUMBER THEORY)

整数論的アルゴリズムです。

約数, 倍数

modpow, modinv

素数

原始根, 位数, 離散対数

エラトステネスの篩

乗法的関数

  • (★★☆☆) Euler のトーティエント関数
  • (★★★★) Euler のトーティエント関数の和
  • (★★★★) 高速ゼータ変換:約数倍数関係
  • (★★★★) 添字 GCD Convolution
  • (★★★★) 添字 LCM Convolution
  • (★★★★) Multivariate Multiplication
  • (★★★★) 乗法的関数の列挙
  • (★★★★) 乗法的関数の prefix sum の列挙
  • (★★★★) 無平方数の個数
  • (★★★★) N 以下の素数の個数 (O(N^{2/3}))

方程式

多倍長整数

有理数

  • (★★★☆) 有理数
  • (★★★☆) Stern-Brocot 木
  • (★★★★) Enumerate Convex
  • (★★★★) Enumerate Quotients

その他

   

ネットワークフロー (NETWORK FLOW)

ネットワークフロー関連のアルゴリズムです。

最大流

最小カット

最小費用流

b-flow

二部マッチング

  • (★★★☆) 二部マッチング (Hopcroft-Karp 法, in O(E√V))
  • (★★★☆) 重み付き二部マッチング (Hungarian 法)
  • (★★★★) 二部マッチングの bitset 高速化
  • (★★★★) アンバランス重み付き二部マッチング (in O((K^2 log N + K^3)N))

二部マッチングの応用

劣モジュラ関数のグラフ表現

series-parallel グラフ上の最小費用流の slope trick 帰着

  • (★★★☆) 2 端子 + Line グラフ上の最小費用流

最小費用流の応用

 

最適化 (OPTIMIZATION)

最適化に関するアルゴリズムです。

動的計画法

制約付き最適化

区分線形凸関数の活用 1 : Convex Hull Trick

区分線形凸関数の活用 2 : Slope Trick

区分線形凸関数の活用 3 : Min Plus Convolution

  • (★★★☆) Min Plus Convolution (凸と凸)
  • (★★★★) Min Plus Convolution (凸と任意)
  • (★★★★) Min Plus Convolution (凹と任意)
  • (★★★★) Axiotis-Tzamos Knapsack

行最小値問題・単一始点最短路問題

Monge 最短路問題

その他 Monge 性, L 凸性

  • (★☆☆☆) Monge 性の判定 (in O(NM))
  • (★★★☆) Monge 行列の積 (in O(N^2))
  • (★★★☆) Monge 行列の min-plus 合成 (in O(N^2))
  • (★★★☆) Monge 性 & 単調性を満たす区間 DP の Knuth-Yao Speedup (in O(N^2))
  • (★★★★) Monge Convex Hull Trick (by Li Chao Tree, in O(log N))

マトロイド, M 凸性

  • (★★★☆) マトロイド上の Greedy 法
  • (★★★★) マトロイド交差

 

探索 (SEARCH)

探索に関するアルゴリズムです。

さまざまな全探索

SAT

  • (★★★☆) 2-SAT
  • (★★★★) SAT Solver

ヒューリスティック探索

  • (★★★☆) α-β 探索
  • (★★★☆) 焼き鈍し法
  • (★★★☆) A*
  • (★★★☆) IDA*

指数時間アルゴリズム

  • (★★★★) Set Cover
  • (★★★★) k-Cover (O(2^N N))
  • (★★★★) k-partition (O(2^N N^3))

 

文字列 (String)

文字列アルゴリズムです。

構文解析

文字列検索

Suffix Array

さまざまな文字列アルゴリズム

さまざまな文字列データ構造

  • (★★★☆) Trie 木
  • (★★★★) Palindromic 木 (AOJ 2292)

有名問題

その他

 

木 (Tree)

木上のクエリに答えるデータ構造や、木に関する問題を解くアルゴリズムの実装です

木の亜種 (Functional Graph など)

木 DP

Euler Tour

HL 分解

重心分解

Link-Cut 木

  • (★★★★) Link-Cut 木
  • (★★★★) 部分木加算 (by Link-Cut 木)
  • (★★★★) 遅延伝播 Link-Cut 木

toptree

  • (★★★★) toptree

さまざまな木

  • (★★★☆) Union-Find のマージ過程を表す木
  • (★★★☆) Cartesian Tree
  • (★★★☆) Auxiliary Tree
  • (★★★☆) Inclusion Tree

その他の問題

 

その他 (OTHERS)

その他のアルゴリズムです

入出力

グリッド

不等式の処理

ソート

その他

 

コードテンプレート

 

License

These codes are licensed under CC0. CC0

About

Implementation of various algorithms

Resources

Stars

276 stars

Watchers

15 watching

Forks

Releases

Packages

Contributors

Languages