我正在阅读 Burrows 和 Wheeler 论文中的块排序算法。这是算法的一个步骤:
假设 S=abracadabra
初始化一个包含 N 个单词 W[0, ... , N - 1] 的数组 W,使得 W[i] 包含字符 S'[i, ... , i + k - 1] 的排列,以便整数比较这些词与 k 字符串的字典比较一致。将字符打包成单词有两个好处:它允许使用对齐的内存访问一次比较两个前缀 k 字节,并且它允许消除许多缓慢的情况
(注意:S'
是原始的,附加S
了 kEOF
个字符,k 是适合机器字的字符数(我在 32 位机器中,所以k=4
)
EOF = '$'
如我错了请纠正我:
S'= abracadabra$$$$
W= abra brac raca acad cada adab dabr abra bra$ ra$$ a$$$
然后,算法说你必须通过索引S
数组来对(命名为 V)的后缀数组进行排序。W
我不完全理解如何通过索引来对后缀进行排序W
。例如:在排序的某个时刻,假设你有两个后缀,i
和j
,你必须比较它们。由于您正在索引W
,因此您当时正在检查 4 个字符。
假设它们具有相同的前 4 个字符。然后,您必须检查每个后缀的下一个 4 个字符,并通过从W
. 这是正确的吗?这种“将字符打包成单词”真的可以加快速度吗?