20111217 gunmaweb#7 エダカリン!

1,348 views
1,327 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,348
On SlideShare
0
From Embeds
0
Number of Embeds
613
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

20111217 gunmaweb#7 エダカリン!

  1. 1. エダカリン! @ivoryworks2011.12.17 gunma.web #7
  2. 2. @ivoryworksC / Java / PHP / JS / Python
  3. 3. 今回のテーマ枝刈り
  4. 4. 枝刈り 主にツリー状のデータを扱う際、 メモリや計算時間を節約する手法不要な枝を刈ってデータを小さくする (作らない・削除する)
  5. 5. どうして枝刈りするの?データを作る人(処理)データを読む人(処理)早く作れて早く読める
  6. 6. 実は刈らなくてもいい 無限の時間と無限のリソースがあるなら処理もシンプルになる
  7. 7. 待ってらんない
  8. 8. 話を変えます
  9. 9. 実用 R アナグラミング 2008 昔つくった ローマ字の アナグラムを つくるサイト http://www.ivoryworks.com/anagram/
  10. 10. 実用 Perl プログラミング
  11. 11. 実用 R アナグラミング PHPで書いた Perl使ってない http://www.ivoryworks.com/anagram/
  12. 12. アナグラム 言葉遊びの一つ。単語または文の中の文字をいくつか入れ替えることによって全く別の意味にさせる遊びである。 Wikipedia - http://ja.wikipedia.org/wiki/アナグラム
  13. 13. 1 + 12 = 2 + 11one plus twelve = two plus eleven
  14. 14. アナグラミングをローマ字でやる 元となる文字列を並び替える ツリーを作って処理する ようするに 枝
  15. 15. 並びパターン3文字だと6通り 3x2x1=6
  16. 16. N! 階乗3! = 6
  17. 17. EDAKARI-N!
  18. 18. 階乗 2文字:2 x 1 = 2通り 3文字:3 x 2 x 1 = 6通り 4文字:4 x 3 x 2 x 1 = 24通り 5文字:5 x 4 x 3 x 2 x 1 = 120通り 6文字:6 x 5 x 4 x 3 x 2 x 1 = 720通り 7文字:7 x 6 x 5 x 4 x 3 x 2 x 1 = 5040通り8文字:8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 40320通り 階乗ヤバい! ねずみ算式に増えていく 10文字で3628800通りとか激ヤバだけど事実
  19. 19. 3! = 3 x 2 x 1 = 6
  20. 20. 10! = 3628800
  21. 21. ローマ字アナグラムを作る処理1.入力:ローマ字2.アナグラムツリー生成3.アナグラムツリーからアナグラムリスト生成4.アナグラムリストから読み仮名ツリー生成5.読み仮名ツリーから読み仮名リスト生成6.出力:アナグラム読み仮名リスト
  22. 22. 読み仮名ツリー?読み仮名は1つでは?
  23. 23. 複数の読み方 兄 ANI 安易
  24. 24. ANINAANI
  25. 25. 一緒に刈ろうぜ! CAPCOM
  26. 26. サンプル“NEZUMIZAN” ねずみざん
  27. 27. NEZUMIZAN 9文字
  28. 28. NEZUMIZAN362,880通り
  29. 29. Try-0何も考えない
  30. 30. 16.573249816895 sec.
  31. 31. どれが不要な枝なのか 不要な枝の判断はデータの特性や内容によって異なる 作る人や読む人次第
  32. 32. 刈り方枝を作る前に刈る枝を作ってから刈る
  33. 33. 枝を作る前に刈る 枝を伸ばす前に不要な枝になることを予測して それ以上計算しない
  34. 34. 枝を作ってから刈る 枝を伸ばした後 不要と判断したら 枝を逆上って刈る
  35. 35. Cace by Cace
  36. 36. Try-1同じ計算しない (伸ばす前に刈れ)
  37. 37. AKA同じ色の枝ダブってね?
  38. 38. 小さくなった
  39. 39. 16.573249816895 sec.15.555239915848 sec.
  40. 40. Try-2 途中で見切る1(伸ばす前に刈れ&伸ばした後刈れ)
  41. 41. 伸ばしても無駄な枝 残りの文字に母音(A,I,U,E,O) もしくはNが存在しなければ枝を伸ばしてもローマ字が成立しない
  42. 42. AKA青いところローマ字成立してなくね?
  43. 43. もっと小さくなった
  44. 44. 16.573249816895 sec.15.555239915848 sec.8.3212361335754 sec.
  45. 45. Try-3 途中で見切る2(伸ばす前に刈れ&伸ばした後刈れ)
  46. 46. 枝を伸ばす際に 読み仮名変換処理にかけて既に読めないならその枝いらない
  47. 47. 16.573249816895 sec.15.555239915848 sec.8.3212361335754 sec.2.0270299911499 sec.
  48. 48. Try-Final素早く刈れ(時間かけるな)
  49. 49. 読み仮名変換処理を元にローマ字スペルチェッカーを作成 軽量化
  50. 50. 16.573249816895 sec.15.555239915848 sec.8.3212361335754 sec.2.0270299911499 sec.1.1768751144409 sec!
  51. 51. (362,880通り)16.573249816895 sec.1.1768751144409 sec! (2,160通り)
  52. 52. よく刈れました
  53. 53. github - romaji-anagram -https://github.com/ivoryworks/romaji-anagram
  54. 54. まとめ● いらない枝は刈ろう● 効率良く刈ろう● データが小さくなる● 小さなデータは早く作れる● 小さなデータは早く扱える
  55. 55. ねずみ算演算済み
  56. 56. おしまい

×