字符串相关算法

一. 字符串排序算法

1. 低位优先(Least-Signifcant-Digit First,LSD)

  • 该算法要求被排序的每个字符串长度都相等。它会把字符串当成数字,从字符串的右边开始向左检查字符(相当于从数字的最低位到高位)。

2. 高位优先(MSD)的字符串排序

  • 不要求被排序的字符串等长,而且不一定需要检查所有的输入就能完成排序。该算法将从左开始向右检查字符(就像通常我们比较字符串那样),使用和快速排序类似的方法将字符串排序。
  • 它是从左向右检查每个字符,统计字符串首字母的频率,并按其来进行归类、排序,然后对归类后的字符串:将所有首字母相同的归为一个子数组,递归地分别对这些子数组排序。精炼点说就是:

    以首字母来排序,将数组切分成首字母相同的子数组
    忽略都相同的首字母,递归地排序子数组

二. 单词查找树(Trie 树、字典树)

1. 简介

  • 单词查找树是一种树形结构,是哈希树的变种。
  • 典型应用是用于统计、排序或保存大量的字符串(不仅限于字符串),所以经常被搜索引擎系统用于文本词频的统计。因为相同的字符串前缀会共享同一条分支,所以优点是可以利用不同字符串的相同前缀来减少无谓的字符串比较,查找效率比hash表/hash树高。
  • 单词树的基本性质:
    ①每个结点都有R个链接,R为字母表大小。会有很多空的,绘制树的时候可以忽略。
    ②从根节点到当前节点路径上的字符连接起来组成该节点对应的字符串。
    ③除了根节点以外,每个节点都包含一个字符。
    ④每个结点也含有一个相应的值,可以是空,也可以是某个关联值。每个键(字符串)的值应该保存在最后一个字母的结点中。如果值为空,表示所在的结点没有对应的键(字符串)。
  • 查找时候的三种情况:
    ①查找到:查找到字符串,并且最后那个结点的值不为空。(可能是在中途,也可能到树的末尾找到)
    ②查找不到(值空):找到相应的字符串,但最后那个结点的值为空。
    ③查找不到(无字符串):找不到相应的字符串。
  • 插入时两种情况:
    ①查找到那个值为空:直接把值变为非空,并且是那个字符串对应的关联值。
    ②查找不到:从查找不到的那个点开始依次进行插入。
  • 遍历所有字符串:递归完成,访问每个结点的所有结点,当值非空时,把其对应的字符串放入一个队列。
  • 删除时情况:先找到要删除的那个结点,找不到表示没有所要求删除的字符串。找到了,该点值设置为空。
    ①如果改点后面有其他结点,那就完成删除
    ②如果改点后面已经没有结点了,那么删除该点。然后退回父结点看父结点是否值为空,是的话删除,以此类推。

2. 常见应用

  • 通配符:例如用*通配一个字符。
  • 最长公共前缀问题:给定N个字符串,求两个串的最长公共前缀。两个串的最长公共前缀的长度即它们所在结点的公共祖先个数
    ①先对所有串构建字典树。
    ②求公共祖先数。
  • 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。

三. 子字符串查找

1. KMP算法

猜你喜欢

转载自blog.csdn.net/weixin_39731083/article/details/82143431