Livro de Sedgewick e Wayne: sec.3.5, p.486. Website do livro: resumo sec.3.5, slides. Código fonte, documentação, e dados de teste de todos os programas do livro: veja algs4.cs.princeton.edu/code/.
Esta página trata de aplicações de TSs (tabelas de símbolos). A maioria das aplicações tem duas fases:
Resumo:
Pré-requisitos:
public class SET<Key> | ||
SET() | cria um conjunto vazio | |
void | add(Key key) | insere key neste conjunto |
void | delete(Key key) | remove key deste conjunto |
boolean | contains(Page p) | key está neste conjunto? |
boolean | isEmpty() | este conjunto está vazio? |
int | size() | número de chaves neste conjunto |
String | toString() | string que descreve este conjunto |
SETcom a abreviatura
STde
symbol table.)
classe invólucrode BST ou de RedBlackST. Implemente a classe SET como uma
classe invólucrode LinearProbingHashST.
public class BlackFilter { public static void main(String[] args) { SET<String> conjunto = new SET<String>(); In dicionario = new In(args[0]); while (!dicionario.isEmpty()) conjunto.add(dicionario.readString()); while (!StdIn.isEmpty()) { String palavra = StdIn.readString(); if (!conjunto.contains(palavra)) StdOut.println(palavra); } } }
% more amino.csv TTT,Phe,F,Phenylalanine TTC,Phe,F,Phenylalanine TTA,Leu,L,Leucine TTG,Leu,L,Leucine TCT,Ser,S,Serine ... GAA,Gly,G,Glutamic Acid GAG,Gly,G,Glutamic Acid GGT,Gly,G,Glycine GGC,Gly,G,Glycine GGA,Gly,G,Glycine GGG,Gly,G,Glycine
% java LookupCSV amino.csv 0 3 TCT Serine
public class LookupCSV {
public static void main(String[] args) {
In in = new In(args[0]);
int keyField = Integer.parseInt(args[1]);
int valField = Integer.parseInt(args[2]);
ST<String,String> st = new ST<String,String>();
while (in.hasNextLine()) {
String line = in.readLine();
String[] tokens = line.split(",");
String key = tokens[keyField];
String val = tokens[valField];
st.put(key, val);
}
while (!StdIn.isEmpty()) {
String query = StdIn.readString();
if (st.contains(query))
StdOut.println(st.get(query));
}
}
}
% more ip.csv ... www.ebay.com,66.135.192.87 www.princeton.edu,128.112.128.15 www.cs.princeton.edu,128.112.136.35 www.harvard.edu,128.103.60.24 www.yale.edu,130.132.51.8 www.cnn.com,64.236.16.20 www.google.com,216.239.41.99 www.nytimes.com,199.239.136.200 www.apple.com,17.112.152.32 www.slashdot.org,66.35.250.151 www.espn.com,199.181.135.201 www.weather.com,63.111.66.11 www.yahoo.com,216.109.118.65 ...
% java LookupCSV ip.csv 1 0 128.112.136.35 www.cs.princeton.edu
% more DJIA.csv ... 20-Oct-87,1738.74,608099968,1841.01 19-Oct-87,2164.16,604300032,1738.74 16-Oct-87,2355.09,338500000,2246.73 15-Oct-87,2412.70,263200000,2355.09 ... 30-Oct-29,230.98,10730000,258.47 29-Oct-29,252.38,16410000,230.07 28-Oct-29,295.18,9210000,260.64 25-Oct-29,299.47,5920000,301.22 ...
% java LookupCSV DJIA.csv 0 3 29-Oct-29 230.07
% more UPC.csv ... 0002058102040,,"1 1/4"" STANDARD STORM DOOR" 0002058102057,,"1 1/4"" STANDARD STORM DOOR" 0002058102125,,"DELUXE STORM DOOR UNIT" 0002082012728,"100/ per box","12 gauge shells" 0002083110812,"Classical CD","'Bits and Pieces'" 002083142882,CD,"Garth Brooks - Ropin' The Wind" 0002094000003,LB,"PATE PARISIEN" 0002098000009,LB,"PATE TRUFFLE COGNAC-M&H 8Z RW" 0002100001086,"16 oz","Kraft Parmesan" 0002100002090,"15 pieces","Wrigley's Gum" 0002100002434,"One pint","Trader Joe's milk" ...
% java LookupCSV UPC.csv 0 2 0002100001086 Kraft Parmesan
Depois, responde consultas pela entrada/saída padrão.
% java LookupIndex aminoI.csv "," Serine TCT TCA TCG AGT AGC TCG Serine
% more aminoI.csv Alanine,AAT,AAC,GCT,GCC,GCA,GCG Arginine,CGT,CGC,CGA,CGG,AGA,AGG . . . Serine,TCT,TCA,TCG,AGT,AGC Stop,TAA,TAG,TGA Threonine,ACT,ACC,ACA,ACG Tyrosine,TAT,TAC Tryptophan,TGG Valine,GTT,GTC,GTA,GTG
public class LookupIndex { public static void main(String[] args) { In in = new In(args[0]); // banco de dados String sp = args[1]; // separador ST<String,Queue<String>> st = new ST<String,Queue<String>>(); ST<String,Queue<String>> ts = new ST<String,Queue<String>>(); while (in.hasNextLine()) { String[] a = in.readLine().split(sp); String key = a[0]; for (int i = 1; i < a.length; i++) { String val = a[i]; if (!st.contains(key)) st.put(key, new Queue<String>()); if (!ts.contains(val)) ts.put(val, new Queue<String>()); st.get(key).enqueue(val); ts.get(val).enqueue(key); } } while (!StdIn.isEmpty()) { String query = StdIn.readLine(); if (st.contains(query)) for (String s : st.get(query)) // foreach StdOut.println(" " + s); if (ts.contains(query)) for (String s : ts.get(query)) // foreach StdOut.println(" " + s); } } }
% java LookupIndex movies.txt "/" Bacon, Kevin Animal House (1978) Apollo 13 (1995) Beauty Shop (2005) Diner (1982) ... Tin Men (1987) DeBoy, David Blumenfeld, Alan ...
% more movies.txt Abducted (1986)/Borland, Skip/Brown, Jim/Camiro... . . . Animal House (1978)/Allen, Karen/Bacon, Kevin/Baur, Lisa/Belushi... . . . Apollo 13 (1995)/Allen, Ivan/Andrews, David/Bacon, Kevin/Barry... Apology (1986)/Allen, Seth/Andrei, Damir/Barber, Ellen/Bassett... . . .
(As linhas desta amostra de movies.txt foram truncadas para que caibam na página.)
% java Concordance tale.txt majesty their turnkeys and the *majesty* of the law fired me treason against the *majesty* of the people in of his most gracious *majesty* king george the third princeton sem ocorrencias
% java FileIndex ex*.txt age ex3.txt ex4.txt best ex1.txt was ex1.txt ex2.txt ex3.txt ex4.txt
% more ex1.txt it was the best of times % more ex2.txt it was the worst of times % more ex3.txt it was the age of wisdom % more ex4.txt it was the age of foolishness
import java.io.File; public class FileIndex { public static void main(String[] args) { ST<String,SET<File>> st = new ST<String,SET<File>>(); for (String filename : args) { // foreach File file = new File(filename); In in = new In(file); while (!in.isEmpty()) { String word = in.readString(); if (!st.contains(word)) st.put(word, new SET<File>()); SET<File> set = st.get(word); set.add(file); } } while (!StdIn.isEmpty()) { String query = StdIn.readString(); if (st.contains(query)) { SET<File> set = st.get(query); for (File file : set.keys()) // foreach StdOut.println(" " + file.getName()); } } } }
invertidona expressão
índice invertido?
Resposta:
De fato, a expressão índice invertido
é redundante:
um índice sempre leva termos
nas partes do documento que os contêm.
Por exemplo, se o documento é um livro e os termos são palavras,
o índice é uma tabela que leva cada palavra (coluna esquerda da tabela)
na lista de números de páginas (coluna direita)
que contêm a palavra.
Infelizmente, a expressão índice invertido
já foi consagrada pela tradição.