20
K-th number @hyksm

K th number

Embed Size (px)

Citation preview

Page 1: K th number

K-th number

@hyksm

Page 2: K th number

概要 個の整数の要素を持つ集合が存在する 番目に小さい要素の値を求めたい

まず中央値(番目に小さい要素の値)を求めるアルゴリズムを考え、選択アルゴリズムに拡張する

Page 3: K th number

目的 決定性アルゴリズム 乱択アルゴリズム

計算の途中にランダムな選択をする 乱数を使って実行手順候補の内の1つを選ぶ

多くの場合、決定的な解法よりも効率的 単純であり、実装が容易

Page 4: K th number

中央値を求めるアルゴリズム まずは決定性アルゴリズム

ソート

クイックソートと同じような感じ ピボットを決めて数列を分割 中央値が含まれているほうの数列で再帰的に

分割を行う ピボットをうまく決めると平均的に

Page 5: K th number

問題点 ではあるが・・・

比較的実装が重たい 定数項が重い

乱数を使うことで改善できる! モンテカルロアルゴリズム

Page 6: K th number

目標 中央値をとしたときに、となるような集

合の要素を見つける 集合の中で以上以下の要素の個数を以下

に抑える

見つからなかったら「失敗」を出力 片側誤りのモンテカルロアルゴリズム

Page 7: K th number

で中央値を求める 未満の要素の個数()を求める 以上以下の要素をソート 個目の要素(=中央値)を出力する

以上以下の要素の個数が以下なので、計算量は(計算省略)

Page 8: K th number

とを求めるために 中央値がどのあたりにあるかを知りたい

標本抽出 元の標本から一様ランダムに選択して小さい

標本をつくる

Page 9: K th number

とを求めるために 元の集合から一様ランダムに要素を選び、

要素を持つ新しい集合を作る 先程と同様に、ソートはで行える 新しい集合の中央値が求められる

Page 10: K th number

とを求めるために 新しい集合の中央値は元の集合の中央値

に近いことが期待される 中央値から離れた要素をおよびとする は新しい標本の番目に小さい要素 は新しい標本の番目に小さい要素

𝑑 𝑢

Page 11: K th number

目標の確認 中央値をとしたときに、となるような集

合の要素を見つける 集合の中で以上以下の要素の個数を以下

に抑える

前に求めたは上の条件をどのくらいの確率で満たしている?

(満たしていなかったら「失敗」)

Page 12: K th number

失敗確率の解析 失敗となる事象は以下の 3 種類

未満の要素の個数がより大きい より大きい要素の個数がより大きい 以上以下の要素がより多い

Page 13: K th number

失敗確率の解析 詳しい計算は長くなるので省略 Chebyshev の不等式を適用 それぞれの事象が起こる確率は

「失敗」を出力する確率は

Page 14: K th number

実際に実行してみる のとき

計算上の失敗確率  ぐらい 実際の失敗確率    ぐらい

のとき 計算上の失敗確率   実際の失敗確率    (失敗なし)

が大きければ失敗なしと見なせる

Page 15: K th number

実際に実行してみる 実行時間も決定性アルゴリズムより早い のケースを 10000 回実行して

乱択() 約秒 決定() 約秒 ソート() 約 37 秒

実用的!

Page 16: K th number

選択アルゴリズムに拡張 集合の番目を求めるアルゴリズム 決定性アルゴリズムは中央値を求めるア

ルゴリズムとほぼ同じ

Page 17: K th number

選択アルゴリズムに拡張 乱択アルゴリズムもほぼ同じ

との基準点が番目の要素に移動 標本抽出によって作られた集合に、元の集

合の最小値と最大値を加える必要がある どんな値でもとで挟めるようにするため

Page 18: K th number

失敗確率の解析 最小値と最大値を追加しているので、解析

がちょっと難しい 中央値アルゴリズムとほぼ同じだが、大

分大雑把な解析を行った 失敗確率はで抑えられる

Page 19: K th number

実際に実行してみる のとき

計算上の失敗確率  ぐらい 実際の失敗確率    ぐらい

のとき 計算上の失敗確率   実際の失敗確率    (失敗なし)

で 10000 回実行 乱択⇒約秒  決定性⇒約秒

Page 20: K th number

まとめ 乱択は実装が比較的楽

決定性アルゴリズムのは実装が重い 定数係数も小さい

実行時間が決定性アルゴリズムより短い が大きければ失敗もほとんどしない

成功するまでプログラムを動かしても良い

乱択アルゴリズムって便利!