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