🔙 Back to Top

シェルソートの補題の証明

こんなのがあった.

シェルソートの話をします。[..]

シェルソートの計算量の導出に関する証明について云々書いてあった. というわけで証明を考えてみた.

以下ネタバレ.

シェルソートの動画

ある位置にいる人が前に出てきて 「あろっとおーにー」とか「あろっとそーしー」みたいなことを言う. これはギャップに相当する数字を言ってるんだと思う. たぶん. これを聞くとその人よりもインデックスが \(k\) だけ低い人が出てきて、ペアで大小比較を行う. 逆転してたならスワップが行われ、その時に限りさらに \(k\) だけ低い人を呼び、大小比較を行う.

補題 0

長さがともに \(r\) 以上ある2つの数列があり、

を仮定する. \(x, y\) をそれぞれ昇順にソートして得た数列を

とするとこれらについて条件 \(P(x', y')\) が成立している.

証明

\(y_1'\) に注目する. \(y_1' = \min \{ y_1, y_2, \ldots, y_m \}\) であるので、 \[y_i \geq y_1'\] である. 更に \(P(x,y)\) より、 \[x_{n+i} \geq y_i \geq y_1' ~~(i=1,2,\ldots,r)\] というわけで、数列 \(x\) に於いて少なくとも \(r\) 個は \(y_1'\) より大きい数がある. \(x\) のソートを考えると、 \[x'_{n+1} \geq y_1'\] が分かる. なぜなら \(x'_{n+1}\) という数字はソートした後の数列の top \(r\) の数であり、\(r\) 個以上は \(y_1'\) より大きい数が含まれるから.

というわけで、\(P(x', y')\) において \(x'_{n+1} \geq y_1'\) (つまり \(i=1\) の場合) だけは示された.

\(y_2'\) 以降も同様. これより大きな数が数列 \(x\)\(r-1\) 個は少なくともあるので〜って言えば良い.

補題 1

証明

数列

が既に \(x\)-sort 済みだとする. すなわち、

これが成立しているとする. 今から \(a\)\(y\)-sort することを考える. \(y\)-sort するとはつまり、\(a\) から \(y\) 個の部分列

を取り出しそれらを独立にソートし、

を得て、

を構成すること. \(a'\)\(y\)-sort 済みなのは自明なので、\(Q_x(a')\) を示せばよい.

\(\alpha_i\) と補題 0 を睨めば自明. すなわち、

\(a_i'\)\(a_{i+x}'\) の大小比較を確かめる. インデックスの \(i\) 及び \(i+x\)\(y\) で割った余りを見ることで、それらが どの部分列 \(\alpha_k\) に属するかが分かる.

  1. ともに同じ \(\alpha_k\) に属するとき
  2. \(a_i'\)\(\alpha_{k_1}\) に、 \(a_{i+x}'\)\(\alpha_{k_2}\) に属するとき

全ての \(i\) についてこれが言えるので、結局 \(a'\)\(x\)-sort 済みであることが分かった.