Salve,
Esse negócio de compressão de dados é outro tópico da hora que veremos nas nossas próximas reuniões.
Para usar classe Genome
o arquivo a ser comprimido deve conter apenas os caracteres "ACGT"
.
O arquivo genome.txt
nas notas de aula tem um '\n'
no final. Vejam
% more genome.txt
ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
% more genomeTiny.txt
ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
% file genome.txt
genome.txt: ASCII text
% file genomeTiny.txt
genomeTiny.txt: ASCII text, with no line terminators
% wc genome.txt
1 1 34 genome.txt
% wc genomeTiny.txt
0 1 33 genomeTiny.txt
% java Genome - < genome.txt
Exception in thread "main" java.lang.IllegalArgumentException: Character
not in alphabet
at edu.princeton.cs.algs4.Alphabet.toIndex(Alphabet.java:188)
at Genome.compress(Genome.java:54)
at Genome.main(Genome.java:85)
% java Genome - < genomeTiny.txt | java BinaryDump 32
00000000000000000000000000100001
00110010001110010011001001100100
11001001110010001110111001110010
01000000
104 bits
De fato, '\n'
não faz parte do alfabeto "ACGT".
compress()
e expand()
Um coisa divertida e que ajuda a verificar se as função compress()
e expand()
estão ok é fazer
% java Genome - < genomeTiny.txt | java Genome + > genomeTiny.orig.txt
% more genomeTiny.txt
ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
% more genomeTiny.orig.txt
ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
% diff genomeTiny.txt genomeTiny.orig.txt
% java Genome - < genomeTiny.txt | java Genome + | more
ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
%
Classe Genome
O main()
da classe Genome
é bem bobo.
Só serve para dizer o que devemos fazer: compress()
ou expand()
.
public class Genome { public static void compress() { Alphabet DNA = new Alphabet("ACGT"); ... } public static void expand() { Alphabet DNA = new Alphabet("ACGT"); ... } public static void main(String[] args) { if (args[0].equals("-")) compress(); else if (args[0].equals("+")) expand(); else throw new IllegalArgumentException("Illegal command line argument"); } }
Entradas e saídas binárias
Nos próximos encontro usaremos entrade e saída de bits que são fornecidas pelo algs4 através das classes BinaryStdIn
, BinaryStdOut
, BinaryIn
, BinaryOut
. Como o Caio notou, a descrição de BinaryStdOut.write()
estava errada no slide.
Corrigi, muito obrigado por avisar.
Mais informações podem ser encontrada na página Entrada e saída binárias do professor Paulo Feofiloff tem uma descrição muito boa dessas classes.
As classe BinaryStdIn
, BinaryStdOut
, BinaryIn
e BinaryOut
que usaremos tem muito métodos.
As APIs originais estão em BinaryStdIn, BinaryStdOut, BinaryIn, e BinaryOut.
Alphabet
A classe Alphabet
que usamos hoje é essencialmente uma tabela. Aqueles e aquelas que estiverem interesados no funcionamento dessa tabela e de seus métodos toIndex()
e toChar()
, vejam a página Alfabetos (classe Alphabet) do professor Paulo Feofiloff.