SlideShare a Scribd company logo
1 of 31
高速なソートアルゴリズムを
書こう!!
最速のソートアルゴリズムを目指して
JJUG CCC 2017 Fall #ccc_m8
松原 正和
https://github.com/m-matsubara/sort
松原正和 - 自己紹介
A5:SQL Mk-2の作者
・SQL&ER図ツール
双子のパパ
・もうすぐ5歳
https://github.com/m-matsubara/sort
https://a5m2.mmatsubara.com
本人
Java の標準ソートは Arrays.sort() メソッド
・プリミティブ(基本)型のソートは Dual-pivot quicksort
ピボット値が2つあるクイックソート (非安定)
・オブジェクト型のソートはTimSort
Tim Petersさんの書いた非再帰マージソート (安定)
とりあえずは、比較ソートで。
基数ソートとかバケットソートと
かは今回は考えないことにします。
https://github.com/m-matsubara/sort
安定(Stable)ソートとは…おさらい
安定(Stable)ソートとは、ソートキーが同じ要素が複数あった場合、
元配列の出現順序が保たれるソートのこと。
安定なソート 非安定なソート
同じ身長同じ身長 同じ身長同じ身長
ソート前
ソート後
https://github.com/m-matsubara/sort
速いソート・遅いソート
ソートアルゴリズムの速い・遅いを語るときにビッグ・オー表記を用
いる。
遅いソート … O(N2)
要素数が10倍になると実行時間は100倍くらいになる。
アルゴリズムの例:バブルソート、選択ソート、挿入ソート
速いソート … O(N log N)
log…ロガリズム(logarithm)…対数
要素数が10倍になっても実行時間は100倍までならない
(10件から100件で20倍、10万件から100万件で12倍くらい)
アルゴリズムの例:クイックソート、ヒープソート、マージソート
N はソートの
要素数
https://github.com/m-matsubara/sort
1.クイックソートを高速化するお話
https://github.com/m-matsubara/sort
クイックソートのおさらい(1/2)
• 身長順に並べる
①ピボット値の選択
②ピボット値以下を左に、ピボット値以上を右に集める
配列
ピボット!!
小さいサブリスト
配列
大きいサブリスト
https://github.com/m-matsubara/sort
クイックソートのおさらい(2/2)
③小さいサブリスト・大きいサブリストそれぞれで再度ピボット値
を決め、さらに小さいサブリスト・大きいサブリストを作っていく
…これを繰り返す。
配列
こっちも繰り返す!
https://github.com/m-matsubara/sort
Dual-pivot Quicksortをベースに
安定ソート化!!
mmsSort (matsubara masakazu stable Sort)
① ピボット値を2つにする
② マージソートのように外部メモリを使うことで安定ソート化
③ 場合によっては3-way partition Quicksortに切り替え
④ CPUキャッシュを有効活用
https://github.com/m-matsubara/sort
① ピボット値を2つに
再帰の深さが約2/3になる。CPUキャッシュも効果的に利用できる。
配列
※ピボット値の選び方
1) 配列中から8個候補を選ぶ
2) 候補をソート
3) 3番目と6番目の要素を
ピボット値として選ぶ
pivot1
比較回数が減るわ
けではない。
https://github.com/m-matsubara/sort
pivot2
配列の先頭からピボット1・ピボット2と比較してパーティション
操作する。
配列
② マージソートのように外部メモリを
使うことで安定ソート化(1/2)
ワーク
メモリ
pivot1 < 値 < pivot2 pivot2 ≦ 値
(作業領域に後ろから詰めていく)(作業領域に前から詰めていく)
値 ≦ pivot1
配列と同じサイズの
外部メモリが必要
https://github.com/m-matsubara/sort
ワークメモリから元の配列に書き戻す。
配列
ワーク
メモリ
② マージソートのように外部メモリを
使うことで安定ソート化(2/2)
コピー 反転コピー
pivot2 ≦ 値値 ≦ pivot1 pivot1 < 値 < pivot2
pivot1 < 値 < pivot2 pivot2 ≦ 値
https://github.com/m-matsubara/sort
③ 場合によっては
3-way partition Quicksortに切り替え
選んだPivot1とPivot2が等しいとき…
→ピボット値未満・ピボット値と等しい・ピボット値より大きい
の3つに分ける
→ピボット値と等しいグループは再帰不要
再帰でソート 再帰でソートソート
要らない
配列 pivot < 値値 < pivot 値 = pivot
https://github.com/m-matsubara/sort
④ CPUキャッシュを有効活用
→先頭から分割操作したとき、後ろ側のサブリストから再帰すると
ちょっと速い
①最初に
再帰ソート
②次に
再帰ソート
③最後に
再帰ソート
分割操作では配列の先頭から値を詰めていく。
再帰の処理は後ろのサブリストから処理する。
配列 pivot2 ≦ 値値 ≦ pivot1 pivot1 < 値 < pivot2
https://github.com/m-matsubara/sort
2.マージソートを高速化するお話
https://github.com/m-matsubara/sort
マージソートのおさらい(1/2)
• 身長順に並べる
①配列を半分ずつに分割し、各々ソート(マージソート)しておく。
②配列の前半をワークメモリに移動する。
配列
配列
ワーク
メモリ
何か騙され
た気持ちに
なる。
配列の半分のワークメモリが必要。
https://github.com/m-matsubara/sort
マージソートのおさらい(2/2)
③マージを行う。
配列
ワーク
メモリ
https://github.com/m-matsubara/sort
3-way Mergesortの少し変わった実装(1/2)
一般的なオンメモリマージソートは2分割する実装が多いけど、3
分割とかすれば速くならない?
…まじめに書くと意外と面倒、ヒープやトーナメントツリーを用い
て実装される。
トーナメントツリーの場合
5 3 6
3
どのサブリスト(の先頭)
から値を取り出すか管理
しなければならない。
https://github.com/m-matsubara/sort
3-way Mergesortの少し変わった実装(2/2)
MasSort (Masakazu Sort)
①1個の整数でデータの状態を管理
②大量のif文で状態遷移を管理
※3分割版と4分割版を作ったが3分割版の方が速かった。ここで
は3分割版を基本として説明をする。
実はC++だと
4分割版のほうが速い…。
https://github.com/m-matsubara/sort
①1個の整数でデータの状態を管理
int state で各サブリストの先頭値の大小順を表現
state = 123となる
2 3 6① ② ③
state = 312となる
8 9 6① ② ③
https://github.com/m-matsubara/sort
②大量のif文で状態遷移を管理
if (state < 0x200) { // state = 0x123 or 0x132
array[idx] = workArray[pos1++];
if (pos1 >= p1to)
break;
if (state == 0x123) {
if (comparator.compare(workArray[pos1], workArray[pos2]) <= 0)
; // モード変更なし
else if (comparator.compare(workArray[pos1], array[pos3]) <= 0)
state = 0x213;
else
state = 0x231;
} else { // state = 0x132
各stateの取りうる値(15種類)
ごとに処理をハードコード
https://github.com/m-matsubara/sort
3.省メモリなマージソート
https://github.com/m-matsubara/sort
省メモリマージソート(1/2)
• 一般的なマージソートは同じ大きさの2つのサブリストに分割す
るけど、あえてバランスを崩してみる。
配列
ワーク
メモリ
ワークメモリ小さい!!。
https://github.com/m-matsubara/sort
省メモリマージソート(2/2)
MatSort (Matsubara Sort)
• 要素数の1/4のワークメモリにした場合
※ワークメモリサイズは速度とメモリ領域のトレードオフで決定する。
※全体の計算量は O(N log N)のままとなる。
配列
① ¼の範囲ごとに
mmsSort または
MasSort等で
ソートしておく
② 後半2つマージ
③ もひとつマージ
④ 最後もマージ
https://github.com/m-matsubara/sort
4.ベンチマーク
https://github.com/m-matsubara/sort
ベンチマーク
• ソート対象のオブジェクトは以下のような感じ
class SortItem {
public int key;
public String keyStr;
public int orginalOrder;
public int filler1;
…
public int filler13;
}
• Java version 1.8.0_40 で実行
• Intel Core-i7 3770K で実行
• 10回繰り返した平均値で比較
整数のソートキー
文字列のソートキー
ソート前の配列上での位置
(安定ソートできているかチェック用)
13個のダミー項目
https://github.com/m-matsubara/sort
※比較回数はArrays.sortが一番少なくなる
※ソート済みや重複値が多い場合、Arrays.sortが一番速くなる
…こともある。
ベンチマーク
(乱数・整数キー・重複なし)
アルゴリズム 10,000,000
mmsSort (dual pivot stable Sort) 3.471
MatSort(1/5) 3.819
MasSort 3.849
Quick Sort (Median of 3) 4.006
Arrays.sort 4.580
実行時間
要素数1000万個で
Arrays.sort()より
25%ほど速い。
単位(秒)
https://github.com/m-matsubara/sort
ベンチマーク総括(1/2)
mmsSortの特徴
• 乱数配列でArrays.sort()より20~30%ほど速い
• 作業領域は対象配列と同じサイズ必要
MasSortの特徴
• 乱数配列でArrays.sort()より10%ほど速い
• 作業領域は対象配列の2/3ほど必要
MatSortの特徴
• MergeSortの作業領域サイズを対象配列サイズの数分の1から
100分の1ほどに減らせる。
• 苦手データが少なめ(ソート済みが遅い部類に入るくらい)
https://github.com/m-matsubara/sort
Dual-pivot Quicksort ベース
3-way Mergesort ベース
省メモリマージソート
ベンチマーク総括(2/2)
Arrays.sort()の特徴
• ほとんどの条件で比較回数は最小になる。
• ソート済みや重複値が多い場合、急激に速くなる。
• 重複の少ない乱数配列は実際のところそれほど速くない
(MergeSortより遅いくらい)
QuickSortの特徴
• メジャーなソートアルゴリズムでは最速とされる…がJavaだとそ
こまで速くないことも。
• 比較回数多め(乱数配列の場合、Arrays.sort()の1.5倍くらい)
• 苦手なデータがある(最悪、O(N2)のパフォーマンス。HeapSortを
併用して克服!!)
https://github.com/m-matsubara/sort
速いソートを書いて目指すところ
• Javaの将来のバージョンの標準ソートに取り込まれたい。
• Javaじゃなくても何かの言語で採用してくれないかなあ…。
• 皆さんにも速いソートにチャレンジしてみてほしい。
https://github.com/m-matsubara/sort
Copyright © 2017 松原正和
ご清聴ありがとうございました。
https://github.com/m-matsubara/sort

More Related Content

What's hot

冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarrayRyosuke839
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例Fixstars Corporation
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がりMITSUNARI Shigeo
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編infinite_loop
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門Kimikazu Kato
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンAkihiko Horiuchi
 

What's hot (20)

冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
暗認本読書会12
暗認本読書会12暗認本読書会12
暗認本読書会12
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
C++の黒魔術
C++の黒魔術C++の黒魔術
C++の黒魔術
 
llvm入門
llvm入門llvm入門
llvm入門
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 

Viewers also liked

Another compilation method in java - AOT (Ahead of Time) compilation
Another compilation method in java - AOT (Ahead of Time) compilationAnother compilation method in java - AOT (Ahead of Time) compilation
Another compilation method in java - AOT (Ahead of Time) compilationLogico
 
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017Kohei Saito
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugMasatoshi Tada
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccYujiSoftware
 
JJUG初心者のためのJava/JJUG講座
JJUG初心者のためのJava/JJUG講座JJUG初心者のためのJava/JJUG講座
JJUG初心者のためのJava/JJUG講座Yusuke Suzuki
 
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017tty fky
 
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方Yuki Morishita
 
将来 自分で サービスを持ちたいエンジニアの葛藤
将来 自分で サービスを持ちたいエンジニアの葛藤 将来 自分で サービスを持ちたいエンジニアの葛藤
将来 自分で サービスを持ちたいエンジニアの葛藤 Yoshio Kajikuri
 
Java9を迎えた今こそ!Java本格(再)入門
Java9を迎えた今こそ!Java本格(再)入門Java9を迎えた今こそ!Java本格(再)入門
Java9を迎えた今こそ!Java本格(再)入門Takuya Okada
 
サーバサイド Kotlin
サーバサイド Kotlinサーバサイド Kotlin
サーバサイド KotlinHiroki Ohtani
 
Selenide or Geb 〜あなたはその時どちらを使う〜
Selenide or Geb 〜あなたはその時どちらを使う〜Selenide or Geb 〜あなたはその時どちらを使う〜
Selenide or Geb 〜あなたはその時どちらを使う〜Youtarou TAKAHASHI
 
JVM上で動くPython処理系実装のススメ
JVM上で動くPython処理系実装のススメJVM上で動くPython処理系実装のススメ
JVM上で動くPython処理系実装のススメYoshiaki Shibutani
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜aha_oretama
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にTaku Miyakawa
 
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyTakakiyo Tanaka
 
Javaアプリケーションの モダナイゼーションアプローチ
Javaアプリケーションの モダナイゼーションアプローチJavaアプリケーションの モダナイゼーションアプローチ
Javaアプリケーションの モダナイゼーションアプローチCData Software Japan
 
マルチクラウドデータ連携Javaアプリケーションの作り方
マルチクラウドデータ連携Javaアプリケーションの作り方マルチクラウドデータ連携Javaアプリケーションの作り方
マルチクラウドデータ連携Javaアプリケーションの作り方CData Software Japan
 
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017Carol Smith
 
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立てユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立てRyosuke Uchitate
 

Viewers also liked (20)

Another compilation method in java - AOT (Ahead of Time) compilation
Another compilation method in java - AOT (Ahead of Time) compilationAnother compilation method in java - AOT (Ahead of Time) compilation
Another compilation method in java - AOT (Ahead of Time) compilation
 
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
 
JJUG初心者のためのJava/JJUG講座
JJUG初心者のためのJava/JJUG講座JJUG初心者のためのJava/JJUG講座
JJUG初心者のためのJava/JJUG講座
 
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017
 
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
 
将来 自分で サービスを持ちたいエンジニアの葛藤
将来 自分で サービスを持ちたいエンジニアの葛藤 将来 自分で サービスを持ちたいエンジニアの葛藤
将来 自分で サービスを持ちたいエンジニアの葛藤
 
Java9を迎えた今こそ!Java本格(再)入門
Java9を迎えた今こそ!Java本格(再)入門Java9を迎えた今こそ!Java本格(再)入門
Java9を迎えた今こそ!Java本格(再)入門
 
サーバサイド Kotlin
サーバサイド Kotlinサーバサイド Kotlin
サーバサイド Kotlin
 
Selenide or Geb 〜あなたはその時どちらを使う〜
Selenide or Geb 〜あなたはその時どちらを使う〜Selenide or Geb 〜あなたはその時どちらを使う〜
Selenide or Geb 〜あなたはその時どちらを使う〜
 
JVM上で動くPython処理系実装のススメ
JVM上で動くPython処理系実装のススメJVM上で動くPython処理系実装のススメ
JVM上で動くPython処理系実装のススメ
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
 
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
 
Javaアプリケーションの モダナイゼーションアプローチ
Javaアプリケーションの モダナイゼーションアプローチJavaアプリケーションの モダナイゼーションアプローチ
Javaアプリケーションの モダナイゼーションアプローチ
 
マルチクラウドデータ連携Javaアプリケーションの作り方
マルチクラウドデータ連携Javaアプリケーションの作り方マルチクラウドデータ連携Javaアプリケーションの作り方
マルチクラウドデータ連携Javaアプリケーションの作り方
 
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
 
CPUから見たG1GC
CPUから見たG1GCCPUから見たG1GC
CPUから見たG1GC
 
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立てユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
 

Similar to 高速なソートアルゴリズムを書こう!!

C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
 
Rubysapporo Stringsearch
Rubysapporo StringsearchRubysapporo Stringsearch
Rubysapporo StringsearchAkio Ishida
 
Pythonによる機械学習
Pythonによる機械学習Pythonによる機械学習
Pythonによる機械学習Kimikazu Kato
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crfShuyo Nakatani
 
Scala/Scrum/DDD 困ったこと50連発ガトリングトーク!!
Scala/Scrum/DDD 困ったこと50連発ガトリングトーク!!Scala/Scrum/DDD 困ったこと50連発ガトリングトーク!!
Scala/Scrum/DDD 困ったこと50連発ガトリングトーク!!Yasuyuki Sugitani
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成Akineko Shimizu
 

Similar to 高速なソートアルゴリズムを書こう!! (9)

OSC2015nagoya
OSC2015nagoyaOSC2015nagoya
OSC2015nagoya
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
[DLHacks]DeepなSSM
[DLHacks]DeepなSSM[DLHacks]DeepなSSM
[DLHacks]DeepなSSM
 
Rubysapporo Stringsearch
Rubysapporo StringsearchRubysapporo Stringsearch
Rubysapporo Stringsearch
 
Pythonによる機械学習
Pythonによる機械学習Pythonによる機械学習
Pythonによる機械学習
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crf
 
OSC2015kyoto
OSC2015kyotoOSC2015kyoto
OSC2015kyoto
 
Scala/Scrum/DDD 困ったこと50連発ガトリングトーク!!
Scala/Scrum/DDD 困ったこと50連発ガトリングトーク!!Scala/Scrum/DDD 困ったこと50連発ガトリングトーク!!
Scala/Scrum/DDD 困ったこと50連発ガトリングトーク!!
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成
 

Recently uploaded

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 

Recently uploaded (8)

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 

高速なソートアルゴリズムを書こう!!

Editor's Notes

  1. 10s プログラミングを習い始めの頃、皆一回くらいはソートアルゴリズムを学んだことがあるはず…。
  2. 30s
  3. 40s プリミティブとは intとかfloatとか。 とりあえず、TimSortを超えるのが目標。
  4. 40s 安定なソートはマージソートやバブルソート 安定でないソートはクイックソートやヒープソート
  5. 30s クイックソートは最悪ケースで O(N2) になることがある。…ヒープソートを併用して回避したりする。 マージソートは速いソートの中で唯一の安定ソート。その代わり外部メモリが必要だったりする。Arrays.sortはマージソートの一種。
  6. 10s
  7. 30s
  8. 30s
  9. 50s CPUキャッシュってなんぞや…最近アクセスしたメモリ(つまりオブジェクト)を高速にアクセスできる「キャッシュメモリ」に覚えておく。
  10. 40s 再帰の深さが2/3になるということは、メモリの転送回数も2/3になる。
  11. 30s ソート対象と同じ大きさの外部メモリが必要。
  12. 30s コピー処理にSIMDを使えるともっと高速化されるのだけど…。
  13. 40s
  14. 30s ここまでがクイックソート高速化のお話。
  15. 10s
  16. 30s
  17. 30s
  18. 30s K-way Mergesortは…誰でも一度は考える。
  19. 30s
  20. 30s
  21. 30s state変数の取りうる値は15種類…全体で66個ものif文、4-way mergesortにすると213個ものif文 ここまでがマージソート高速化のお話
  22. 10s
  23. 30s ワークメモリが要らない、インプレースマージソートってのもあるけどあんまり速くない。 Inplace Mergesortの例 O(N log N)のもの WikiSort … MergeSortの倍近く…ただし、ソースに改善の余地ありと思う。  GrailSort … C++のみ … Javaに移植して試したいが…。
  24. 40s ¼の範囲ごとのソートは安定ソートなら何でもいい。ソート範囲サイズと同じワークメモリが使える。 ②~④の実行コストは1/Kのワークメモリの場合、O(N・K)に比例する。つまり、Kが固定なら、O(N)ということ。 ここまでが省メモリマージソートのお話。
  25. 10s
  26. 20s 整数のキータイプと文字列のキータイプでベンチマークした。 CPUのアーキテクチャもそうだし、ダミー項目の増減でもパフォーマンスは変わる。 自分の環境はメモリが若干遅め(安物)ってところも影響はあるかも。
  27. 20s
  28. 50s
  29. 30s
  30. 20s 敷居はそんなに高くないよ。アイデア次第。 …突き詰めると離散数学とか出てくるけど…
  31. 10s