字符串排序
一、键索引计数法
- 时间复杂度:线性时间,排序N个键为0-R-1需要11N+4R+1次。因为不是继续比较的排序。计数排序嘛,分配型的排序方法,以空间换时间。
- 适用:小整数键
- 步骤:频率统计,频率转化为索引,数据分类,数据回写。
- 特点:是其他三种方法的基本操作
二、低位优先字符串排序(LSD Least-Significant-Digit First)
- 时间复杂度:基于键索引排序法 对基于R个字符的字母表的N个长度为W的元素,LSD需要访问~7WN+3WR次数组,空间复杂度为O(N+R)
- 适用:定长字符串
- 特点:是稳定排序的一种
三、高位优先字符串排序
- 时间复杂度:亚线性,最坏情况下为线性。
- 适用:不定长的随机字符串
- 特点:递归算法,和快排类似,采用切分,一定要搭配插排适用,不然空间复杂度爆炸(N+WR)。插排的阈值M应该为基数R的平方根级别。
- 最坏情况:数组含有大量重复键或较长的公共前缀(比如域名)
四、三向字符串快速排序
- 时间复杂度:N-Nw,w为字符数组中最长字符串的长度。
- 适用:含有较长的公共前缀或大量重复主键的情况。专门为了弥补MSD算法缺陷而设计的,结合三向切分快排思想。
- 特点:递归算法,三向快排的思想,较为通用(和归并排序的情况差不多,最好最坏情况上下界差距不是特别大)是原地排序的方法,空间复杂度为W+logN
五、KMP算法:
- 时间复杂度:M+N,M为模式长度,N为字符串长度
- 空间复杂度:~MR,R是基数
- 适用:重复字符的字符串,如AAAAB/BABABAB
- 特点:(1)代码简洁。(2)采用有限自动状态机(一个数组)记录输入后状态机的状态。(3)充分利用部分匹配串,指向字符串的指针i始终++,不再回溯,而指向模式的指针j模拟在状态机运行状态。