如何在块排序中对数组后缀进行排序

| 我正在阅读Burrows和Wheeler论文中的块排序算法。 这是算法的步骤: 假设S = abracadabra 初始化一个包含N个单词W [0,...,N-1]的数组W,以使W [i]包含字符S \'[i,...,i + k-1]进行排列,以便进行整数比较在单词上与在k字符字符串上的字典比较是一致的。将字符打包成单词有两个好处:它允许使用对齐的内存访问一次比较两个前缀k个字节,并且可以消除许多慢速情况 (注意:“ 0”是原始的“ 1”,后面附加了k个“ 2”个字符,k是适合一个机器字的字符数(我是32位机器,所以是“ 3”个)
EOF = \'$\'
如果我错了纠正我:
S\'= abracadabra$$$$  
W= abra brac raca acad cada adab dabr abra bra$ ra$$ a$$$
然后,该算法表示您必须对into1ѭ(称为V)的后缀数组进行排序, 数组“ 7”。 我不完全了解如何通过索引
W
对后缀进行排序。 例如:在排序的某个点,假设您得到两个后缀
i
j
,并且必须对其进行比较。由于您正在索引
W
,因此您正在检查4个字符。  假设它们的前四个字符相同。然后,您将需要检查每个后缀的下一个4个字符,并通过在
W
中从每个后缀的第4个位置进行访问来进行检查。 这是正确的吗? “将字符打包成单词”是否真的加快了速度?     
已邀请:
        您在问题中的描述方式是完全准确的。是的,它可以加快速度,因为如您所说,它一次可以比较四个字符。 但是,有两点要注意: 当比较后缀i和j时(如您的示例),您实际上比较的是条目W [i]和W [j]。其结果与您在字典上比较字符S [i..i + 3]和S [j..j + 3]的四个字符的结果相同,因此您节省了相当于三个字符比较的计算时间。是的,如果结果表明两个四倍体相同,则必须继续比较W [i + 1]和W [j + 1],但是:您不会立即进行比较。他们的算法的工作方式是基数排序。也就是说,您可以在初始比较之后立即将后缀放入存储桶中(可能两个都放入同一个存储桶中),然后在内部对存储桶进行递归排序。 Burrows和Wheeler在原始论文中描述的算法(您引用了该示例;这里有一个示例)是1994年的,它不是最佳的后缀数组构造算法。首先,在2003年发现了几种O(N)直接施工方法;其次,从那时起,对实现进行了许多进一步的改进。 1994年论文的核心思想是使用Burrows-Wheeler转换作为字符串压缩的基础,而不是转换本身的确切生成方式。     
        数组V不是后缀数组,而是W的索引数组。排序完成后,V应将W的索引保存为
V[i] <= V[j]
然后
 W[V[i]] <= W[V[j]].
我希望我说的对:)完全匹配它们不是问题,任何顺序都可以。关键是,当您应用反向转换时,您需要能够恢复W才能恢复原始字符串,并且W的相同元素不会对此造成问题。     

要回复问题请先登录注册