后缀数组~

子串:在字符串s中,取任意i<=j,那么在s中截取从i到j的这一段就叫做s的一个子串。

后缀:后缀就是从字符串的某个位置i到字符串末尾的子串,我们定义以s的第i个字符为第一个元素的后缀为suff(i)。

suff(1)就是从第一个字符到最后一个字符。

后缀数组的定义

把s的每个后缀按照字典序排序,

后缀数组sai表示排名为i的后缀的起始位置的下标;

而它的映射数组raki就表示起始位置的下标为i的后缀的排名;

简单来说,sai表示排名为i的是啥,raki标是第i个的排名是啥。

例如,ababa,他的后缀有ababa,baba,aba,ba,a。进行排序'a', 'aba', 'ababa', 'ba', 'baba',则s3表示排名为3的后缀的起始位置的下标就是1;rak3就表示起始位置的下标为3的后缀的排名=2。

LCP:

LCP(i:j)biaoshi suff(sai)与suffer(saj)的最长公共前缀。

LCP(I,J)=LCP(J,I).

LCP(I,I)=len(sai)=n-sai+1

Height:表示LCP(I,I-1)

快速排序

1、在数组中选择一个基准元素(pivot)

2、分区,把所有小于或等于pivot的元素放在pivot的左边

3、把所有大于或等于pivot的元素放在pivot的右边

4、递归的排序pivot的左边和右边的子数组

复制代码
import java.util.Arrays;

public class QuickSort {
    public static void main(String[] args) {
int[]arr={3,5,2,1,4};
quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    public static void quickSort(int[] arr, int low, int high){
        if (arr==null||arr.length==0||low>=high) return;
        //选择基准元素
        int middle=low+(high-low)/2;
        int pivot=arr[middle];
        //分区操作
        int i=low,j=high;
        while (i<=j){
            //从左往右找,找到左边第一个>=pivot的元素
            while (arr[i]<pivot) i++;
            //从右往左找,找到右边第一个<pivot的元素
            while (arr[j]>pivot) j--;
            //交换这两个元素
            if (i<=j){
                int temp=arr[i];
                arr[i]=arr[j];
                arr[j]=temp;
                i++;
                j--;
            }
        }
        //递归处理左右子数组
        if (low<j) quickSort(arr,low,j);
        if (high>i) quickSort(arr,i,high);
    }
}

1、选择中间元素作为基准,避免在已排序数组中出现最坏的时间复杂度

2、分区,使用双指针i和j从两端向中间扫描

3、递归终止条件,当low>=high时停止递归

4、时间复杂度,如果每次分区都能将数组均匀分成两半,那么递归的深度是O(log n),每一层的总工作量是O(n),所以平均时间复杂度是O(n log n)。但是,如果分区不均匀,比如总是分成一个很小的部分和一个很大的部分,递归深度会接近O(n),导致最坏时间复杂度O(n²)。

相关推荐
通信小呆呆7 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
benben0447 小时前
强化学习之DQN算法族(基于gymnasium开发)
算法
小小工匠8 小时前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾8 小时前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
何以解忧,唯有..9 小时前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
想吃火锅10059 小时前
【leetcode】88.合并两个有序数组js
算法
生成论实验室10 小时前
机器人:一个自主运动的系统
人工智能·算法·语言模型·机器人·自动驾驶·agi·安全架构
Qres82110 小时前
算法复键——树状数组
数据结构·算法
H1785350909610 小时前
SolidWorks第四部分_直接实体建模特征9_替换面原理
线性代数·算法·机器学习·3d建模·solidworks