文章目录
版权声明
- Algorithms 系列学习笔记来源于 Kevin Wayne 和 Robert Sedgewick 在 Coursera 网站上所授课程 Algorithms, parts I and II [1,2],课程教材 Algorithms 4th edition [3];
- 该系列笔记不以盈利为目的,仅用于个人学习、课后复习及科学研究;
- 如有侵权,请与本人联系([email protected]),经核实后即刻删除;
- 本文采用 署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0) 协议发布;
5. String
5.1 Background
- Java 提供的8种基本数据类型:byte、short、int、long、float、double、char、boolean;
- 助记:4种整型,2种浮点型,1种字符型,1种布尔型;
- String 不是基本数据类型;
- 字符串的2种表示方法:
- 字符数组:
- 转换方式:
chars = str.toCharArray()
;
- 转换方式:
- String:
- 转换方式:
str=new String(chars)
;
- 转换方式:
- 字符数组:
- 基数和“基数”方法:
- 基数:即进制数;
- “基数”方法:一次只处理一位数的方法;
5.2 字符串排序
- 字符串排序方法:
- 低位优先:LSD,Least-Significant-Digit First;
- 高位优先:MSD,Most-Significant-Digit First;
- 键索引计数法:
- 步骤:统计频率、根据频率求索引、数据分类、回写;
- 适用范围:小整数键排序;
- 时间复杂度: ;
- 注意:通过
compareTo()
访问数据的时间复杂度下限为 ,但键索引计数法通过键
访问数据,因此该方法进行排序的时间复杂度为线性级别; - 符号说明:
- N:输入的字符串个数;
- R:基数,即字母表中的字符数量;
- 低位优先的字符串排序:
- 基于键索引计数法;
- 适用范围:仅适用于等长字符串排序;
- 高位优先的字符串排序:
- 基于键索引计数法;
- 适用范围:可处理通用字符串排序问题,即不等长字符串排序;
5.3 单词查找树
- 单词查找树:又称字典树,trie,发音同 try,E.Fredkin 在1960年根据该数据结构的作用(取出数据,retrieval)为其命名;
- 用途:统计、排序和保存大量字符串(但不仅限于字符串);
- 优点:利用字符串的公共前缀减少查询时间,减少无谓的字符串比较,查询效率高于哈希树;
- R 向单词查找树:字母表中含有 R 个字符的单词查找树;
- 单词查找树的性质:
- 单词查找树的链表结构(形状)和键的插入、删除顺序无关;
- 插入和删除操作需要访问数组的次数:
- 最坏情况下为待处理字符串的长度加一;
- 由数学证明知,在随机键构造的单词查找树中,未命中查找的成本与键的长度无关(通常仅需检查3-4个节点);
- 三向单词查找树:TST,每个节点含有一个字符,三条连接(对应的键值分别小于、等于和大于当前键)和一个值;
- 优点:三向单词查找树所需的空间小;
- 三向单词查找树每个节点含有3条连接,而单词查找树中每个 节点含有 R 个连接;
- 优点:三向单词查找树所需的空间小;
- 字符串符号表性能对比:
- 二叉查找树:BST;
- 2-3 树(红黑树):能保证最坏情况下的性能(实现平衡插入);
- 哈希表;
- 字典树(R 向单词查找树):随机情况下仅需常数次比较即可完成查找,空间开销大;
- 字典树(三向单词查找树):需要执行对数次比较操作即可完成查找,空间开销小于 R 向单词查找树;
5.4 子字符串查找
5.4.1 各类字符串查找算法相关定义
- 相关概念:
- 模式:pattern,即子字符串;
- DFA:Deterministic Finite Automaton,确定有限状态自动机;
- NFA:Nondeterministic Finite Automaton,非确定有限状态自动机;
- 子字符串查找算法:
- 暴力子字符串查找算法;
- KMP 子字符串查找算法:即 Knuth-Morris-Pratt 算法;
- 优点:保障线性级别的性能,且无需在文本中回退;
5.4.2 各类字符串查找算法总结
算法 | 最坏情况 | 一般情况 | 文本中回退 | 额外空间需求 |
---|---|---|---|---|
暴力查找 | MN | 1.1N | 是 | 1 |
KMP 子串查找 | M+N | 否 | MR |
- 符号说明:
- N:文本长度;
- M:模式长度;
- R:基数,即字母表中的字符数量;
References
[1] https://www.coursera.org/learn/algorithms-part1?.
[2] https://www.coursera.org/learn/algorithms-part2?.
[3] Sedgewick, R. & Wayne, K. (2016). Algorithms Fourth Edition. Boston: Addison-Wesley.