続・BlockSorting(BWT)

BlockSorting - 西尾泰和のはてなダイアリー http://d.hatena.ne.jp/nishiohirokazu/20080218/1203322931

ちゃんと読んだらわかった。ようするにn番目の"X"はn番目の"X"につながると言うことか。どうやったらエレガントに書けるかな…。

すなおに各文字に連番をふったら素直に書けた。

# 復元
from collections import defaultdict
count = defaultdict(int)
def inc(c):
    count[c] += 1
    return count[c]

tails = [(c, inc(c)) for c in tails]
heads = list(sorted(tails))

cur = start
result = []

print start # => 1
print tails # => [('b', 1), ('a', 1), ('b', 2), ('a', 2)]
print heads # => [('a', 1), ('a', 2), ('b', 1), ('b', 2)]

for i in range(len(tails)):
    pair = heads[cur]
    result.append(pair[0])
    cur = tails.index(pair)

print "".join(result) # => abba

ふむふむ。これを思いついた人はいったい何を考えていて思いついたんだろうなぁ。すごいなぁ。

        • -

BlockSortingっていうか、まだ普通に全部ソートしてしまっているからBWTと呼ぶべきなのかな。

試しにこのソースをBWTしてみたらこうなった。確かに縮みやすそうだ。