noshi91のメモ

データ構造のある風景

周期関数の極小点を求めるアルゴリズム

定義

 f: \mathbb{Z} \to \mathbb{R}, ~ p \in \mathbb{Z} _ {\gt 0} \forall x. ~ f(n) = f(n + p) を満たすとする。  n を与えると  f(n) \mathrm{O} (1) の時間計算量で取得できるとして、 f(n - 1) \geq f(n), ~ f(n) \leq f(n + 1) を満たす  n \Theta(\log ( p ) ) の時間計算量で求めるアルゴリズムが存在する。

アルゴリズム

一般の数列を三分探索すると極小点が求まるとは限らない - noshi91のメモ

上記の記事の後半で紹介しているアルゴリズムを、 (l, m, r) := (0, p, 2p) で初期化して、 f に対して適用すればよい。

実用例

 2 次元平面上に点群があり、ベクトル  v の方向に最も遠い点を求めることを考える。 点群の凸包を  P、その頂点を順に  a _ 1, a _ 2, \dots として  f(n) := v \cdot a _ n と定義する。  f P の頂点数を周期とする関数であり、 f の極大点が求める点である。