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

按子串字典序排序的文本索引是否有通用名称?

后缀数组:你描述的经典数据结构名称

你提到的这种按所有从文本各位置起始、延续至末尾的子串(即文本的后缀)字典序排序的索引,通用名称是后缀数组(Suffix Array)。

后缀数组的核心是一个存储文本所有后缀起始位置的数组,且这些位置按对应后缀的字典序排列。它具备你提到的所有特性:

  • 可通过二分查找快速定位目标子串,搜索效率高效
  • 排序后相似的后缀会相邻排列,便于查找相似字符串

你的代码实现了后缀数组的直观构建方式——直接对所有后缀的起始位置进行排序,但这种方法的时间复杂度较高(O(n² log n),n为文本长度)。实际场景中通常会使用更高效的构建算法,比如倍增法(O(n log² n))或SA-IS算法(线性时间O(n))。

你的代码实现

#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>

auto make_index_projection_for_subrange = []<std::ranges::random_access_range R>(R & range) {
    return [&range](std::ranges::range_difference_t<R> i) -> decltype(auto) {
        return std::ranges::subrange(std::ranges::begin(range)+i, std::ranges::end(range));
        };
};

int main()
{
    const std::string s1 = "abdbc";
    std::vector i1{0,1,2,3,4};
    
    //Sort by substring from the char to the end
    auto proj = make_index_projection_for_subrange(s1);

    std::ranges::sort(i1, std::ranges::lexicographical_compare,proj);
    std::ranges::copy(i1, std::ostream_iterator<int>(std::cout));
    std::cout << std::endl;

    for(auto i: i1){
        std::cout << std::string(s1.begin()+i, s1.end()) << std::endl;
    }
}

代码输出

03142
abdbc
bc
bdbc
c
dbc

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:25:30