关于Burrows–Wheeler transform的详细介绍见wiki
http://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform
可以重一个字符串重编码,使得重复的一些字符段集中在一起,但是也有代价,
比如将字符串*****abc*****abc***进行bwt重编码,并不能将两个abc集中在一起,
而是要牺牲最后一个字符c作为索引,将两个ab紧凑起来。所以有得必有失。
显然讲一个规律很明显的字符串abcabcabcabc进行bwt重编码是得不偿失的。
bwt的encode可以用后缀数组在O(logN)或O(N)的时间复杂度和O(N)的空间复杂度解决。
这里说一下bwt的decode,我想到的最好方法是N方时间复杂度和O(N)的空间复杂度,不知有没有更好的方法。
wiki中提到一些资料,没去看,可能有更好的方法。
N方的做法是每一轮利用O(N)的基数排序进行排序,对于8位字符串,桶总量是256。
根据上一轮的排序结果,依个在桶里领取当前轮排序后的位置。
贴个伪代码段, 很简单:
void decode(int len) { for (int i = 0; i < len; ++i) { f[i] = i; } for (int k = 0; k < len; ++k) { memset(t, 0, sizeof(t)); for (int i = 0; i < len; ++i) t[a[i]]++; for (int i = 1; i < 256; ++i) t[i] += t[i - 1]; for (int j = len - 1; j >= 0; --j) { tf[f[j]] = --t[a[j]]; if f[j] 为目标串标志 a[j]写入目标串; } for (int j = 0; j < len; ++j) { f[tf[j]] = j; } } }