LeetCode Weekly Contest 146のQ4でN個の点の3次元マンハッタン距離の最大値を求める問題が出たのでメモ。
内容的には
を理解する過程で噛み砕いたものなので、上記記事を既読の方は本稿を読むには及ばない。
MathJaxの不具合なのか、の下に
が書けなかったので
で代用。
2次元の場合
例題
N個の点の二次元座標が与えられ、2点
間のマンハッタン距離
を考えた時、マンハッタン距離の最大値を求めよ。
愚直にやると全てのペア(組ある)について距離を算出することになって計算量は
(kは次元数=2)になり、
のような制約だと時間内に解くことができない。
という写像を考える。
$$ \begin{align}
&ManhattanDistance( (x_i,y_i), (x_j,y_j) ) \\
&= |x_i-x_j| + |y_i-y_j| \\
&= \max(x_i-x_j, x_j-x_i) + \max(y_i-y_j, y_j-y_i) ) \\
&= \max( (x_i-x_j)+(y_i-y_j), (x_i-x_j)+(y_j-y_i), (x_j-x_i)+(y_i-y_j), (x_j-x_i)+(y_j-y_i) ) ) \\
&= \max( (x_i+y_i)-(x_j+y_j), (x_i-y_i)-(x_j-y_j), (-x_i+y_i)-(-x_j+y_j), (-x_i-y_i)-(-x_j-y_j) ) ) \\
&= \max( \max( (x_i-y_i)-(x_j-y_j), (-x_i+y_i)-(-x_j+y_j) ), \max( (x_i+y_i)-(x_j+y_j), (-x_i-y_i)-(-x_j-y_j) ) ) \\
&= \max( |(x_i-y_i)-(x_j-y_j)|, |(x_i+y_i)-(x_j+y_j)| ) \\
&= ChebyshevDistance( (x_j-y_j, x_j-y_j), (x_i+y_i, x_i+y_i) ) \\
&= ChebyshevDistance( f(x_i,y_i), f(x_j,y_j) )
\end{align} $$
ここで
チェビシェフ距離(Chebyshev distance;
距離)
= 各座標の差(の絶対値)の最大値を2点間の距離とする
チェビシェフ距離 - Wikipedia
の各成分を
と表すとして
$$ \begin{align}
&\max_{i,j\in N,i\neq j} ManhattanDistance( (x_i,y_i), (x_j,y_j) ) \\
&= \max_{i,j\in N,i\neq j} ChebyshevDistance( f(x_i,y_i), f(x_j,y_j) ) \\
&= \max_{d\in{0,1}} \max_{i,j\in N,i\neq j} |f(x_i,y_i)_d - f(x_j,y_j)_d| \\
&= \max_{d\in{0,1}} ( \max_{i\in N} f(x_i,y_i)_d - \min_{i\in N} f(x_i,y_i)_d )
\end{align} $$
N個の点をfで射影した先で、各軸における最大値と最小値の差を求め、その差の(全次元の)最大値が求める答えとなる。計算量もに抑えることができた。
このfでの射影は45度の回転(※倍の拡大を伴っている)に対応している。
いわゆる「マンハッタン距離は45度回転させて考える」というやつである。
3次元以上の場合
2次元の場合と同様に、次元空間の2点間のマンハッタン距離は
次元でのチェビシェフ距離に置き換えることができる。
次元空間のN個の点の座標を
次元の空間に射影する写像fを考える
も正負を取ると
次元なのだけれど、
の項の負号が-になるものは
の項の負号が+になるものの正負をひっくり返しただけのものと1:1で対応していて、最大値と最小値の差の絶対値を取る用途では同じになるので節約のため+になる方で代表させる。(
が負の項も入れて
次元にしても計算量や使用メモリ量が2倍になる以外の問題はない)
- 3次元の場合:
- このとき
が言えることを利用する。
だとこんな感じ:
$$ \begin{align}
& ManhattanDistance( (x_0,y_0,z_0), (x_1,y_1,z_1) ) \\
\ \ \ \ &=|x_0-x_1|+|y_0-y_1|+|z_0-z_1| \\
&= \max (x_0-x_1,x_1-x_0) + \max (y_0-y_1,y_1-y_0) + \max (z_0-z_1,z_1-z_0) \\
&= \max ( (x_0-x_1) + (y_0-y_1) + (z_0-y_1), \\
& \ \ \ \ (x_0-x_1) + (y_0-y_1) - (z_0-y_1), \\
& \ \ \ \ (x_0-x_1) - (y_0-y_1) + (z_0-y_1), \\
& \ \ \ \ (x_0-x_1) - (y_0-y_1) - (z_0-y_1), \\
& \ \ \ \ -(x_0-x_1) + (y_0-y_1) + (z_0-y_1), \\
& \ \ \ \ -(x_0-x_1) + (y_0-y_1) - (z_0-y_1), \\
& \ \ \ \ -(x_0-x_1) - (y_0-y_1) + (z_0-y_1), \\
& \ \ \ \ -(x_0-x_1) - (y_0-y_1) - (z_0-y_1) ) \\
&= \max ( (x_0+y_0+z_0) - (x_1+y_1+z_1), \\
& \ \ \ \ (x_0+y_0-z_0) - (x_1+y_1-z_1), \\
& \ \ \ \ (x_0-y_0+z_0) - (x_1-y_1+z_1), \\
& \ \ \ \ (x_0-y_0-z_0) - (x_1-y_1-z_1), \\
& \ \ \ \ (-x_0+y_0+z_0) - (-x_1+y_1+z_1), \\
& \ \ \ \ (-x_0+y_0-z_0) - (-x_1+y_1-z_1), \\
& \ \ \ \ (-x_0-y_0+z_0) - (-x_1-y_1+z_1), \\
& \ \ \ \ (-x_0-y_0-z_0) - (-x_1-y_1-z_1) ) \\
&= \max ( \max ( (x_0+y_0+z_0) - (x_1+y_1+z_1), (-x_0-y_0-z_0) - (-x_1-y_1-z_1) ), \\
& \ \ \ \ \max ( (x_0+y_0-z_0) - (x_1+y_1-z_1), (-x_0-y_0+z_0) - (-x_1-y_1+z_1) ), \\
& \ \ \ \ \max ( (x_0-y_0+z_0) - (x_1-y_1+z_1), (-x_0+y_0-z_0) - (-x_1+y_1-z_1) ), \\
& \ \ \ \ \max ( (x_0-y_0-z_0) - (x_1-y_1-z_1), (-x_0+y_0+z_0) - (-x_1+y_1+z_1) ) ) \\
&= \max ( |(x_0+y_0+z_0) - (x_1+y_1+z_1)|, \\
& \ \ \ \ |(x_0+y_0-z_0) - (x_1+y_1-z_1)|, \\
& \ \ \ \ |(x_0-y_0+z_0) - (x_1-y_1+z_1)|, \\
& \ \ \ \ |(x_0-y_0-z_0) - (x_1-y_1-z_1)| ) \\
&= ChebyshevDistance( (x_0+y_0+z_0,...,x_0-y_0-z_0), (x_1+y_1+z_1,...,x_1-y_1-z_1) ) \\
&= ChebyshevDistance( f(x_0,y_0,z_0), f(x_1,y_1,z_1) ) \\
\end{align} $$
N個の点の全ペアについてのマンハッタン距離の最大値
= N個の点の全ペアについての次元空間上でのチェビシェフ距離の最大値
$$ \begin{align}
& \max_{i,j\in N,i\neq j} ManhattanDistance({\mathbf x}_i, {\mathbf x}_j) \\
&= \max_{i,j\in N,i\neq j} ChebyshevDistance( f({\mathbf x}_i),f({\mathbf x}_j) ) \\
&= \max_{i,j\in N,i\neq j} \max_{d\in 2^k/2} |f({\mathbf x}_i)_d - f({\mathbf x}_j)_d| \\
&= \max_{d\in 2^k/2} \max_{i,j\in N,i\neq j} |f({\mathbf x}_i)_d - f({\mathbf x}_j)_d| \\
&= \max_{d\in 2^k/2} ( \max_{i\in N} f({\mathbf x}_i)_d - \min_{i\in N} f({\mathbf x}_i)_d ) \\
\end{align} $$
N個の点を次元空間に射影して、
次元各軸での最大値と最小値の差を求める。
それらの差の最大値が求める値である。
計算量は写像を求める部分が、最大値を求める部分が
なので全体では
となる。