算法(第 4 版)
Robert Sedgewick, Kevin Wayne
ACM Fellow, ACM 杰出教育家
2178 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
时长 04:02
时长 01:33:37
课程目录
已完结/共 41 讲
时长 00:58
时长 03:10
时长 05:29
时长 04:02
时长 01:24:35
时长 01:33:37
时长 01:16:16
时长 01:26:27
时长 30:28
时长 36:09
时长 48:57
时长 47:59
时长 54:43
时长 46:00
时长 56:31
时长 56:13
时长 53:55
时长 01:12:09
时长 51:36
时长 55:01
时长 01:35:07
时长 04:45
时长 04:08
时长 47:52
时长 45:42
时长 37:58
时长 01:13:26
时长 15:16
时长 17:22
时长 25:55
时长 14:40
时长 28:01
时长 04:15
时长 03:41
时长 03:52
算法(第 4 版)
15
15
1.0x
00:00/00:00
登录|注册

5.0.2 字母表

一些应用程序可能会对字符串的字母表作出限制。在这些应用中,可能常常会需要一个 API 如表 5.0.2 所示的 Alphabet 类。
表 5.0.2 字母表的 API
public class <b>Alphabet</b>
Alphabet(String s)根据 s 中的字符创建一张新的字母表
char toChar(int index)获取字母表中索引位置的字符
int toIndex(char c)获取 c 的索引,在 0 到 ![R-1](https://private.codecogs.com/gif.latex?R-1) 之间
boolean contains(char c)c 在字母表之中吗
int R()表示一个索引所需的比特数
int lgR()s 转换为 ![R](https://private.codecogs.com/gif.latex?R) 进制的整数
int[] toIndices(String s)将 ![R](https://private.codecogs.com/gif.latex?R) 进制的整数转换为基于该字母表的字符串
String toChars(int[] indices)
这份 API 定义了一个构造函数,它用一个含有 个字符的字符串参数指定了字母表。API 定义了 toChar() 方法和 toIndex() 方法来在字符和 0 到 之间的整型值进行转换(常数时间)。它还包含了 contains() 方法来检查给定的字符是否存在于字母表中。方法 R()lgR() 用来获取字母表中的字符数以及表示它们所需的比特数。toIndices() 方法和 toChars() 方法能够将由字母表中的字符组成的字符串与 int 数组相互转换。方便起见,下面的表格显示了各种内置的字母表,你可以通过类似 Alphabet.UNICODE16 的方式来访问它们。Alphabet 的实现很简单,我们将它留作练习(请见 5.1.12)。我们会在表 5.0.3 后面的框注“Alphabet 类的典型用例”来展示一个它的用例。
表 5.0.3 标准字母表
名称R()lgR()字符集
BINARY2101
DNA42ACTG
OCTAL8301234567
DECIMAL1040123456789
HEXADECIMAL1640123456789ABCDEF
PROTEIN205ACDEFGHIKLMNPQRSTVWY
LOWERCASE265abcdefghijklmnopqrstuvwxyz
UPPPERCASE265ABCDEFGHIJKLMNOPQRSTUVWXYZ
BASE64646ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxz0123456789+/
ASCII1287ASCII 字符集
EXTENDED_ASCII2568扩展 ASCII 字符集
UNICODE1665 53616Unicode 字符集
public class Count
{
public static void main(String[] args)
{
Alphabet alpha = new Alphabet(args[0]);
int R = alpha.R();
int[] count = new int[R];
String s = StdIn.readAll();
int N = s.length();
for (int i = 0; i < N; i++)
if (alpha.contains(s.charAt(i)))
count[alpha.toIndex(s.charAt(i))]++;
for (int c = 0; c < R; c++)
StdOut.println(alpha.toChar(c)
+ " " + count[c]);
}
}
Alphabet 类的典型用例
% more abra.txt
ABRACADABRA!
% java Count ABCDR < abra.txt
A 5
B 2
C 1
D 1
R 2
字符索引数组。我们使用 Alphabet 类的一个最重要的原因是字符索引的数组能够提高算法的效率。在这个数组中,用字符作为索引来获取与之相关联的信息。如果要使用 Java 的 String 类,那就必须使用一个大小为 65 536 的数组;有了 Alphabet 类,则只需要使用一个字母表大小的数组即可。我们将要学习的一些算法能够产生大量的此类数组。在这种情况下,大小为 65 536 的数组是不可接受的。例如前面框注中的 Count 类,它从命令行接受一个字符串并打印出从标准输入获得的每个字符的出现频率。Count 中用来保存出现频率的 count[] 数组就是一个字符索引数组的示例。你可能会认为数组的计算有些繁琐,但实际上它是 5.1 节介绍的一系列快速排序算法的基础。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

该文章介绍了一个名为“5.0.2 字母表”的 API,它定义了一个名为 <code>Alphabet</code> 的类,用于处理字符串的字母表限制。该类包含了一系列方法,如根据字符串创建新的字母表、字符和整型值之间的转换、检查字符是否存在于字母表中等功能。文章展示了标准字母表的示例,以及一个名为 <code>Count</code> 的典型用例,用于统计字符出现的频率。此外,还介绍了使用 <code>Alphabet</code> 类处理数字的方法,以及基数方法的应用。总的来说,通过介绍 <code>Alphabet</code> 类及其应用场景,为读者提供了一种处理字符串字母表限制的有效工具,尤其适用于处理较小的字母表。文章还提到了在代码中使用常数 R = 256 并在分析中将 <img img src="https://static001.geekbang.org/files/resource/ebook/100010/image01027.gif" alt="R" inline-img="true" /> 作为参数。在适当的时候会讨论通用字母表的性能。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《算法(第 4 版)》
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部