我正在阅读Burrows和Wheeler论文中的块排序算法。 这是算法的一个步骤:
假设S = abracadabra
初始化N个字W [0,...,N-1]的数组W,使得W [i]包含字符S'[i,...,i + k-1]这样排列使得对单词的整数比较与对k字符串的字典比较一致。将字符打包成单词有两个好处:它允许使用对齐的内存访问一次比较两个前缀k个字节,并且它允许消除许多慢速情况
(注意:S'
是原始的S
,附加了k EOF
个字符,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
中每个后缀的第4个位置来执行此操作。
这是正确的吗?这种“将字符包装成文字”真的能加快速度吗?
答案 0 :(得分:4)
您在问题中描述它的方式完全准确。是的,它会加快速度,因为就像你说的那样,它一次比较四个字符。
但有两点需要注意:
答案 1 :(得分:0)
数组V不是后缀数组,而是指向W的索引数组。一旦排序完成,V应该将索引保存到W中,这样如果
V[i] <= V[j]
然后
W[V[i]] <= W[V[j]].
我希望我说对了:)让他们完全匹配不是问题,任何一个订单都没问题。关键是当你应用逆向转换时,你需要能够恢复W以恢复原始字符串,而W的相同元素不会导致问题。