C++字符串.pptVIP

  • 61
  • 0
  • 约6.63千字
  • 约 51页
  • 2017-06-08 发布于湖北
  • 举报
C字符串

6、后缀数组 后缀数组就是所有后缀按照字典序从小到大排序后的结果 一般会现在字符串s后增加一个字符$,为一个不在串中出现且比串中字符都要小的字符(通常取`)。 在算法竞赛中,后缀数组的构造中,一个简单而容易理解的构造方法是倍增算法 6、后缀数组 首先把所有单个字符排序,计算出每个字母的“名次”,最小的字母是第1名,第二小的字母是第2名,依次类推。 下面来给所有后缀的前两个字符排序。这一步等价于给一些二元组排序,其中每个二元组就是一个后缀的前两个字符的名次。 接下来给所有后缀的前4个字符排序。这一次的排序仍然是二元组的排序。 如此进行下去,当所有名次两两不同时排序结束。 不难发现最多需要O(logn)次排序。每一次排序如果使用快速排序,时间复杂度为O(nlog2n)。注意到字符种类数最多为n,所以可以使用基数排序,总时间复杂度为O(nlogn)。 6、后缀数组 那么什么是基数排序? 简单的说就是多次计数排序。 这里做一个简单介绍 6、后缀数组 以二位数的排序为例 首先对个位进行计数排序,将每个数字放进对应的链表中 然后再依次将它们按十位进行计数排序 将各个链表中的数依次输出即可 由于链表本身并不是很方便,所以在代码实现上,有一些其他技巧实现 6、后缀数组 接下来简单分析一下代码 6、后缀数组 有了sa数组后,多模式匹配问题就很简单了,可以直接在sa数组中二分查找 单次查询时间复杂

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档