後半はparserとか
Jon Orwant,Jarkko Hietaniemi,John MacDonald
Oreilly & Associates Inc / ¥ 4,054 (1999-07)
通常3~5週間以内に発送
HOPも読んだし、再帰下降パーサもいじったことあるのでさらさらと。あとハフマン符号化とか。
結局1週間近くかけて読んだが文字列検索アルゴリズムがなかなか面白かった。
後半はparserとか
HOPも読んだし、再帰下降パーサもいじったことあるのでさらさらと。あとハフマン符号化とか。
結局1週間近くかけて読んだが文字列検索アルゴリズムがなかなか面白かった。
perlは写経でいまいち理解度があやしいため、pythonでBoyer-Moore法を。パターンとの不一致の場合には何文字スキップできるか、一致した場合に何文字スキップできるかのテーブルを最初に作っておいて、スキップ幅の大きいほうでスキップしながらパターンマッチを進めていく。
def boyer_moore_bad_character (P): m = len(P) bc = [m] * 256 j = m for char in list(P): bc[ord(char)] = j - 1 j -= 1 return m, bc def boyer_moore_good_suffix (m,P): j = m + 1 gs = [0] * j k = [0] * j k[m] = j for i in reversed(range(1,j)): while j <= m and P[i-1] != P[j-1]: if gs[j] == 0: gs[j] = j - i j = k[j] j -= 1 k[i-1] = j kn = k[0] for j in range(m+1): if gs[j] == 0: gs[j] = kn if j == kn: kn = k[kn] gs.pop(0) return gs def boyer_moore (T,P): (m,bc) = boyer_moore_bad_character(P) gs = boyer_moore_good_suffix(m,P) (i, last_i, first_j) = (0, len(T)-m, m-1) for i in range(last_i+1): j = first_j while j >= 0 and T[i+j] == P[j]: j -= 1 if j < 0: return i else: bcn = bc[ord(T[i+j])] - m + j + 1 gsn = gs[j] i += bcn if bcn > gsn else gsn return -1 if __name__ == '__main__': print boyer_moore("perlpypythonruby","python")
for文でカウンタ変数使いたかったのでrangeをつかったけどPython流はどうやるのがよろしいんだろうか、、、カウンタ変数減算するのにfor i in reversed(range(1,j))だしな。
パターンマッチングとか。
色々と検索アルゴリズムが紹介されていてなかなか進まない。
Boyer-Moore法を写経して、ついでにPythonで書き直してみたけどgood suffixのアルゴリズムがうまくかけません。perlのfor文とpythonのfor文は大分違うなと。というか、文字列の位置を記憶しながら逆向きに移動していってごにょごにょする方法が分からん。
for(;;)みたいなこと(カウンタ変数を使うっていうの?)をpythonでやる場合にはどういうことをすればいいんじゃと調べてみたら、そういう場合にはfor文は使わないのがお約束としか書いてなかったが、どうもwhile文を使えということらしい。
ふむ。
perlのコード見ながらpythonのコードに移植しようとすんのが間違ってるのかな。
06122007 chemoinformatics perl MAWP
Graphなどを使ってグラフ
なんかをコードを追いながら理解することができた。Primはこっちの説明が分かりやすくてお奨め。
Pythonだとnetworkxがあってこっちは視覚化できてよさげ。
chemoinformaticsでグラフは化合物の構造表現なんかでよく使う。というか、売り物ツールが勝手にやってくれるのであまりちゃんと理解してなかったんだけど、アルゴリズムしらないで理解しないで使うと痛い目見たりとか、中身がよく分からんので痒いところに手が届かない感じが嫌だなと思うことがあったので、MAWP読んで基本的なところをちょっと押さえた気になった。
そういえば、gSpanなんかで、部分構造いじってみたいと思ってたんだけど、放ってあるなぁ。
行列演算の章
でもPDLもMath::MatrixRealも突っ込んだことやるにはちょっと非力な感じなので、素直にRを使うのがよさげ。
となると、perlでRを扱うのにいまいちよさげなモジュールがないので行列演算するのはrpyが使えるPythonのほうがよいかなと思う。
というわけで7章は軽くスルー。
また同じ理由により15章(statistics)も斜め読みして終了。それにしても統計の章は軽すぎ。もうちょっと突っ込んだほうがよいような気がするけど。
集合論
key値に名前でvalueがundefのハッシュを使って集合の計算をするという。なんかそういう実装のやり方って、、、読んでてかなりアレだった(途中で慣れたけど)。
Set::Scalarってモジュールで集合を扱えるがPythonには標準で集合扱えるようになってんだよね。
Minimax,Alpha-beta,Killer moveで検索すると将棋のサイトによくあたる。
Heap::Fibonacciってのがいまいちよく分からなかったのでRadium Software Developmentを後で読む。
明日からどうせまた忙しくなるので、今日は時間をとって一日中MAWPを読んでた。
ひたすらソート。
シェルソートってのはバブルソートの従兄弟のようなもんだ。名前の由来は実はメタファーじゃないんだよ。単に考えたヒトの名前からとっただけだヨ(超意訳)
と、豆知識を仕入れつつ。
radix sortってのは知らなかった。後ろから順番に仕分けしていくイメージのアルゴリズムかな。
ソート一覧
とこれらのハイブリッド。
linked listはHOPでやったので、binary heapsを実装してみたりとか。
グラフ表現と遺伝アルゴリズムが面白そうだったので、HOPの次に読もうと買っておいた。で半年近く放っておいたわけですが。
1章、2章は割と基本的なことなんで軽く読み流した。3章はlinked listとか木構造のようなデータ構造の章らしい。