首页 > 其他分享 >后缀数组

后缀数组

时间:2023-10-01 21:11:41浏览次数:35  
标签:log 后缀 复杂度 基数排序 数组 sa 字典

  1. 基数排序
    算法思想:利用桶的单调性,从低到高位依次将整数放进对应数位的桶中。
    时间复杂度:\(O(d*(n+siz))\),其中 \(d\) 为数位,\(n\) 为元素个数,\(siz\) 为桶的大小。

  2. 后缀树
    对于字符串 \(s\),取出 \(s\) 所有的后缀字串,并建立字典树。这个树就是 \(s\) 的后缀树。空间复杂度 \(O(N^2)\)。

  3. 后缀数组 SA
    对于字符串 \(s\),定义 sa[i] 表示 \(s\) 的 \(n\) 个后缀按字典序排序后的第 \(i\) 个后缀在 \(s\) 中的下标,其中 \(i\) 从 \(0\) 开始。

  4. 后缀数组的实现
    直接使用 sort 排序,由于字符串的比较是 \(O(n)\) 的,总时间复杂度 \(O(n^2\times \log n)\)。

倍增求 sa[]

  1. 将 \(s\) 中的字母按照字典序从 \(1\) 开始分配整数。
  2. 倍增拼接连续 \(1,2,4,...,\log n\) 的整数来代表每个后缀的排名,当拼接的数字互不相同时即停止,由得到的数字 sort 即可确定字典序。
    最坏复杂度 \(O(n\log^2 n)\)
    拼数的时候可以每次重新编号,长度控制在两位数。
  3. 利用基数排序的优化
    拿基数排序替换快排。d=2,所以跑的很快。

rnk[i] 表示以下标 \(i\) 开头的后缀在排序后的排名。

易知 sa[rnk[i]]=i;rnk[sa[i]]=i;

标签:log,后缀,复杂度,基数排序,数组,sa,字典
From: https://www.cnblogs.com/Forever1507/p/17739274.html

相关文章

  • 33. 搜索旋转排序数组
    整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,4,5,6,7]在下标3处经......
  • C语言学习记录---数组1
    BIT-4-数组一维数组的创建和初始化一维数组的使用一维数组在内存中的存储二维数组的创建和初始化二维数组的使用二维数组在内存中的存储数组越界数组作为函数参数数组的应用实例1:三子棋数组的应用实例2:扫雷游戏1.一维数组的创建和初始化。1.1数组的创建数组是一组相同类型元素......
  • 34. 在排序数组中查找元素的第一个和最后一个位置
    给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你必须设计并实现时间复杂度为O(logn)的算法解决此问题。示例1:输入:nums=[5,7,7,8,8,10],target=8......
  • 利用PHP的数组splice方法进行高效数据删除和插入
    PHP数组是一个非常强大的数据结构,它可以存储多个值,并按照需要对这些值进行添加、删除或修改。在PHP中,我们可以使用splice方法对数组进行删除和插入操作,以实现高效的数据操作。本文将介绍如何使用数组splice方法进行数据删除和插入,并给出示例代码。一、使用splice方法进行数据删除......
  • 利用PHP的数组splice方法进行高效数据删除和插入
    PHP数组是一个非常强大的数据结构,它可以存储多个值,并按照需要对这些值进行添加、删除或修改。在PHP中,我们可以使用splice方法对数组进行删除和插入操作,以实现高效的数据操作。本文将介绍如何使用数组splice方法进行数据删除和插入,并给出示例代码。一、使用splice方法进行数据删除数......
  • axios - get 请求参数传递数组的方式
    npminstallqs导入qs库,如果是TypeScript项目,一同安装npminstall@types/qs。在请求的函数中添加一项配置:file:[demo.ts]const{data}=awaitaxios.get("/flowchart/query/all",{params,lit:[paramsSerializer:params=>{returnqs.stringify(params,......
  • 【洛谷 P1305】新二叉树 题解(结构体数组+先序遍历+二叉树)
    新二叉树题目描述输入一串二叉树,输出其前序遍历。输入格式第一行为二叉树的节点数。()后面行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。空节点用*表示输出格式二叉树的前序遍历。样例#1样例输入#16abcbdicj*d**i**j**......
  • golang 代码实现:并发请求下游接口,下游接口限制请求参数中某数组单次最多传20个
    内容来自对chatgpt的咨询假设你有一个golang的数组,数组元素数量大于20,你需要调用下游接口,但是接口的请求参数限制了一次最多传20个,为了节省时间,你需要并发调用,完整整个数组的下游调用,请完成代码编写写法一我们将数组切分成最大20个元素的小块,并对每个块并发调用下游接口:p......
  • http get 请求,path请求参数有数组类型的参数,怎么传参
    内容来自对chatgpt的咨询当在HTTPGET请求中传递数数组类型的参数时,需要按照一定的格式进行编码。并且具体的格式可能会根据后端的实现和预期的格式进行变化。这里有两种常见的方法:方法一:相同参数名,多次出现在URL中,后面每一个数组元素都用相同的参数名。例如,如果你有一个名......
  • golang 求出这两个对象数组的2个差集,即存在其中一个数组,但是不存在于另一个数组
    代码来自chatgptpackagemainimport( "fmt" "reflect")typeObjectstruct{ IDint}funcmain(){ a:=[]Object{{1},{2},{3}} b:=[]Object{{2},{3},{4}} diffAB:=diff(a,b) diffBA:=diff(b,a) fmt.Println("InAn......