Aplicações de TSs

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:

Qual implementação de TS devo usar?

Implementação de conjuntos e a classe SET

Exercícios 1

  1. (SW 3.5.1)  Implemente SET como uma classe invólucro de BST ou de RedBlackST.  Implemente a classe SET como uma classe invólucro de LinearProbingHashST.
  2. (SW 3.5.2)  Transforma a classe SequentialSearchSET em uma classe SequentialSearchSET que implemente a API SET. Baste eliminar a parte do código que envolve val.
  3. (SW 3.5.3)  Transforma a classe BinarySearchSET em uma classe BinarySearchSET que implemente a API SET. Nesse caso, o conjunto é ordenado pois as chaves são comparáveis.

Filtros

Exercícios 2

  1. (SW 3.5.31) Verificador ortográfico. Use BlackFilter para encontrar as palavras do livro tale.txt (0.73MB) que não estão no vocabulário (= lista de palavras) words.utf-8.txt (645288 palavras, 6.75MB). Use o ADT Stopwatch do website do livro para comparar o desempenho das implementações RedBlackBST, SeparateChainingHashST, e LinearProbingHashST de tabela de símbolos.
  2. (SW 3.5.30) Filtro de repetidos. Escreva um programa Dedup que receba uma lista de números e elimine os repetidos. Escreva um programa AleatoriosRepetidos que receba inteiros M, N e T na linha de comando e repita o seguinte experimento T vezes: gere N inteiros aleatórios entre 0 e M−1 e veja quantos repetidos são gerados.  (A teoria da probabilidades diz que o número de repetidos deve ser aproximadamente 1 − eN/M.)  Use o seu programa com T igual a 10 e N igual a 107, 108, e 109, e com M igual a N/2, N e 2N. Cronometre seus experimentos com Stopwatch.

Consulta a vocabulário (dictionary lookup)

Exercícios 3

  1. (SW 3.5.32) Dicionário. Estude o desempenho de LookupCSV em um ambiente onde bom desempenho é importante. Especificamente, construa um cenário em que as consultas não são feitas manualmente mas geradas por um aplicativo, muitas por segundo (como as consultas a URLs em um roteador). Faça experimentos de desempenho.

Construção de índices invertidos

Exercícios 4

  1. No código de LookupIndex, os comandos foreach, se referem a um iterador de ST ou de Queue?
  2. (SW 3.5.14)  Escreva e teste um método estático invert() que receba um ST<String,Bag<String>> como argumento e produza o inverso da TS (que também é uma ST<String,Bag<String>>).
  3. (SW 3.5.20) Concordância. Escreva um cliente Concordance de TS que leia um arquivo texto e responda consultas de concordância feitas pela entrada padrão: para cada palavra digitada, o programa imprime o contexo (digamos, 4 palavras antes e 4 depois) de cada ocorrência da palavra no arquivo. Por exemplo,
    % 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
    

Indexação de arquivos

Exercícios 5

  1. (SW 3.5.24) Busca em intervalos disjuntos. Dada uma lista de intervalos disjuntos dois a dois, escreva um programa que receba um número como argumento e determine o intervalo a que o número pertence. Por exemplo, se os intervalos são 1643-2033, 5532-7643, 8999-10332, 5666653-5669321, o número 9122 pertence ao terceiro intervalo e 8122 não petence a intervalo algum. O programa deve ser escrito como uma classe Intervalos.java que seja capaz de tratar não só de intervalos de números inteiros mas de intervalos de quaisquer tipos de dados comparáveis.  Essa classe deve conter um cliente de teste que responda consultas sobre intervalos de strings.  (Se precisar iterar sobre um objeto da classe SET, sugiro consultar a observação no fim da seção anterior.)

Perguntas e respostas