Yearly Archives: 2008

2008-11-16

列の差分アルゴリズム

先週末から差分抽出アルゴリズムに取り組んでいます。

二つの列の差分を調べるというのは、LCS(Longest Common Subsequence:最長共通部分列)やSES(Shortest Edit Script:最短編集スクリプト)を求める処理です。

例えば、abcdとabbbcという列があった場合、(ab)(c)というのがLCSで、共通(ab)追加(bb)共通(c)削除(d)みたいなのがSESです。追加2、削除1なので、編集回数は3で、これを編集距離(Edit Length)が3と呼びます。

で、実際にこれをどう解くかなのですが、以下、見つけた限りの資料。

で、結局私はどうしたかというと、「An O(NP) Sequence Comparison Algorith」の最後に書いてあるコードを元に編集距離を求めるプログラムを試してみて、そこから共通部分の検出時に記録をとるような処理を追加してLCSを求めました。

でも、複数ある答え(LCS,SES)のうち、一つしか求められないのが痛いところです。長い列と短い列の差分をとった場合、細切れな差分が出来てしまう場合があります。たとえば、ravsogiupihrhawegoiurseagroihuとroihuの差分をとった場合、削除(25文字)、共通(roihuとなってほしいのですが、実際には共通(r)、削除(3文字)、共通(o)、削除(1文字)、共通(i)、削除(3文字)、共通(h)、削除(8文字)、共通(u)、削除(10文字)のようになってしまいます。どちらも編集距離25なので、間違ってはいないのですが……。CVSを使っているとよく括弧だけの行が全然関係ない変更していない行とマッチして、気持ち悪い差分を出力してしまうことがありますが、これが原因なんですね。とりあえず、今回の用途では、4文字以上連続でマッチしないと共通と認識しないようにすることで回避してみました。普通どうするものなんでしょう。

2008-11-12

sas5不透明度表現

不透明度はやはり0.0~1.0とすべきなんだろう。ということで関係するところを修正。

ただ、この手の輝度とか比率とかを表す部分って他にも色々あるんだよね。全部直すのはちょっと面倒だなぁ。まあ、少しずつ直していきましょう。

2008-11-07

体調不良

体調不良で会社を休むのはかなり久しぶりのことだと思う。
体調が悪くても、ゲホゲホじゅるじゅるいいながら会社に行っていたし(なんて迷惑な!)。

まあ、季節の変わり目には良くある症状ですね。

でも、この体調で人と長時間会話をする自信はない。

2008-11-01

新刊チェック

今までe-honを使っていたんだけど、AriBookへ移行してみた。新刊.netってのもあったんですね。そっちでも良かったかも。

まあ、新刊チェックしているシリーズって四つしか無いけど。

2008-11-01

Implicit Type Conversion From int32 To float64

算術演算の格上げとパラメータ引き渡し時の変換をしないとさすがに辛いなと。それをすれば、SCALE_UNITを2048から1.0にすることである程度そのままいける。ただ、エラーになってくれた方が非互換部分が浮き彫りになるから良いという話もあるけど……。

とりあえず演算子の多重定義解決、定数たたみ込み、コード生成部分をどうするか迷い中。綺麗にまとめられそうで、案外そうもいかないのがもどかしい。

こういうのは色々悩んだあげく、結局一番最小限の変更で済むある意味場当たり的なコードに落ち着くんだよなぁ。