Scalaで
クイックソートを
書いてみよう
2014-02-08 第3回 Scala関西ビギナーズ
14年2月8日土曜日
自己紹介

14年2月8日土曜日
粕谷 大輔
Twitter: @daiksy
フリュー株式会社

自己紹介

14年2月8日土曜日
電子書籍
『開発現場に伝えたい10のこと』
達人出版会 500円

自己紹介

14年2月8日土曜日
ソート

ツリー
探索

ハッシュ

アルゴリズム
スタック & キュー
リスト
動的計画法
14年2月8日土曜日

再帰
新しい言語を学ぶ際に
時々振り返ると
アルゴリズム
いろいろ気づくことがある

14年2月8日土曜日
今回はクイックソートを見てみる

14年2月8日土曜日
L Q C A K B I J F R H D N T E O S G M P

14年2月8日土曜日
L Q C A K B I J F R H D N T E O S G M P

pivot
を決める

14年2月8日土曜日
L Q C A K B I J F R H D N T E O S G M P
C A K B I J F H D E G L Q R N T O S M P

pivotより小さい
グループと
大きいグループに分ける

14年2月8日土曜日
L Q C A K B I J F R H D N T E O S G M P
C A K B I J F H D E G L Q R N T O S M P
A B C K I

J F H D E G L

繰り返す

14年2月8日土曜日...
まずはJavaだとこう書ける

14年2月8日土曜日
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integ...
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integ...
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integ...
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integ...
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integ...
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integ...
public class QuickSort {
public static List<Integer> sort(List<Integer> list) {
if (list.isEmpty()) {
return list;
}
Integ...
さて、Scalaで書くとこうなる

14年2月8日土曜日
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= ...
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
listの先頭をpivotとし、
case Nil => data
それ以外のlistを取り出す
case ...
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= ...
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= ...
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= ...
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= ...
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.filter(_ <= ...
CAUTION!!
def qSort[T <% Ordered[T]](data: List[T]): List[T] = {
data match {
case Nil => data
case x::xs => {
qSort(xs.fi...
まとめ:
Scalaで再帰を使って書くと
手続き的に書くより直感的に
書ける(事がよくある)。

14年2月8日土曜日
宣伝

14年2月8日土曜日
dmm4s

https://github.com/daiksy/dmm4s
14年2月8日土曜日
ご清聴ありがとうございました

14年2月8日土曜日
Upcoming SlideShare
Loading in …5
×

Scala関西ビギナーズ

2,702 views

Published on

第3回Scala関西ビギナーズ発表資料

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,702
On SlideShare
0
From Embeds
0
Number of Embeds
1,238
Actions
Shares
0
Downloads
3
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Scala関西ビギナーズ

  1. 1. Scalaで クイックソートを 書いてみよう 2014-02-08 第3回 Scala関西ビギナーズ 14年2月8日土曜日
  2. 2. 自己紹介 14年2月8日土曜日
  3. 3. 粕谷 大輔 Twitter: @daiksy フリュー株式会社 自己紹介 14年2月8日土曜日
  4. 4. 電子書籍 『開発現場に伝えたい10のこと』 達人出版会 500円 自己紹介 14年2月8日土曜日
  5. 5. ソート ツリー 探索 ハッシュ アルゴリズム スタック & キュー リスト 動的計画法 14年2月8日土曜日 再帰
  6. 6. 新しい言語を学ぶ際に 時々振り返ると アルゴリズム いろいろ気づくことがある 14年2月8日土曜日
  7. 7. 今回はクイックソートを見てみる 14年2月8日土曜日
  8. 8. L Q C A K B I J F R H D N T E O S G M P 14年2月8日土曜日
  9. 9. L Q C A K B I J F R H D N T E O S G M P pivot を決める 14年2月8日土曜日
  10. 10. L Q C A K B I J F R H D N T E O S G M P C A K B I J F H D E G L Q R N T O S M P pivotより小さい グループと 大きいグループに分ける 14年2月8日土曜日
  11. 11. L Q C A K B I J F R H D N T E O S G M P C A K B I J F H D E G L Q R N T O S M P A B C K I J F H D E G L 繰り返す 14年2月8日土曜日 R N M O P Q T S
  12. 12. まずはJavaだとこう書ける 14年2月8日土曜日
  13. 13. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  14. 14. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } listの先頭をpivotとし、 それ以外のlistを取り出す List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  15. 15. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } pivot以下のグループ List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  16. 16. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } pivotより大きいグループ List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  17. 17. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); pivot以下のグループ、 pivot、 pivotより大きいグループ それぞれを再帰的に連結 return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  18. 18. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  19. 19. public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } ちゃんと読めば意図を理解できるけど、 List<Integer> rightSide = new LinkedList<>(); ぱっと見ではわかりづらくないですか? for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } } 参考: http://nikcode.blogspot.jp/2013/10/quick-sort-scala-vs-java.html 14年2月8日土曜日
  20. 20. さて、Scalaで書くとこうなる 14年2月8日土曜日
  21. 21. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } }   14年2月8日土曜日
  22. 22. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { listの先頭をpivotとし、 case Nil => data それ以外のlistを取り出す case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } }   14年2月8日土曜日
  23. 23. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } pivot以下のグループ }   14年2月8日土曜日
  24. 24. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } } pivotより大きいグループ   14年2月8日土曜日
  25. 25. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } pivot以下のグループ、 } pivot、   pivotより大きいグループ それぞれを再帰的に連結 14年2月8日土曜日
  26. 26. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } }   14年2月8日土曜日
  27. 27. def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } }   直感的な気がする!!! 14年2月8日土曜日
  28. 28. CAUTION!! def qSort[T <% Ordered[T]](data: List[T]): List[T] = { data match { case Nil => data case x::xs => { qSort(xs.filter(_ <= x)) ++ List(x) ++ qSort(xs.filter(x < _)) } } }   実はこれ、末尾再帰じゃないので わりとすぐにスタックオーバーフロー!! 14年2月8日土曜日
  29. 29. まとめ: Scalaで再帰を使って書くと 手続き的に書くより直感的に 書ける(事がよくある)。 14年2月8日土曜日
  30. 30. 宣伝 14年2月8日土曜日
  31. 31. dmm4s https://github.com/daiksy/dmm4s 14年2月8日土曜日
  32. 32. ご清聴ありがとうございました 14年2月8日土曜日

×