算法第四版 第5章字符串 笔记


5.0字符串

5.0.1游戏规则

substring(beginindex,endindex)的时间复杂度是O(n),书上说的是O(1)但是在网上搜到Java7之后这个方法变成了返回一个复制的新的char[],所以是线性复杂度了。


5.1字符串排序

5.1.1键索引计数法

适用于小整数数据的简单排序方法,并且排序后相对位置不变

问题:老师在统计学生的分数时可能会遇到以下数据处理问题:
学生被分为若干组,标号为1,2,3等,我们希望将全班同学按组分类。因为组的编号是较小的整数,使用键索引计数法排序很合适。
在这里插入图片描述
假设数组a[ ]中的每个元素都保存了一个名字和一个组号,其中组号在0到R-1之间,代码a[i].key(会返回指定学生的组号。这种方法有4个步骤,我们会依次讲解。


5.1.1.1频率统计

使用int[ ] count数组统计每个出现的频率。
遍历数组,如果键为r,则将count[r+1] 加一(为了方便下一步将频率转换为索引)在这里插入图片描述


5.1.1.2将频率转换为索引

在这里插入图片描述
这里求的是排序时的索引位置,比如第一组有三个人,排序时前三个人就是第一组的;第二组5个人,则第二组第一个人的起始位置就是3了(第四个人)。


5.1.1.1数据分类

在转换成索引表后,在另一个辅助数组aux[ ]中进行排序。 只需遍历一遍数据即可产生排序结果。
在这里插入图片描述
在排完一个后,count[r]需要+1(排完这一个人以后,让本组的下一个人的位置在这个人后边)
在这里插入图片描述


5.1.1.4回写

在辅助数组aux[ ]中排完序后,将结果复制回原数组count[ ]中。
在这里插入图片描述
这种针对小整数键排序的排序方法突破了NlogN的排序算法运行时间下限,它是一个线性时间的排序方法。


5.1.2低位优先的字符串排序

低位优先(LSD) 的字符串排序。从右向左检查键中的字符。如果将一个字符串看做一个256进制的数字,那么从右向左检查字符串就等价于先检查数字的最低位。适用于键的长度都相同的字符串排序应用。
比如想把电话号码,车牌,IP地址等定长字符串排序。

通过前w个字符将a[ ]排序:
在这里插入图片描述
在这里插入图片描述

这种算法依赖于使用的上一节讲过的键索引排序的稳定性(下一次排序不能改变上一次排序的结果,因此依赖于稳定性)

猜你喜欢

转载自blog.csdn.net/weixin_45736160/article/details/113791166