Rubyで連結リスト使うためのgemを作った(tsukuba.rb版)

3,942 views

Published on

2013/12/12 のTsukuba.rb の発表資料です。

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,942
On SlideShare
0
From Embeds
0
Number of Embeds
2,714
Actions
Shares
0
Downloads
5
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Rubyで連結リスト使うためのgemを作った(tsukuba.rb版)

  1. 1. Rubyで連結リスト使うための gemを作った @gam0022
  2. 2. 自己紹介 Twitter: @gam0022 情報科学類3年(coins11) @daigoroubot の飼い主 COJT SWコース Ruby と C# けっこうなんでも書きます
  3. 3. 作った動機 Rubyでオーバーヘッドを気にせずに 再帰プログラミングをしたかった。 (情報特別講義の課題)
  4. 4. Rubyで再帰プログラミング Ruby の Array は 配列で実装されている。 遅い + メモリを消費する 次の操作が 先頭への要素の追加(cons) 連結(append) push などが破壊的操作 再帰プログラミングをするのには致命的
  5. 5. なんとかしたい リストのデータ構造を自分で作ってみた! ImmutableList
  6. 6. ImmutableList 特徴 単方向連結リスト(singly-circularly-linked list) 非破壊的(immutable) Cで実装 (C Extensions) Rubyで実装すると、オーバーヘッドが多すぎる RubyGemsでは、Cで実装されたLinkedListは見つから なかった
  7. 7. ImmutableList OCaml を意識したメソッド cons head, tail rev_append, rev, append length nth
  8. 8. Basic
  9. 9. Benchmark 先頭に長さ3のリストを連結するのにかかった秒数 連結回数 Array ImmutableList 10 1.5E-05 2E-05 1000 0.007251 0.00166 10000 0.727542 0.015206 100000 102.080825 0.414083
  10. 10. メモリ効率の良さ Arrayの連結(C = A + B) : メモリの使用量が2倍 B A 1 2 3 + 1 2 3 4 4 6 5 8 7 C 5 6 7 8 4 5 6 7 B A 1 2 3 8
  11. 11. メモリ効率の良さ ImutableListの連結(C = A + B): BとCはメモリを共有 B A 1 3 2 + 4 6 5 7 8 C 1 2 3 B A 1 2 3 4 5 6 7 8
  12. 12. Quick Sort とは クイックソート 一般的に最も高速なソート O(n log n)、安定ソートではない アルゴリズム 1. 適当に数(ピポット)を選ぶ 2. ピポットより小さい数を前方、大きい数を後方に分割 3. 2分割されたデータで更に繰り返す
  13. 13. Quick Sort 素朴な実装 tempとか実装上の都合 の変数が多い (#・ ・) プログラムの動作が追い にくい (#・ ・) 読みにくい (#・ ・)
  14. 14. Quick Sort 再帰版
  15. 15. RubyGemsで公開中 RubyGemとは Rubyのライブラリのパッケージ管理システム
  16. 16. Install コマンド一発で導入可能
  17. 17. ご静聴ありがとうございました 詳しい話はブログで 「ruby immutable_list」で検索 http://gam0022.net/blog/2013/10/22/immutablelist-gem/ http://gam0022.net/blog/2013/10/18/gems-withextensions/
  18. 18. 余談 RubyのC拡張は作りやすさは素晴らしい。 しかし、デメリットもある。 Rubyを改良するための大きな変更がしたいときに、C拡張 が足を引っ張る。 効率の良いGCを取り入れたいが、それまでのライブラリが 使えなくなる。
  19. 19. RGenGC GCは重い処理。 現状のRubyは mark&sweep 方式(全探索で遅い) Ruby 2.1 では世代別GCが採用予定 RGecGC 過去のC拡張の互換性を保ちつつ高速化 http://www.atdot.net/ ko1/activities/ RubyKaigi2013-ko1.pdf

×