Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
sort conference
Search
Catupper
July 13, 2014
2
97
sort conference
Catupper
July 13, 2014
Tweet
Share
More Decks by Catupper
See All by Catupper
ants' roots
catupper
1
2.4k
Trianguler
catupper
0
190
計算量の話
catupper
0
1.1k
Graph is Fun
catupper
0
130
About累積和
catupper
0
1.6k
For You
catupper
1
140
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
510
110k
GitHub's CSS Performance
jonrohan
1030
460k
Designing for humans not robots
tammielis
250
25k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
What's in a price? How to price your products and services
michaelherold
243
12k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Navigating Team Friction
lara
183
15k
Statistics for Hackers
jakevdp
796
220k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
Thoughts on Productivity
jonyablonski
67
4.4k
Transcript
None
「やぁ」 「やぁ。僕は配列くん。ランダムアクセスができるよ。」 「どうも。私は比較演算子くん。2つの値の大小を教え て あげます。」 配 「たまたま、人類の身体測定に居合わせた僕たち は、彼らの身長をソートすることになったんだ。」 比 「ソートは私達の得意分野だったのですぐに出来ま
した。」
「やぁ」 「ウッス。オイラはヒープソート。配列くんを使って ヒープっつう木構造を使うテクニックを利用した最 悪計算量O(N log N)のソートっす。」 「こんにちは。アタシはマージソート。ヒープソートく んと一緒で最悪計算量はO(NlogN)だよ。Inplace はちょっと大変かもね。」
比「ヒープソートくんやマージソートちゃんは私と配 列くんによるソートの最悪計算量の上界を与え てくれます。だから今回の身体測定でも彼らに 活躍してもらおうと思ったんです。」 配「だけど、そこには我々の知らないソートの世界 があったんだ。」 マ「なんと平均計算量O(N)のソートがいたの。」
新たな敵現る ???「ククク。君たちは私よりも一般的な世界で生き てきたようだな。だが、私達には実践に際して、 特殊なケースに対して特化して振る舞うのだ よ。」 ヒ「お、お前は!?カウントソート!?」 カ「そのとおり。人類の身長にInt型は広すぎる。配 列くんにも別の生き方があるんだよ。」
カウントソートくん 配「カウンソートさんはキー値の種類が少なく範 囲が狭い時にO(N)のソートだよ。カウントソート さんの前では私はキー値を管理するんじゃなく てキー値がいくつあるかを管理するんだ。」 カ「そう。あとは、小さい順番にそれぞれ足し合わ せ るだけ。範囲がO(N)なら計算量もO(N)だ。」
マ「だけどアタシは、彼に言ってやったのよ。 『人類の身長はIntには狭いけどDoubleでな いと管理できないわ。』」 ヒ「そしたらまた別のやつが現れたんだ。」 ???「待ちたまえ、君たち!」 配「君は!?基数ソート」 基「その名前はダサいからラディックスソートと呼ん でくれたまえ。」
ラディックスソートくん ラ「人類の身長を測るのは難しいぞ。なにせ一日で 1cm単位で身長がずれ得るんだ。だから人類は 有効数字という概念を生み出した。私は有効数 字の桁数を定数とみなせばO(N)で動く!カウン トソート君との合作だ!」 カ「私だけでは離散的な値のソートはできなかっ た。しかし、ラディックスソート様はそれを桁ごと に分けてやるという発想を与えてくれた。私も離 散だけの世界から連続の世界に移ることができ
たのだ。彼には感謝している・・・」
だがしかし! ヒ「あの~。たしかにラディックスさんは強いんスけ ど~、有効数字っていうのはなんかずるくないッ スか?」 配「そうだ!そうだ!人類はノギスとかマイクロメー ターで身長を測るんだぞ!有効数字なんていく らでも大きくなるんだ!」 ラ「なんだってー」
??? ???「諦めるな君たち!」
挑戦者現る ラ「そ、その声は・・・ バケツソート!?」 バ「左様。我輩はバケツソート。キー値が一定の範 囲に一様分布する場合ならば平均計算量O(N) でソートすることができる。有効数字なんて屁 で もないわ!」
バケツソートくん 比「バケツソートは簡単な発想と挿入ソート君を活 用したソートです。キー値が現れる範囲をN等 分して、それぞれの範囲に対応する配列くん を 管理します。あとは順番にそこに挿入ソートす る。最悪計算量はO(N^2)ですが、キー値が一 様分布すればすごく速く動く。数学を味方につ け たソートです。」
期待値の線形性くん 期待値の線形性くん「 ふふふ。僕がいるかぎりは、一様分布なキー値に 対してはバケツソート様が高速に動くぜ!」 マ「待って!人類の身長は一様分布しないわ!このま までは期待値の線形性くんが言った条件に合わな い!」 バ「な、なに!?」 ???「そろそろ私の出番のようだな・・」 「「!?」」
中心極限定理くん 配「お、お前は!中心極限定理くん!」 中「期待値の線形性くん、バケツソートくん。君たち は君たちの平均計算量を出す過程を忘れた か。一様分布でうまくいく理由は、各区間に入る キー値の個数の期待値が同じことだった。つ まり、N等分するところを別の区切り方にすれば いい。」
ついにラスボス登場 配「つ、つまり、70億人いる人類の身長の分布は、 なんらかの正規分布に近似可能だということ か!?」 中「左様。しかし、私だけでは、近似可能であること しか示せない。どんな分布に近似するかは彼に 登場してもらおう。」 比「一体誰だというのです!?」 ???「ゴゴゴゴゴゴ」
大数の法則 大数の法則「こんにちは、みなさん。なにやら賑や かですね。」 比「そうか!標本の分布や平均から、母集団の標 準偏差と平均を計算するのか!」 大「そのとおり!皆さん勤勉ですねぇ。私を活用す れば、分布もうまく計算できるでしょう。がんばっ てくださいね。ヒマじゃないんで帰りますよ。」
みんなちがって みんないい こうして人類の身長はうまくおおよそO(N)でソートさ れましたとさ。おしまい。 いろんなアルゴリズムがあるけれど、 いろんな数学の定理があるけれど、 みんなちがってみんないい --完--
解説Phase
登場人物 • 配列くん • 比較演算子くん
登場人物 • 配列くん • 比較演算子くん • ヒープソートくん • マージソートくん
登場人物 • 配列くん • 比較演算子くん • ヒープソートくん • マージソートくん •
カウントソートくん • ラディックスソートくん • バケツソートくん
登場人物 • 配列くん • 比較演算子くん • ヒープソートくん • マージソートくん •
カウントソートくん • ラディックスソートくん • バケツソートくん • 期待値の線形性くん • 中心極限定理くん • 大数の法則くん
登場人物 • 配列くん • 比較演算子くん • ヒープソートくん • マージソートくん •
カウントソートくん • ラディックスソートくん • バケツソートくん • 期待値の線形性くん • 中心極限定理くん • 大数の法則くん • 金子みすゞ
配列くん • 入力などをたくさん保存する人です • ランダムアクセスができます – どの添字にも一瞬でアクセスできる – 線形リストでは無理だね •
int array[108]; • array[10] = 10;//O(1)
比較演算子くん • 大小比較する人です • こいつがいないとソートは始まらない
Comparison sort • 配列と比較演算子だけを使うソートを Comparison sort といいます • ヒープソートとマージソートはComparison sortです
挿入ソートくん • 入力順に配列に要素を追加していく • 配列内の値が昇順になるように、適当な場所に挿 入する • 配列は挿入ができないので、いちいちずらさないと いけない •
降順に入力されたら、入力ごとに全部ずらさないと いけないのでO(N^2)
ヒープソートくん • ヒープという木をつくる • 配列上でうまく木を表現して頑張る • ちょっとむずかしい概念 • 計算量はO(NlogN)
マージソートくん • 配列を半分にわけて、それぞれで小さいヒープソー トをして、あとで合成する – 合成は、2つのソート済みの配列のうち小さい方を順番 に取っていくだけ – O(N) •
半々に分けていくとlog(N)かい分けることになる • よって全体の計算量はO(NlogN)
Comparison sortの上界 • 実はComparison sortはどうがんばっても O(NlogN)かかることがしられている • しかし、今回の『ソート会議』ではO(N)のソートがた くさん出てきました •
その謎にせまる
カウントソート • 本名 counting sort • 日本名 バケツソート (すごく紛らわしい) •
与えられる値の種類が少なく、範囲も狭く、整数であ るときに使える • それぞれいくつあるか数えるだけ • 正の字システム • どう考えてもO(N)
カウントソート • 3 1 4 1 5 9 2 •
1が2つ • 2が1つ • 3が1つ • 4が1つ • 5が1つ • 6が0つ • 7が0つ • 8が0つ • 9が1つ • よって合わせたら • 1 1 2 3 4 5 9
ラディックスソート • 本名 radiz sort • 日本名 基数ソート (すごくダサい) •
与えられる値を桁ごとに小さい位からカウントソー トをする。桁数が定数ならばO(N)になる
ラディックスソート • 13 24 81 92 5 12 • 1の位でカウントソート
• 81 92 12 13 24 5 • 10の位でカウントソート • 05 12 13 24 81 92 • 結果 • 5 12 13 24 81 92 • やったぜ
バケツソート • 本名 bucket sort • 日本名 (ない) 一部直訳文献では「バケツソート」 • 値が一様に分布するとき、計算量の期待値が
O(N)になる。 • 値の範囲をN等分してそれぞれの範囲に入るもの でグループ分け。グループ内では挿入ソートなどを する。最後に合成。
バケツソート • 72 66 24 4 12 93 61 39
52 23 • 0~99の範囲で一様分 布という前提 • N=10なので10等分 • わける • [4] [12] [24 23] [39] [] [52] [66 61] [72] [] [93] • グループごとにソート • [4] [12] [23 24] [39] [] [52] [61 66] [72] [] [93] • 結果 • 4 12 23 24 39 52 61 66 72 93
平均計算量の証明 • グループiに入る要素数 をn[i] • p[i][j]はグループiにj番目 の要素が入るかどうか (1 or 0)
• 総計算量はn[i]^2の総 和 • p[i][j]はiを固定すると独 立。期待値は1/N • よって総計算量の期待 値はE[Σ(Σp[i][j])^2] • Kind of 計算頑張ってく ださい • Σ(1 + 1/n)とかになる • O(N) • やったぜ
さっきの計算のミソ • 分けたグループに要素が入る確率はグループによ らず等しい • 一様分布じゃなくても、どんな分布になるか知って いればうまくグループの範囲を指定してやればい い
中心極限定理くん • あらゆる分布はたくさん試行すると、なんらかの正 規分布に近づいていく という定理 • ようするに、規模がでかいと分布の輪郭がなんとな く決まるということ
中心極限定理くん 大数の法則くん • でっかいデータの中から幾つかを無作為に選び出 して、それの性質を見ることで元のデータの性質を 予測する。 このとき誤差は正規分布に近づき、し かもたくさんやれば正確に予測できる。 みたいな定理、法則 • ようは70億人のうち1万にくらいを選んで分布を調 べる ということをたくさんすると元の分布も小さい
誤差で予測できる • これでバケツソートが応用できる
金子みすゞ みんなちがってみんないい