• Nenhum resultado encontrado

CePAula06

N/A
N/A
Protected

Academic year: 2021

Share "CePAula06"

Copied!
14
0
0

Texto

(1)ANHANGUERA ENSINO SUPERIOR Faculdades de Valinhos - FAV Valinhos, setembro de 2006. Classificação e Pesquisa. Prof. Dr. Marcelo Augusto Cicogna. ESTRUTURA DO CURSO 2. C&P - AULA 6. ¾ Cronograma de Aulas - Terceiro Bimestre ¾ Aula 1: Apresentaç Apresentação do Curso ¾ Aula 2: Revisão de C (Ponteiros & Funç Funções) ¾ Aula 3: Ordenaç Ordenação (Seleç (Seleção, Troca) ¾ Aula 4: Ordenaç Ordenação (Inserç (Inserção) Prof. Dr. Marcelo Augusto Cicogna. ¾ Aula 5: Ordenaç Ordenação (Distribuiç (Distribuição) ¾ Aula 6: Ordenaç Ordenação (Intercalaç (Intercalação) ¾ Aula 7: Pesquisa de Dados: Seqü Seqüencial ¾ Aula 8: Pesquisa de Dados: Biná Binária ¾ Primeira Avaliaç Avaliação: 19 ou 26/10/2006. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa..

(2) CONTEÚDO 3. C&P - AULA 6. Prof. Dr. Marcelo Augusto Cicogna. ¾ Nessa Aula z. Ordenaç Ordenação por Intercalaç Intercalação (Mé (Método QuickSort) QuickSort). z. Requisitos: Mé Métodos Recursivos. z. Requisitos: Partiç Partição por Pivoteamento. z. Método QuickSort. z. Algoritmo. z. Implementaç Implementação em Linguagem C. z. Aná Análise e Insights. z. Exemplos. z. Exercí Exercícios e Implementaç Implementação Computacional. PA ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. 78-81. UM PROBLEMA RECURSIVO 4. C&P - AULA 6. ¾ Um Problema Recursivo Suponha o problema de dividir um vetor de tamanho n em duas partes, de forma recursiva. Seja o seguinte procedimento:. Prof. Dr. Marcelo Augusto Cicogna. a) A divisão é feita escolhendoescolhendo-se o ponto mé médio do vetor. b) A partir desse ponto, chamado pivô (pivot), pivot), dividedivide-se o vetor em dois subsub-vetores (esquerdo e direito). direito). c) Por convenç convenção, o pivô faz parte do primeiro subsub-vetor. Exemplo:. 1. 1. 2. 2. 3. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. 3. 4. 5 4. 5.

(3) UM PROBLEMA RECURSIVO 5. C&P - AULA 6. Prof. Dr. Marcelo Augusto Cicogna. ¾ Exemplo Problema Recursivo. 1 1 1. 2. 1. 2. 2. 3 3. 2. 3. 4. 5 4. 4. 5 5. Note que a divisão começ começa sempre pelo lado esquerdo, esquerdo, e só só volta ao lado direito quando um elemento sozinho é identificado.. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. UM PROBLEMA RECURSIVO 6. C&P - AULA 6. Prof. Dr. Marcelo Augusto Cicogna. ¾ Algoritmo // Processo Recursivo. // Dividir um vetor em duas partes de forma recursiva. divide(int data[], int esq, esq, int dir) dir) { imprima vetor entre esq e dir; dir; calcula pivo; pivo; if (!vetor de um elemento) { divide(data, divide(data, esq, esq, pivo) pivo); divide(data, divide(data, pivo+1, pivo+1, dir) dir); } }. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa..

(4) UM PROBLEMA RECURSIVO 7. C&P - AULA 6. ¾ Detalhando o Algoritmo em Funç Função de suas Variá Variáveis d=4. e=0. 1. 2. 3. 4. 5. p=2 d=2. Prof. Dr. Marcelo Augusto Cicogna. e=0. 1. 2. 3. 4. p=1 e=0. 1. d=4. e =3. 5 p=3. d=1. 2 p=0. 1. 2. e = 0, d = 0, p = 0. e = 1, d = 1, p = 1. 3. 4. 5. e = 2, d = 2, p = 2. e = 3, d = 3, p = 3. e = 4, d = 4, p = 4. NotaNota-se que o processo recursivo se interrompe quando encontraencontra-se a condiç condição: (esq (esq = dir). dir).. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. UM PROBLEMA RECURSIVO 8. C&P - AULA 6. Prof. Dr. Marcelo Augusto Cicogna. ¾ Melhoramento do Algoritmo // Processo Recursivo. // Divisão recursiva de um vetor. // Detalhamento. divide(int data[], int esq, esq, int dir) dir) { imprima vetor entre esq e dir; dir; pivo = (esq (esq + dir) dir) / 2; if (esq != dir) dir) { divide(data, divide(data, esq, esq, pivo) pivo); divide(data, divide(data, pivo+ pivo+1, dir) dir); } }. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa..

(5) UM PROBLEMA RECURSIVO 9. C&P - AULA 6. Prof. Dr. Marcelo Augusto Cicogna. ¾ Implementaç Implementação em Linguagem C (vetor de inteiros). Recursivo.c. void vetorDivide(int vet[], int esq, int dir) /** Função demonstração de um processo recursivo. Essa função divide divide o vetor vet[] de forma recursiva. Os sub-vetores são impressos para acompanhamento do processo recursivo. @param vet[] vetor de inteiros. @param esq índice do primeiro elemento à esquerda. @param dir índice do último elemento à direita. @author Marcelo Augusto Cicogna */ { int pivo; /* Imprime o vetor antes da divisão. */ vetorPrintParc(vet, esq, dir); /* Calcula o pivo. */ pivo = (esq + dir)/2; /* Se os índices forem diferentes, ativar processo recursivo. */ if ( esq != dir ) { vetorDivide(vet, esq, pivo); /* Sub-vetor a esquerda. */ vetorDivide(vet, pivo+1, dir); /* Sub-vetor a direita. */ } }. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. PA 218. ORDENAÇÃO POR INTERCALAÇÃO 10. C&P - AULA 6. ¾ Motivaç Motivação do Algoritmo Intercalaç Intercalação A idé idéia bá básica é dividir o problema de ordenar um conjunto com n itens em dois problemas menores.. Prof. Dr. Marcelo Augusto Cicogna. Utilizando os pré pré-requisitos apresentados anteriormente: a) Dividir o problema foi visto no problema de Recursão. Recursão. b) QuickSort utiliza como pivô o ponto mé +dir)/2). médio ((esq ((esq+ dir)/2). c) A melhora na ordenaç ordenação é feita por meio de um algoritmo de Partiç Partição por Pivoteamento. Pivoteamento. d) Vale lembrar que a partiç partição separa um vetor em uma parte esquerda com chaves menores ou iguais ao pivô e uma parte direita com chaves maiores ou iguais a pivô.. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa..

(6) PARTIÇÃO POR PIVOTEAMENTO 11. C&P - AULA 6. ¾ Partiç Partição Ordenada de um Vetor Suponha o problema de rearranjar um vetor v por meio da escolha arbitrá arbitrária de um elemento x chamado pivô, pivô, de tal forma que ao final o vetor está está particionado em uma parte esquerda com chaves menores ou iguais a x e uma parte direita com chaves maiores ou iguais a x. Seja o seguinte procedimento: Prof. Dr. Marcelo Augusto Cicogna. a) Escolha arbitrariamente um item do vetor e coloquecoloque-o em x; b) Percorra o vetor a partir da esquerda até até que um item v[i] ≥ x é encontrado; da mesma forma, percorra o vetor a partir da direita até até que um item v[j] ≤ x é encontrado; encontrado; c) Como os dois itens v[i] e v[i] estão fora do lugar no vetor final, então troquetroque-os de lugar; d) Continue esse processo até até que os contadores i e j se cruzem em algum ponto do vetor. PA ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. 78-81. PARTIÇÃO POR PIVOTEAMENTO 12. C&P - AULA 6. ¾ Exemplo: Partiç Partição Ordenada de um Vetor. Prof. Dr. Marcelo Augusto Cicogna. Iterações. 1. 2. 3. 4. 5. 6. k=0. 4. 5. 3. 1. 2. 6. k=1. 2. 5. 3. 1. 4. 6. k=2. 2. 1. 3. 5. 4. 6. Elementos ≤ pivô. pivô. Elementos ≥ pivô. Observaç Observação: Apó Após o processamento de partiç partição, o pivô pode aparecer em uma posiç posição diferente da original. No Exercí Exercício acima, teste pivô = 2. 2. PA. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. 78-81.

(7) PARTIÇÃO POR PIVOTEAMENTO 13. C&P - AULA 6. Prof. Dr. Marcelo Augusto Cicogna. ¾ Algoritmo // Partiç Partição Ordenada de um Vetor. particiona(int data[], int pivo) pivo) { i = 0; j = size - 1; x = data[pivo ]; data[pivo]; while (i < j) { while (x > vet[i]) vet[i]) i++; while (x < vet[j]) ; vet[j]) j-j--; if (i < j) swap( ; swap(vet[i], vet[i], vet[j]) vet[j]); } } PA ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. 78-81. UM PROBLEMA RECURSIVO 14. C&P - AULA 6. Prof. Dr. Marcelo Augusto Cicogna. ¾ Implementaç Implementação em Linguagem C (vetor de inteiros) void vetorPart(int vet[], int posPivo, int size) /** Função para a partição por pivoteamento de um vetor. Essa função não escolhe o pivô, que é passado por parâmetro. @param vet[] vetor de inteiros. @param posPivo ídice do pivô. @param size dimensão do vetor. @author Marcelo Augusto Cicogna */ { int i, j, valPivo, aux; i = 0; j = size-1; valPivo = vet[posPivo]; /* Enquanto os contadores nao se cruzarem. */ while (i < j) { /* Encontrar elementos que nao respeitam a particao sobre valPivo. */ while (valPivo > vet[i]) i++; while (valPivo < vet[j]) j--; /* Swap de posicoes: respeitar particao sobre valPivo. */ if (i < j) { aux = vet[i]; vet[i] = vet[j]; vet[j] = aux; } } /* Ao final: i = j = posição final do pivô. */ }. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. Particao.c. PA 218.

(8) UM PROBLEMA RECURSIVO 15. C&P - AULA 6. ¾ Teste do Programa Partiç Partição 13. Dica: Para criar um Fundo Claro, clique com o botão direito sobre a barra de título da janela. Escola Propriedades/Cores. Coloque o Plano de fundo da tela como branco e o texto em preto. Clicar em OK e responder para Salvar alterações.... Prof. Dr. Marcelo Augusto Cicogna. 13. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. ORDENAÇÃO POR INTERCALAÇÃO 16. C&P - AULA 6. ¾ Algoritmo Intercalaç Intercalação - QuickSort Algoritmo inventado por Sir1 Charles Antony Richard Hoare em 1960, 1960, quando visitava a Universidade de Moscou como estudante.. Prof. Dr. Marcelo Augusto Cicogna. QuickSort é o algoritmo de ordenaç ordenação interna mais rápido que se conhece para uma ampla variedade de situaç situações, sendo provavelmente mais utilizando do que qualquer outro algoritmo. A idé idéia bá básica é dividir o problema de ordenar um conjunto com n itens em dois problemas menores. Para isso, utilizautiliza-se o Algoritmo de Partiç Partição Por Pivoteamento. Pivoteamento.. 1. Proclamado Sir pela Rainha da Inglaterra em 2000.. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa..

(9) ORDENAÇÃO POR INTERCALAÇÃO 17. C&P - AULA 6. Prof. Dr. Marcelo Augusto Cicogna. ¾ Algoritmo Partiç Partição por Pivoteamento // Ordenaç Ordenação por Mé Método de Intercalaç Intercalação. // Partiç Partição por Pivoteamento. Pivoteamento. particiona(int particiona(int data[]; data[]; int esq, esq, dir; dir; var int i, j) j) { i = esq; esq; j = dir; dir; x = data[(i+j) div 2]; while (i < j) { while (x > vet[i]) vet[i]) i++; while (x < vet[j]) ; vet[j]) j-j--; if (i < j) swap( swap(vet[i], vet[i], vet[j]); vet[j]); } } // Ao final: i = j = posiç posição final do pivô.. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. ORDENAÇÃO POR INTERCALAÇÃO 18. C&P - AULA 6. ¾ Algoritmo Mé Método Intercalaç Intercalação/QuickSort ão/QuickSort. Prof. Dr. Marcelo Augusto Cicogna. // Ordenaç Ordenação por Mé Método de Intercalaç Intercalação. // Mé Método QuickSort (Sir C. A. R. Hoare) Hoare) ordena(int data[]; data[]; int esq, esq, dir) dir) { particiona( particiona(vet, vet, esq, esq, dir, dir, i, j); if (esq < j) ordena( j); ordena(vet, vet, esq, esq, if (i+1 < dir) dir) ordena( ordena(vet, vet, i+1, dir); dir); } ordenaPorIntercalaç ordenaPorIntercalação(int ão(int data[]; data[]; int n) { ordena( ordena(vet, vet, 0, nn-1); }. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa..

(10) ORDENAÇÃO POR INTERCALAÇÃO 19. C&P - AULA 6. ¾ Exemplo da Motivaç Motivação do Algoritmo Intercalaç Intercalação. Prof. Dr. Marcelo Augusto Cicogna. partiç partição. partiç partição. partiç partição. 4. 1. 3. 5. 2. 2. 1. 3. 5. 4. 2. 1. 3. 1. 2. 3. 1. 2. 1. 2. partiç partição. 5. 4. 4. 5. Estado final do vetor:. 1. 2. 3. 4. 5. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. ORDENAÇÃO POR INTERCALAÇÃO 20. C&P - AULA 6. Prof. Dr. Marcelo Augusto Cicogna. ¾ Implementaç Implementação em Linguagem C (vetor de inteiros). BibOrdena.c. void particiona(int vet[], int esq, int dir, int* i, int* j) { int valPivo, aux; (*i) = esq; (*j) = dir; /* i e j armazenam posicao final part. */ valPivo = vet[(esq+dir)/2]; /* Pivô: ponto médio. */ /* Repita enquanto os contadores nao se cruzarem. */ while ( (*i) < (*j) ) {/* Encontrar elementos que nao respeitam a particao sobre valPivo. */ while (valPivo > vet[*i]) (*i)++; while (valPivo < vet[*j]) (*j)--; /* Swap de posicoes: respeitar particao sobre valPivo. */ if ( (*i) < (*j) ) { aux = vet[*i]; vet[*i] = vet[*j]; vet[*j] = aux; } } } /* Ao final: *i = *j = posição final do pivô. */. PA. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. 218.

(11) ORDENAÇÃO POR INTERCALAÇÃO 21. C&P - AULA 6. Prof. Dr. Marcelo Augusto Cicogna. ¾ Implementaç Implementação em Linguagem C (vetor de inteiros). BibOrdena.c. //---------------------------------------------------------------------void ordena(int vet[], int esq, int dir) // Função recursiva de ordenação pelo método QuickSort. { int i, j; particiona(vet, esq, dir, &i, &j); if (esq < j) ordena(vet, esq, j); if ((i+1) < dir) ordena(vet, i+1, dir); } //---------------------------------------------------------------------void ordenaPorIntercalacao(int vet[], int size) { /* Chamada da função recursiva ordena() para o vetor original. */ ordena(vet, 0, size-1); }. PA ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. 218. ORDENAÇÃO POR INTERCALAÇÃO 22. C&P - AULA 6. ¾ Desempenho do Algoritmo z Comparações (pior, médio, melhor). C (n) = n log(n). C (n) = n log(n). Prof. Dr. Marcelo Augusto Cicogna. n2 C ( n) = 2. PA ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. 78-81.

(12) ORDENAÇÃO POR INTERCALAÇÃO 23. C&P - AULA 6. ¾ Análise de Comparações Pior. Prof. Dr. Marcelo Augusto Cicogna. n2 C ( n) = 2 Médio/Melhor. C (n) = n log(n). ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. ORDENAÇÃO POR INTERCALAÇÃO 24. C&P - AULA 6. ¾ Processo de Ordenação z. Método para Extrair “Insights”. Prof. Dr. Marcelo Augusto Cicogna. ~ Considere. um vetor de valores aleatórios. {. Valores inteiros entre 1 e 100. {. Sem repetiç repetição. {. Funç Função: void doVetorRand(int vet[], int size). ~ Gráfico {. Colocar o vetor na forma grá gráfica y = f(x). {. x = i (1, 2, 3, ..., 100). {. y = vet[i] vet[i]. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa..

(13) ORDENAÇÃO POR INTERCALAÇÃO 25. C&P - AULA 6. ¾ Evolução do Processo de Ordenação 100. 100. 80. 80. Prof. Dr. Marcelo Augusto Cicogna. 60. 60. 40. 40. 20. 20. 0. 100. 80. 60. 40. 20. 0. 0. 0. 100. 80. 60. 40. 20. 100. 100. 80. 80. 60. 60. 40. 40. 20. 20. 20. 0. 0. 0. 0. 0 0. 20. 40 20. 20. 0 0. 40. 20. 60 40. 40. 20. 60. 40. 80 60. 60. 40. 100. 80. 60. 80. 80. 80. 60. 100. 100. 100. 80. 100. 100. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. ORDENAÇÃO POR INTERCALAÇÃO 26. C&P - AULA 6 100. 100. 80. 80. 60. 60. 40. 40. 20. 20. 0. 0. Prof. Dr. Marcelo Augusto Cicogna. 0. 20. 40. 60. 80. 100. 0. 20. 40. 100. 100. 80. 80. 60. 60. 40. 40. 20. 20. 0. 60. 80. 100. 0 0. 20. 40. 60. 80. 100. 0. 20. 40. 100. 100. 80. 80. 60. 60. 40. 40. 20. 20. 0. 60. 80. 100. 0 0. 20. 40. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. 60. 80. 100. 0. 20. 40. 60. 80. 100.

(14) EXERCÍCIO EM LABORATÓRIO 27. C&P - AULA 6. 7) Baseado nos Exercí Exercícios em Laborató Laboratório 01, 03 e 05 (Aula 3, 4 e 5), 5), altere o módulo criado para a inclusão do mé método de ordenaç ordenação de inteiros utilizando o Método de Ordenaç Ordenação por Intercalaç Intercalação: ão:  BibOrdena. BibOrdena.h : adicione o protó protótipo da funç função do slide 17;. Prof. Dr. Marcelo Augusto Cicogna.  BibOrdena. BibOrdena.c : adicione a funç função dos slides 17 e 18;  Main. Main.c : altere a funç função principal para teste do Mé Método de Ordenaç ç ão por Intercalaç ç ão. Ordena Intercala Para preenchimento dos cabeç cabeçalhos: Título: Exercí Exercício Computacional. Assunto: Ordenaç Ordenação por Intercalaç Intercalação.. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa.. EXERCÍCIO PRÁTICO 28. C&P - AULA 6. 8) Baseado nos Exercí Exercícios Prá Práticos 02, 04 e 06 (Aulas 3, 4 e 5), 5), altere o mó módulo criado para a ordenaç ordenação de strings utilizando o Método de Ordenaç Ordenação por Intercalaç Intercalação: ão:  BibOrdenaStr. BibOrdenaStr.h : adicione o protó protótipo da funç função do slide 17, tomando o cuidado de gerenciar um vetor de strings; strings;. Prof. Dr. Marcelo Augusto Cicogna.  BibOrdenaStr. BibOrdenaStr.c : altere o có código dos slides 17 e 18 para ordenar um vetor de strings. strings.  Main. Main.c : altere a funç função principal para teste do Mé Método de Ordenaç Ordenação por Intercalaç Intercalação aplicado a vetor de strings. strings.. Para preenchimento dos cabeç cabeçalhos: Título: Exercí Exercício Computacional. Assunto: Ordenaç Ordenação por Intercalaç Intercalação - Uso de Strings.. Data de entrega: 21/09/2006. ©2006 FAV - Classificaç Classificação & Pesquisa. Pesquisa..

(15)

Referências

Documentos relacionados

Abrindo-se imediatamente para uma praça situada no piso do vazio central, que abriga o posto de venda de ingressos para todos os eventos do centro cultural bem como para espetáculos

Note on the occurrence of the crebeater seal, Lobodon carcinophagus (Hombron &amp; Jacquinot, 1842) (Mammalia: Pinnipedia), in Rio de Janeiro State, Brazil.. On May 12, 2003,

(2014) através da World Values Survey. A preocupação com o meio ambiente, bem como a pouca importância dada ao “ter” são características dos que tendem a

Os candidatos reclassificados deverão cumprir os mesmos procedimentos estabelecidos nos subitens 5.1.1, 5.1.1.1, e 5.1.2 deste Edital, no período de 15 e 16 de junho de 2021,

potencialmente porque não são entendidos como tal pela maioria da população e porque não estão classificados — e, em parte, a uma lacuna consistente relativa à formação de

ABSTRACT: The toxicological effects of crude ethanolic extracts (CEE) of the seed and bark of Persea americana have been analyzed on larvae and pupae of

[r]

A meta prevista para este indicador era garantir a realização de exames complementares em dia a 100% de hipertensos e diabéticos do programa, por tanto não foi atingida,