Upload
motoki-ikeda
View
483
Download
1
Embed Size (px)
Citation preview
K-th number
@hyksm
概要 個の整数の要素を持つ集合が存在する 番目に小さい要素の値を求めたい
まず中央値(番目に小さい要素の値)を求めるアルゴリズムを考え、選択アルゴリズムに拡張する
目的 決定性アルゴリズム 乱択アルゴリズム
計算の途中にランダムな選択をする 乱数を使って実行手順候補の内の1つを選ぶ
多くの場合、決定的な解法よりも効率的 単純であり、実装が容易
中央値を求めるアルゴリズム まずは決定性アルゴリズム
ソート
クイックソートと同じような感じ ピボットを決めて数列を分割 中央値が含まれているほうの数列で再帰的に
分割を行う ピボットをうまく決めると平均的に
問題点 ではあるが・・・
比較的実装が重たい 定数項が重い
乱数を使うことで改善できる! モンテカルロアルゴリズム
目標 中央値をとしたときに、となるような集
合の要素を見つける 集合の中で以上以下の要素の個数を以下
に抑える
見つからなかったら「失敗」を出力 片側誤りのモンテカルロアルゴリズム
で中央値を求める 未満の要素の個数()を求める 以上以下の要素をソート 個目の要素(=中央値)を出力する
以上以下の要素の個数が以下なので、計算量は(計算省略)
とを求めるために 中央値がどのあたりにあるかを知りたい
標本抽出 元の標本から一様ランダムに選択して小さい
標本をつくる
とを求めるために 元の集合から一様ランダムに要素を選び、
要素を持つ新しい集合を作る 先程と同様に、ソートはで行える 新しい集合の中央値が求められる
とを求めるために 新しい集合の中央値は元の集合の中央値
に近いことが期待される 中央値から離れた要素をおよびとする は新しい標本の番目に小さい要素 は新しい標本の番目に小さい要素
𝑑 𝑢
目標の確認 中央値をとしたときに、となるような集
合の要素を見つける 集合の中で以上以下の要素の個数を以下
に抑える
前に求めたは上の条件をどのくらいの確率で満たしている?
(満たしていなかったら「失敗」)
失敗確率の解析 失敗となる事象は以下の 3 種類
未満の要素の個数がより大きい より大きい要素の個数がより大きい 以上以下の要素がより多い
失敗確率の解析 詳しい計算は長くなるので省略 Chebyshev の不等式を適用 それぞれの事象が起こる確率は
「失敗」を出力する確率は
実際に実行してみる のとき
計算上の失敗確率 ぐらい 実際の失敗確率 ぐらい
のとき 計算上の失敗確率 実際の失敗確率 (失敗なし)
が大きければ失敗なしと見なせる
実際に実行してみる 実行時間も決定性アルゴリズムより早い のケースを 10000 回実行して
乱択() 約秒 決定() 約秒 ソート() 約 37 秒
実用的!
選択アルゴリズムに拡張 集合の番目を求めるアルゴリズム 決定性アルゴリズムは中央値を求めるア
ルゴリズムとほぼ同じ
選択アルゴリズムに拡張 乱択アルゴリズムもほぼ同じ
との基準点が番目の要素に移動 標本抽出によって作られた集合に、元の集
合の最小値と最大値を加える必要がある どんな値でもとで挟めるようにするため
失敗確率の解析 最小値と最大値を追加しているので、解析
がちょっと難しい 中央値アルゴリズムとほぼ同じだが、大
分大雑把な解析を行った 失敗確率はで抑えられる
実際に実行してみる のとき
計算上の失敗確率 ぐらい 実際の失敗確率 ぐらい
のとき 計算上の失敗確率 実際の失敗確率 (失敗なし)
で 10000 回実行 乱択⇒約秒 決定性⇒約秒
まとめ 乱択は実装が比較的楽
決定性アルゴリズムのは実装が重い 定数係数も小さい
実行時間が決定性アルゴリズムより短い が大きければ失敗もほとんどしない
成功するまでプログラムを動かしても良い
乱択アルゴリズムって便利!