You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

快速排序后缀数组异常排查:首次分区正常后续分区失效

后缀数组快速排序错误修复

问题核心错误

你的suffixArrayPartition函数存在致命逻辑错误:你直接将数组下标j和right作为后缀起始索引传入compareSuffix,但实际上suffixArray容器存储的才是各个后缀的起始位置,j和right只是数组自身的索引,并非后缀对应的字符串起始下标。这导致后续分区时比较的是错误的后缀,排序自然无法正常完成。

修复后的关键代码

修改后的suffixArrayPartition函数

int suffixArrayPartition(const std::string &text, std::vector<int> &suffixArray, int left, int right)
{
    int i = left - 1;
    // 提取基准元素对应的后缀起始索引
    int pivotSuffix = suffixArray[right];

    for (int j = left; j < right; j++)
    {
        // 比较当前数组元素对应的后缀与基准后缀
        if (compareSuffix(text, suffixArray[j], pivotSuffix) == -1)
        {
            i++;
            suffixArraySwap(suffixArray, j, i);
        }
    }

    suffixArraySwap(suffixArray, i + 1, right);

    return i + 1;
}

可选类型优化

suffixArrayQuickSort中p的类型无需使用unsigned int,改为int可避免不必要的类型转换,与函数参数类型保持一致:

void suffixArrayQuickSort(const std::string &text, std::vector<int> &suffixArray, int left, int right)
{
    if (left >= right)
    {
        return;
    }
    int p = suffixArrayPartition(text, suffixArray, left, right);

    suffixArrayQuickSort(text, suffixArray, left, p - 1);
    suffixArrayQuickSort(text, suffixArray, p + 1, right);
}

修复效果验证

修复后,后缀数组会按照后缀的字典序正确排序,例如前几项输出应为:

0:141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067
2:1592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067
15:238462643383279502884197169399375105820974944592307816406286208998628034825342117067
20:2643383279502884197169399375105820974944592307816406286208998628034825342117067
5:2653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067
...

内容的提问来源于stack exchange,提问作者WildCard23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:47:34