« PythonワンライナーでBrainf*ckインタプリタ(第零部) |Main| PythonワンライナーでBrainf*ckインタプリタ(第二部) »

« PythonワンライナーでBrainf*ckインタプリタ(第零部) | Python | PythonワンライナーでBrainf*ckインタプリタ(第二部) »

PythonでSuffixArray

def makeSuffixArray(s):
    result = range(len(s))
    result.sort(lambda x,y: cmp(s[x:], s[y:]))
    for item in result:
        print item, s[item:]


makeSuffixArray("abracadabra")

10 a 7 abra 0 abracadabra 3 acadabra 5 adabra 8 bra 1 bracadabra 4 cadabra 6 dabra 9 ra 2 racadabra

手抜きをするとこんなに行数が短くて驚きました。 もちろんsortの比較部分で毎回部分文字列を作っているので、これをこのまま巨大な文字列に使っちゃダメですけど、試しに実データで走らせてみると 100文字で1ミリ秒、300文字で8ミリ秒、1000文字で64ミリ秒だったので、僕の今回の目的にはこれで十分でした。 データが10倍になると実行時間が64倍になっているので、1万文字で4秒、10万文字で4分、100万文字で4時間、くらいは最低でもかかると覚悟して使ってください。

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/318

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.