Aula 18 Algoritmos básicos de busca e classificação
|
|
|
- Giovanni Borja Campelo
- 7 Há anos
- Visualizações:
Transcrição
1 Aula 18 Algoritmos básicos de busca e classificação Dentre os vários algoritmos fundamentais, os algoritmos de busca em tabelas e classificação de tabelas estão entre os mais usados. Considere por exemplo um sistema de banco de dados. As operações de busca para se encontrar um determinado elemento, são muito utilizadas. Para que a busca seja rápida é necessário que as tabelas que constituem o banco de dados estejam numa determinada ordem. Vamos nos concentrar somente na busca e classificação de tabelas em memória, ou seja, busca e classificação em vetores ou matrizes. Busca em tabelas Busca sequencial Consiste em varrer uma tabela a procura de um determinado elemento, verificando ao final se o mesmo foi ou não encontrado. A função busca abaixo, procura elemento igual a x num vetor a de n elementos, devolvendo 1 se não encontrou ou o índice do primeiro elemento igual a x no vetor. int busca(int a[], int n, int x) { int i; for (i = 0; i < n; i++) if (a[i] == x) return i; /* Foi até o final e não encontrou */ return -1; Existem várias maneiras de se fazer o algoritmo da busca, por exemplo: int busca(int a[], int n, int x) { int i = 0; while (i < n && a[i]!= x) i++; /* Verifica se parou porque chegou ao fim ou encontrou igual */ if (i == n) return 1; /* chegou ao fim */ return i; /* encontrou um igual */ Fica como exercício, reescrever a função busca de outras formas. Usando o próprio comando for, usando o do while, usando o comando while, modificando a comparação, etc. P102) Programa que testa a função busca. Dado n, gere uma seqüência de números com rand(), imprima a seqüência gerada e efetua várias buscas até ser digitado um número negativo. #include <stdio.h> #include <stdlib.h> int busca(int a[], int n, int x) { int i; for (i = 0; i < n; i++) if (a[i] == x) return i; /* foi até o final e não encontrou */ return -1;
2 void geravet(int v[], int k) { /* gera vetor com k elementos usando rand() */ int i; srand(9999); for (i = 0; i < k; i++) v[i] = rand(); void impvet(int v[], int k) /* imprime vetor com k elementos */ {int i; for (i = 0; i < k; i++) printf("%6d", v[i]); int main() { int vet[1000], n, kk, x; /* ler n */ printf("entre com n:"); scanf("%d", &n); /* gera o vetor e imprime */ geravet(vet, n); impvet(vet, n); /* ler vários números até encontrar um negativo e procurar no vetor */ printf("\nentre com o valor a ser procurado:"); scanf("%d", &x); while (x >= 0) { if ((kk = busca(vet, n, x)) >= 0) printf("*** encontrado na posicao %3d", kk); else printf("*** nao encontrado"); printf("\nentre com o valor a ser procurado:"); /* lê o próximo */ scanf("%d", &x); Veja o que será impresso: entre com n: entre com o valor a ser procurado:21514 *** encontrado na posicao 16 entre com o valor a ser procurado:24288 *** encontrado na posicao 7 entre com o valor a ser procurado:163 *** encontrado na posicao 6 entre com o valor a ser procurado:7777 *** nao encontrado entre com o valor a ser procurado:1234 *** nao encontrado entre com o valor a ser procurado:1995 *** encontrado na posicao 1 entre com o valor a ser procurado:-9 Busca Sequencial análise simplificada Considere a função busca do P102. Quantas vezes a comparação (a[i] == x) é executada?
3 Essa comparação (a[i] == x)representa a quantidade de vezes que a repetição é efetuada. Dizemos então que o tempo que esse algoritmo leva para ser executado é proporcional a quantidade de vezes que essa repetição é executada. Máximo = n (quando não encontra o x ou x é igual ao último elemento) Mínimo = 1 (quando x é igual ao primeiro elemento) Médio = (n+1)/2, supondo os elementos procurados equiprováveis Assim, o tempo que esse algoritmo leva, é proporcional a n. Quando existem elementos que podem ocorrer com maior freqüência, o melhor é colocá-los no início da tabela, pois serão encontrados com menos comparações. Busca binária em tabela ordenada Quando a tabela está ordenada, nem sempre é necessário ir até o fim da tabela para concluir que um elemento não está. Ao encontrarmos um elemento maior que o procurado, podemos parar a busca, pois dali para frente todos os demais serão maiores. No entanto, existe um algoritmo muito melhor quando a tabela está ordenada. Lembre-se de como fazemos para procurar uma palavra no dicionário. Não vamos verificando folha a folha (busca seqüencial) até encontrar a palavra procurada. Ao contrário, abrimos o dicionário mais ou menos no meio e a partir daí só há 3 possibilidades: a) Encontramos a palavra procurada na página aberta (ou concluímos que ela não está no dicionário, pois se estivesse estaria nesta página). b) A palavra está na parte esquerda. c) A palavra está na parte direita. Se não ocorreu o caso a), repetimos o mesmo processo com as páginas remanescentes onde a palavra tem chance de ser encontrada, isto é, continuamos a busca com um número bem menor de páginas. Para o caso de uma tabela, isso pode ser sistematizado da seguinte forma: a) Testa com o elemento do meio da tabela b) Se o elemento é igual, termina a busca, pois foi encontrado. c) Se o elemento do meio é maior, repete o processo considerando a tabela do inicio até o elemento do meio menos 1. d) Se o elemento do meio é menor, repete o processo considerando a tabela do elemento do meio mais 1 até o final. int buscabinaria(int a[], int n, int x) { int inicio = 0, final = n-1, meio; /* procura enquanto a tabela tem elementos */ while (inicio <= final) { meio = (inicio + final) / 2; if (a[meio] == x) return meio; if (a[meio] > x) final = meio -1; /* busca na parte de cima */ else inicio = meio + 1; /* busca na parte de baixo */ /* foi até o final e não encontrou */ return -1;
4 P102a) Programa que testa a função buscabinaria. Dado n, gere uma sequência ordenada de números com rand(), imprima a seqüência gerada e efetue várias buscas até ser digitado um número negativo. Acrescentamos um printf na buscabinaria, para explicitar cada uma das repetições. #include <stdio.h> #include <stdlib.h> int buscabinaria(int a[], int n, int x) { int inicio = 0, final = n-1, meio; /* procura enquanto a tabela tem elementos */ while (inicio <= final) { printf("\ninicio = %3d final = %3d", inicio, final); meio = (inicio + final) / 2; if (a[meio] == x) return meio; if (a[meio] > x) final = meio -1; /* busca na parte de cima */ else inicio = meio + 1; /* busca na parte de baixo */ /* foi até o final e não encontrou */ return -1; void geravet(int v[], int k) { /* gera vetor em ordem crescente com k elementos usando rand() */ int i; srand(9999); v[0] = rand()%100; for (i = 1; i < k; i++) v[i] = v[i-1] + rand()%100; void impvet(int v[], int k) { /* imprime vetor com k elementos */ int i; for (i = 0; i < k; i++) printf("%6d", v[i]); int main() { int vet[1000], n, kk, x; /* ler n */ printf("entre com n:"); scanf("%d", &n); /* gera o vetor e imprime */ geravet(vet, n); impvet(vet, n); /* ler vários números até encontrar um negativo e procurar no vetor */ printf("\nentre com o valor a ser procurado:"); scanf("%d", &x); while (x >= 0) { if ((kk = buscabinaria(vet, n, x)) >= 0) printf("\n*** encontrado na posicao %3d", kk); else printf("\n*** nao encontrado"); printf("\nentre com o valor a ser procurado:"); scanf("%d", &x); Veja o que será impresso. Em especial, veja como as variáveis inicio e final se comportam dentro da buscabinaria.
5 entre com n: entre com o valor a ser procurado:354 inicio = 0 final = 14 inicio = 0 final = 6 inicio = 4 final = 6 *** encontrado na posicao 5 entre com o valor a ser procurado:803 inicio = 0 final = 14 inicio = 8 final = 14 inicio = 12 final = 14 inicio = 12 final = 12 *** encontrado na posicao 12 entre com o valor a ser procurado:500 inicio = 0 final = 14 inicio = 0 final = 6 inicio = 4 final = 6 inicio = 6 final = 6 *** nao encontrado entre com o valor a ser procurado:613 inicio = 0 final = 14 inicio = 8 final = 14 inicio = 8 final = 10 *** encontrado na posicao 9 entre com o valor a ser procurado:12345 inicio = 0 final = 14 inicio = 8 final = 14 inicio = 12 final = 14 inicio = 14 final = 14 *** nao encontrado entre com o valor a ser procurado:939 inicio = 0 final = 14 inicio = 8 final = 14 inicio = 12 final = 14 inicio = 14 final = 14 *** encontrado na posicao 14 entre com o valor a ser procurado:-1 Exercícios: Considere a seguinte tabela ordenada, onde vamos procurar elementos usando a busca binária: ) Diga quantas comparações serão necessárias para procurar cada um dos 7 elementos da tabela? 2) Diga quantas comparações serão necessárias para procurar os seguintes números que não estão na tabela 12, 28, 1, 75, 8? E se a tabela tivesse os seguintes elementos:
6 ) Diga quantas comparações serão necessárias para procurar cada um dos 10 elementos da tabela? 2) Diga quantas comparações serão necessárias para procurar os seguintes números que não estão na tabela 12, 28, 1, 75, 8? Busca binária - análise simplificada A comparação (a[meio] == x) é bastante significativa para a análise do tempo que esse algoritmo demora, pois representa a quantidade de repetições que serão feitas. O tempo consumido pelo algoritmo é proporcional à quantidade de repetições (comando while). Como a cada repetição uma comparação é feita, o tempo consumido será proporcional à quantidade de comparações. Quantas vezes a comparação (a[meio] == x) é efetuada? Mínimo = 1 (encontra na primeira) Máximo =? Médio =? Note que a cada iteração a tabela fica dividida ao meio. Assim, o tamanho da tabela é: N,N/2,N/4,N/8,... A busca terminará quando o tamanho da tabela chegar a zero, ou seja, no menor k tal que N < 2 k. Portanto o número máximo é um número próximo de lg N (lg N = log 2 N). Uma maneira um pouco mais consistente. Vamos analisar quando N é da forma 2 k -1 (1,3,7,15,31,...) Para este caso, a tabela fica sempre dividida em: N, N/2, N/4, N/8,..., 15,7,3,1 sempre com a divisão por 2 arredondada para baixo. Serão feitas exatamente k repetições até que a tabela tenha 1 só elemento. Como estamos interessados num limitante superior, caso N não seja desta forma, podemos considerar N o menor N tal que N >N e que seja da forma 2 k -1. N = 2 k -1 então o número máximo de repetições será k = lg (N+1). Assim, o algoritmo é O(lg N). É um resultado surpreendente. Suponha uma tabela de de elementos. O número máximo de comparações será lg ( ) = 20. Compare com a busca seqüencial, onde o máximo de comparações seria e o médio seria Veja abaixo alguns valores típicos para tabelas grandes. N lg (N+1)
7 Será que o número médio é muito diferente da média entre o máximo e o mínimo? Vamos calculá-lo, supondo que sempre encontramos o elemento procurado. Note que quando não encontramos o elemento procurado, o número de comparações é igual ao máximo. Assim, no caso geral, a média estará entre o máximo e a média supondo que sempre vamos encontrar o elemento. Supondo que temos N elementos e que a probabilidade de procurar cada um é sempre 1/N. Vamos considerar novamente N=2 k -1 pelo mesmo motivo anterior. Como fazemos 1 comparação na tabela de N elementos, 2 comparações em 2 tabelas de N/2 elementos, 3 comparações em 4 tabelas de N/4 elementos, 4 comparações em 8 tabelas de N/8 elementos, e assim por diante. = 1.1/N + 2.2/N + 3.4/N k.2 k-1 /N = 1/N. i.2 i-1 (i=1,k) = 1/N. ((k-1).2 k + 1) (a prova por indução está abaixo) Como N=2 k -1 então k=lg (N+1) = 1/N. ((lg (N+1) 1). (N+1) + 1) = 1/N. ((N+1).lg (N+1) N) = (N+1)/N. lg (N+1) - 1 ~ lg (N+1) - 1 Resultado novamente surpreendente. A média é muito próxima do máximo. Prova por indução: i.2 i-1 (i=1,k) = (k-1).2 k + 1 Verdade para k=1 Supondo verdade para k, vamos calcular para k+1. i.2 i-1 (i=1,k+1) = i.2 i-1 (i=1,k) + (k+1).2 k = (k-1).2 k (k+1).2 k = k.2 k Tabelas estáticas e tabelas dinâmicas A busca binária é um algoritmo extremamente eficiente. Entretanto há um problema a se considerar no caso real. As tabelas muitas vezes não são estáticas, ou seja, durante o processamento ocorrem inserções e remoções de elementos (tabelas dinâmicas). Para manter a tabela ordenada, seriam necessárias deslocamentos de grandes partes da tabela para acomodar as inserções e remoções de elementos. Portanto outros algoritmos são necessários e que têm que aliar a eficiência da busca binária com inserções e remoções. Não serão estudados neste curso, mas apenas como comentário, são algoritmos de hash (que dividem a tabela em subtabelas lógicas) e que usam estrutura de dados ligada (listas ligadas e árvores). Classificação de tabelas Classificação método da seleção O algoritmo imediato para se ordenar uma tabela é o seguinte:
8 a) Determinar o mínimo a partir do primeiro e trocar com o primeiro b) Determinar o mínimo a partir do segundo e trocar com o segundo c) Determinar o mínimo a partir do terceiro e trocar com o terceiro : : x) Determinar o mínimo a partir do (n-1)-ésimo e trocar com o (n-1)-ésimo Exemplo numa tabela de 5 elementos: P103) Programa que dado n, gere uma seqüência com n elementos usando rand(), imprima a seqüência gerada, ordene a mesma pelo método da seleção e imprima a seqüência ordenada. #include <stdio.h> #include <stdlib.h> void troca (int *x, int *y) {int aux; aux = *x; *x = *y; *y = aux; void ordena(int a[], int n) {int i, j, imin; /* varrer o vetor de a[o] até a[n-2] (penúltimo) */ for (i = 0; i < n - 1; i++) {/* achar o mínimo a partir de a[i] */ imin = i; for (j = i + 1; j < n; j++) if (a[imin] > a[j]) imin = j; /* troca a[imin] com a[i] */ troca(&a[imin], &a[i]); void geravet(int v[], int k) /* gera vetor com k elementos usando rand() */ {int i; srand(9999); for (i = 0; i < k; i++) v[i] = rand()%1000; void impvet(int v[], int k) /* imprime vetor com k elementos */ {int i; for (i = 0; i < k; i++) printf("%5d", v[i]); int main() {int vet[1000], n, kk, x; /* ler n */ printf("entre com n:"); scanf("%d", &n);
9 /* gera o vetor e imprime */ geravet(vet, n); printf("\n****** vetor gerado ******\n"); impvet(vet, n); /* ordena o vetor */ ordena(vet, n); /* imprime vetor ordenado */ printf("\n****** vetor ordenado ******\n"); impvet(vet, n); Um exemplo de execução do programa: entre com n:100 ****** vetor gerado ****** ****** vetor ordenado ****** Classificação método da seleção análise simplificada O número de trocas é sempre n 1. Não seria necessário trocar se o mínimo fosse o próprio elemento, mas para fazer isso teríamos de qualquer forma fazer outra comparação. O número de comparações (a[imin] > a[j])é sempre (n-1)+(n-2) = n(n-1)/2. Esse número é exatamente a quantidade de repetições efetuadas. Portanto o tempo que esse algoritmo leva é proporcional a esse número, ou seja, o tempo é proporcional a n 2. Ordenação - método bubble (da bolha) Outro método para fazer a ordenação é pegar cada um dos elementos a partir do segundo (a[1] até a[n-1]) e subi-los até que encontrem o seu lugar Observe como cada elemento sobe até encontrar o seu lugar.
10 P104) Programa que dado n, gere uma seqüência com n elementos usando rand(), imprima a seqüência gerada, ordene a mesma pelo método da bolha e imprima a seqüência ordenada. #include <stdio.h> #include <stdlib.h> void troca (int *x, int *y) {int aux; aux = *x; *x = *y; *y = aux; void bubble(int a[], int n) {int i, j; /* subir com a[i], i = 1, 2,..., n-1*/ for (i = 1; i < n; i++) {/* suba com a[i] até encontrar um menor ou chegar em a[0] */ j = i; while (j > 0 && a[j] < a[j-1]) {/* troca a[imin] com a[i] */ troca(&a[j], &a[j-1]); /* continua subindo */ j--; void geravet(int v[], int k) /* gera vetor com k elementos usando rand() */ {int i; srand(9999); for (i = 0; i < k; i++) v[i] = rand()%1000; void impvet(int v[], int k) /* imprime vetor com k elementos */ {int i; for (i = 0; i < k; i++) printf("%5d", v[i]); int main() {int vet[1000], n, kk, x; /* ler n */ printf("entre com n:"); scanf("%d", &n); /* gera o vetor e imprime */ geravet(vet, n); printf("\n****** vetor gerado ******\n"); impvet(vet, n); /* ordena o vetor */ bubble(vet, n); /* imprime vetor ordenado */ printf("\n****** vetor ordenado ******\n"); impvet(vet, n); Nada de novo na saída do programa.
11 entre com n:100 ****** vetor gerado ****** ****** vetor ordenado ****** Exercícios Considere as 120 (5!) permutações de : 1) Encontre algumas que precisem exatamente de 5 trocas para classificá-la pelo método bubble. 2) Idem para 7 trocas 3) Qual a seqüência que possui o número máximo de trocas e quantas trocas são necessárias? Ordenação - método bubble (da bolha) análise simplificada O comportamento do método bubble depende se a tabela está mais ou menos ordenada, mas em média, o seu tempo também é proporcional a n 2 como no método anterior. Quantas vezes o comando troca(&a[j], &a[j-1]) é executado??? No pior caso, quando a seqüência está invertida, é executado i vezes para cada valor de i = 1, 2, 3,..., n-1. Portanto n 1 = n.(n 1)/2. Portanto, no pior caso o bubble é O(n 2 ). E quanto ao número médio? Inversões Seja P = a 1 a 2... a n, uma permutação de n. O par (i,j) é uma inversão quando i<j e a i >a j. Exemplo: tem 4 inversões: (3,2) (5,4) (5,2) e (4,2) No método bubble o número de trocas é igual ao número de inversões da seqüência. O algoritmo se resume a: for (i = 1; i < n; i++) { // elimine as inversões de a[i] até a[0]... Veja também o exemplo: elimine as inversões do 8 0
12 elimine as inversões do elimine as inversões do elimine as inversões do Total de 7 inversões que é exatamente a quantidade de inversões na seqüência. Para calcularmos então o número de trocas do bubble, basta calcular o número de inversões da seqüência. É equivalente a calcular o número de inversões de uma permutação de n. Qual o número médio de inversões em todas as seqüências possíveis? É equivalente a calcular o número médio de inversões em todas as permutações de n. Não vamos demonstrar, mas esse número é n.(n-1)/4. Note que é exatamente a média entre o mínimo e o máximo. Portanto o bubble é O(n 2 ). Ordenação - outros métodos Existem vários outros métodos melhores que os métodos acima que não veremos neste curso. Podemos citar: Quick que usa o fato de existir algoritmo rápido para particionar a tabela. Merge que usa o fato de existir algoritmo rápido para intercalar 2 seqüências ordenadas. Heap que organiza a tabela como uma árvore hierárquica. Nesses métodos, o tempo é proporcional a (n. log n)
Algoritmos de Busca em Tabelas
Dentre os vários algoritmos fundamentais, os algoritmos de busca em tabelas estão entre os mais usados. Considere por exemplo um sistema de banco de dados. As operações de busca e recuperação dos dados
Algoritmos de Classificação de Tabelas - Sorting
Revisado em 03Out13 - Sorting A classificação de tabelas e conjuntos de dados é uma operação bastante usada em qualquer área da computação. Os algoritmos de classificação estão dentre os algoritmos fundamentais.
Aula 15 Variáveis Indexadas (vetores)
Aula 15 Variáveis Indexadas (vetores) Além das variáveis normais já conhecidas, podemos ter também variáveis indexadas. Tais variáveis são referenciadas por um nome e um índice. Especialmente úteis para
Algoritmos de Enumeração
Em muitos casos para fazer a simulação de um algoritmo é necessário testar-se com um conjunto exaustivo de dados, ou seja, gerar várias ou todas as sequências possíveis de dados e verificar o comportamento
HeapSort. Estrutura de Dados II Jairo Francisco de Souza
HeapSort Estrutura de Dados II Jairo Francisco de Souza HeapSort Algoritmo criado por John Williams (1964) Complexidade O(NlogN) no pior e médio caso Mesmo tendo a mesma complexidade no caso médio que
Linguagem C vetores multidimensionais
Linguagem C vetores multidimensionais IF61A/IF71A - Computação 1 Prof. Leonelo Almeida Universidade Tecnológica Federal do Paraná Até agora... Introdução à linguagem C... Operadores aritméticos, de comparação
1) Operadores de auto incremento ++ e auto decremento --
Aula 09 - Operadores de auto incremento e auto decremento, atribuição múltipla, atribuição na declaração, atribuição resumida e algumas regras de boa programação. 1) Operadores de auto incremento ++ e
ESTRUTURAS CONDICIONAIS. Baseado nos slides de autoria de Rosely Sanches e Simone Senger de Souza
ESTRUTURAS CONDICIONAIS Baseado nos slides de autoria de Rosely Sanches e Simone Senger de Souza Estruturas de Controle ESTRUTURA SEQUENCIAL ESTRUTURA CONDICIONAL ESTRUTURA DE REPETIÇÃO 2 Estruturas Condicionais
Departamento de Engenharia Rural Centro de Ciências Agrárias. Programação I
Departamento de Engenharia Rural Centro de Ciências Agrárias Programação I Algoritmos de busca Basicamente podem ser citadas duas estratégias para procurar (ou buscar) algo em uma coleção de dados: Busca
MC102 Algoritmos e Programação de Computadores
MC102 Algoritmos e Programação de Computadores Instituto de Computação UNICAMP Primeiro Semestre de 2014 Roteiro 1 Maior número 2 Soma de n números 3 Fatorial 4 Máximo Divisor Comum (MDC) 5 Números primos
Funções Vetores Matrizes
Funções Vetores Matrizes Além dos tipos elementares (float, double, char, etc.), é possível também passar um vetor ou uma matriz como parâmetro de funções. Quando um vetor é passado como parâmetro, o que
Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática
Estrutura de Dados Algoritmos de Ordenação Prof. Othon M. N. Batista Mestre em Informática Roteiro Introdução Ordenação por Inserção Insertion Sort Ordenação por Seleção Selection Sort Ordenação por Bolha
Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1
Estruturas de Dados Módulo 17 - Busca 2/6/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004)
Árvores Binárias de Busca
0. Um breve comentário sobre os algoritmos de busca em tabelas De uma maneira geral, realizam-se operações de busca, inserção e remoção de elementos numa tabela. A busca sequencial tradicional é O(N).
Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler
Aula 3 Listas Lineares Sequenciais Ordenadas prof Leticia Winkler 1 Listas Lineares Sequenciais Ordenadas Elementos da lista estão dispostos num vetor (contíguos na memória) e ordenado de acordo com alguma
Programação: Vetores
Programação de Computadores I Aula 09 Programação: Vetores José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011-1 1/62 Motivação Problema Faça um programa que leia
Linguagem C: Ordenação
Instituto de C Linguagem C: Ordenação Luis Martí Instituto de Computação Universidade Federal Fluminense [email protected] - http://lmarti.com Tópicos Principais Introdução Algoritmos de ordenação Ordenação
Análise de complexidade
Introdução Algoritmo: sequência de instruções necessárias para a resolução de um problema bem formulado (passíveis de implementação em computador) Estratégia: especificar (definir propriedades) arquitectura
Prova de Recuperação
Programação I Prova de Recuperação 1. (1 ponto) Considere um programa que leia de um arquivo de veículos os seguintes dados: placa de um veículo, ano de fabricação, consumo médio de combústivel, modelo
Aula 10 Algoritmos e Funções Recursivas
Aula 10 Algoritmos e Funções Recursivas Considere a definição da função fatorial: n! = 1 se n 0 Considere agora a seguinte definição equivalente: n! = 1 se n
INF111 Programação II Aulas 11, 12, 13 Ordenação
INF Programação II Aulas,, Ordenação Departamento de Informática UFV Ordenação A ordenação é o processo de organizar um conunto (vetor) de n obetos ou registros segundo uma determinada ordem crescente
Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1
Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1 ORDENAÇÃO E BUSCA Ordenação: Bublesort, seleção direta e inserção direta. Busca: linear e binária 1 - ORDENAÇÃO (CLASSIFICAÇÃO) DE DADOS Em diversas
Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo
Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária Túlio Toffolo www.decom.ufop.br/toffolo Pesquisa em Memória Primária n Introdução - Conceitos Básicos n Pesquisa Sequencial n Pesquisa Binária n Árvores
max1: 20,max2:+ max1:15, max2:20 max1:30,max2:32,max3:35 max1:40,max2:+
Estruturas de Dados Algumas Respostas da Lista 4 Angelo Ciarlini 1- Mostre o aspecto de uma árvore 2-3 que armazena números inteiros após a inserção dos números 30, 20, 10, 40, 15, 35 e 32, nesta ordem.
Lógica de Programação I
Gilson de Souza Carvalho [email protected] 1 Comando Switch O comando Switch pode ser visto como uma especialização do comando if. Foi criado para facilitar um uso particular de comandos if encadeados.
Curso de Programação Computadores Prof. Aníbal Tavares Profa. Cassilda Ribeiro Ministrado por: Prof. André Amarante
14 - Vetores Unesp Campus de Guaratinguetá Curso de Programação Computadores Prof. Aníbal Tavares Profa. Cassilda Ribeiro Ministrado por: Prof. André Amarante Vetores, Matrizes e Strings 1 14.1 Vetor Problemas
Ordenação: Heapsort. Algoritmos e Estruturas de Dados II
Ordenação: Heapsort Algoritmos e Estruturas de Dados II Introdução Possui o mesmo princípio de funcionamento da ordenação por seleção Selecione o menor item do vetor Troque-o pelo item da primeira posição
Algoritmos de Ordenação
Algoritmos de Ordenação! Problema: encontrar um número de telefone em uma lista telefônica! simplificado pelo fato dos nomes estarem em ordem alfabética! e se estivesse sem uma ordem?! Problema: busca
Medida do Tempo de Execução de um Programa. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP
Medida do Tempo de Execução de um Programa Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP Medida do Tempo de Execução de um Programa O projeto de algoritmos é fortemente influenciado pelo estudo
INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1
INF1007: Programação 2 6 Ordenação de Vetores 01/10/2015 (c) Dept. Informática - PUC-Rio 1 Tópicos Introdução Ordenação bolha (bubble sort) Ordenação por seleção (selection sort) 01/10/2015 (c) Dept. Informática
1 Resumo: Matrizes. 2.1 Como declarar uma matriz IME/USP. Departamento de Ciência da Computação
Departamento de Ciência da Computação MAC2166 Introdução a Computação IME/USP Matrizes 1 Resumo: Matrizes são estruturas bi-dimensionais utilizadas para armazenar dados de um mesmo tipo. Para declarar
Linguagem C (repetição)
Linguagem C (repetição) André Tavares da Silva [email protected] Exercício Escrever um programa que conte (mostre na tela) os números de 1 a 100. Comandos aprendidos até o momento: printf, scanf, getchar,
CORREÇÃO DE ALGORITMOS E
AULA 3 CORREÇÃO DE ALGORITMOS E PROGRAMAS É fato que estamos muito interessados em construir algoritmos e programas eficientes, conforme vimos na aula 2. No entanto, de nada vale um algoritmo eficiente
Métodos de Ordenação Parte I
Estrutura de Dados II Métodos de Ordenação Parte I Prof a Márcio Bueno [email protected] / [email protected] Material baseado nos materiais da Prof a Ana Eliza e Prof. Robson Lins Rearranjar
Análise de Algoritmos
Análise de Algoritmos Parte 1 Prof. Túlio Toffolo http://www.toffolo.com.br BCC202 Aula 04 Algoritmos e Estruturas de Dados I Qual a diferença entre um algoritmo e um programa? Como escolher o algoritmo
Métodos de ordenação. Bubble sort:
Métodos de ordenação Bubble sort: O método de ordenação por bubble sort ou conhecido como bolha consiste em compara dados armazenados em um vetor de tamanho qualquer, comparando cada elemento de uma posição
Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio
Programação II Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio Árvores Dados organizados de maneira hierárquica Exemplos: arquivos em diretórios, subdivisão de espaço 2D em um
Aula 12- Variáveis e valores reais
Aula 12- Variáveis e valores reais Até agora todos os nossos problemas continham apenas valores inteiros e portanto variáveis do tipo int. Para resolver problemas que usam valores com parte fracionária,
ÁRVORE BINÁRIA DE BUSCA
ÁRVORE BINÁRIA DE BUSCA Introdução O algoritmo de busca binária em vetores tem bom desempenho e deve ser usado quando temos os dados já ordenados. No entanto, se precisarmos inserir e remover elementos
Algoritmos e Funções Recursivas
Considere a definição da função fatorial: n! = 1 se n 0 Considere agora a seguinte definição equivalente: n! = 1 se n 0 Dizemos que essa última
ORDENAÇÃO E BUSCA 1. MÉTODOS DE ORDENAÇÃO
ORDENAÇÃO E BUSCA Em computação, freqüentemente, armazenamos dados que, mais tarde, precisam ser recuperados. Como veremos, a eficiência na busca de informações depende, essencialmente, da ordem em que
Estruturas de Dados 2
Estruturas de Dados 2 Técnicas de Projeto de Algoritmos Dividir e Conquistar IF64C Estruturas de Dados 2 Engenharia da Computação Prof. João Alberto Fabro - Slide 1/83 Projeto de Algoritmos por Divisão
Aula 15: Pesquisa em Memória Primária. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP
Aula 15: Pesquisa em Memória Primária Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP Pesquisa em Memória Primária Introdução - Conceitos Básicos Pesquisa Sequencial Pesquisa Binária Árvores de
Recursividade. Objetivos do módulo. O que é recursividade
Recursividade Objetivos do módulo Discutir o conceito de recursividade Mostrar exemplos de situações onde recursividade é importante Discutir a diferença entre recursividade e iteração O que é recursividade
BCC202 - Estrutura de Dados I
BCC202 - Estrutura de Dados I Aula 13: Ordenação: MergeSort Reinaldo Fortes Universidade Federal de Ouro Preto, UFOP Departamento de Computação, DECOM Website: www.decom.ufop.br/reifortes Email: [email protected]
Complexidade Assintótica de Programas Letícia Rodrigues Bueno
Complexidade Assintótica de Programas Letícia Rodrigues Bueno Análise de Algoritmos 1. Introdução; Análise de Algoritmos 1. Introdução; 2. Conceitos básicos; Análise de Algoritmos 1. Introdução; 2. Conceitos
Aula 10 Comandos de Repetição For e Do While
Aula 10 Comandos de Repetição For e Do While 1) O comando for É muito comum usarmos o comando while para repetir alguns comandos um número definido de vezes. Fazemos isso usando um contador. Considere
Método de ordenação - objetivos:
Método de ordenação - objetivos: Corresponde ao processo de rearranjar um conjunto de objetos em uma ordem ascendente ou descendente. Facilitar a recuperação posterior de itens do conjunto ordenado. São
5 Comando de Seleção Simples e Composta
5 Comando de Seleção Simples e Composta Ronaldo F. Hashimoto e Carlos H. Morimoto Essa aula introduz o comando de seleção, que permite ao seu programa tomar decisões sobre o fluxo do processamento, ou
Árvore Binária de Busca. Prof. César Melo
Árvore Binária de Busca Prof. César Melo Introdução O algoritmo de busca binária em vetores tem bom desempenho e deve ser usado quando temos os dados já ordenados. No entanto, se precisarmos inserir e
Programação de Computadores II. Cap. 17 Busca
Programação de Computadores II Cap. 17 Busca Livro: Waldemar Celes, Renato Cerqueira, José Lucas Rangel. Introdução a Estruturas de Dados, Editora Campus (2004) Slides adaptados dos originais dos profs.:
1 Exercícios com ponteiros
Computação para Informática Funções e Ponteiros1 EXERCÍCIOS COM PONTEIROS Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Funções e ponteiros O objetivo desta aula prática
MC-102 Aula 17 Strings e Matrizes
MC-102 Aula 17 Strings e Matrizes Instituto de Computação Unicamp 5 de Maio de 2015 Roteiro 1 Strings Strings: Exemplos 2 Matrizes Exemplos com Matrizes 3 Exercícios (Instituto de Computação Unicamp) MC-102
Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR
Medida do Tempo de Execução de um Programa David Menotti Algoritmos e Estruturas de Dados II DInf UFPR Classes de Comportamento Assintótico Se f é uma função de complexidade para um algoritmo F, então
Lista de exercícios sobre contagem de operações Prof. João B. Oliveira
Lista de exercícios sobre contagem de operações Prof. João B. Oliveira 1. metodo m ( Vetor V ) int i, res = 0; para i de 1 a V.size res = res + V[i]; return res; Soma de elementos de um vetor, O( ). 2.
O Problema da Ordenação Métodos de Ordenação Parte 1
Métodos de Ordenação Parte 1 SCC-201 Introdução à Ciência da Computação II Rosane Minghim 2010 Ordenação (ou classificação) é largamente utilizada Listas telefônicas e dicionários Grandes sistemas de BD
1 Exercícios com ponteiros
Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Oitava Aula Prática - 29 de outubro de 2010 O objetivo desta aula prática é exercitar ponteiros e funções. 1 Exercícios com ponteiros
Tabelas Hash. informação, a partir do conhecimento de sua chave. Hashing é uma maneira de organizar dados que:
Tabelas Hash Tabelas Hash O uso de listas ou árvores para organizar informações é interessante e produz bons resultados. Porem, em nenhuma dessas estruturas se obtém o acesso direto a alguma informação,
Estruturas de Repetição
Estruturas de Repetição Introdução As estruturas de repetição, permitem executar mais de uma vez um mesmo trecho de código. Trata-se de uma forma de executar blocos de comandos somente sob determinadas
Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo
PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo Árvore: estrutura composta por nós e arestas entre nós. As arestas são direcionadas ( setas ) e: um nó (e apenas um) é a raiz; todo nó
Universidade da Madeira. 1. Recursão. 3. Busca. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 2
Profa. Dra. Laura Rodríguez E-mail: [email protected] Universidade da Madeira 1. Recursão 2. Ordenação 3. Busca Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 2 1 1. Recursão 2. Ordenação 3.
Projeto e Análise de Algoritmos
Projeto e Análise de Algoritmos Aula 01 Complexidade de Algoritmos Edirlei Soares de Lima O que é um algoritmo? Um conjunto de instruções executáveis para resolver um problema (são
3. Vectores: Algoritmos de Pesquisa. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2004/2005) Luís Paulo Reis (versão 2005/2006)
3. Vectores: Algoritmos de Pesquisa João Pascoal Faria (versão original) Ana Paula Rocha (versão 2004/2005) Luís Paulo Reis (versão 2005/2006) FEUP - MIEEC Prog2-2006/2007 Introdução Algoritmo: conjunto
2. Ordenação por Seleção
1 Algoritmos de Ordenação Simples (SelectionSort, InsertionSort, BubbleSort) 1. Introdução Objetivo: Determinar a seqüência ordenada dos elementos de um vetor numérico. Algumas considerações: O espaço
Exercícios em C 1 Saulo O. D. Luiz
Exercícios em C 1 Saulo O. D. Luiz Exercícios 1. Faça um programa em C para receber três notas e seus respectivos pesos, calcule e mostre a média ponderada dessas notas. 2 Saulo O. D. Luiz #include
Complexidade de Algoritmos
Complexidade de Algoritmos! Uma característica importante de qualquer algoritmo é seu tempo de execução! é possível determiná-lo através de métodos empíricos, considerando-se entradas diversas! é também
Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal
Exercícios 1) Crie uma função que recebe os coeficientes de uma função do 2o. grau e retorna as raízes sem usar vetor. 2) Faça um programa que acha o maior e o menor inteiro dentro de um vetor de 10 inteiros,
COMANDOS DE DECISÕES. O COMANDO if. O comando if instrui o computador a tomar uma decisão simples. Forma Geral: if (expressão de teste) instrução;
COMANDOS DE DECISÕES O COMANDO if O comando if instrui o computador a tomar uma decisão simples. Forma Geral: if (expressão de teste) instrução; Por exemplo: /* testif.c*/ /* mostra o uso do comando if*/
Busca Binária. Aula 05. Busca em um vetor ordenado. Análise do Busca Binária. Equações com Recorrência
Busca Binária Aula 05 Equações com Recorrência Prof. Marco Aurélio Stefanes marco em dct.ufms.br www.dct.ufms.br/ marco Idéia: Divisão e Conquista Busca_Binária(A[l...r],k) 1:if r < lthen 2: index = 1
CAP. IX - MANIPULAÇÃO DE ARQUIVOS Generalidades sobre Arquivos. 9.2 Abertura e Fechamento de Arquivos. Operações com arquivos:
CAP. IX - MANIPULAÇÃO DE ARQUIVOS 9.1 Generalidades sobre arquivos 9.2 Abertura e fechamento de arquivos 9.3 Arquivos textos e arquivos binários 9.4 Leitura e escrita em arquivos binários 9.5 Procura direta
Alocação dinâmica de Memória
Alocação dinâmica de Memória Vetores e Arrays A variável vetor é uma variável que armazena outras variáveis, no caso tem que ser do mesmo tipo. Exemplo Criar um cont Declarar um vet com o tamanho Laço
Linguagem C: Ponteiros - Alocação Dinâmica
Prof. Paulo R. S. L. Coelho [email protected] Faculdade de Computação Universidade Federal de Uberlândia GEQ007 Organização 1 Ponteiros Alocação Dinâmica de Memória 2 3 4 Organização Ponteiros Alocação
Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula
Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula Tópicos Introdução Ordenação por bolha (bubble sort)
ESTRUTURAS COMPOSTAS VETOR
ESTRUTURAS COMPOSTAS Variáveis Compostas Unidimensionais VETOR slides desenvolvidos pela Profa. Rosely Sanches 2 ESTRUTURAS COMPOSTAS Pode-se organizar tipos simples em tipos mais complexos formando as
ESTRUTURA DE DADOS VETORES E LISTAS LINEARES
ESTRUTURA DE DADOS VETORES E LISTAS LINEARES Prof. Dr. Daniel Caetano 2012-2 Objetivos Conhecer os vetores Compreender as Listas Sequenciais Implementar uma Lista Sequencial com Vetor GRUPOS? Até o fim
MAC 2166 Introdução à Computação para Engenharia
MAC 2166 Introdução à Computação para Engenharia PROVA 2 QUESTÃO 1. Simule a execução do programa abaixo, destacando a sua saída. A saída do programa consiste de tudo que resulta dos comandos printf. int
Quantidade de memória necessária
Tempo de processamento Um algoritmo que realiza uma tarefa em 10 horas é melhor que outro que realiza em 10 dias Quantidade de memória necessária Um algoritmo que usa 1MB de memória RAM é melhor que outro
6. Pesquisa e Ordenação
6. Pesquisa e Ordenação Fernando Silva DCC-FCUP Estruturas de Dados Fernando Silva (DCC-FCUP) 6. Pesquisa e Ordenação Estruturas de Dados 1 / 30 Pesquisa de Informação A pesquisa eficiente de informação
