【发布时间】:2020-08-29 12:37:53
【问题描述】:
我正在尝试通过此链接了解后缀数组的工作原理 - https://www.geeksforgeeks.org/suffix-array-set-2-a-nlognlogn-algorithm/。在这个链接中,我了解了代码和程序,首先按 2 个字符排序,然后按 4 个字符和 8 个字符排序,依此类推。 我没有得到的是 - 限制被视为 2*n。这是为什么 ?如果字符串的长度为 6,则只需 1 次迭代就足够了。相关代码sn-p如下。 ALso 相同的链接还提供了另一篇斯坦福大学关于后缀数组的论文,它完全在我脑海中浮现。论文相关链接为-https://web.stanford.edu/class/cs97si/suffix-array.pdf。在本文中的后缀数组(第 5 页)部分下,如果有人可以更直观地解释该论文中编写的示例和 C++ 代码。真的很有帮助。
for (int k = 4; k < 2*n; k = k*2)
{
// Assigning rank and index values to first suffix
int rank = 0;
int prev_rank = suffixes[0].rank[0];
suffixes[0].rank[0] = rank;
ind[suffixes[0].index] = 0;
// Assigning rank to suffixes
for (int i = 1; i < n; i++)
{
// If first rank and next ranks are same as that of previous
// suffix in array, assign the same new rank to this suffix
if (suffixes[i].rank[0] == prev_rank &&
suffixes[i].rank[1] == suffixes[i-1].rank[1])
{
prev_rank = suffixes[i].rank[0];
suffixes[i].rank[0] = rank;
}
else // Otherwise increment rank and assign
{
prev_rank = suffixes[i].rank[0];
suffixes[i].rank[0] = ++rank;
}
ind[suffixes[i].index] = i;
}
// Assign next rank to every suffix
for (int i = 0; i < n; i++)
{
int nextindex = suffixes[i].index + k/2;
suffixes[i].rank[1] = (nextindex < n)?
suffixes[ind[nextindex]].rank[0]: -1;
}
// Sort the suffixes according to first k characters
sort(suffixes, suffixes+n, cmp);
}
// Store indexes of all sorted suffixes in the suffix array
int *suffixArr = new int[n];
for (int i = 0; i < n; i++)
suffixArr[i] = suffixes[i].index;
// Return the suffix array
return suffixArr;
}
【问题讨论】:
标签: string algorithm c++11 suffix-array