首页 > 其他分享 >后缀排序

后缀排序

时间:2024-11-11 10:40:53浏览次数:1  
标签:后缀 复杂度 height sa 排序 rk

后缀排序

即对字符串\(S\)的所有后缀根据字典序排序

实现

算法1:暴力排序

直接\(O(n)\)比较,时间复杂度\(O(n^2\log n)\)

算法2:倍增优化

我们考虑长为\(2^k\)的串的比较,该串可以分为前后均长\(2^{k-1}\)的串,那么只要知道这两个串的排名,就可以对所有\(2^k\)的串进行双关键字排序

于是每次记录\(rk[i]\)为\(S[i\sim i+2^k-1]\)的排名,则\(S[i\sim i+2^{k+1}-1]\)的两个关键字为\((rk[i],rk[i+2^k])\),倍增处理\(2^k\),每次排序即可

当某后缀无法拓展至\(2^k\)时,由于越界访问\(sa[]\),\(sa[]\)值为 \(0\),则该关键字无限小,正好对应了字典序排序中“空字符字典序无限小”,因此可以不用特判,开两倍空间即可

时间复杂度\(O(n\log^2n)\)

算法3:基数排序优化

尝试优化时,我们发现双关键字排序复杂度为\(O(n\log n)\),尝试从这里着手优化

于是想到了基数排序——时间复杂度\(O(n|A|)\),\(|A|\)为数的位数,这里为\(2\),于是排序复杂度变为\(O(n)\)

时间复杂度\(O(n\log n)\)

算法4:见OIwiki

后缀数组

\(sa[i]\)记录后缀排序后排名为\(i\)的后缀的编号

在字符串领域内有相当广泛的应用

height数组

定义,\(sa\)数组中相邻两项的最长公共前缀,即\(h[i]=LCP(sa[i],sa[i-1])\)

对于\(height\)数组,有公式\(h[rk[i]]\ge h[rk[i-1]]-1\)

因此可以线性求解\(height\)数组

代码:


	for(rg int i=1,k=0;i<=n;i++) {

		if(rk[i]==1) {h[rk[i]]=0; continue;}

		if(k) --k;

		while(S[i+k]==S[sa[rk[i]-1]+k]) ++k;

		h[rk[i]]=k;

	}

\(height\)数组还有一个重要的公式:\(\displaystyle LCP(sa[i],sa[j])=\min\{h[i+1]\sim h[j]\}\)

\(height\)数组是解决一些子串问题的关键

标签:后缀,复杂度,height,sa,排序,rk
From: https://www.cnblogs.com/zhone-lb/p/18539278

相关文章

  • 912. 排序数组
    题目链接本题使用的是快排解决。思路:「荷兰国旗」问题,具体思路跳转75.颜色分类代码classSolution{public:voidswap(vector<int>&nums,inti,intj){inttmp=nums[i];nums[i]=nums[j];nums[j]=tmp;}//[L,......
  • 选择排序
    选择排序的排序方法通过\(2\)重循环遍历数组,发现有不符合顺序的数对,就交换他们.时间复杂度选择排序的最好时间复杂度:\(\Theta(n^2).\)选择排序的平均时间复杂度:\(\Theta(n^2).\)选择排序的最坏时间复杂度:\(\Theta(n^2).\)稳定性选择排序是不稳定的排序算法.示......
  • 如果你搞不懂排序,看这篇文章就对了,初学者也看得懂,其三:进阶插入排序——希尔排序
    目录一.希尔排序1.1希尔排序的原理1.2希尔排序的代码思路1.3希尔排序的代码实现1.1希尔排序的原理希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重......
  • 冒泡排序(详细讲解)
    对于冒泡排序,字面理解就是对一段数据进行排序比如说你有10个数据intarr[10]={3,1,7,5,8,9,0,2,4,6};你想对这些数据进行从小到大的排序,一个个用if和else去进行比较太麻烦了,所以这时候冒泡排序就可以帮你提高效率首先,先文字讲解,这里总共有十个数据,而我们每次排序都会将......
  • 排序算法原理、应用与对比
    一、排序算法综述排序算法在计算机科学中具有至关重要的地位。在众多应用场景中,如数据库管理、搜索引擎结果排序、数据分析等,高效的排序算法能够极大地提高系统的性能和用户体验。不同类型的排序算法具有各自独特的特点和分类。从算法的稳定性来看,有些算法是稳定的,如插入排序......
  • DICOM图像知识:DICOM图像排序与坐标系解析
    目录引言1.概述2.DICOM图像排序规则2.1Patient的Study按StudyDate排序2.2Study的Series按SeriesNumber排序2.3Series的SOP按InstanceNumber或SliceLocation排序2.3.1InstanceNumber排序2.3.2SliceLocation排序2.3.3使用ImagePosition(Patient)和Image......
  • 桶排序 选择,插入排序
    (2)选择排序:基本思想:从数组的未排序区域选出一个最小的元素,把它与数组中的第一个元素交换位置;然后再从剩下的未排序区域中选出一个最小的元素,把它与数组中的第二个元素交换位置。重复上述过程,直到数组中的所有元素按升序排列完成。【案例】对一维数组中的十个数据进行从小到大排......
  • 桶排序2
    #include<iostream>#include<bits/stdc++.h>usingnamespacestd;/*桶排序思想:把每个数组开辟的空间看作一个桶,将与桶编号相同的数据存入桶中13579864210数据b[]开辟桶的个数大于数据最大值第一步:桶内初始化为0第二步:判断数据存入桶中a[11]a[0].........
  • 【VBA实战】用Excel制作排序算法动画续
    为什么会产生用excel来制作排序算法动画的念头,参见【VBA实战】用Excel制作排序算法动画一文。这篇文章贴出我所制作的所有排序算法动画效果和源码,供大家参考。冒泡排序:插入排序:选择排序:快速排序:归并排序:堆排序:希尔排序:完整源码如下。OptionExplicitPublichm......
  • 排序算法 - 冒泡
    文章目录1.冒泡排序1.1简介1.2基本步骤:1.3示例代码(C)1.4复杂度分析1.5动画展示1.冒泡排序1.1简介冒泡排序(BubbleSort)是一种简单的排序算法,其基本思想是通过相邻元素的比较和交换,把最大的元素逐步“冒泡”到列表的末尾。该算法的名称来源于较小的元素会逐......