Try   HackMD

[Monge まとめ①] Monge 性とは?

まえがき

LARSCH の読んだので解説記事を書こうと思ったが、説明が難しくてなかなか書けない…
Monge を理解していきたいので Monge の記事を書きます。
完全に理解しているわけではないのでご了承ください。

Monge の読み方

もんげ〜 と読みます。嘘です。

Monge の定義

実数からなる

N×M 行列について考えます。

N×M 行列
A
が Monge であるとは、以下の条件が成り立つことをいう。

  • 1i1<i2N
    および
    1j1<j2M
    を満たすすべての整数の組
    (i1,i2,j1,j2)
    について、
    Ai1,j1+Ai2,j2Ai1,j2+Ai2,j1
    である。

ABC224-B Mongeness

上三角 / 下三角 バージョンもよくでてきますね。

上三角バージョン

N×N 行列
A
は 上三角 (
i>j
ならば無効値) であるものとする。このとき、上の条件は以下のように言い換えられる。

  • 1i1<i2j1<j2N
    を満たすすべての整数の組
    (i1,i2,j1,j2)
    について、
    Ai1,j1+Ai2,j2Ai1,j2+Ai2,j1
    である。

これは、無効値の部分を Monge になるように適当な値で埋め、さらに十分大きな定数

INF を用いて、無効値だった部分
(i>j)
の各要素に
INF×(ij)
を加算すれば、通常の Monge として解釈できます。

つまり、右上や左下の一部分を無効値にしても Monge 性には問題がないということです。

(右下や左上だとうまくいかないことに注意しましょう。)

何につかえるの?

  • N×M
    行列
    A
    が Monge であるとき、各行の最小値を
    O(N+M)
    で求められます。
  • N
    頂点のグラフがあり、頂点
    i
    から頂点
    j
    (i<j)
    に移動するコストが
    Ai,j
    であるとします。
    A
    が Monge であるとき、単一始点最短路が
    O(N)
    で求められます。
  • A
    が Monge かつ単調 (区間が長いほど大きい) であるとき、区間 DP
    dp[i][j]=mini<k<j{dp[i][k]+dp[k][j]}+Ai,j
    O(N2)
    で計算できます。
  • ほかいろいろ

Monge のおきもち

私なりの理解です。

ちょっと式変形してみましょう。

Ai1,j1+Ai2,j2Ai1,j2+Ai2,j1Ai2,j2Ai2,j1Ai1,j2Ai1,j1

ここで、

Ai2,j2Ai2,j1 とは、「区間
[i2,j1]
の左端を固定し、右端を
j1j2
と広げたときのコストの増分」と解釈できます。
Ai1,j2Ai1,j1
も同様に、「区間
[i1,j1]
の左端を固定し、右端を
j1j2
と広げたときのコストの増分」と解釈できます。

したがってこの式は、「右端を

j1j2 と広げたときのコストの増分」は、元々の区間
[i,j1]
が長いほど大きい
ことを表しています。

つまり、こうです。

Ai,j2Ai,j1Ai1,j2Ai1,j1Ai2,j2Ai2,j1Ai3,j2Ai3,j1


左端を広げる場合も同様です。

Ai1,j1+Ai2,j2Ai1,j2+Ai2,j1Ai1,j1Ai2,j1Ai1,j2Ai2,j2

とすれば、「左端を

i2i1 と広げたときのコストの増分」は、元々の区間
[i2,j]
が長いほど大きい
ことも表しています。

つまり、こうです。

Ai1,jAi2,jAi1,j+1Ai2,j+1Ai1,j+2Ai2,j+2Ai1,j+3Ai2,j+3

同値な条件

これをふまえると、以下の同値な条件がわかります。

N×M 行列
A
が Monge であるとは、以下の条件が成り立つことをいう。

  • 1i<i+1N
    および
    1j<j+1M
    を満たすすべての整数の組
    (i,j)
    について、
    Ai,j+Ai+1,j+1Ai+1,j+Ai,j+1
    である。

証明

Ai1,j1+Ai2,j2Ai1,j2+Ai2,j1 の方を (A) 、
Ai,j+Ai+1,j+1Ai+1,j+Ai,j+1
の方を (B) とします。
(A)
(B) は明らかなので、(B)
(A) を示せばよいです。

(B) を

Ai+1,j+1Ai,j+1Ai+1,jAi,j と変形すると、

Ai+1,j2Ai,j2Ai+1,j21Ai,j21Ai+1,j1+1Ai,j1+1Ai+1,j1Ai,j1

より

Ai+1,j2+Ai,j1Ai+1,j1+Ai,j2 です。
また、これを
Ai+1,j2Ai+1,j1Ai,j2Ai,j1
と変形すると、

Ai2,j2Ai2,j1Ai21,j2Ai21,j1Ai1+1,j2Ai1+1,j1Ai1,j2Ai1,j1

より

Ai1,j1+Ai2,j2Ai1,j2+Ai2,j1 が示せました。

Monge 行列の性質

転置しても Monge

定義の

i,j が対称な形なので、
i,j
を入れ替えれば転置しても Monge であることがわかります。

部分行列も Monge

Monge 行列

A から、任意に行を
0
本以上削除し、任意に列を
0
本以上削除した行列
A
を考えると、これも Monge です。

定義が、

A から任意の
2
2
列を取り出すと
Ai1,j1+Ai2,j2Ai1,j2+Ai2,j1
である という形なので、
A
から取り出しても成り立ちます。

Monge ならば totally monotone

まずは monotone から定義していきましょう。

monotone

行ベクトル

v に対して、
argmin(v)
min(v)=vj
なる
j
と定義する。ただし、同じ値が複数ある場合は適切に tie-break し、同じ値が存在しないようにする。これにより
min(v)=vj
なる
j
は一意に定まる。
N×M
行列
A
が monotone であるとは、以下の条件が成り立つことをいう。

  • argmin(A1)argmin(A2)argmin(AN)

totally monotone

N×M 行列
A
が totally monotone であるとは、以下の条件が成り立つことをいう。

  • A
    の任意の部分行列 (
    A
    から任意に行を
    0
    本以上削除し、任意に列を
    0
    本以上削除した行列) は monotone である。

部分行列にはいろいろな定義があるみたいなので、明示しておきます。

行列

A が行列
A
の部分行列であるとは、以下の条件が成り立つことをいう。

  • A
    から行を
    0
    本以上削除し、列を
    0
    本以上削除した結果
    A
    を作ることができる。

同値な条件

行を削除しても monotone の条件が緩くなるだけなので、行の削除は考えなくて良いです。

ある列番号の集合

J{1,2,,M} が存在して、
A
から
J
以外の列を削除した行列
A
が monotone でないと仮定します。
すなわち、ある
i
が存在して
argmin(Ai)>argmin(Ai+1)
ということです。

このとき、

j1=argmin(Ai+1)
j2=argmin(Ai)
2
列のみを取ってきても、
Ai,j1>Ai,j2
かつ
Ai+1,j1<Ai+1,j2
なので monotone になっていません。
したがって、以下の同値な条件がわかります。

N×M 行列
A
が totally monotone であるとは、以下の条件が成り立つことをいう。

  • 1i<i+1N
    および
    1j1<j2M
    を満たすすべての整数の組
    (i,j1,j2)
    について、行
    i,i+1
    と列
    j1,j2
    のみからなる部分行列が monotone
    (Ai,j1>Ai,j2Ai+1,j1>Ai+1,j2)
    である。

つまり…?

Ai,j1
Ai,j2
を比較し、

Ai,j1>Ai,j2 であった場合 :

Ai,j1>Ai,j2Ai+1,j1>Ai+1,j2Ai+2,j1>Ai+2,j2

Ai,j1<Ai,j2 であった場合 :

Ai,j1<Ai,j2Ai1,j1<Ai1,j2Ai2,j1<Ai2,j2

と、連鎖的に大小が定まります。

Monge ならば totally monotone

A
2×2
Monge 行列のとき、Monge
monotone を示します。

Monge なので

A2,2A2,1A1,2A1,1 です。このとき
argmin
がどうなるかを見ると、

条件
argmin(A1)
argmin(A2)
0<A2,2A2,1A1,2A1,1
1
1
A2,2A2,1<0<A1,2A1,1
1
2
A2,2A2,1A1,2A1,1<0
2
2

なので

A は monotone です。

A が一般の行列のとき、

Monge

任意の
2×2
部分行列が Monge
任意の
2×2
部分行列が monotone
totally monotone

なので、Monge ならば totally monotone です。

行の中に同じ値が存在する場合

A の各要素に列番号を付加 :
Ai,j(Ai,j,j)

をして、これの辞書順で大小を比較するようにすると、行の中で tie-break ができます。

A が Monge ならば、

Ai1,j1+Ai2,j2Ai1,j2+Ai2,j1(Ai1,j1+Ai2,j2,j1+j2)(Ai1,j2+Ai2,j1,j1+j2)(Ai1,j1,j1)+(Ai2,j2,j2)(Ai1,j2,j2)+(Ai2,j1,j1)

より列番号を付加した状態でも Monge で、totally monotone であることがわかります。

totally monotone だけど Monge でないという問題を見たことがないので、totally monotone と Monge は同じものだと思ってしまって良いです。(本当に?)

1 つの 行 / 列 に値を加算しても Monge

Monge の条件式

Ai1,j1+Ai2,j2Ai1,j2+Ai2,j1 において、行
i1
に定数
c
を加算しても、

(Ai1,j1+c)+Ai2,j2(Ai1,j2+c)+Ai2,j1

両辺に

c が足されるだけなので変わりません。同様に、列
j1
に定数
c
を加算しても、

(Ai1,j1+c)+Ai2,j2Ai1,j2+(Ai2,j1+c)

両辺に

c が足されるだけなので変わりません。

合成しても Monge

Monge 行列

ARN×M,BRM×K に対し、
Ci,j=mink{Ai,k+Bk,j}
で定義される行列
C
は Monge です。

任意の

i1<i2, j1<j2 に対して

Ci1,j1+Ci2,j2Ci1,j2+Ci2,j1

を示したいです。これは、任意の

k1,k2 に対しある
l1,l2
が存在して、

(Ai1,l1+Bl1,j1)+(Ai2,l2+Bl2,j2)(Ai1,k1+Bk1,j2)+(Ai2,k2+Bk2,j1)

と同値です。

k1k2 のとき、Monge 性より
Bk1,j1+Bk2,j2Bk1,j2+Bk2,j1
なので、
(l1,l2)=(k1,k2)
を選ぶと不等式が成立します。

k1k2 のとき、Monge 性より
Ai1,k2+Ai2,k1Ai1,k1+Ai2,k2
なので、
(l1,l2)=(k2,k1)
を選ぶと不等式が成立します。

Monge 行列の例

  • 下に凸 な関数
    f:ZR
    に対し、
    Ai,j=f(ji)
    で定義される行列
    A
    は Monge です。

Ai,j+Ai+1,j+1Ai,j+1Ai+1,j=2f(ji)f(ji1)f(ji+1)

f は下に凸なので
f(ji)f(ji1)+f(ji+1)2
であり、

Ai,j+Ai+1,j+1Ai,j+1Ai+1,j0Ai,j+Ai+1,j+1Ai,j+1+Ai+1,j

より Monge です。

a の累積和を
si=k=1i1ak
とすると、
Ai,j=(ji)2+sjsi
です。
sj
si
は 行 / 列 に加算しているので関係なく、
(ji)2
ji
の凸関数なので、Monge です。

  • Monge 行列
    A
    と広義単調増加関数
    f:NN
    に対し、
    Bi,j=Ai,f(j)
    で定義される行列
    B
    は Monge です。

Bi1,j1+Bi2,j2=Ai1,f(j1)+Ai2,f(j2)Ai1,f(j2)+Ai2,f(j1)=Bi1,j2+Bi2,j1

より Monge です。

同様に

Bi,j=Af(i),j でも Monge です。

  • Ai,j=(aibj)2
    (
    a,b
    は広義単調増加の整数列)
  • Ai,j=(ij)2
    は Monge です。
  • a
    は広義単調増加なので、
    Ai,j=(aij)2
    は Monge です。
  • b
    も広義単調増加なので、
    Ai,j=(aibj)2
    は Monge です。
  • (実数列でも Monge になります。)
  • Monge 行列
    A
    と実数
    c0
    に対し、
    Bi,j=cAi,j
    で定義される行列
    B
    は Monge です。
  • Monge 行列
    A,B
    に対し、
    Ci,j=Ai,j+Bi,j
    で定義される行列
    C
    は Monge です。
  • Ai,j=(BiANDBi+1ANDANDBj1)
     (
    AND
    は bitwise AND 演算)

1 つの bit で Monge であれば、bitwise AND はその線型結合なので Monge になります。
以下
Bi{0,1}
とします。

(Ai+1,jAi+1,j+1)(Ai,jAi,j+1)=Ai+1,j(1Bj)Ai,j(1Bj)=(Ai+1,jAi,j)(1Bj)=Ai+1,j(1Bi)(1Bj)0

より Monge です。

こんな計算をしなくても、「右端を

j1j2 と広げたときのコストの減少分」は、元々の区間
[i,j1]
が長いほど小さい
を確認すれば
Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
です。

参考文献

Knuth-Yao speedup - 週刊 spaghetti_source - TopCoder部