Livro de Sedgewick e Wayne: introdução do cap.5, p.698. Website do livro: slides. Página algs4.cs.princeton.edu/code/: código fonte e documentação de todos os programas do livro.
Esta pequena aula não trata de uma estrutura de dados mas de uma classe Java que permite definir alfabetos arbitrários. A ferramenta é útil para para manipular strings cujos caracteres são extraídos de um alfabeto restrito. A ferramento é usada em implementações de tabelas de símbolos de strings (em particular, tries) e em compressão de dados.
Resumo:
public class Alphabet
| ||
Alphabet(String s) | cria um novo alfabeto cujas letras são os caracteres da string s | |
int | toIndex(char c) | converte c em um índice entre 0 e R-1 |
char | toChar(int index) | converte index no correspondente caractere deste alfabeto |
boolean | contains(char c) | o caractere c pertence a este alfabeto? |
int | R() | base (número de caracteres deste alfabeto) |
int | lgR() | número de bits para representar um índice |
int[] | toIndices(String s) | converte s em um número inteiro na base R |
String | toChars(int[] indices) | converte um inteiro na base R em uma string sobre este alfabeto |
c | A | C | T | G |
| ||||
toIndex(c) | 0 | 1 | 2 | 3 |
i | 0 | 1 | 2 | 3 |
| ||||
toChar(i) | A | C | T | G |
0 1 2 3 4 5 6 7 8 9 0 NUL SOH STX ETX EOT ENQ ACK BEL BS HT 1 LF VT FF CR SO SI DLE DC1 DC2 DC3 2 DC4 NAK SYN ETB CAN EM SUB ESC FS GS 3 RS US SP ! " # $ % & ' 4 ( ) * + , - . / 0 1 5 2 3 4 5 6 7 8 9 : ; 6 < = > ? @ A B C D E 7 F G H I J K L M N O 8 P Q R S T U V W X Y 9 Z [ \ ] ^ _ ` a b c 10 d e f g h i j k l m 11 n o p q r s t u v w 12 x y z { | } ~ DEL
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]); } }
% more abra.txt ABRACADABRA! % java Count ABCDR < abra.txt A 5 B 2 C 1 D 1 R 2
constantesda classe Alphabet:
nome | R() | lg(R) | conjunto de caracteres |
| |||
BINARY | 2 | 1 | 01 |
DNA | 4 | 2 | ACTG |
OCTAL | 8 | 3 | 01234567 |
DECIMAL | 10 | 4 | 0123456789 |
HEXADECIMAL | 16 | 4 | 0123456789ABCDEF |
PROTEIN | 20 | 5 | ACDEFGHIKLMNPQRSTVWY |
LOWERCASE | 26 | 5 | abcdefghijklmnopqrstuvwxyz |
UPPERCASE | 26 | 5 | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
ASCII | 128 | 7 | alfabeto ASCII |
EXTENDED_ASCII | 256 | 8 | alfabeto ASCII estendido |
UNICODE16 | 65536 | 16 | alfabeto Unicode |
Resposta: O livro usa o alfabeto ASCII em vez do Alphabet, mais geral, apenas para tornar o código mais simples. Não é difícil adaptar os códigos de TrieST e KMP, por exemplo, para usar Alphabet. O website do livro tem as versões que usam Alphabet.