Document

第10章 中央値と順序統計量
10.1 最大と最小
10.2 平均線形時間の選択法
10.3 最悪線形時間の選択アルゴリズム
第10章 中央値と順序統計量
• i番目の順序統計量とは
– n要素の集合のi番目に小さい要素のことである
– 最小値、最大値
– 中央値:
• 奇数ならば、(n+1)/2
• 偶数ならば、大きい中央値 éê n / 2 ùú・小さい中央値 êë n / 2 úû
– 選択問題
• 入力:n個の異なる数の集合Aと整数
• 出力:i番目大きい要素
• 計算量:ヒープソートやマージソートを使ってO(nlgn)で解けるが、
もっと高速のアルゴリズムが存在する
10.1 最大と最小
• 素朴なアルゴリズム
MINIMUM(A)
1. min ← A[1]
2. for i ← 2 to length[A]
3.
do if min > A[i]
4.
then min ← A[i]
5. return min
min
a1
a2
a3
a4
– n-1回の比較して、最小値や最大値を得られる
– 各比較はトーナメントの試合に相当し、優勝者以
外は少なくともn-1回の比較が必要なので、この
アルゴリズムは最良である。
10.1 最大と最小
• 同時に最大と最小を求める
– 素朴なアルゴリズムならば、2(n-1)回の比較
– 3 êë n / 2 úû 回の比較で動作するアルゴリズム
• アイデア:2つの要素を対にして処理する。入力の最初
から2つの要素をお互いに比較し、各2要素毎3回の比
較を単位として小さい方とそれまでの最小値を、大き
い方とそれまでの最大値をそれぞれ比較する。
10.1 最大と最小
–
3 êë n / 2 úû 回の証明
• n=奇数の場合
min
a1
min
a1
max
a2
max
a2
比較の回数は3[(n -1) / 2]
= 3 êë n / 2 úû
a3
a3
a4
a4
• n=偶数の場合
a5
比較の回数は 1+ 3(n - 2) / 2 = 3n / 2 - 2
< 3 êë n / 2 úû
• つまり、少なくとも 3 êë n / 2 úû 回の比較
min
a1
max
a2
10.2 平均線形時間の選択法
• 選択問題に対して分割統治のアルゴリズム
– アイデア:クイックソートと同様に入力配列を再帰
的に分割して、i番目の大きい・小さい要素がを必
ず一つの部分にあり、分割の一方のみ、その要
素を見つかるまで範囲を小さくする。
– クイックソートのRANDOMIZED-PARTITIONを利用
する確率的アルゴリズムである。
10.2 平均線形時間の選択法
• コード
RANDOMIZED-SELECT(A, p, r, i)
1. if p = r ▹一つの要素しかない場合、その要素を返す
2.
then return A[p]
3. q ← RANDOMIZED-PARTITION(A, p, r) ▹クイックソートの手続きを利用
4. k ← q - p + 1 ▹2つの部分列のいずれか決定するために、kを計算する
5. if i <= k ▹再帰的に見つけられる
6.
then return RANDOMIZED-SELECT(A, p, q - 1, i) ▹分割の小さい部分
7. else return RANDOMIZED-SELECT(A, q + 1, r, i - k) ▹分割の大きい部分
8.3節で示されたRANDOMIZED-PARTITIONが確率的なアルゴリズムなので、
RANDOMIZED-SELECTも確率的なアルゴリズムである。
10.2 平均線形時間の選択法
– 計算量
• 常に最大の要素のみ残されるように分割される場合、
2
最小値を見つけるために、 o(n )時間かかる。
• しかしながら、このアルゴリズムは平均的にはうまく動
作し、確率的アルゴリズムなのでどのような入力に対
しても最悪の振る舞いをしない。
10.2 平均線形時間の選択法
• 計算量
n-1
1
T (n) £ (T (max(1,n -1)) + å T (max(k,n - k))) + O(n)
n
k=1
ïì k, k > êë n / 2 úû
max(1,n -1) = n -1& max(k,n - k) = í
ïîn - k, k < éê n / 2 ùú
したがって、
nが偶数ならば、和の中には T (éên / 2 ùú),T (éên / 2 ùú +1),...,T (n -1) の各項は2回現れ
nが奇数数ならば、和の中には T (éê n / 2 ùú +1),T (éên / 2 ùú + 2),...,T (n -1)の各項は2回、 T (éê n / 2 ùú) 1回現れ
なので
n-1
1
T (n) £ (T (n -1) + 2 å T (k )) + O(n)
n
k= éê n/2 ùú
最悪の場合 T (n -1) = O(n 2 ) なので
2 n-1
T (n) = å T (k ) + O(n)
n k= éên/2 ùú
この漸化式は置き換え法によって解くことができる
10.2 平均線形時間の選択法
• 計算量
2 n-1
T (n) £ å ck + O(n)
n k= êën/2 úû
T(n)<=cnを仮定すると
êë n/2 úû-1
ö
2c æ n-1
= ç å k - å k ÷ + O(n)
n è k=1
ø
k=1
=
2c æ 1
1
ö
(n
1)n
(
n
/
2
1)
n
/
2
ê
ú
ê
ú
ë
û
ë
û÷ø + O(n)
çè
n 2
2
2c æ 1
1
ö
(n
1)n
(n
/
2
2)(n
/
2
1)
çè
÷ø + O(n)
n 2
2
c
= (3n 2 / 4 + n / 2 - 2) + O(n) = c(3n / 4 + 1 / 2 - 2 / n) + O(n)
n
£ c(3n / 4 - 1 / 2) + O(n) = cn
£
10.3 最悪線形時間の選択アルゴリズム
• アルゴリズム
– アイデア:入力配列を再帰的に分割する時、必ず
上手な分割を保証するということである。
– 8.1節のクイックソートの決定性の分割アルゴリ
ズムPartitionを用いる。
10.3 最悪線形時間の選択アルゴリズム
• 手続き
1. 入力配列のn要素を5要素の êën / 5 úû 個のグルー
プと残りの 個からなる高々1個のグループに分
ける。O(n)時間かかる。
10.3 最悪線形時間の選択アルゴリズム
• 手続き
2. 各グループの(高々5個)要素を挿入ソートによってソー
トして、それぞれの中央値をとることによって n/5 個の
中央値を求める。 O(1)のサイズに対する挿入ソートを
O(n)回呼ぶため、 O(n)時間かかる。
10.3 最悪線形時間の選択アルゴリズム
• 手続き
3.
ìO(1),n £ 80
T (n) £ í
SELECTを再帰的にStep2.で見つけた
個の中央値を
T
(
n
/
5
)
+
T
(7n
/10
+ 6) + O(n),n > 80
é
ù
ú
î ê
求める。 SELECTの実行時間がT(n)を仮定すると、Step3.
T ( éê n / 5 ùú)
の実行時間が
10.3 最悪線形時間の選択アルゴリズム
• 手続き
4. 変更されたPARTITIONを用いて入力配列を中央値の中
央値xによって分割する。kを分割の小さい方の要素数
とする。この時、大きい方にはn-k個の要素がある。
PARTITION がO(n)時間かかる(8.1節)。
10.3 最悪線形時間の選択アルゴリズム
• 手続き
5.
ならば、小さい方にi番目に小さい要素を見つけるよう、
ならば大きい方に対して番目に小さい要素を見つけるようにSelect
を再帰的に用いる。 灰色の部分はxより大きい要素である、その要
æ é 1 é n ù ù ö 3n
素の数が
3ç ê ê ú ú - 2 ÷ ³ - 6
è ê 2 ê 5 ú ú ø 10
したがって最悪の場合、
n-(
3n
7n
- 6) =
+6
10
10
要素に対して再帰的に呼ばれる。
Step5.が T (7n /10 + 6)
10.3 最悪線形時間の選択アルゴリズム
• 次の漸化式を得られる
ìO(1),n £ 80
îT (éê n / 5 ùú) + T (7n /10 + 6) + O(n),n > 80
T (n) £ í
• 80以下の任意の入力に対してはO(1)の時間と仮定すると、置き換え法
によって:
T (n) £ c éê n / 5 ùú + c(7n /10 + 6) + O(n)
£ cn / 5 + c + 7cn /10 + 6c + O(n)
£ 9n /10 + 7c + O(n)
£ cn
よって、
Selectの最悪実行時間は線形である。
以上です。
ありがとうございました!