Algorithm

エラトステネスの篩の空間効率

ref:http://www.algo.ics.tut.ac.jp/~yusuke_abe/html/2008-03-01.html#2008-03-01-1 「常識的」が「普通」に書き換わったのはなぜだろう. それはちょうどこのへんを読んだので、その通りかも、と思って修正した結果です。 さて、それはともかくとして、エ…

素数表

ref:http://www.algo.ics.tut.ac.jp/~yusuke_abe/html/2008-02-19.html#2008-02-19-1 Project Euler をやっている人は素数関係の部分をライブラリ化するに違いないと思う今日この頃ですが、エラトステネスの篩だろ、常識的普通に考えて。 % time java Prime …

範囲の与え方

ref:404 Blog Not Found:アルゴリズム百選 - 二分探索(binary search) あとまぁ、どうでもいいといえばどうでもいいのだけど。 範囲指定する場合、終端は終端要素のインデックス + 1 で与えるのが通例じゃないのかなぁ。というか、終端要素のインデックスを…

Suffix Array の検索

ref:404 Blog Not Found:アルゴリズム百選 - 二分探索(binary search) 面白い応用としては、Suffix Arrayというものがあります。これは無秩序に並んだデータ、例えば一般的なテキストファイルに対応する秩序だったデータ構造を用意し、それに対して二分探索…

quick sort

ref:Quick Sort - mono-hateの日記 なんか以前も Haskell での quick sort について書いたような記憶があるけども、Python でもできたりするな。 def quicksort(xs): if len(xs) == 0: return [] x = xs[0] return quicksort([y for y in xs[1:] if y < x]) …

部分文字列頻度計数

ファイルの中にある文字列が何回出現するか数えたいとする。 sub count_occurrences { my ($search, $text) = @_; my @m = ($text =~ /\Q$search\E/g); return scalar @m; } さて、このサブルーチンはうまく動くだろうか。うまく動かないとすれば、何がまず…

edit distance

ref:みずぴー日記 - 文字列の距離 via:Blog/2007-8-20 - Rocco の日記 普通、こういうのは edit distance (編集距離) と言うんじゃないかな、と思うんだけども文字列間距離だけでも通じるもの?Hamming distance とか無視ですか、そうですか。 アルゴリズム…

Java で Suffix Array

なんか Java で Suffix Array なコードというリクエストがあったので簡単に。 とりあえず Suffix Array の構築だけ。効率とか一切無視で。 import java.io.IOException; import java.util.Arrays; import java.util.Comparator; import java.util.regex.Matc…

繰り返し現れる部分文字列の発見 #2

多分、Suffix Treeを作って、一番深い分岐を調べるという方針になるのかと思います。 Suffix Treeだと大きな文書だとSuffix Arrayを作って順次隣接する要素を比較していけばよいのかと。 どちらの方が速いのかというと、どうなんでしょう? より正確には Gen…

繰り返し現れる部分文字列の発見

ref:lethevert is a programmer - 問題 : 文字列処理 うん、まぁ、Suffix Array を使って「任意部分文字列の頻度計数」なんてことをやっていた自分にとっては、手元のコードを組み合わせて30行ほどのコードを書け足せば、それなりの速度で動くものが出来上が…

RMQ高速化

データ系列の任意区間から最小値(もしくはその位置)を取得する操作を Range Minimum Query というのだが、これは n 個のデータに対して O(n) の前処理をしておけば O(1) で計算できることが知られている。 で、その実装が九州大学の坂内さんのページで公開さ…

文字列ソーティング #3

今度は単語単位のソートにしてベンチマーク。元データは同じく新聞記事約 30MBytes (単語数 5,727,663)。 ついでに MSD Radix Sort も加えてみた。 で、きむらさんのところを見て、そういや、プロファイルとってないなと思ったので、g++ -O2 -pg でコンパイ…

Quicksort が遅い理由

クイックソートは、その性質上、再帰の最後の方になってくるとほとんど同じ要素同士を比較することになってしまうので、文字列配列の場合、最後の方の比較のコストがかなり大きくなってしまうので、それが影響しているのではないかと。 む。そうかも。 まぁ…

文字列ソーティング #2

文字列ソーティングの速度比較にいくつかのアルゴリズムで Suffix Array を構築してみた。 対象データは 30 MBytes ほどの英文新聞記事データで、gcc 4.0 で -O2 でコンパイル。結果はこんな感じ。 algorithm time[sec] quicksort 97.33 multikey quicksort …

文字列ソーティング

ref:lethevert is a programmer - 文字列ソート ref:ときどきの雑記帖 リターンズ 2007年3月 文字列をソートするのに、クイックソート系のアルゴリズムをつかうのと、マージソート系のアルゴリズムを使うのでは、効率が大分変わる。 と思うのだけれど、マー…

圧縮アルゴリズムを類似度に使う

ref:西尾泰和のブログ: ICTスクール日記 あー、2つのファイルを連結して圧縮して、圧縮率を Similarity Measure に使って Clustering するって話でいいのかな。以前、梅村先生が Conference でそんなのを聞いてきたって嬉しそうに紹介してたような記憶がある…

Bucket Sort & Distribution Counting Sort

ref:404 Blog Not Found:Algorithm - O(n log(n))より速いsort まぁ、データの特性が利用できるならO(n log n)より速いアルゴリズムが存在するのは、その道の人には常識だったりもするが。 sub bucket_sort(\@&){ my ($aref, $cref) = @_; my @bucket = (); …

stable quick sort

ref:落ちてないけど堕ちている - 「安定」なクイックソート stable な quick sort もあるよ、という話なのだが。 quicksort :: Ord a => [a] -> [a] quicksort [] = [] quicksort (x:xs) = quicksort [ y | y <- xs, y < x ] ++ [x] ++ quicksort [ y | y <-…