20111217 gunmaweb#7 エダカリン!

56
エダカリン! @ivoryworks 2011.12.17 gunma.web #7

Upload: ivoryworks-

Post on 26-Dec-2014

1.168 views

Category:

Documents


2 download

DESCRIPTION

 

TRANSCRIPT

Page 1: 20111217 gunmaweb#7 エダカリン!

エダカリン!@ivoryworks

2011.12.17 gunma.web #7

Page 2: 20111217 gunmaweb#7 エダカリン!

@ivoryworks

C / Java / PHP / JS / Python

Page 3: 20111217 gunmaweb#7 エダカリン!

今回のテーマ

枝刈り

Page 4: 20111217 gunmaweb#7 エダカリン!

枝刈り

主にツリー状のデータを扱う際、メモリや計算時間を節約する手法不要な枝を刈ってデータを小さくする

(作らない・削除する)

Page 5: 20111217 gunmaweb#7 エダカリン!

データを作る人(処理)データを読む人(処理)

早く作れて早く読める

どうして枝刈りするの?

Page 6: 20111217 gunmaweb#7 エダカリン!

無限の時間と無限のリソースがあるなら

処理もシンプルになる

実は刈らなくてもいい

Page 7: 20111217 gunmaweb#7 エダカリン!

待ってらんない

Page 8: 20111217 gunmaweb#7 エダカリン!

話を変えます

Page 9: 20111217 gunmaweb#7 エダカリン!

実用 R アナグラミング

2008昔つくったローマ字のアナグラムをつくるサイト

http://www.ivoryworks.com/anagram/

Page 10: 20111217 gunmaweb#7 エダカリン!

実用 Perl プログラミング

Page 11: 20111217 gunmaweb#7 エダカリン!

実用 R アナグラミング

PHPで書いたPerl使ってない

http://www.ivoryworks.com/anagram/

Page 12: 20111217 gunmaweb#7 エダカリン!

アナグラム

言葉遊びの一つ。単語または文の中の文字をいくつか入れ替えることによって全く別の意味にさせる遊びである。

Wikipedia - http://ja.wikipedia.org/wiki/アナグラム

Page 13: 20111217 gunmaweb#7 エダカリン!

1 + 12 = 2 + 11

one plus twelve = two plus eleven

Page 14: 20111217 gunmaweb#7 エダカリン!

アナグラミングをローマ字でやる

元となる文字列を並び替える

ツリーを作って処理する

ようするに

Page 15: 20111217 gunmaweb#7 エダカリン!

並びパターン

3文字だと6通り3 x 2 x 1 = 6

Page 16: 20111217 gunmaweb#7 エダカリン!

N!階乗

3! = 6

Page 17: 20111217 gunmaweb#7 エダカリン!

EDAKARI-N!

Page 18: 20111217 gunmaweb#7 エダカリン!

階乗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通りとか激ヤバだけど事実

Page 19: 20111217 gunmaweb#7 エダカリン!

3! = 3 x 2 x 1 = 6

Page 20: 20111217 gunmaweb#7 エダカリン!

10! = 3628800

Page 21: 20111217 gunmaweb#7 エダカリン!

ローマ字アナグラムを作る処理

1.入力:ローマ字2.アナグラムツリー生成3.アナグラムツリーからアナグラムリスト生成4.アナグラムリストから読み仮名ツリー生成5.読み仮名ツリーから読み仮名リスト生成6.出力:アナグラム読み仮名リスト

Page 22: 20111217 gunmaweb#7 エダカリン!

読み仮名ツリー?

読み仮名は1つでは?

Page 23: 20111217 gunmaweb#7 エダカリン!

複数の読み方

兄ANI安易

Page 24: 20111217 gunmaweb#7 エダカリン!

ANINAANI

Page 25: 20111217 gunmaweb#7 エダカリン!

一緒に刈ろうぜ!CAPCOM

Page 26: 20111217 gunmaweb#7 エダカリン!

サンプル

“NEZUMIZAN”ねずみざん

Page 27: 20111217 gunmaweb#7 エダカリン!

NEZUMIZAN

9文字

Page 28: 20111217 gunmaweb#7 エダカリン!

NEZUMIZAN

362,880通り

Page 29: 20111217 gunmaweb#7 エダカリン!

Try-0何も考えない

Page 30: 20111217 gunmaweb#7 エダカリン!

16.573249816895 sec.

Page 31: 20111217 gunmaweb#7 エダカリン!

どれが不要な枝なのか

不要な枝の判断はデータの特性や内容によって異なる

作る人や読む人次第

Page 32: 20111217 gunmaweb#7 エダカリン!

刈り方

枝を作る前に刈る

枝を作ってから刈る

Page 33: 20111217 gunmaweb#7 エダカリン!

枝を作る前に刈る

枝を伸ばす前に不要な枝になることを予測して

それ以上計算しない

Page 34: 20111217 gunmaweb#7 エダカリン!

枝を作ってから刈る

枝を伸ばした後不要と判断したら枝を逆上って刈る

Page 35: 20111217 gunmaweb#7 エダカリン!

Cace by Cace

Page 36: 20111217 gunmaweb#7 エダカリン!

Try-1同じ計算しない

(伸ばす前に刈れ)

Page 37: 20111217 gunmaweb#7 エダカリン!

AKA

同じ色の枝ダブってね?

Page 38: 20111217 gunmaweb#7 エダカリン!

小さくなった

Page 39: 20111217 gunmaweb#7 エダカリン!

16.573249816895 sec.15.555239915848 sec.

Page 40: 20111217 gunmaweb#7 エダカリン!

Try-2途中で見切る1

(伸ばす前に刈れ&伸ばした後刈れ)

Page 41: 20111217 gunmaweb#7 エダカリン!

伸ばしても無駄な枝

残りの文字に母音(A,I,U,E,O)もしくはNが存在しなければ

枝を伸ばしてもローマ字が成立しない

Page 42: 20111217 gunmaweb#7 エダカリン!

AKA

青いところローマ字成立してなくね?

Page 43: 20111217 gunmaweb#7 エダカリン!

もっと小さくなった

Page 44: 20111217 gunmaweb#7 エダカリン!

16.573249816895 sec.15.555239915848 sec.8.3212361335754 sec.

Page 45: 20111217 gunmaweb#7 エダカリン!

Try-3途中で見切る2

(伸ばす前に刈れ&伸ばした後刈れ)

Page 46: 20111217 gunmaweb#7 エダカリン!

枝を伸ばす際に読み仮名変換処理にかけて

既に読めないならその枝いらない

Page 47: 20111217 gunmaweb#7 エダカリン!

16.573249816895 sec.15.555239915848 sec.8.3212361335754 sec.2.0270299911499 sec.

Page 48: 20111217 gunmaweb#7 エダカリン!

Try-Final素早く刈れ

(時間かけるな)

Page 49: 20111217 gunmaweb#7 エダカリン!

読み仮名変換処理を元にローマ字スペルチェッカーを作成

軽量化

Page 50: 20111217 gunmaweb#7 エダカリン!

16.573249816895 sec.15.555239915848 sec.8.3212361335754 sec.2.0270299911499 sec.1.1768751144409 sec!

Page 51: 20111217 gunmaweb#7 エダカリン!

(362,880通り)16.573249816895 sec.

1.1768751144409 sec!(2,160通り)

Page 52: 20111217 gunmaweb#7 エダカリン!

よく刈れました

Page 53: 20111217 gunmaweb#7 エダカリン!

github

- romaji-anagram -https://github.com/ivoryworks/romaji-anagram

Page 54: 20111217 gunmaweb#7 エダカリン!

まとめ

●いらない枝は刈ろう●効率良く刈ろう●データが小さくなる●小さなデータは早く作れる●小さなデータは早く扱える

Page 55: 20111217 gunmaweb#7 エダカリン!

ねずみ算

演算済み

Page 56: 20111217 gunmaweb#7 エダカリン!

おしまい