wvogel日記

自分用の技術備忘録が多めです.

suffix array

Haskellから、googleのような検索エンジンにアクセスするにはどうしたらいいんだろうと思って調べていたら、
suffix array
というものに遭遇。
よくわかんないけど、とりあえずこんなもんかなと思って書いてみた

import Data.List

maketouple :: Int -> [String]->[(String , Int)]
maketouple n [s] = [(s , n)]
maketouple n (s:str) = (s,n):maketouple (n+1) str

suffix_index :: String -> [(String , Int)]
suffix_index  = maketouple 0.init.tails

suffix_sort :: String -> [Int]
suffix_sort = map snd.sort.suffix_index

main = getLine >>=print.suffix_sort

ちゃんと、ネットにあるような答えが返って来ました。
これをどう利用するのか、まだちょっと頭がまわんない....
もうちょっと明るい場所でPC使わないと目が悪くなりそうです。

短くしてみた

import Data.List

maketouple :: Int -> [String]->[(String , Int)]
maketouple n [s] = [(s , n)]
maketouple n (s:str) = (s,n):maketouple (n+1) str

suffix_index :: String -> [Int]
suffix_index = map snd.sort.maketouple 0.init.tails

main = getLine >>=print.suffix_index

alistの、第1要素ではなく第2要素でソートしてくれるような関数があると、

zip [0..] . init.tails

とできるので、綺麗にポイントフリースタイルで一つの関数にまとめられるんですけどね。
ちょっと見つからない