iHeader.dataSize);}あとは、適当にテストして遊ぶ。アプリ開発2011年7月19日火曜日Haskell勉強記(8)前回分からなかったfoldlをfoldrで書きかえる方法について。foldrの一つらしい。"5"]は、foldrを用いて以下のように書ける。[]関数適用がもっとも結合度が高いことと、関数適用はleft-associativeであることを考えると、上式は以下と等価。[]なるほど、foldrは、値と関数を受け取って新しい関数を返す関数であることが分かる。やってるのは、こんなこと。[]それ自体を返す関数を受け取って、5を末尾に付ける関数を作る。それを受け取って、4を末尾に付けた後に、5を末尾に付ける関数を作る。それを受け取って、・・・・・という具合。一般に以下の書き換えが可能。function)について少し復習してみた。新しい発見があったのでメモしておく。オイラー関数とは、と素因数分解できるある自然数nに対して、と表され、これはn未満の自然数でnと互いに素なものの数を表しています。上記の公式の証明は、以下3つの補題から簡単にできます。1番目の補題は、pが素数なことから自明。2番目の補題は、p^k未満の数でpを素因数にもつものを数えれば導出できます。3番目の補題は、aと因数を共有しないもの、bと因数を共有しないものを、それぞれaとbの法を元に列挙して、中国の剰余定理を使えば証明できます。これら3つの補題からオイラー関数の公式は導出可能ですが、詳細は省略。(1-nまで自然数のpkで割れない確率)と捉えることができるということです。確かに言われてみればその通りですが、この発想は面白いと思いました。数学2011年7月14日木曜日C++でハッシュのマップを実装するC++のset/mapは、二分木で実装されている。要素数が大きくなると重くなってしまうので(平衡木の回転の処理が重たい?)、ハッシュを使ってmapみたいなものを実装してみた(挿入、参照のみ)。}};これで、参照/挿入はO(1)でできるはず。衝突がどれくらい起きているかを調べるためにprintHashBalance()という関数を定義した。コンストラクタには、使用するハッシュ関数のポインタと、ハッシュ値のサイズを渡す。適当にテストコードを書いて、標準関数のmapと比較する。WORDS_NUM個のランダムな文字列を、それぞれのコンテナにぶちこんで、最頻出の文字列を求める。HashMapの_sizeは入力文字数と同じサイズにした。一つのハッシュ値に格納される入力値の種類は平均1.45くらいだった。20.274もっと速くなると思ったが、どこがネックなんだろう。オーダー的にはハッシュ値の計算が重いけど、実際はvectorのメモリ関連処理が遅そうな気がする。プロファイルとってみるかー。cpp2011年7月13日水曜日Haskellで有名アルゴリズム実装(5)最近英語力が落ちてる感があるので、英語で書く。マージソート今日は、軽い実験。