TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados
Semana 01Semana 01
Cade...
Para aplicar as funções supracitadas é necessário representar os símbolos do alfabeto em formato decimal.
Na computação es...
1. String text = new String("STRING");
2. String cipherText = new String();
3. int k = 3;
4.
5. if(cipherText.isEmpty()) {...
3. É prática em documentos cartoriais como AVISOS, DECLARAÇÕES, CERTIDÕES, etc., que os títulos
sejam grafados com as letr...
TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados
Semana 02Semana 02
Orde...
A linha 8 percorre o objeto scanner enquanto existir blocos de texto – uma analogia é percorrer o
arquivo linha a linha ou...
Sua tarefa é:
Altere a classe→ MySortingClassMySortingClass para cosiderar igualmenteigualmente letras maiúsculas e minúsc...
TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados
Semana 03Semana 03
Orde...
Considere as operações de comparação !isGreater(key, array[j]) (linha 8) e troca array[j+1] =
array[j]; (linha 9) como ope...
Considerando as alterações na classe MySortingMySorting e no método insertionSort()insertionSort(), e a entrada
names.txtn...
Próximos SlideShares
Carregando em…5
×

pSets TSI32B - Estrutura, Pesquisa e Ordenação de Dados (TSI UTFPR-Toledo)

711 visualizações

Publicada em

Conjunto de problemas referente aos conceitos, técnicas e recursos fundamentais para a manipulação de cadeia de caracteres, pilhas, listas, filas, tabela hash e grafos, bem como a pesquisa e ordenação de dados.

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
711
No SlideShare
0
A partir de incorporações
0
Número de incorporações
16
Ações
Compartilhamentos
0
Downloads
2
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

pSets TSI32B - Estrutura, Pesquisa e Ordenação de Dados (TSI UTFPR-Toledo)

  1. 1. TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados Semana 01Semana 01 Cadeia de Caracteres (Cadeia de Caracteres (StringsStrings)) &&&& Manipulação deManipulação de StringsStrings ObjetivoObjetivo Introduzir a criptografa a partir da→ Cifra de CésarCifra de César Consolidar o conteúdo sobre cadeias de caracteres→ Leitura ComplementarLeitura Complementar → Cífra de CésarCífra de César: http://pt.wikipedia.org/wiki/Cifra_de_C%C3%A9sar AvaliaçãoAvaliação → Exatidão:Exatidão: o programa apresenta a saída desejada? → Estilo:Estilo: o código-fonte segue as boas práticas? ComeçandoComeçando A criptografacriptografa é a ciência e o estudo dos princípios e das técnicas pelas quais um texto legível pode ser escrito de forma secreta (i.e. cifradocifrado). Um texto cifradocifrado somente é compreendido se aplicado a chave de decifragemdecifragem. O processo de transformação é conhecido como ciframentociframento e a transformação inversa é conhecida como deciframentodeciframento. Uma texto não cifrado é claro (plaintextplaintext) e pode ser interceptado e lido por pessoas não autorizadas, por isso da necessidade de cifrá-lo. As primeiras formas de criptografa usavam o método da substituiçãosubstituição. Esse tipo de criptografa era comum no ensino fundamental, lembram :-):-) ? As meninas se comunicavam por meio de papéis com escrita cifrada para que os meninos não interpretar o conteúdo. A cifra era feita trocando as letras do alfabeto (e.g. a letra AA correspondia à letra CC). Naturalmente, a colega (destinatária da mensagem) conhecia a chave e o método de ciframento e aplicava o deciframento do texto. O estudo da criptografa cobre bem mais do que apenas a cifragemcifragem e decifragemdecifragem, pois é uma ciência que envolve teoria da informação e matemática. Com o advento da computação, a criptografa evoluiu para o estudo de algoritmos criptográfcos implementados por sistemas computacionais. Atualmente existem diversos algorimtos de criptografa, alguns com objetivos bem específcos e outros com objetivos mais gerais. Independente disso, a ideia não é estudar os algorimtos de criptografa, mas desenvolver o conteúdo de cadeia de caracterescadeia de caracteres a partir de métodos de substituição. Cifra de CésarCifra de César A Cifra de CésarCifra de César é uma das mais simples e conhecidas técnicas de criptografa. É um tipo de cifra de substituiçãocifra de substituição em que cada letra do texto é substituída por outra, satisfazendo uma relação de..parade..para (A→C, B→D, C→E, etc.). Considere um alfabetoalfabeto A=(s0,s1,…,sn-1) com nn símbolos e um valor inteiro kk (chavechave), onde 0≤k≤n-10≤k≤n-1. Considere também as funções de cifragemcifragem Ck(si)=s(i+k) mod n e sua função inversa de decifragemdecifragem Dk(si)=s(i-k+n) mod n, onde s(i-k+n) mod n é o símbolo referente à posição do resultado da operação de resto da divisão Ck(si) é a cifragemcifragem com a chave k do símbolo da posição i Dk(si) é a decifragemdecifragem com a chave k do símbolo da posição i Pg.Pg. 11//44
  2. 2. Para aplicar as funções supracitadas é necessário representar os símbolos do alfabeto em formato decimal. Na computação essa representação pode ser feita através da tabela ASCII. Assim, as funções cifragemcifragem e decifragemdecifragem devem considerar o alfabeto a partir do intervalo decimal (0..255) da tabela ASCII. Considere o subalfabeto As=(A..Z) (65..90) da tabela ASCII. 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 As A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Cada símbolo do alfabeto (si) é representado por um valor decimal (e.g. s65=A, s66=B, etc.). É importante ressaltar que o valor inicial do subalfabeto As é 65 e não 0, por isso, as funções de cifragemcifragem e decifragemdecifragem devem considerar essa diferença Ck(si)=s(i-p+k) mod n+p Dk(si)=s(i-p-k+n) mod n+p , sendo p o valor decimal inicial do subalfabeto As. Caso o valor decimal do alfabeto inicie em 0, p pode ser omitido. Agora vamos aplicar a defnição acima em um exemplo prático. Para isso, considere a chave com valor 3 (k=3k=3), as funções de cifragem CC33((si)) e decifragem DD33((si)), e os valores decimais do subalfabeto As. Aplicando a função de cifragem Ck(si)=s(i-p+k) mod n+p na cadeia de caracteres "STRING" S C3(83)=s(83-65+3) mod 26 + 65 => 86 => V T C3(84)=s(84-65+3) mod 26 + 65 => 87 => W R C3(82)=s(82-65+3) mod 26 + 65 => 85 => U I C3(73)=s(73-65+3) mod 26 + 65 => 76 => L N C3(78)=s(78-65+3) mod 26 + 65 => 66 => Q G C3(71)=s(78-65+3) mod 26 + 65 => 73 => J temos como saída a cadeia de caracteres "VWULQJ". Aplicando a função de decifragem Dk(si)=s(i-p-k+n) mod n+p no texto cifrado "VWULQJ". V C3(86)=s(86-65-3+26) mod 26 + 65 => 86 => S W C3(87)=s(87-65-3+26) mod 26 + 65 => 84 => T U C3(85)=s(85-65-3+26) mod 26 + 65 => 82 => R L C3(76)=s(76-65-3+26) mod 26 + 65 => 73 => I Q C3(66)=s(66-65-3+26) mod 26 + 65 => 78 => N J C3(73)=s(73-65-3+26) mod 26 + 65 => 71 => G temos como saída a cadeia de caracteres "STRING". Implementando a funçãoImplementando a função Ck do alfabetodo alfabeto As A implementação das funções Ck e Dk faz uso de funções de manipulação de strings, pois, a partir de um string, manipula caracteres ASCII e os concatena em uma nova str string cifrada. O código-fonte abaixo refere-se a função de cifragemcifragem Ck. Pg.Pg. 22//44
  3. 3. 1. String text = new String("STRING"); 2. String cipherText = new String(); 3. int k = 3; 4. 5. if(cipherText.isEmpty()) { 6. for(int i = 0; i < text.length(); i++) { 7. int ascii = Integer.valueOf(text.charAt(i)).intValue(); 8. ascii = ((ascii - 65 + k) % 26) + 65; 9. cipherText = cipherText.concat(String.valueOf((char) ascii)); 10. } 11. } 12. 13. System.out.print(cipherText); Nas linhas 1 e 2 são criadas as strings que receberão, respectivamente, o texto original (text) e o texto cifrado (cipherText). É uma boa prática e convenção da linguagem de programação Java que nomes compostos de variáveis possuam a primeira palavra em minúsculo e a segunda palavra somente com a primeira letra em maiúscula. O texto original recebe a palavra "STRING" para ser cifrado, enquanto o texto cifrado é criado sem valor. Na linha 5 é realizado um teste condicional para verifcar se o texto cifrado está nulo. Se o resultado do teste condiconal for verdadeiro, então se inicia a verredura na string texto para cifrá-la. A variável ascii (linha 7) é cirada a cada iteração da estrutura de repetição, recebendo a conversão de uma posição específca da string para inteiro. Após obter o valor inteiro o cálculo da cifragem é aplicado (linha 8). Por conseguinte, o texto cifrado é concatenado com a conversão do valor da variável ascii para string (linha 9). Por fm, o texto cifrado é exibido (linha 13). Para testar o código-fonte crie uma classe principal denominada CaesarCipherHandler.javaCaesarCipherHandler.java. Em seguida, insira o código-fonte dentro do método principal. ExercitandoExercitando 1. Considere a implementação da função de cifragemcifragem Ck no arquivo CaesarCipherHandler.javaCaesarCipherHandler.java e: Implemente a função→ Dk do alfabeto As no mesmo código-fonte. Utilize a variável cipherText como entrada do processo de decifragemdecifragem. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2. As normas para a formatação bibliográfca de documentos acadêmicos (artigo científco, monografa, livro, texto, etc.) preconizam que o nome do autor seja escrito no formato: último sobrenome emúltimo sobrenome em maiúsculo + vírgula + espaço + sequência das primeiras letras do nome e dos demais sobrenomes,maiúsculo + vírgula + espaço + sequência das primeiras letras do nome e dos demais sobrenomes, seguidas de ponto fnalseguidas de ponto fnal. Por exemplo, John Ronald Reuel TolkienJohn Ronald Reuel Tolkien deve ser referenciado como TOLKIEN, J.TOLKIEN, J. R. R.R. R.. Codifque um programa em Java que leia um nome e apresente-o no formato bibliográfco→ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Pg.Pg. 33//44
  4. 4. 3. É prática em documentos cartoriais como AVISOS, DECLARAÇÕES, CERTIDÕES, etc., que os títulos sejam grafados com as letras separadas por um espaço em branco. Codifque um programa em Java que receba uma frase e a retorne com suas letras separadas→ por um espaço em branco. Se houver espaço na frase, substitua por dois espaços - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4. Um histogramahistograma é a representação gráfca, em colunascolunas ou linhaslinhas, de um conjunto de dados previamente tabulado e dividido em classes uniformes. A base da coluna ou linha representa uma classeclasse e a altura representa a quantidadequantidade ou frequência com que o valor dessa classe ocorreu. A construção de histogramas tem caráter preliminar em qualquer estudo e é um importante indicador da distribuição de dados. Com base na breve defnição de histograma: Codifque um programa que recebe uma linha de texto e apresente o histograma das vogais,→ ignorando a condição case sensetive. Exemplo: "Histograma das vogais!" a: **** e: i: ** o: ** u: Após apresentar o histograma das vogais exiba a vogal com maior frequência→ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5. Elabore um programa em Java que dada uma datadata no formato "DD/MM/AAAA" a tranforme para o formato "AAAA-MM-DD". - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 6. Elabore um programa em Java que dado um número real qualquer (e.g. 85.54, 865.1, etc.) exiba o número de dígitos da parte inteira e o número de dígitos da parte fracionária. Pg.Pg. 44//44
  5. 5. TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados Semana 02Semana 02 Ordenação Interna – Parte IOrdenação Interna – Parte I &&&& Leitura de ArquivoLeitura de Arquivo ObjetivoObjetivo Introdução à leitura de arquivos com a classe→ Scanner() Consolidar os métodos de ordenação→ Insertion SortInsertion Sort, Bubble SortBubble Sort e Selection SortSelection Sort Leitura ComplementarLeitura Complementar → The JavaThe JavaTMTM Tutorials:Tutorials: http://docs.oracle.com/javase/tutorial/essential/io/scanning.html AvaliaçãoAvaliação → Exatidão:Exatidão: o programa apresenta a saída desejada? → Estilo:Estilo: o código-fonte segue as boas práticas? ComeçandoComeçando A manipulação de arquivos é um dos recursos das linguagens de programação úteis para criar arquivos de configuração, evitando modificações do código-fonte para diferentes cenários. Além disso, é comum o uso de arquivos para realizar o inputinput e outputoutput de dados em sistemas computacionais (e.g. para a entrada e saída de algoritmos). Na linguagem de programação Java existem várias formas de realizar a leitura de um arquivo de dados, contudo, neste pSetpSet o objetivo é obter dados de um arquivo de textoobter dados de um arquivo de texto utilizando a classe Scanner. Com os dados carregados em memória primária, métodos de ordenação serão aplicados sobre esse conjunto de dados. A classe Scanner permite separar uma entrada de texto em blocos a partir de um delimitadordelimitador. Os valores dos blocos podem ser convertidos em valores de tipos primitivos (int, float, double, etc.) ou objetos (String, etc.) - dependendo do método utilizado na classe Scanner. Por exemplo, o arquivo price.txtprice.txt, disponível com este pSet, possui uma lista de valores separados por uma quebra de linha n, ou seja, um valor por linha. Neste exemplo o delimitador é a quebra de linha n. Analise o código abaixo: 1. Scanner scanner = null; 2. try { 3. scanner = new Scanner(new FileReader("prices.txt")).useDelimiter("n"); 4. } catch (FileNotFoundException e) { 5. e.printStackTrace(); 6. } 7. 8. while (scanner.hasNext()) { 9. Double price = scanner.nextDouble(); 10. System.out.println(price); 11. } Na linha 1 é criado um objeto Scanner atribuindo o valor nullnull. Na linha 3 é criado um objeto de leitura de arquivo (usando a classe FileReader) e definindo como delimitador a quebra de linha n. As intruções try..catch() (linhas 2, 4-6) identificam e exibem possíveis exceções (erros) de abertura de arquivo. Pg.Pg. 11//33
  6. 6. A linha 8 percorre o objeto scanner enquanto existir blocos de texto – uma analogia é percorrer o arquivo linha a linha ou um vetor índice a índice. A linha 9 lê o valor e o converte para o tipo floatfloat, atribuindo o valor convertido na variável priceprice. A linha 10 exibe o conteúdo da variável priceprice na saída padrão (console). Ordenando os dados do arquivoOrdenando os dados do arquivo price.txtprice.txt com a classecom a classe ScannerScanner Como a quantidade de dados do arquivo prices.txtprices.txt é incerta, é necessário utilizar uma estrutura dinâmica para obter os valores do arquivo. A classe ArrayList oferece métodos para isso, conforme o exemplo: 1. Scanner scanner = null; 2. try { 3. scanner = new Scanner(new FileReader("prices.txt")).useDelimiter("n"); 4. } catch (FileNotFoundException e) { 5. e.printStackTrace(); 6. } 7. 8. ArrayList<Double> arrayDbl = new ArrayList<Double>(); 9. 10. while (scanner.hasNext()) { 11. Double price = scanner.nextDouble(); 12. arrayDbl.add(price); 13. } Ao invés de exibir os valores do objeto scannerscanner, o código-fonte acima adiciona o valor ao objeto ArrayList arrayDblarrayDbl através do método .add().add(). Ao criar o objeto da inner class MySortingClassMySortingClass na classe SortingHandlerSortingHandler, envie para o método construtor o array de objetosarray de objetos por meio do método arrayDbl.toArray()arrayDbl.toArray(). MySortingClass arraySort = new MySortingClass(arrayDbl.toArray()); Em seguida é só invocar os métodos disponíveis na inner class MySortingClassMySortingClass: print(), insertionSort(), bubbleSort() e selectionSort(). ExercitandoExercitando 1. Considere a função principal da classe SortingHandlerSortingHandler e a inner class MySortingClassMySortingClass. Crie um vetor com os valores {"sidgley", "Alexandre", "fabio", "Lucas", "eduardo"}. Em seguida, invoque os métodos de ordenação Insertion SortInsertion Sort, Selection SortSelection Sort e Bubble SortBubble Sort. As saídas dos algoritmos estão corretas? Perceba que os algoritmos são case sensitivecase sensitive, ou seja, diferenciam maiúsculas e minúsculas. As letras maiúsculas possuem valor ASCII ou UNICODE menor, consequentemente os nomes não são ordenados adequadamente. No terminal do GNU-Linux execute: $man ascii Observe o valor decimal dos símbolos da tabela ASCII. Das letras “a” e “A”, qual possui o maior valor? Pg.Pg. 22//33
  7. 7. Sua tarefa é: Altere a classe→ MySortingClassMySortingClass para cosiderar igualmenteigualmente letras maiúsculas e minúsculas – torne a comparação ignoreignore case sensitivecase sensitive em relação a objetos String. Salve o arquivo como IISortingHandler.javaSortingHandler.java. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2. Altere o código-fonte do arquivo IISortingHandler.javaSortingHandler.java para medir e comparar o tempo de execução dos algoritmos de ordenação Insertion SortInsertion Sort, Selection SortSelection Sort e Bubble SortBubble Sort. Para tanto, realize as seguintes alterações: Utilize o método→ System.nanoTime() para medir o tempo de execução de cada algoritmo de ordenação. Imprima esse tempo na tela. IMPORTANTE: Note que, após a aplicação de um dos métodos de ordenação, é necessário restaurar os valores originais do vetor (caso contrário, o vetor já estará ordenado e as medições de tempo serão prejudicadas). Crie um novo método para realizar essa restauração. Utilize, para tanto, um novo atributo (vetor auxiliar) que armazena o estado inicial do vetor. 1. long startTime, endTime; 2. startTime = System.nanoTime(); 3. /* coloque aqui a chamada a um dos algoritmos de ordenação */ 4. endTime = System.nanoTime(); 5. /* neste caso, o tempo decorrido da operação é (endtime – startTime) */ Imprima na tela os tempos de execução de cada algoritmo.→ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3. Utilizando a classe Scanner, crie um objeto ArrayList<String> com os dados do arquivo names.txtnames.txt. Em seguida ordene os dados através dos métodos de ordenação insertionSort(), bubbleSort() e selectionSort(). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4. Defina um vetor de inteiros para demonstrar que o algoritmo selectionSort()selectionSort() é um método instável. Exiba os passos da execução do algoritmo até que a estabilidade é violada. Dica! Quanto menor for o vetor, mais rápido resolverá a questão. Pg.Pg. 33//33
  8. 8. TSI32B – Estrutura, Pesquisa e Ordenação de DadosTSI32B – Estrutura, Pesquisa e Ordenação de Dados Semana 03Semana 03 Ordenação Interna – Parte IIOrdenação Interna – Parte II &&&& Análise ExperimentalAnálise Experimental ObjetivoObjetivo Consolidar os métodos de ordenação→ Merge SortMerge Sort, Quick SortQuick Sort e Shell SortShell Sort → Introdução à análise experimental de algoritmos AvaliaçãoAvaliação → Exatidão:Exatidão: o programa apresenta a saída desejada? → Estilo:Estilo: o código-fonte segue as boas práticas? ComeçandoComeçando Em muitas situações podem existir vários algoritmos para resolver o mesmo problema, sendo necessário escolher aquele que resolve o problema de forma mais eficiente. Vários critérios podem ser adotados para analisar a eficiência e robustez de um algortimo. Comumente, o tempo de processamentotempo de processamento como função da entrada, o espaço de memóriaespaço de memória máximo ou total requerido para os dados e o tratamento detratamento de entradas errôneas ou inesperadasentradas errôneas ou inesperadas são exemplos desses critérios em análises experimentais. Em geral, o custo da execução de um algoritmo depende principalmente do tamanho da entradatamanho da entrada dos dados. Por isso, é comum considerar o tempo de processamentotempo de processamento de um programa como critério de eficiência em experimentos usando computadores. Entretanto, para alguns algoritmos o tempo detempo de processamentoprocessamento é próximo ou alterna entre os algoritmos da mesma classe. Neste caso, outros critérios devem ser adotados nas análises experimentais, tais como, o número de execuções da operaçãooperação dominantedominante (também denominada operação fundamental). Em relação à análise experimental, o número de execuções da operação dominanteexecuções da operação dominante pode ser considerado um critério complementar. A operação dominanteoperação dominante deve ser tal que a contagem do número de execuções expresse a quantidade real de trabalho ou custo do algoritmo. Em caso de duas ou mais operaçõesoperações dominantesdominantes é necessário definir pesos (iguais ou diferentes) dependendo do custo de cada operação. Como exemplo de operações dominantesoperações dominantes na análise experimental tem-se as comparaçõescomparações e trocastrocas dos algoritmos de ordenação. Observe o código-fonte em Java do algoritmo de ordenação insertionSort()insertionSort(), especificado no arquivo SortingHandler.javaSortingHandler.java: 1. public void insertionSort() { 2. int i, j; 3. Object key; 4. 5. for (i = 1; i < array.length; i++) { 6. key = array[i]; 7. j = i - 1; 8. while ((j >= 0) && (!isGreater(key, array[j]))) { 9. array[j+1] = array[j]; 10. j--; 11. } 12. array[j+1] = key; 13. } 14. } Pg.Pg. 11//33
  9. 9. Considere as operações de comparação !isGreater(key, array[j]) (linha 8) e troca array[j+1] = array[j]; (linha 9) como operações dominantesoperações dominantes, pois são responsáveis pelo maior trabalho do algoritmo. Variáveis podem ser adicionadas ao algoritmo para verificar o número de execuções de cada operaçãooperação dominantedominante. Observe o novo código-fonte em Java do mesmo algoritmo: 1. public void insertionSort() { 2. int i, j; 3. Object key; 4.4. cmpCount = swpCount = 0;cmpCount = swpCount = 0; 5. for (i = 1; i < array.length; i++) { 6. key = array[i]; 7. j = i – 1; 8.8. cmpCount++;cmpCount++; 9. while ((j >= 0) && (!isGreater(key, array[j]))) { 10.10. swpCount++;swpCount++; 11. array[j+1] = array[j]; 12. j--; 13. } 14. array[j+1] = key; 15. } 16. } As variáveis cmpCountcmpCount e swpCountswpCount contabilizam as execuções das operações dominantes comparaçãocomparação e trocatroca. A linha 8 incrementa o número de comparações (cmpCountcmpCount) a cada comparação realizada na linha 9. A linha 10 incrementa a variável swpCountswpCount a cada permuta realizada na linha 11. Ao final da execução as variáveis cmpCountcmpCount e swpCountswpCount possuirão, respectivamente, o custo das operações comparaçãocomparação e trocatroca. Análise experimental do métodoAnálise experimental do método insertionSort()insertionSort() para a entradapara a entrada names.txtnames.txt Na classe MySortingMySorting do arquivo SortingHandler.javaSortingHandler.java defina as variáveis cmpCountcmpCount e swpCountswpCount: 1. class MySortingClass { 2. // array de objetos (tipos primitivos ou Strings) 3. private Object[] array = null; 4. 5. long cmpCount = 0, swpCount = 0; 6. 7. // contrutor de classe para alimentar o array 8. public MySortingClass(Object[] array) { 9. this.array = array; 10. } 11. // restante do código-fonte (veja SortingHandler.java) Altere o método print()print() da classe MysortingMysorting de forma a exibir os custos das operações de comparação e troca: 1. public void print() { 2. int i; 3. for (i = 0; i < array.length; i++) 4. System.out.print(array[i] + " "); 5. System.out.println(); 6. System.out.format("cmpCount: %dtswpCount: %dnn",cmpCount, swpCount); 7. } Pg.Pg. 22//33
  10. 10. Considerando as alterações na classe MySortingMySorting e no método insertionSort()insertionSort(), e a entrada names.txtnames.txt, o custo das operações dominantes (comparação e troca) é: cmpCount: 106 swpCount: 2719 Por que realizar análise experimental?Por que realizar análise experimental? O fato de um algoritmo resolver um problema não significa que seja aceitável na prática, pois os recursos de tempotempo e espaçoespaço requeridos têm grande importância em casos práticos – quando o algoritmo é implementado e executado em um computador. Considerando uma classe de algoritmos para resolução de um problema em específico, nem sempre o algoritmo mais imediato é viável na prática. Assim, análises experimentais são importantes para validar algoritmos. O problema da análise experimentalO problema da análise experimental Existem diversos fatores que afetam o tempo de processamento de um programa. Dentre eles estão: o próprio algoritmoalgoritmo, os dados de entradadados de entrada e o sistema computacionalsistema computacional utilizado para rodar o programa. Uma análise considerando esses fatores é difícil, além da interferência rápida das mudanças tecnológicas (e.g. hardware, linguagem de programação, compilador/interpretador, sistema operacional, etc.). Nesse contexto, uma análise através de um formalismo matemáticoformalismo matemático é adequado para mitigar o impacto desses fatores. Esse tipo de análise torna-se imparcial em relaçãoà tecnologia e preocupa-se somente com a representação das operações dominantes, desconsiderando operações que não refletirão custo considerável ao algoritmo. A análise por meio de formalismo matemática será tema da próxima aula, bem como desafio do pSet04pSet04. ExercitandoExercitando 1. Considere os algoritmos vistos em sala de aula: insertionSort()insertionSort(); selectionSort()selectionSort(); bubbleSort()bubbleSort(); mergeSort()mergeSort(); shellSort()shellSort(); heapSort()heapSort(); e quickSort()quickSort(), utilize os arquivos price.txtprice.txt e names.txtnames.txt como entradas para: Determinar experimentalmente o número de→ comparaçõescomparações e trocastrocas para cada método de ordenação. Determinar experimentalmente o→ tempo de execuçãotempo de execução de cada um dos métodos de ordenação . Preencher o quadro abaixo e analisar o melhor algoritmo para os arquivos de entrada→ Algoritmo Custo comparações Custo trocas Tempo execução (ms) insertionSort()insertionSort() selectionSort()selectionSort() bubbleSort()bubbleSort() mergeSort()mergeSort() shellSort()shellSort() heapSort()heapSort() quickSort()quickSort() Pg.Pg. 33//33

×