Академический Документы
Профессиональный Документы
Культура Документы
www.professoresalgoritmos.com
ndice
1- Registros 2- Alocao Dinmica de Memria 3- Ponteiros 4- Anlise de Complexidade 5- Tcnicas de Anlise de Algoritmos 6- Tipos Abstratos de dados (TAD) 7- TAD Listas Encadeadas 8- TAD Pilha 9- TAD Fila
www.professoresalgoritmos.com
ndice
10- Recursividade 11- TAD rvores 12- Balanceamento em rvores 13- Pesquisa em Memria Primria rvore Binria de Busca 14- Pesquisa em Memria Primria Tabela Hash 15- Pesquisa Digital rvore TRIE 16- Ordenao
www.professoresalgoritmos.com
Registros
Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)
www.professoresalgoritmos.com
Definio
Registros so estruturas de dados capazes de agregar vrias informaes possvel gerar novos tipos de dados, no se limitando apenas utilizao dos tipos de dados primitivos (char, int, float, double) Cada informao contida em um registro chamada de campo ou membro
www.professoresalgoritmos.com
Definio
Os campos podem ser de diferentes tipos primitivos, ou mesmo podem representar outros registros Registros so conhecidos como variveis compostas heterogneas
www.professoresalgoritmos.com
Declarao de Registros
So definidos por meio da utilizao da palavra struct, conforme apresentado:
struct { tipo tipo ... tipo }; nome_do_registro
campo1; campo2;
campon;
7
www.professoresalgoritmos.com
Declarao de Registros
Palavra-chave Nome do Registro
chaves
Campos ou Membros
www.professoresalgoritmos.com
Declarao de Registros
Definir uma estrutura no cria nenhuma varivel, somente informa ao compilador as caractersticas de um novo tipo de dados No h reserva de memria No exemplo, foi definido um novo tipo de dado denominado Aluno A definio desse tipo pode vir antes da funo main() ou dentro dela
www.professoresalgoritmos.com 9
10
Exemplo 1
int main() { //nesse exemplo a estrutura foi criada dentro da main() struct Aluno { char nome[255]; char endereco[300]; int idade, cel; } alu1; cout<<"\nCadastro - Aluno 1: "; cout<<"\nDigite o nome: "; gets(alu1.nome); cout<<"\nDigite o endereco: "; gets(alu1.endereco); cout<<"\nDigite a idade: "; cin>>alu1.idade; cout<<"\nDigite o celular: "; cin>>alu1.cel; www.professoresalgoritmos.com
14
Exemplo 1
cout<<"\n************* Cadastro realizado *************"; cout<<"\nAluno 1 "; cout<<"\nNome: "<<alu1.nome; cout<<"\nIdade: "<<alu1.idade; cout<<"\nCel: "<<alu1.cel; cout<<"\nEndereco: "<<alu1.endereco; cout<<"\nFim do programa!" system("PAUSE"); return EXIT_SUCCESS; }
www.professoresalgoritmos.com
15
Exemplo 2
//nesse exemplo a estrutura foi criada fora da main() struct Aluno { char nome[255]; char endereco[300]; int idade, cel; }; int main() { Aluno alu1; cout<<"\nCadastro - Aluno 1: "; cout<<"\nDigite o nome: "; gets(alu1.nome); cout<<"\nDigite o endereco: "; gets(alu1.endereco); cout<<"\nDigite a idade: "; cin>>alu1.idade; cout<<"\nDigite o celular: "; cin>>alu1.cel; www.professoresalgoritmos.com
16
Exemplo 2
cout<<"\n************* Cadastro realizado *************"; cout<<"\nAluno 1 "; cout<<"\nNome: "<<alu1.nome; cout<<"\nIdade: "<<alu1.idade; cout<<"\nCel: "<<alu1.cel; cout<<"\nEndereco: "<<alu1.endereco; cout<<"\nFim do programa!" system("PAUSE"); return EXIT_SUCCESS; }
www.professoresalgoritmos.com
17
www.professoresalgoritmos.com
19
Exemplo 3
struct Aluno { char nome[255]; char endereco[300]; int idade, cel; }; int main() { Aluno alu1[10]; int i; for(i=0; i<10; i++) { cout<<"\nCadastro - Aluno "<<i+1<<": "; cout<<"\nDigite o nome: "; gets(alu1[i].nome); cout<<"\nDigite o endereco: "; gets(alu1[i].endereco); cout<<"\nDigite a idade: "; cin>>alu1[i].idade; cout<<"\nDigite o celular: "; cin>>alu1[i].cel; }
www.professoresalgoritmos.com
20
Exemplo 3
for(i=0; i<10; i++) { cout<<"\n*********** Cadastro realizado ************"; cout<<"\nAluno "<<i+1; cout<<"\nNome: "<<alu1[i].nome; cout<<"\nIdade: "<<alu1[i].idade; cout<<"\nCel: "<<alu1[i].cel; cout<<"\nEndereco: "<<alu1[i].endereco; } cout<<"\nFim do programa!"; system("PAUSE"); return EXIT_SUCCESS;
www.professoresalgoritmos.com
21
Exemplo 4
//A estrutura e a funo esto antes da main()
struct Venda { int pecas; float preco; }; void listavenda(Venda c, Venda d) { cout<<"\n**** Venda Total ****"; cout<<"\nTotal de pecas: "<<(c.pecas + d.pecas); cout<<"\nPreco total: "<<((c.pecas*c.preco) + (d.pecas*d.preco));
}
www.professoresalgoritmos.com
23
Exemplo 4
int main() { Venda A, B; cout<<"\nVenda A"; cout<<"\nInsira o numero de pecas: "; cin>>A.pecas; cout<<"\nInsira o preco: "; cin>>A.preco; cout<<"\nVenda B"; cout<<"\nInsira o numero de pecas: "; cin>>B.pecas; cout<<"\nInsira o preco: "; cin>>B.preco; listavenda(A,B);//chamada da funo cout<<"\nFim do programa"; system("PAUSE"); return EXIT_SUCCESS; }
www.professoresalgoritmos.com
24
Exemplo 5
//Alterando o exemplo anterior para que a funo receba os parmetros //por referncia struct Venda { int pecas; float preco; }; void listavenda(Venda *c, Venda *d) { cout<<"\n**** Venda Total ****"; cout<<"\nTotal de pecas: "<<((*c).pecas+ (*d).pecas); cout<<"\nPreco total: "<<(((*c).pecas* (*c).preco)+((*d).pecas* (*d).preco)); }
www.professoresalgoritmos.com
26
Exemplo 5
int main() { Venda A, B; cout<<"\nVenda A"; cout<<"\nInsira o numero de pecas: "; cin>>A.pecas; cout<<"\nInsira o preco: "; cin>>A.preco; cout<<"\nVenda B"; cout<<"\nInsira o numero de pecas: "; cin>>B.pecas; cout<<"\nInsira o preco: "; cin>>B.preco; listavenda(&A,&B);//chamada da funo cout<<"\nFim do programa"; system("PAUSE"); return EXIT_SUCCESS; }
www.professoresalgoritmos.com
27
Exemplo 6
//Outra forma de passar a estrutura como parmetros por referncia
struct Venda { int pecas; float preco; }; void listavenda(Venda& c, Venda& d) { cout<<"\n**** Venda Total ****"; cout<<"\nTotal de pecas: "<<(c.pecas + d.pecas); cout<<"\nPreco total: "<<((c.pecas * c.preco)+(d.pecas * d.preco));
}
www.professoresalgoritmos.com
28
Exemplo 6
int main() { Venda A, B; cout<<"\nVenda A"; cout<<"\nInsira o numero de pecas: "; cin>>A.pecas; cout<<"\nInsira o preco: "; cin>>A.preco; cout<<"\nVenda B"; cout<<"\nInsira o numero de pecas: "; cin>>B.pecas; cout<<"\nInsira o preco: "; cin>>B.preco; listavenda(A,B);//chamada da funo cout<<"\nFim do programa"; system("PAUSE"); return EXIT_SUCCESS; }
www.professoresalgoritmos.com
29
Exerccios
www.professoresalgoritmos.com
31
Exerccios
2- Foi realizada uma pesquisa de algumas caractersticas fsicas de 50 habitantes de uma certa regio. De cada habitante foram coletados os seguintes dados: sexo, altura, idade e cor dos olhos (A - Azuis, V - Verdes ou C Castanhos). Faa um programa que leia esses dados e armazene-os em um registro do tipo vetor. Em seguida, determine: a) a mdia de idade das pessoas com olhos castanhos e altura superior a 1.60 m b) a maior idade entre os habitantes c) a quantidade de indivduos do sexo feminino cuja idade esteja entre 20 e 45 anos (inclusive) ou que tenham olhos verdes e altura inferior a 1.70 m d) o percentual de homens
www.professoresalgoritmos.com 32
Referncia Bibliogrfica
ASCENCIO, Ana Fernanda Gomes e CAMPOS, Edilene A. Veneruchi. Fundamentos da Programao de Computadores Algoritmos, Pascal e C/C++. So Paulo: Pearson Prentice Hall, 2007. 2 Edio. Captulo 10. MIZRAHI, Victorine Viviane. Treinamento em Linguagem C++. 2 Ed. Mdulo 1. So Paulo: Pearson Prentice Hall, 2006. Captulo 7.
www.professoresalgoritmos.com 33
www.professoresalgoritmos.com
Definio
Na declarao de um vetor preciso dimension-lo, ou seja, saber, de antemo, quanto de espao necessrio
Prever o nmero mximo de elementos no vetor durante a codificao
Ex.: Suponha que desejamos desenvolver um programa para calcular a mdia e a varincia das notas de uma prova. Mas no sabemos que o nmero mximo de alunos?
www.professoresalgoritmos.com 35
Definio
Soluo:
Dimensionar um vetor com um nmero absurdamente alto, para no termos limitao no momento da utilizao do programa Essa soluo pode levar a um desperdcio de memria ou uma limitao do nmero de alunos e consequentemente do programa
www.professoresalgoritmos.com
36
Definio
A linguagem C oferece meios de requisitar espaos de memria em tempo de execuo
Alocao dinmica de memria
Assim, voltando ao exemplo, possvel consultar o nmero de alunos e ento fazer a alocao do vetor dinamicamente, sem de desperdcio de memria
www.professoresalgoritmos.com 37
www.professoresalgoritmos.com
Funo Malloc()
Biblioteca: stdlib.h A funo bsica para alocar memria a malloc() A funo recebe como parmetro o nmero de bytes que se deseja alocar e retorna o endereo inicial da rea da memria alocada
Dessa forma, necessrio o uso de um ponteiro para receber o endereo inicial do espao alocado
39
www.professoresalgoritmos.com
Funo Malloc()
Exemplo: Alocao dinmica de um vetor de inteiros com 10 elementos:
int *v; v = malloc(10 * 4);
www.professoresalgoritmos.com
40
Funo Malloc()
Para ficarmos livres de compiladores e mquinas, usamos o operador sizeof()
int *v; v = malloc(10 * sizeof(int));
www.professoresalgoritmos.com
41
Funo Malloc()
Como malloc retorna um ponteiro genrico, para um tipo qualquer, representado por void *
que pode ser convertido para o tipo apropriado na atribuio:
int *v; v = (int *)malloc(10 * sizeof(int));
www.professoresalgoritmos.com
42
Funo Malloc()
Se no houver espao livre suficiente para realizar a alocao, a funo retorna um endereo nulo (NULL):
int *v; v = (int *)malloc(10 * sizeof(int)); if( v == NULL) { cout<<Memria insuficiente; exit(1); //aborta o programa e retorna 1 } ...
www.professoresalgoritmos.com 43
Funo Free()
Biblioteca: stdlib.h A funo bsica para liberar um espao de memria alocado dinamicamente a free() A funo recebe como parmetro o ponteiro da memria a ser liberada
int *v; v = (int *)malloc(10* sizeof(int)); ... Free(v); //libera espao de memria
www.professoresalgoritmos.com 44
Funo Free()
S podemos passar para a funo free() um ponteiro (endereo) de memria que tenha sido alocado dinamicamente Cuidado, pois no possvel acessar o espao da memria depois de liberado
www.professoresalgoritmos.com
45
Exerccios
1- Explique a vantagem de usar alocao dinmica de memria. Use exemplos. 2- O que alocao dinmica de memria? 3- Como podemos liberar um espao de memria alocado dinamicamente?
www.professoresalgoritmos.com
46
Exerccios
4- Escreva o que ser impresso pelo programa abaixo.
int main ( ) { int *A; A = (int*)malloc(sizeof(int)); *A = 10; cout<<"\nvalor de A: "<<*A; int *B; B = A; *B = 15; cout<<"\nvalor de B: "<<*B; }
www.professoresalgoritmos.com 47
Exerccios
5- Escreva o que ser impresso pelo programa abaixo.
int main ( ) { int *A; A = (int*)malloc(sizeof(int)); *A = 10; cout<<"\nPrimeiro valor de A: "<<*A; int *B; B= (int*)malloc(sizeof(int)); *B = *A; *B = 15; cout<<"\nvalor de B: "<<*B; cout<<"\nSegundo valor de A: "<<*A; }
www.professoresalgoritmos.com
48
Exerccios
6- Dado o cdigo abaixo, indique o resultado do mesmo para cada um dos valores de *A.
void main() { int *A; A = (int*)malloc(sizeof(int)); *A = ??; int *B; B = (int*)malloc(sizeof(int)); *B = *A; *B = 15; cout<<"\n "<<*B; cout<<"\n "<<*A; }
Substitua o valor do smbolo ?? no cdigo por cada um dos valores apresentados para *A abaixo. Em seguida, mostre os resultados que sero impressos na tela (*B e *A) para cada um dos valores.
www.professoresalgoritmos.com
Referncia Bibliogrfica
Celes, Waldemar; Cerqueira, Renato e Rangel, Jos Lucas. Introduo a Estruturas de Dados. Rio de Janeiro: Elsevier, 2004 5 impresso.
www.professoresalgoritmos.com
50
Ponteiros
Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)
www.professoresalgoritmos.com
Definio
Ponteiro um endereo de memria Seu valor indica em que parte da memria do computador uma varivel est alocada, no o que est armazenado nela
www.professoresalgoritmos.com
53
Ponteiros
Dizemos que uma varivel aponta para outra varivel quando a primeira contm o endereo da segunda Endereo de memria: um endereo a referncia que o computador usa para localizar variveis
Toda varivel ocupa uma certa localizao na memria e seu endereo o do primeiro byte ocupado por ela
www.professoresalgoritmos.com 54
Declarao de Ponteiros
int *ptr;
Tipo de dado Nome_ponteiro
Exemplo:
Declarao de Ponteiros
int *ptr;
Tipo de dado Nome_ponteiro
Exemplo:
Declarao de Ponteiros
int *ptr;
Tipo de dado Nome_ponteiro
Exemplo:
Ponteiros
Operador de endereos: & Acessa no endereo da posio da memria reservada para a varivel int *ptr; ptr = &a;
www.professoresalgoritmos.com
58
Ponteiros
Operador indireto: * (resulta no contedo / valor da varivel) Acessa o contedo de endereo de memria armazenado int *ptr; *ptr = 6;
www.professoresalgoritmos.com
59
Exemplo1 - Ponteiros
int main() { int x = 4, y =7; int *px, *py; cout<<"\n &X= "<<&x<<" X= "<<x; cout<<"\n &Y= "<<&y<<" Y= "<<y; cout<<"\n"; px=&x; py=&y;
cout<<"\n PX= "<<px<<" *PX= "<<*px; cout<<"\n PY= "<<py<<" *PY= "<<*py; cout<<"\n";
system("PAUSE"); return EXIT_SUCCESS; }
www.professoresalgoritmos.com 60
Exemplo2 - Ponteiros
int main() { int x, y; int *px=&x; *px = 14; y = *px; cout<<"\n y= "<<y; cout<<"\n x= "<<x;
cout<<"\n";
system("PAUSE"); return EXIT_SUCCESS; }
61
www.professoresalgoritmos.com
px = py + 3;
palu->
mat
nome
curso
www.professoresalgoritmos.com
64
Os parnteses so indispensveis, pois o operador * tem precedncia menor do que o operador de acesso .
www.professoresalgoritmos.com 65
www.professoresalgoritmos.com
67
www.professoresalgoritmos.com
68
Exerccios
1- O que um ponteiro? 2- Explique o que significa a instruo: int *p; 3- Explique para que serve o operador & e o operador * nas instrues abaixo: a) p = &i; b) *p = i;
www.professoresalgoritmos.com 69
Exerccios
4- Escreva o que ser impresso pelo programa abaixo. int main() { int x=3, y=7; int *px=&x; *px = 12; y = *px; cout<<"\n y= "<<y; cout<<"\n x= "<<x; cout<<"\n"; system("PAUSE"); }
www.professoresalgoritmos.com
70
Exerccios
5- Escreva o que ser impresso pelo programa abaixo.
int main() { int x=3, y=7; int *px=&x, *py=&y; y= 4; cout<<"\n *px= "<<*px; cout<<"\n *py= "<<*py; cout<<"\n"; system("PAUSE"); }
www.professoresalgoritmos.com
71
Exerccios
6- Escreva o que ser impresso pelo programa abaixo.
void Troca (int *A, int B) { int temp; temp = *A; *A = B; B = temp; } int main() { int x,y; x = 5; y = 3; Troca(&x,y); cout << x << endl << y; getch(); }
www.professoresalgoritmos.com
72
Referncia Bibliogrfica
MIZRAHI, Victorine Viviane. Treinamento em Linguagem C++. 2 Ed. Mdulo 2. So Paulo: Pearson Prentice Hall, 2006. Captulo 11. Celes, Waldemar; Cerqueira, Renato e Rangel, Jos Lucas. Introduo a Estruturas de Dados. Rio de Janeiro: Elsevier, 2004 5 impresso. Captulos 4 e 8.
www.professoresalgoritmos.com 73
Anlise de Complexidade
Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)
www.professoresalgoritmos.com
Introduo
O projeto de um algoritmo deve considerar o desempenho que este ter aps sua implementao. Vrias solues podem surgir e aspectos de tempo de execuo e espao ocupado so pontos muito relevantes na escolha da soluo mais adequada.
www.professoresalgoritmos.com
75
Introduo
Analisar um algoritmo significa predizer os recursos computacionais que o algoritmo requer quando da sua execuo: memria, largura de banda de comunicao, hardware de computao. Recurso mais considerado: tempo de processamento. Em geral, existem vrios algoritmos para solucionar um mesmo problema e a anlise capaz de identificar qual o mais eficiente.
www.professoresalgoritmos.com 76
Introduo
A rea de anlise de algoritmos pode considerar dois tipos de problemas distintos:
Anlise de um algoritmo em particular: custo para a resoluo de um problema especfico. Anlise de uma classe de algoritmos: um conjunto de algoritmos para resolver um problema especfico estudado, para determinar qual o melhor.
www.professoresalgoritmos.com
77
Introduo
Interesse: expresso ou frmula matemtica (modelo matemtico) que represente o tempo de execuo de um algoritmo. Aspectos mais importantes da anlise de tempo:
quantidade de elementos a processar (tamanho da entrada); forma como os elementos esto dispostos na entrada.
Tempo de execuo de um algoritmo: uma funo f(n), onde n o tamanho da entrada. A funo f deve expressar o nmero de operaes bsicas, ou passos, executados pelo algoritmo.
www.professoresalgoritmos.com 78
Introduo
Interesse: expresso ou frmula matemtica (modelo matemtico) que represente o tempo de execuo de um algoritmo. Aspectos mais importantes da anlise de tempo:
quantidade de elementos a processar (tamanho da entrada); forma como os elementos esto dispostos na entrada.
Tempo de execuo de um algoritmo: uma funo f(n), onde n o tamanho da entrada. A funo f deve expressar o nmero de operaes bsicas, ou passos, executados pelo algoritmo.
www.professoresalgoritmos.com 79
Introduo
A operao bsica de maior freqncia de execuo no algoritmo denominada operao dominante ou operao fundamental.
www.professoresalgoritmos.com
80
Complexidade de Tempo
A complexidade de tempo de um algoritmo tem por objetivo avaliar sua eficincia. Para medir o custo de execuo de um algoritmo comum definir uma funo de custo ou funo de complexidade f, em que f(n) a medida do tempo necessrio para executar um algoritmo para um problema de tamanho n
www.professoresalgoritmos.com 81
Complexidade de Tempo
A complexidade de tempo de um algoritmo tem por objetivo avaliar sua eficincia. Para medir o custo de execuo de um algoritmo comum definir uma funo de custo ou funo de complexidade f, em que f(n) a medida do tempo necessrio para executar um algoritmo para um problema de tamanho n.
www.professoresalgoritmos.com 82
Complexidade de Tempo
Funo de complexidade de tempo do algoritmo: se f(n) for uma medida da quantidade do tempo necessrio para executar um algoritmo de tamanho n Funo de complexidade de espao do algoritmo: se f(n) for uma medida da quantidade de memria necessria para executar um algoritmo de tamanho n
www.professoresalgoritmos.com 83
Complexidade de Tempo
Melhor caso: corresponde ao menor tempo de execuo sobre todas as possveis entradas de tamanho n Caso mdio (ou caso esperado): corresponde mdia dos tempos de execuo de todas as entradas de tamanho n Pior caso: corresponde ao maior tempo de execuo sobre todas as possveis entradas de tamanho n
www.professoresalgoritmos.com 84
Exemplo1
Seja f uma funo de complexidade tal que f(n) o nmero de registros consultados no arquivo, isto , o nmero de vezes que a chave de consulta comparada com a chave de cada registro. Os casos a considerar so:
Melhor caso: f(n) = 1 Pior caso: f(n) = n Caso mdio: f(n) = (n+1)/2
www.professoresalgoritmos.com 85
Exemplo2
Considere o problema de encontrar o maior e o menor elementos de um vetor de inteiros v[0..n-1], n>=1
void calculaMaxMin1(int vet[], int n) { int max = vet[0], min = vet[0]; for(int i=1; i<n; i++) { if(vet[i]>max) max = vet[i]; if(vet[i]<min) min = vet[i]; } }
www.professoresalgoritmos.com 86
Exemplo2
Para o exemplo anterior, temos que f uma funo de complexidade tal que f(n) o nmero de comparaes entre os elementos de vet, se vet contiver n elementos, temos que:
f(n) = 2(n-1), para n > 0
Esse programa pode ser facilmente melhorado. Basta observar que a comparao vet[i] < min somente necessria quando o resultado da comparao vet[i] > max falso.
www.professoresalgoritmos.com 87
www.professoresalgoritmos.com
www.professoresalgoritmos.com
90
Notao Assinttica
Passos: 1. Identificar o termo dominante da expresso que descreve sua complexidade, ou seja, descreve a ordem de crescimento assinttico desta expresso. 2. Obter uma funo que um limitante superior assinttico para a nossa expresso, isto , para instncias arbitrrias de tamanho n podemos resolver o problema em tempo menor ou igual a O(n).
www.professoresalgoritmos.com 93
Notao O(f(n))
f(n) = O(1) Complexidade constante, ou seja, independe do tamanho da entrada n. As instrues so executadas um nmero fixo de vezes
Complexidade sub-linear ou logartmica, ocorre f(n) = O(log n) geralmente em problemas que dividem-se em problemas menores em sua resoluo Complexidade linear, ou seja, quando um pequeno trabalho realizado sobre os elementos de entrada n. Esta situao boa para algoritmos que tenham entrada e sada n.
94
f(n) = O(n)
www.professoresalgoritmos.com
Notao O(f(n))
Esta complexidade geralmente acontece com algoritmos que separam o problema em f(n) = O(n log n) menores e unem as resolues depois de encontr-las. Complexidade quadrtica, ou seja, quando f(n) = O(n^2) itens so processados aos pares, geralmente quando temos um anel dentro do outro. Complexidade exponencial. So algoritmos pssimos em ponto de vista prtico. Geralmente so algoritmos utilizados para resoluo de problemas na fora bruta.
95
f(n) = O(2^n)
www.professoresalgoritmos.com
Notao O(f(n))
Complexidade fatorial. So algoritmos piores que os exponenciais. Pssimos na prtica e resultado de aplicao d e fora bruta, no so recomendados para resoluo de problemas.
f(n) = O(n!)
www.professoresalgoritmos.com
96
Notao Assinttica
A tabela de classes de problemas est ordenada de maneira crescente Para compararmos dois algoritmos, necessrio saber primeiro a qual classe pertencem ao algoritmos. Se forem de classe diferentes s comparao fica fcil, seguindo a ordem da tabela. Se forem da mesma classe, devero ser comparados por suas funes reais de complexidade de tempo, lembrando que o caso comparado deve ser o mesmo (ex. pior caso com pior caso)
www.professoresalgoritmos.com 97
Tamanho n
10 20 30 40 50 60
n
n
0,00001 s
0,0001 s
n
n 2^n 3^n
0,001 s
0,1 s 0,001 s 0,059 s
0,008 s
3,2 s 1s 58 min
0,027 s
24,3 s
0,64 s
1,7 min
0,125 s
5,2 min
0,316 s
13 min 366 sc. 10 sc.
98
17,9 min 12,7 dias 35,7 anos 6,5 anos 3855 sc. 10 sc.
www.professoresalgoritmos.com
Trabalho de Pesquisa
Fazer uma pesquisa sobre:
Problemas P Problemas NP Problemas NP-completos
Conceitue cada um. D exemplos. No esquea de colocar as referncias usadas. Entregar impresso dia (06/09/2012). Pode ser feito em dupla.
99
www.professoresalgoritmos.com
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007.
CORMEN, Thomas. Algoritmos: teoria e prtica. Campus, 2002.
www.professoresalgoritmos.com
Introduo
A anlise de algoritmos ou programas utiliza tcnicas de matemtica discreta, envolvendo contagem ou enumerao dos elementos de um conjunto que possuam propriedade comum:
Manipulao de somas, produtos, permutaes, fatoriais, coeficientes binomiais, soluo de equaes de recorrncia, entre outras.
www.professoresalgoritmos.com
102
Introduo
Infelizmente no existe um conjunto completo de regras para analisar programas. Dessa forma, algumas dessas tcnicas sero ilustradas informalmente com exemplos.
www.professoresalgoritmos.com
103
Introduo
Complexidade de tempo da maioria dos problemas polinomial ou exponencial. Polinomial: funo de complexidade O (p(n)) , onde p(n) um polinmio. Exemplos: pesquisa binria (O (log n)), pesquisa seqencial ( O (n)), ordenao por insero (O (n)), e multiplicao de matrizes (O (n)). Exponencial: funo de complexidade O (c^n), c> 1. Exemplo:Problema do Caixeiro Viajante(PCV) (O (n!)).
www.professoresalgoritmos.com
104
Complexidade
O(1) ou constante O(log n) ou logaritmica O(n) ou linear O(n log n) ou n log de n O(n) ou quadrtica O(n) ou cbica O(n!) ou fatorial
Maior Complexidade
www.professoresalgoritmos.com
105
Notao O
Algumas regras:
www.professoresalgoritmos.com
106
Notao O
www.professoresalgoritmos.com
107
Notao O
www.professoresalgoritmos.com
108
Notao O - Exemplos
f(n) = 403 = O(1) f(n) = 5 + 2 logn + 3 logn = O(logn) f(n) = 5 + 2 logn + 3n = O(n) f(n) = 5*2^n + 5n^10 = O(2^n) f(n) = n - 1 = O(n) f(n) = n - 1 = O(n) f(n) = 3n + 5 logn + 2 = O(n)
109
www.professoresalgoritmos.com
Comando simples : tem um tempo de execuo constante, O(c) = O(1). Seqncia: tem um tempo igual soma dos tempos de cada comando da seqncia; se cada comando O(1), assim, tambm ser a seqncia; seno, pela regra da soma, a seqncia ter a complexidade do comando de maior complexidade. Alternativa : qualquer um dos ramos pode ter complexidade arbitrria; a complexidade resultante a maior delas; isto vale para alternativa dupla (if-else) ou mltipla (switch).
www.professoresalgoritmos.com 111
Repeties Repetio contada: aquela em que cada iterao (ou volta) atualiza o controle mediante uma adio(geralmente, quando se usa uma estrutura do tipo for, que especifica incremento/decremento automtico de uma varivel inteira). Se o nmero de iteraes independente do tamanho do problema, a complexidade de toda a repetio a complexidade do corpo da mesma, pela regra da constante (ou pela regra da soma de tempos).
112
Se o nmero de iteraes funo de n, pela regra do produto teremos a complexidade da repetio como a complexidade do corpo multiplicada pela funo que descreve o nmero de iteraes. Isto :
www.professoresalgoritmos.com
113
Exemplo:
for (i=0; i<k*n ; i++) trecho com O(log n)
o trecho O(f(n)*g(n)), no caso O(k*n*log n), ou seja: O(n log n)
www.professoresalgoritmos.com
114
Uma aplicao comum da regra do produto a determinao da complexidade de repeties aninhadas. Exemplo: o trecho for (i=0; i<n ; i++) for (j=0; j<n ; j++) trecho com O(1) Exemplo: for (i=1; i<=n ; i++) for (j=1; j<=i ; j++) trecho com O(1)
www.professoresalgoritmos.com o lao interno executado 1+2+3+...n-1 +n=n*(n+1)/2 vezes, logo, O(n*(n+1)/2), ou seja: O(0.5(n+n)) ou seja O(n) O(f(n)*g(n)), no caso g(n)=n*1 (lao interno); logo, O(n*n), ou seja: O(n)
115
for (i=1; i<=n ; i++) for (j=n; i<=j ; j--) trecho com O(1)
o lao interno executado n+n-1+n2+...+2+1=n*(n+1)/2 vezes, ou seja: O(n) como no caso anterior
Os dois ltimos exemplos podem ser generalizados para quaisquer aninhamentos de repeties contadas em k nveis, desde que todos os ndices dependam do tamanho do problema. Nesse caso, a complexidade da estrutura aninhada ser da ordem de n ^ k.
www.professoresalgoritmos.com
116
for (IndExt=1; IndExt<=n ; IndExt++) for (IndMed=IndExt; IndMed<=n ; IndMed++) for (IndInt=1; IndInt<=IndMed; IndInt++) trecho com O(1)
o lao mediano executado n+n-1+n-2+... +2+1=(n+n)/2 vezes; o lao mais interno ser executado no mximo n vezes; logo, tem-se O((n+n)*n), ou seja: O(n)
www.professoresalgoritmos.com
117
Repeties Repetio multiplicativa: aquela em que cada iterao atualiza o controle mediante uma multiplicao ou diviso. limite=1; while (limite<=n) { trecho com O(1) limite = limite*2; }
o nmero de iteraes depende de n; limite vai dobrando a cada iterao; depois de k iteraes, limite = 2^k e k = log2 limite; como o valor mximo de limite n, ento o trecho O(log2n) = O(log n)
OBS: Na verdade O(log n) independe da base do logaritmo, pois logan = logab*logbn = c*logbn. www.professoresalgoritmos.com
118
int limite; for (limite=n; limite!=0; limite /=2) trecho com O(1)
o nmero de iteraes depende de n; limite vai-se subdividindo a cada iterao; depois de k=log2n iteraes, encerra; ento o trecho O(log n)
Os dois exemplos anteriores tambm podem ser generalizados, adotando-se um fator genrico de multiplicao fator. Nesse caso, o nmero de iteraes ser dado por k = logfatorlimite = O(logf(n)), se o limite funo de n.
www.professoresalgoritmos.com 119
Exemplo:
int limite=n; while (limite!=0) { for (i=1; i<=n; i++) trecho com O(1) limite = limite/2; }
o nmero de iteraes depende de n; limite vai-se subdividindo a cada iterao; o lao interno O(n), o externo O (log n); logo, o trecho O (n log n)
www.professoresalgoritmos.com
120
Chamada de funo: Pode ser resolvida considerandose que a funo tambm tem um algoritmo com sua prpria complexidade. Esta usada como base para clculo da complexidade do algoritmo invocador. Por exemplo: se a invocao estiver num ramo de uma alternativa, sua complexidade ser usada na determinao da mxima complexidade entre os dois ramos; se estiver no interior de um lao, ser considerada no clculo da complexidade da seqncia repetida, etc. A questo se complica ao se tratar de uma chamada recursiva.
www.professoresalgoritmos.com
121
Embora no haja um mtodo nico para esta avaliao, em geral a complexidade de um algoritmo recursivo ser funo de componentes como: a complexidade da base e do ncleo da soluo e a profundidade da recurso. Por este termo entende-se o nmero de vezes que o procedimento invocado recursivamente. Este numero, usualmente, depende do tamanho do problema e da taxa de reduo do tamanho do problema a cada invocao. E na sua determinao que reside a dificuldade da anlise de algoritmos recursivos.
www.professoresalgoritmos.com
122
Exemplo:
int fatorial (int n) { if (n==0) return 1; // Base else return n*fatorial(n- 1); }
//Ncleo
www.professoresalgoritmos.com
A reduo do problema se faz de uma em uma unidade, a cada reinvocao do procedimento, a partir de n, at alcanar n = 0. Logo, a profundidade da recurso igual a n. O ncleo da soluo (que repetido a cada reinvocao) tem complexidade O(1), pois se resume a uma multiplicao. A base tem complexidade O(1), pois envolve apenas uma atribuio simples. Nesse caso, conclui-se que o algoritmo tem um tempo T(n) = n*1+1 = O(n). 123
Exemplo
Considere um algoritmo recursivo, nesse caso necessrio obter uma equao de recorrncia (maneira de definir uma funo por uma expresso envolvendo a mesma funo) O exemplo a seguir inspeciona n elementos de um conjunto e permite descartar 2/3 dos elementos e ento fazer uma chamada recursiva sobre os n/3 elementos restantes
www.professoresalgoritmos.com 124
if(n<=1) { cout<<"Inspeciona o elemento e termina"; } else { cout<<"\nPara cada um dos n elementos inspecione o elemento"; pesquisa(n/3); }
}
125
www.professoresalgoritmos.com
if(n<=1) { cout<<"Inspeciona o elemento e termina"; } else { cout<<"\nPara cada um dos n elementos Para esse inspecione o elemento"; exemplo, a pesquisa(n/3); complexidade }
}
www.professoresalgoritmos.com
Exemplo
Considere o algoritmo para ordenar n elementos de um vetor v cujo princpio o seguinte:
1. Selecione o menor elemento do vetor 2. Troque esse elemento com o primeiro elemento do v[0] 3. A seguir, repita essas duas operaes com os n-1 elementos restantes, depois com os n-2 elemento, at que reste apenas um elemento
www.professoresalgoritmos.com 127
www.professoresalgoritmos.com
128
www.professoresalgoritmos.com
129
www.professoresalgoritmos.com
130
Devemos comear a anlise pelo anel interno. Nesse anel temos um comando de deciso que, por sua vez, possui apenas um comando de atribuio.
www.professoresalgoritmos.com
131
O comando de atribuio leva um tempo constante para ser executado, assim como a avaliao da condio do comando de deciso.
www.professoresalgoritmos.com
132
No sabemos se o corpo do comando de deciso ser executado ou no: nessas situaes devemos considerar o pior caso, isto , assumir que a linha 10 sempre ser executada.
www.professoresalgoritmos.com
133
O tempo para incrementar o ndice do anel e avaliar sua condio de terminao tambm O(1), e o tempo combinado para executar uma vez o anel composto pelas linhas de 6 a 11 O(max(1,1,1)) = O(1), conforme a regra da soma para notao O.
www.professoresalgoritmos.com
134
Como o nmero de iteraes do anel n-i, ento o tempo gasto no anel O(( n-i ) * 1) = O( n-i ), conforme regra do produto.
www.professoresalgoritmos.com
135
O corpo do anel mais externo contm, alm do anel interno, os comandos de atribuio nas linhas 5, 13, 14 e 15. Logo, o tempo de execuo das linhas de 5 a 15 O(max(1,(n-i),1,1,1)) = O(n-i).
www.professoresalgoritmos.com
136
A linha 3 executada n1 vezes, e o tempo total para executar o programa est limitado ao produto de uma constante pelo somatrio de (n i) a saber:
www.professoresalgoritmos.com
137
n(n 1) n n 2 (n i ) O( n ) 2 2 2 i 1
n 1 2
www.professoresalgoritmos.com
138
Complexidade de Tempo
Melhor caso: corresponde ao menor tempo de execuo sobre todas as possveis entradas de tamanho n Caso mdio (ou caso esperado): corresponde mdia dos tempos de execuo de todas as entradas de tamanho n Pior caso: corresponde ao maior tempo de execuo sobre todas as possveis entradas de tamanho n
www.professoresalgoritmos.com 139
Exemplo3
Considere o problema de encontrar o maior e o menor elementos de um vetor de inteiros v[0..n-1], n>=1
void calculaMaxMin1(int vet[], int n) { int max = vet[0], min = vet[0]; for(int i=1; i<n; i++) { if(vet[i]>max) max = vet[i]; if(vet[i]<min) min = vet[i]; } }
www.professoresalgoritmos.com 140
Exemplo3
Para o exemplo anterior, temos que f uma funo de complexidade tal que f(n) o nmero de comparaes entre os elementos de vet, se vet contiver n elementos, temos que:
f(n) = 2(n-1), para n > 0
Esse programa pode ser facilmente melhorado. Basta observar que a comparao vet[i] < min somente necessria quando o resultado da comparao vet[i] > max falso.
www.professoresalgoritmos.com 141
www.professoresalgoritmos.com
void calculaMaxMin2(int vet[], int n) { int max = vet[0], min = vet[0]; for(int i=1; i<n; i++) { if(vet[i]>max) max = vet[i]; else if(vet[i]<min) Melhor caso: f(n) = n-1 min = vet[i]; } Pior caso: f(n) = 2(n-1) }
Melhor caso: o vetor est ordenado crescente e no pior caso est ordenado decrescente
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007.
CORMEN, Thomas. Algoritmos: teoria e prtica. Campus, 2002.
www.professoresalgoritmos.com
Introduo
TAD: Tipos Abstratos de Dados Ideia central: encapsular (esconder) de quem usa um determinado tipo a forma concreta com que ele foi implementado
www.professoresalgoritmos.com
146
TAD - Exemplo
Se criarmos um tipo para representar um ponto no espao, um cliente desse tipo usa-o de forma abstrata, com base apenas nas funcionalidades oferecidas pelo tipo A forma com que ele foi efetivamente implementado (armazenando cada coordenada num campo ou agrupando todas num vetor) passa a ser um detalhe de implementao, que no deve afetar o uso do tipo nos mais diversos contextos
www.professoresalgoritmos.com 147
Modularizao
Vantagens:
desacoplamos a implementao do uso facilitamos a manuteno aumentamos o potencial de reutilizao do tipo criado a implementao do tipo pode ser alterada sem afetar seu uso em outros contextos.
Modularizao
Um mdulo agrupa vrios tipos e funes com funcionalidades relacionadas, caracterizando assim uma finalidade bem definida. Se um mdulo definir um novo tipo de dado e o conjunto de operaes para manipular dados desse tipo, dizemos que o mdulo representa um tipo abstrato de dados (TAD)
www.professoresalgoritmos.com
149
Interface - TAD
A interface de um TAD consiste:
Na definio do nome do tipo e do conjunto de funes exportadas para sua criao e manipulao
www.professoresalgoritmos.com
150
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007. Captulo 1. CORMEN, Thomas. Algoritmos: teoria e prtica. Campus, 2002.
Celes, Waldemar; Cerqueira, Renato e Rangel, Jos Lucas. Introduo a Estruturas de Dados. Rio de Janeiro: Elsevier, 2004 5 impresso. Captulo 9.
www.professoresalgoritmos.com 153
www.professoresalgoritmos.com
Introduo
O vetor no estrutura muito flexvel, pois precisamos dimension-lo com um nmero mximo de elementos
Complexidade das funes para inserir e remover usando vetor em um tempo linear O(n)
Soluo: utilizar estruturas de dados que cresam conforme precisamos armazenar novos elementos
E diminuam a medida que retiramos elementos armazenados
www.professoresalgoritmos.com 155
Introduo
Essas estruturas so chamadas dinmicas e armazenam cada um dos seus elementos por alocao dinmica
Complexidade para inserir e remover: O (1)
A primeira estrutura a ser estudada a lista encadeada As listas encadeadas so amplamente utilizadas para implementar diversas outras estruturas de dados com semnticas prprias
www.professoresalgoritmos.com 156
Introduo
Tipos de listas: Listas Simplesmente Encadeadas Listas Circulares Listas Duplamente Encadeadas
www.professoresalgoritmos.com
157
www.professoresalgoritmos.com
158
www.professoresalgoritmos.com
160
Isso feito armazenando-se junto com a informao de cada elemento, um ponteiro para o prximo elemento da lista
www.professoresalgoritmos.com 161
prim
Info1
Info2
Info3
NULL
www.professoresalgoritmos.com
162
www.professoresalgoritmos.com
163
valor
www.professoresalgoritmos.com
prox
165
www.professoresalgoritmos.com
166
www.professoresalgoritmos.com
168
www.professoresalgoritmos.com
169
www.professoresalgoritmos.com
170
www.professoresalgoritmos.com
171
www.professoresalgoritmos.com
172
Lista Circular
www.professoresalgoritmos.com
173
Listas Circulares
Algumas aplicaes necessitam representar conjuntos cclicos Estrutura: o ltimo elemento tem como prximo o primeiro elemento da lista, o que forma um ciclo Nesse caso nem faz sentido em falar em primeiro ou ltimo elemento j que um ciclo
dessa forma, a lista pode ser representada por um ponteiro para um elemento inicial qualquer
www.professoresalgoritmos.com 174
Lista Circular
www.professoresalgoritmos.com
175
www.professoresalgoritmos.com
176
www.professoresalgoritmos.com
178
www.professoresalgoritmos.com
179
www.professoresalgoritmos.com
180
www.professoresalgoritmos.com
181
www.professoresalgoritmos.com
www.professoresalgoritmos.com
184
www.professoresalgoritmos.com
185
186
Exerccios
1- Implemente as principais operaes para o TAD lista simplesmente encadeada
2- Implemente as principais operaes para o TAD lista duplamente encadeada
www.professoresalgoritmos.com
188
Exerccios
3- Analise a estrutura no e o procedimento abcd:
www.professoresalgoritmos.com
189
Exerccios
Sabendo-se que as variveis prim e ult so, respectivamente, ponteiros para o incio e o final de uma lista simplesmente encadeada com 5 elementos, o procedimento abcd utilizado para:
[A] [B] [C] [D] incluir um elemento no final da lista. excluir o ltimo elemento da lista. incluir um elemento no incio da lista. excluir o primeiro elemento da lista.
www.professoresalgoritmos.com
190
Exerccios
4- Marque (certo) ou (errado): a) (CESPE - 2008 - TRT - 5 Regio (BA) - Tcnico Judicirio Tecnologia da Informao ) A principal caracterstica de uma lista encadeada o fato de o ltimo elemento da lista apontar para o elemento imediatamente anterior. b) (CESPE - 2009 - ANAC - Tcnico Administrativo Informtica)Em uma lista circular duplamente encadeada, cada n aponta para dois outros ns da lista, um anterior e um posterior.
www.professoresalgoritmos.com 191
Exerccios
(Poscomp-2011) ( ) Uma lista permite que as inseres possam ser feitas em qualquer lugar (posio), mas as remoes, no. ( ) Em uma lista circular com encadeamento simples, o primeiro elemento aponta para o segundo e para o ltimo. ( ) Para remover um elemento de uma lista duplamente encadeada, deve-se alterar o encadeamento dos elementos anterior e prximo ao elemento removido.
www.professoresalgoritmos.com
192
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007. CORMEN, Thomas. Algoritmos: teoria e prtica. Campus, 2002.
Celes, Waldemar; Cerqueira, Renato e Rangel, Jos Lucas. Introduo a Estruturas de Dados. Rio de Janeiro: Elsevier, 2004 5 impresso. Captulo 10.
www.professoresalgoritmos.com 193
TAD Pilha
Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)
www.professoresalgoritmos.com
Introduo
www.professoresalgoritmos.com
195
Introduo
Uma das Estrutura de dados mais simples a PILHA
Por isso, a mais utilizada em programao
www.professoresalgoritmos.com
196
Introduo
Quando um novo elemento introduzido na pilha, ele passa a ser o elemento do topo O nico elemento que pode ser removido da pilha o do topo Os elementos da pilha s podem ser retirados na ordem inversa ordem em que foram introduzidos: o primeiro que sai o ltimo que entrou (LIFO Last in, first out)
www.professoresalgoritmos.com 197
Introduo
Operaes Bsicas: 1. Operao empilhar (push): inseri um novo elemento no topo da pilha 2. Operao desempilhar (pop): remove um elemento do topo da pilha
www.professoresalgoritmos.com
198
Funcionamento da Pilha
push (a)
topo 199
www.professoresalgoritmos.com
Funcionamento da Pilha
push (a) push (b)
topo
topo
a
200
www.professoresalgoritmos.com
Funcionamento da Pilha
push (a) push (b) push (c)
c
b
topo
topo
topo
a
201
www.professoresalgoritmos.com
Funcionamento da Pilha
pop ()
desempilha o c
c
b
topo
topo
a
www.professoresalgoritmos.com
a
202
Funcionamento da Pilha
push (a) pop ()
desempilha o c
pop ()
desempilha o b
c
b
topo
topo
a
www.professoresalgoritmos.com
topo 203
Exemplo - Pilha
O exemplo mais prximo a prpria pilha de execuo da linguagem C As variveis locais das funes so dispostas em uma pilha, e uma funo s tem acesso s variveis da funo que est no topo
No possvel acessar as variveis da funo locais s outras funes
204
www.professoresalgoritmos.com
206
www.professoresalgoritmos.com
float pop_pilha(Pilha* p) { Lista* t; float v; if(pilha_vazia(p)) { cout<<"\n Pilha vazia"; exit(1); } else { t = p->topo; v = t->valor; p->topo = t->prox; free(t); return v; } }
207
void libera_pilha(Pilha* p) { Lista* q = p->topo; while(q != NULL) { Lista* t = q->prox; free(q); q = t; } free(p); } void imprime_pilha(Pilha* p) { Lista* q; for(q=p->topo; q!=NULL; q=q->prox) { cout<<"\n "<<q->valor; } }
www.professoresalgoritmos.com
208
Exerccios
1- Faa uma funo que retorne a quantidade de elementos (tamanho) de uma pilha. 2- Faa uma funo para concatenar duas pilhas, essa funo deve receber as pilhas como parmetro (observe a imagem).
P1 topo -> 2.1 4.5 1.0 P2 topo -> 7.2 3.1 9.8 concatena www.professoresalgoritmos.com
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007. CORMEN, Thomas. Algoritmos: teoria e prtica. Campus, 2002.
Celes, Waldemar; Cerqueira, Renato e Rangel, Jos Lucas. Introduo a Estruturas de Dados. Rio de Janeiro: Elsevier, 2004 5 impresso. Captulo 11.
www.professoresalgoritmos.com 211
TAD Fila
Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)
www.professoresalgoritmos.com
Introduo
www.professoresalgoritmos.com
213
Introduo
Outra Estrutura de dados bastante usada na computao a FILA
O que a diferencia da pilha a ordem de sada dos elementos: enquanto na pilha o ltimo que entra o primeiro que sai, na fila o primeiro que entra o primeiro que sai
214
www.professoresalgoritmos.com
Introduo
Ideia principal: s podemos inserir um novo elemento no final da fila e s podemos retirar o elemento do incio.
www.professoresalgoritmos.com
215
Introduo
Analogia natural com a fila do dia-a-dia: quem entra primeiro na fila o primeiro a se atendido (ex. fila de Banco, fila do CAA, fila do Mc Donald, etc) Os elementos da fila s podem ser retirados na ordem em que foram introduzidos: o primeiro que entra o primeiro que sai (FIFO First in, First out)
www.professoresalgoritmos.com 216
Introduo
Operaes Bsicas: 1. Inserir elementos na fila: inserir elementos em uma extremidade da fila 2. Retirar elementos da fila: retirar elementos de outra extremidade da fila
www.professoresalgoritmos.com 217
Exemplo - Fila
Um exemplo de utilizao em computao a implementao de uma fila de impresso: Impressora compartilhada por vrias mquinas:
adotar uma estratgia para determinar o documento ser impresso primeiro
Estratgia mais simples: tratar todas as requisies com a mesma prioridade e imprimir os documentos na ordem em que forem submetidos (o primeiro submetido o primeiro a ser impresso)
218
www.professoresalgoritmos.com
Info1
Info2
Info3
www.professoresalgoritmos.com
219
220
Fila* fila_cria() { Fila* f = (Fila*)malloc(sizeof(Fila)); f->ini = NULL; f->fim = NULL; return f; } int fila_vazia(Fila* f) { return (f->ini == NULL); }
www.professoresalgoritmos.com 221
void fila_insere(Fila* f, float v) { Lista* n = (Lista*)malloc(sizeof(Lista)); n->info = v; //armazena a informao n->prox = NULL; //novo no ser o ultimo if(f->fim != NULL) //fila no esta vazia? { f->fim->prox = n; } else //seno a fila esta vazia { f->ini = n; } f->fim = n; //fila aponta p novo elemento }
www.professoresalgoritmos.com 222
float fila_retira(Fila* f) { Lista* t; float v; if(fila_vazia(f)) { cout<<"Fila vazia"; exit(1); //aborta o programa } t = f->ini; v = t->info; f->ini = t->prox; if(f->ini == NULL) //fila ficou vazia? { f->fim = NULL; } free(t); return v; }
www.professoresalgoritmos.com
223
void fila_libera(Fila* f) { Lista* q = f->ini; while(q != NULL) { Lista* t = q->prox; free(q); q = t; } free(f); } void fila_imprime(Fila* f) { Lista* q; for(q = f->ini; q!=NULL; q = q->prox) { cout<<" "<<q->info<<" - "; } } www.professoresalgoritmos.com
224
int main() { Fila* f = fila_cria(); fila_insere(f, 20); fila_insere(f, 80); fila_insere(f, 10); fila_imprime(f); getch(); system("cls"); fila_retira(f); fila_imprime(f); getch(); }
www.professoresalgoritmos.com 225
Exerccios
1- Faa uma funo que retorna a quantidade de elementos existem na fila.
2- Faa uma funo que verifica se existe um determinado nmero(valor) inserido na fila.
www.professoresalgoritmos.com
226
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007. CORMEN, Thomas. Algoritmos: teoria e prtica. Campus, 2002.
Celes, Waldemar; Cerqueira, Renato e Rangel, Jos Lucas. Introduo a Estruturas de Dados. Rio de Janeiro: Elsevier, 2004 5 impresso. Captulo 12.
www.professoresalgoritmos.com 227
Recursividade
Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)
www.professoresalgoritmos.com
Introduo
Uma funo dita recursiva se definida em termos dela mesma Ou seja, uma funo recursiva quando dentro dela est presente uma instruo de chamada a ela prpria
www.professoresalgoritmos.com
229
Introduo
O cdigo gerado por uma funo recursiva exige a utilizao de mais memria, o que torna a execuo mais lenta No difcil criar funes recursivas, o difcil reconhecer as situaes nas quais a recurso apropriada Trs pontos devem ser lembrados quando queremos escrever uma funo recursiva
www.professoresalgoritmos.com 232
www.professoresalgoritmos.com
233
www.professoresalgoritmos.com
234
www.professoresalgoritmos.com
235
www.professoresalgoritmos.com
236
www.professoresalgoritmos.com
237
www.professoresalgoritmos.com
238
www.professoresalgoritmos.com
239
www.professoresalgoritmos.com
240
www.professoresalgoritmos.com
241
1* 0!
2 * 1!
3 * 2!
3!
www.professoresalgoritmos.com 243
www.professoresalgoritmos.com
245
1 2
3
www.professoresalgoritmos.com 246
www.professoresalgoritmos.com
248
www.professoresalgoritmos.com
249
int main() { int numero; cout << "Digite o numero inicial: "; cin >> numero; print_numero(numero); cout << endl; print_numero_inv(numero); cout << endl; system("pause"); }
www.professoresalgoritmos.com
250
www.professoresalgoritmos.com
251
#include <iostream.h>
int resto(int x, int y) { if (x < y) return(x); return( resto(x - y, y) ); }
int main() { int num, den; cout << "Digite o numerador: "; cin >> num; cout << "Digite o denominador: "; cin >> den; cout << resto(num, den); cout << endl; system("pause"); }
www.professoresalgoritmos.com
252
Exerccios
1- Escreva uma funo recursiva denominada potencia() que aceite dois parmetros inteiros positivos i e j. A funo retorna i elevado a potncia j. Por exemplo: potencia(2,3) igual a 8. Use a seguinte definio:
i elevado potncia j igual a i elevado potncia j-1 vezes i
253
www.professoresalgoritmos.com
Exerccios
2- Escreva uma funo recursiva de nome soma() que receba um nmero inteiro positivo n como argumento e retorne a soma dos n primeiro nmeros inteiros. Por exemplo, se a funo receber n= 5, deve retornar 15, pois 15 = 1+2+3+4+5
www.professoresalgoritmos.com
254
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007. CORMEN, Thomas. Algoritmos: teoria e prtica. Campus, 2002.
Celes, Waldemar; Cerqueira, Renato e Rangel, Jos Lucas. Introduo a Estruturas de Dados. Rio de Janeiro: Elsevier, 2004 5 impresso. Captulo 11.
www.professoresalgoritmos.com 255
TAD rvores
Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)
www.professoresalgoritmos.com
Introduo
N Raiz
...
257
www.professoresalgoritmos.com
Introduo
Estruturas de dados chamadas lineares como vetores e listas no so adequadas para representar dados que devem ser dispostos e maneira hierrquica
Exemplo: arquivos (documentos) que criamos em um computador so armazenados dentro de uma estrutura hierrquica de diretrios (pastas) Existe um diretrio base dentro do qual podemos armazenar diversos subdiretrios e arquivos
www.professoresalgoritmos.com
258
Introduo
rvores: so estruturas de dados adequadas para a representao de hierarquias
A forma mais natural de definir uma estrutura de rvore usando a recursividade
www.professoresalgoritmos.com
259
Recursividade
Uma funo poder tambm ser considerada recursiva se chamar outras funes que, em algum momento, chamem a primeira funo, tornando esse conjunto de funes um processo recursivo. Cada vez que uma funo chamada de forma recursiva, guardada uma cpia dos seus parmetros de forma a no perder os valores dos parmetros das chamadas anteriores.
www.professoresalgoritmos.com 260
rvores
Uma rvore composta por: um n Raiz, denominado r, que contm zero ou mais sub rvores ns folhas ou extremos, que no possuem filhos
261
...
Folhas
www.professoresalgoritmos.com
262
rvores
tradicional desenhar as estruturas de rvores com a raiz para cima e as folhas para baixo
rvores Binrias
Exemplo de utilizao: avaliao de expresses Como trabalhamos com operadores que esperam um ou dois operandos, os ns da rvore para representar uma expresso tm no mximo dois filhos
264
rvores Binrias
ns folhas representam os operandos ns internos representam operadores No exemplo, a expresso representada a: (3+6) * (4-1) + 5
265
rvores Binrias
Em uma rvore binria, cada n tem zero, um ou dois filhos. Recursivamente, podemos definir uma rvore binria como sendo: Vazia
uma rvore vazia, ou um n raiz tendo duas subrvores, identificadas como a subrvore da direita (sad) e a subrvore da esquerda (sae)
* A definio recursiva ser usada na construo de algoritmos e na verificao (informal) da correo e do seu desempenho
sae
raiz
sad
266
rvores Binrias
a
Os ns a, b, c, d, e e f formam uma rvore binria: - Sub rvore esquerda formada por b e d - Sub rvore direita formada por c, e e f - A raiz da rvore representada pelo n a - As razes das sub rvores representadas pelos ns b e c - Folhas representadas pelos ns d, e e f - Alm disso, cada n folha representa uma rvore, com duas sub rvores vazias.
267
www.professoresalgoritmos.com
rvores Binrias
a b c
Podemos usar a seguinte notao textual: - A rvore vazia representada por < > - e a rvore no vazia, por <raiz sae sad> Para o nosso exemplo: <a<b< ><d< >< >>><c<e< >< >><f< >< >>>>
www.professoresalgoritmos.com
268
Representao
De modo semelhante ao que fizemos para as demais estruturas, podemos definir um tipo para representar uma rvore binria
struct arv { char info; arv* esq; arv* dir; };
www.professoresalgoritmos.com 269
Representao
Da mesma forma que uma lista encadeada representada por um ponteiro para o n para o primeiro n, a estrutura da rvore representada por um ponteiro para o n raiz Dado o ponteiro para o n raiz tem-se acesso aos demais ns
www.professoresalgoritmos.com
270
Operaes bsicas
Cria rvore vazia Como uma rvore representada pelo endereo do n raiz, uma rvore vazia tem de ser representada pelo valor NULL
www.professoresalgoritmos.com
271
Operaes bsicas
Cria rvore no-vazia:
Para construir rvores no-vazias, podemos ter uma operao que cria um n raiz dadas a informao e as duas sub rvores, a da esquerda e a da direita Essa operao tem como retorno o endereo do n raiz criado
www.professoresalgoritmos.com
272
Operaes bsicas
Imprime rvore:
Consiste em exibir todo o contedo da rvore Essa funo deve percorrer recursivamente a rvore, visitando todos os ns e imprimindo sua informao Como uma rvore binria ou vazia ou composta pela raiz e por duas sub rvores
www.professoresalgoritmos.com
273
Operaes bsicas
Imprime rvore:
Portanto, para imprimir a informao de todos os ns da rvore devemos primeiro testar se ela vazia se no for, imprimimos a informao associada raiz e chamamos (recursivamente) a funo para imprimir as sub rvores
www.professoresalgoritmos.com
274
Operaes bsicas
Libera rvore:
Operao para liberar a memria
www.professoresalgoritmos.com
275
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007. CORMEN, Thomas. Algoritmos: teoria e prtica. Campus, 2002.
Celes, Waldemar; Cerqueira, Renato e Rangel, Jos Lucas. Introduo a Estruturas de Dados. Rio de Janeiro: Elsevier, 2004 5 impresso. Captulo 13.
www.professoresalgoritmos.com 276
Balanceamento em rvores
Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)
www.professoresalgoritmos.com
Introduo
Dois argumentos favorveis s rvores:
1. as rvores so bem apropriadas para representar a estrutura hierrquica de um certo domnio 2. o processo de busca muito mais rpido usando rvores do que listas encadeadas
www.professoresalgoritmos.com
278
Introduo
Observe as rvores, todas elas armazenam os mesmos dados, mas obviamente, a rvore (a) a melhor e a (c) a pior.
(a) (b)
(c)
www.professoresalgoritmos.com
279
Introduo
O que acontece nas rvores (b) e (c) que elas so assimtricas, portanto, no so distribudas uniformemente
(a) (b)
(c)
www.professoresalgoritmos.com
280
Introduo
Uma rvore dita balanceada quando as suas sub-rvores esquerda e direita possuem a mesma altura. E todos os ns vazios esto no mesmo nvel, ou seja, a rvore est completa. A rvore que no est balanceada, define-se como degenerada
www.professoresalgoritmos.com
281
Introduo
www.professoresalgoritmos.com
282
Introduo
Como em uma rvore binria cada n pode ter dois filhos, o nmero de ns em um certo nvel o dobro do nmero de ascendentes que residem no nvel prvio
Altura 1 2 3 4 Nvel 0 1 2 3 Ns em um nvel 2^0=1 2^1=2 2^2=4 2^3=8
283
www.professoresalgoritmos.com
Balanceamento
Pode ser: Balanceamento Esttico Balanceamento Dinmico: AVL
www.professoresalgoritmos.com
284
Balanceamento
Balanceamento Esttico O balanceamento esttico de uma rvore binria consiste em construir uma nova verso, reorganizando-a.
www.professoresalgoritmos.com
285
Balanceamento
Balanceamento Dinmico: AVL
rvore AVL em homenagem aos matemticos russos (Adelson-Velskii e Landism -1962) Uma rvore AVL uma rvore binria de pesquisa onde a diferena em altura entre as subrvores esquerda e direita no mximo 1 (positivo ou negativo).
A essa diferena chamamos de fator de balanceamento de n(FatBal (n)). Essa informao dever constar em cada n de uma rvore balanceada
www.professoresalgoritmos.com
286
rvore AVL
rvore AVL (ou rvore balanceada pela altura) Assim, para cada nodo podemos definir um fator de balanceamento (FB) , que vem a ser um nmero inteiro igual a:
FB(nodo p) = altura(subrvore direita p) altura(subrvore esquerda p)
www.professoresalgoritmos.com
288
www.professoresalgoritmos.com
289
rvore AVL
Se o fator de balanceamento de qualquer n em uma rvore AVL se tornar menor do que -1 ou maior do que 1
a rvore tem que ser balanceada Um arvore AVL pode ser tornar desbalanceada em quatro situaes, mas somente duas delas necessitam ser analisadas
as outras duas so simetricas
www.professoresalgoritmos.com
290
www.professoresalgoritmos.com
291
www.professoresalgoritmos.com
292
www.professoresalgoritmos.com
293
(c)
www.professoresalgoritmos.com
294
www.professoresalgoritmos.com
295
www.professoresalgoritmos.com
296
www.professoresalgoritmos.com
297
www.professoresalgoritmos.com
298
www.professoresalgoritmos.com
Exerccios
1- Considere a insero dos seguintes valores (nesta ordem) em uma rvore AVL: 5,3,8,2,4,7,10,1,6,9,11. Para essas inseres nenhuma rotao necessria. Desenhe a rvore AVL resultante e determine o fator de balanceamento de cada n.
www.professoresalgoritmos.com
300
Exerccios
2- Construir uma rvore AVL com os seguintes dados: Inserir inicialmente 10, 20, 30 Se necessrio fazer balanceamento Inserir 25 e 27 Se necessrio fazer balanceamento
www.professoresalgoritmos.com
301
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007. DROZDEK, Adam. Estruturas de dados e algoritmos em c++. So Paulo: Cengage Learning, 2009. Traduo: Luiz Srgio de Castro Paiva. Captulo: 6.
www.professoresalgoritmos.com 302
www.professoresalgoritmos.com
Introduo
Pesquisa = busca
www.professoresalgoritmos.com
304
www.professoresalgoritmos.com
305
Para inserir um novo elemento em um vetor ordenado, temos de rearrumar os elementos no vetor para abrir espao para insero do novo elemento
www.professoresalgoritmos.com 306
www.professoresalgoritmos.com
307
Essa propriedade garante que quando percorremos a rvore em ordem simtrica (sae raiz sad), os valores so encontrados em ordem crescente
www.professoresalgoritmos.com 308
Ordem simtrica: 1 - 4 - 2 - 8 - 9
www.professoresalgoritmos.com
sae
sad
309
Nesse caso, como a repetio de valores permitida, quando a rvore percorrida em ordem simtrica, os valores so encontrados em ordem no decrescente
www.professoresalgoritmos.com 310
1 3
www.professoresalgoritmos.com
312
www.professoresalgoritmos.com
313
www.professoresalgoritmos.com
314
Operao de busca
A operao para buscar um elemento na rvore explora a propriedade de ordenao da rvore, Desempenho computacional proporcional sua altura (O(log n)) para rvores balanceadas
www.professoresalgoritmos.com
317
Operao de insero
A operao de insero adiciona um elemento na rvore na posio correta para que a propriedade fundamental seja mantida Para inserir um valor v em uma rvore, usamos sua estrutura recursiva e a ordenao especificada na propriedade fundamental
Se a (sub)rvore for vazia, deve ser substituda por uma rvore cujo nico n (o n raiz) contm o valor v Se a rvore no for vazia, comparamos v ao valor na raiz da rvore e inserimos v na sae ou na sad, conforme resultado da comparao
318
www.professoresalgoritmos.com
Operao de insero
importante lembrar da necessidade de atualizar os ponteiros para as subrvores esquerda ou direita quando da chamada recursiva da funo, pois a funo de insero pode alterar o valor do ponteiro para a raiz da (sub)rvore.
www.professoresalgoritmos.com
319
Operao de insero
Arv* abb_insere(Arv* a, int v) { if(a == NULL) { a = (Arv*)malloc(sizeof(Arv)); a->info = v; a->esq = a->dir = NULL; } else if (v < a->info) a->esq = abb_insere(a->esq, v); else a->dir = abb_insere(a->dir, v); return a; }
www.professoresalgoritmos.com
320
Operao de remoo
A operao de remoo permite retirar um determinado elemento da rvore Essa operao tambm deve ter como valor de retorno a eventual nova raiz da rvore, mas sua implementao mais complexa que a insero Novamente a implementao deve ser recursiva
www.professoresalgoritmos.com 321
Operao de remoo
Se a rvore for vazia, nada tem de ser feito, pois o elemento no est presente na rvore
Se a rvore no for vazia, comparamos o valor armazenado no n raiz ao valor que se deseja retirar da rvore Se o valor associado raiz for maior do que o valor a ser retirado, chamamos a funo recursivamente para retirar o elemento da subrvore esquerda
www.professoresalgoritmos.com 322
Operao de remoo
Se o valor associado raiz for menor retiramos o elemento da (sub)rvore direita Finalmente, se o valor associado raiz for igual, encontramos o elemento a ser retirado e devemos efetuar essa operao Portanto, estaremos sempre retirando um n raiz de uma (sub)rvore Nesse caso, existem 3 situaes possveis
323
www.professoresalgoritmos.com
Operao de remoo
1 situao: quando se deseja retirar uma raiz que folha que folha (isto , uma raiz que no tem filhos)
Neste caso, basta liberar a memria alocada pelo elemento e ter como valor de retorno a raiz atualizada, que passa a ser NULL
Operao de remoo
O caso complicado ocorre quando a raiz a ser retirada tem dois filhos, para poder retirar esse n da rvore, devemos proceder assim: Encontrarmos o elemento que precede a raiz na ordenao. Isso equivale a encontrar o elemento mais direita da subrvore esquerda
www.professoresalgoritmos.com
325
Operao de remoo
Trocamos a informao da raiz com a informao do n encontrado Retiramos da subrvore esquerda, chamando a funo recursivamente, o n encontrado (que agora contm a informao da raiz que se deseja retirar). Observa-se que retirar o n mais direita trivial, pois ele um n folha ou um n com um nico filho (no caso, o filho da direita nunca existe)
www.professoresalgoritmos.com 326
Operao de remoo
Arv* abb_retira(Arv* r, int v) { if(r == NULL) return NULL;
else if(r->info > v) r->esq = abb_retira(r->esq, v); else if(r->info < v) r->dir = abb_retira(r->dir, v); else //achou o elemento { /*elemento sem filhos*/ if(r->esq == NULL && r->dir == NULL) { free(r); r= NULL; } //.... www.professoresalgoritmos.com
327
Operao de remoo
else if(r->esq == NULL) { Arv* t = r; r = r->dir; free(t); } else if(r->dir == NULL) { Arv* t = r; r = r->esq; free(t); } else { //....
www.professoresalgoritmos.com
328
Operao de remoo
Arv* f = r->esq; while(f->dir != NULL) { f = f->dir; } r->info = f->info; f->info = v; r->esq = abb_retira(r->esq, v); }
} return r;
}
www.professoresalgoritmos.com
329
rvores Balanceadas
fcil prever que, aps vrias operaes de insero/remoo, a rvore tende a ficar desbalanceada
Essas operaes no garantem o balanceamento
Para que seja possvel usar rvores binrias de busca e manter sempre a altura das rvores no mnimo, ou prximo dele
necessrio um processo de insero e remoo de ns mais complicado
www.professoresalgoritmos.com 330
rvores Balanceadas
E com isso manter as rvores balanceadas ou equilibradas, tendo as duas subrvores de cada n o mesmo peso, isto , o mesmo nmero de elementos nas subrvores deve ser igual ou aproximadamente igual
www.professoresalgoritmos.com
331
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007. CORMEN, Thomas. Algoritmos: teoria e prtica. Campus, 2002.
Celes, Waldemar; Cerqueira, Renato e Rangel, Jos Lucas. Introduo a Estruturas de Dados. Rio de Janeiro: Elsevier, 2004 5 impresso. Captulo 17.
www.professoresalgoritmos.com 332
www.professoresalgoritmos.com
Introduo
Tabelas de disperso = tabela hash Essas estruturas se bem projetadas podem ser usadas para buscar um elemento em ordem constante: O(1). Preo pago por essa eficincia:
ser um uso maior de memria, mas esse uso excedente no precisa ser to grande e proporcional ao nmero de elementos armazenados.
www.professoresalgoritmos.com 334
Introduo
Os registros armazenados em uma tabela hash so diretamente endereados a partir de uma transformao aritmtica sobre a chave de pesquisa
www.professoresalgoritmos.com
335
Introduo
Limitao da tabela hash:
Ausncia de ordenao Ausncia de navegao
Exemplo
Desejamos armazenar dados referentes aos alunos de uma disciplina. Cada aluno individualmente identificado pelo seu numero de matrcula. Podemos usar o nmero de matrcula como chave de busca do conjunto de alunos armazenados. O nmero de matrcula dado por uma sequencia de 8 dgitos,
o ltimo dgito representa um dgito de controle e, portanto, no parte efetiva do nmero de matrcula.
www.professoresalgoritmos.com 337
Exemplo
Se 9711234-4 fosse um nmero de matrcula vlido, o ltimo dgito 4, aps o hfen, representaria o dgito de controle. O nmero de matrcula efetivo nesse caso seria composto pelo primeiro sete dgitos: 9711234.
www.professoresalgoritmos.com
338
Exemplo
Para permitir um acesso a qualquer aluno em ordem constante, podemos usar o nmero de matrcula do aluno como ndice de um vetor (vet) Se isso for possvel, acessamos os dados do aluno cuja matrcula dada por mat pela indexao do vetor (vet[mat]) Assim, o acesso ao elemento ocorre em ordem constante, imediata Problema: o preo pago para ter acesso rpido muito grande
339
www.professoresalgoritmos.com
Estrutura do Aluno
struct Aluno { int mat; char nome[81], email[41], turma; };
www.professoresalgoritmos.com
340
Exemplo
Como a matrcula composta por sete dgitos, o nmero inteiro que conceitualmente representa uma matrcula varia de 0 a 9999999. Portanto, precisamos dimensionar nosso vetor com dez milhes (10.000.000) de elementos. Isso pode ser feito por:
#define MAX 10000000 Aluno vet[MAX];
341
www.professoresalgoritmos.com
Exemplo
Para acessar o nome do aluno com matrcula mat, basta usar: vet[mat].nome Como a estrutura de cada aluno, no exemplo, ocupa menos de 127 bytes, estamos falando de um gasto de 1.270.000.000 bytes, ou seja, acima de 1 Gbyte de memria
www.professoresalgoritmos.com
342
Exemplo
Amenizando o problema: podemos usar um vetor de ponteiros em vez de um vetor de estruturas. Desse modo, as posies do vetor que no correspondem a alunos cadastrados teriam valores NULL Para cada aluno cadastrado, alocaramos dinamicamente a estrutura de aluno e armazenaramos um ponteiro para essa estrutura no vetor Para acessar o nome do aluno, agora, vamos usar: vet[mat]->nome
www.professoresalgoritmos.com
343
Exemplo
Assim, ao considerar que cada ponteiro ocupa 4 bytes, o gasto excedente de memria seria de, no mximo, aproximadamente, 40 Mbytes. Apesar de menor, esse gasto de memria ainda proibitivo. Resolvendo esse problema: e ainda com acesso rpido: usaremos tabelas de disperso (hash table)
www.professoresalgoritmos.com 344
Tabela Hash
Idia central
Identificar, na chave de busca, quais so as partes significativas
www.professoresalgoritmos.com
345
Tabela Hash
Os dgitos mais significativos so os 4 ltimos seqenciais Dessa maneira, podemos usar um nmero de matrcula parcial, de acordo com a dimenso que queremos dar a nossa tabela (ou nosso vetor) Ex. para dimensionar nossa tabela com apenas 100 elementos, podemos usar os dois ltimos dgitos seqenciais do numero de matrcula
www.professoresalgoritmos.com 346
Tabela Hash
A tabela pode ento ser declarada por: Aluno* tab[100]; Para acessar o nome do aluno cujo nmero de matrcula dado por mat, usamos como ndice da tabela apenas os dois ltimos dgitos. Isso poderia se conseguido com a aplicao do operador mdulo (%): vet[mat%100]-> nome
www.professoresalgoritmos.com 347
Tabela Hash
Dessa forma, o uso de memria excedente pequeno, e o acesso a um determinado aluno, a partir do nmero de matrcula, continua imediato Problema: Provavelmente, existiro dois ou mais alunos da turma que apresentaro os mesmo dois ltimos dgitos no numero da matrcula
www.professoresalgoritmos.com 348
Coliso
Existe coliso, pois alunos diferentes so mapeados para o mesmo ndice da tabela Para que a estrutura funcione de maneira adequada, temos que resolver esse problema com o devido tratamento das colises Existem diversos mtodos para tratar colises em tabelas hash, no entanto, no h como eliminar a ocorrncia de colises nas tabelas hash O que fazemos minimizar as colises, alm disso, mesmo com colises necessrio saber identificar cada elemento da tabela individualmente.
www.professoresalgoritmos.com 349
Funo de disperso
A funo de disperso (ou funo hash) mapeia uma chave de busca em um ndice da tabela No exemplo, adotamos como funo hash a utilizao dos dois ltimos dgitos do nmero de matrcula Nossa funo poderia ser assim:
int hash(int mat) { return (mat%100); }
www.professoresalgoritmos.com 350
Tratamento de Coliso
Existem diversas estratgias para tratar eventuais colises que surgem quando duas ou mais chaves de busca so mapeadas para um mesmo ndice da tabela hash Nas estratgias que sero apresentadas, a tabela de disperso ser representada por um vetor de ponteiros para a estrutura que representa a informao a ser armazenada, no exemplo, Aluno
www.professoresalgoritmos.com
351
Tratamento de Coliso
Assim, podemos definir um tipo que representa a tabela: #define N 127 typedef Aluno* Hash[N];
www.professoresalgoritmos.com
352
Tratamento de Coliso
Nas duas primeiras estratgias a serem apresentadas, os elementos que colidem so armazenados em outros ndices, ainda no ocupados, da prpria tabela A escolha da posio ainda no ocupada para armazenar um elemento que colide diferencia as estratgias a serem discutidas
www.professoresalgoritmos.com 353
Tratamento de Coliso
Uso da posio consecutiva livre Na 1 estratgia, se a funo de disperso mapeia a chave de busca para um ndice j ocupado, procuramos o prximo ndice livre da tabela para armazenar o novo elemento Uma tabela hash nunca ter todos os elementos preenchidos (ocupao acima de 75% eleva o nmero de colises)
Portanto, devemos sempre garantir que existir uma posio livre na tabela.
www.professoresalgoritmos.com 354
Tratamento de Coliso
Uso da posio consecutiva livre
Busca por posio livre
h( x )
www.professoresalgoritmos.com
355
Tratamento de Coliso
Uso da posio consecutiva livre
Aluno* hsh_busca(Hash tab, int mat) { int h = hash(mat); while(tab[h] != NULL) { if(tab[h]->mat == mat) { return tab[h]; } h = (h+1)% N; } return NULL; }
www.professoresalgoritmos.com
356
Tratamento de Coliso
Uso de uma segunda funo de disperso Para evitar a concentrao de posies ocupadas na tabela, esta 2 estratgia faz uma variao na forma de procurar uma posio livre a fim de armazenar o elemento que colidiu. Possvel segunda funo de disperso:
X = chave de busca N = dimenso da tabela
www.professoresalgoritmos.com 358
Tratamento de Coliso
Uso de uma segunda funo de disperso De posse dessa nova funo, se houver coliso, procuramos uma posio livre na tabela com incrementos da mesma forma que o anterior, dados por . Em vez de tentarmos (h(x) + 1 )%N, tentamos (h(x) + h(x))% N
www.professoresalgoritmos.com
359
Tratamento de Coliso
Cuidados: 1. A funo de disperso nunca deve retornar zero, pois isso no faria com que o ndice fosse incrementado 2. De preferncia, essa funo no deve retornar um nmero divisor da dimenso da tabela, pois isso nos limitaria a procurar uma posio livre em um subconjunto restrito dos ndices da tabela Se a dimenso da tabela for um nmero primo, garante-se automaticamente que o resultado da funo no ser um divisor
360
www.professoresalgoritmos.com
Tratamento de Coliso
Implementao da funo de busca:
int hash2(int mat) { return (N - 2 - mat%(N-2)); }
Aluno* hsh_busca(Hash tab, int mat) { int h = hash(mat); int h2 = hash2(mat); while(tab[h] != NULL) { if(tab[h]->mat == mat) { return tab[h]; } h = (h+h2)% N; } return NULL; } 361
www.professoresalgoritmos.com
Tratamento de Coliso
Uso de listas encadeadas Uma estratgia diferente, mas ainda simples, consiste em fazer com que cada elemento da tabela hash represente um ponteiro para uma lista encadeada Todos os elementos mapeados para um mesmo ndice seriam armazenados na lista encadeada
www.professoresalgoritmos.com 362
Tratamento de Coliso
Uso de listas encadeadas
* * * * *
363
Tratamento de Coliso
Uso de listas encadeadas Com essa estratgia, cada elemento armazenado na tabela ser um elemento de uma lista encadeada Portanto devemos prever, na estrutura da informao um ponteiro adicional para o prximo elemento da lista
www.professoresalgoritmos.com
364
Tratamento de Coliso
Uso de listas encadeadas
struct Aluno { int mat; char nome[81]; char email [41]; char turma; Aluno* prox; };
www.professoresalgoritmos.com 365
Tratamento de Coliso
Uso de listas encadeadas
Aluno* hsh_busca(Hash tab, int mat) { int h = hash(mat); Aluno* a = tab[h]; while(a != NULL) { if(a->mat == mat) { return a; } a = a->prox; } return NULL; }
www.professoresalgoritmos.com
366
www.professoresalgoritmos.com
367
Exerccios
1- Considere as seguintes estruturas de dados: (I)Tabela hash (II)Fila (III)Arvore de pesquisa (IV)Pilha Qual ou quais das estruturas acima requer mais do que tempo mdio constante para Insero de um elemento? (a) Somente(I) (b) Somente (II) (c) Somente(III) (d) Somente (IV) (e) Todas.
www.professoresalgoritmos.com 369
Exerccios
2- Ao usar o clculo de endereo ou hashing, geralmente necessrio o uso de um mtodo de tratamento de colises. Sobre esse mtodo, correto afirmar: a) O tratamento de colises necessrio apenas quando a tabela est cheia e se necessita inserir mais uma chave. b) O tratamento de colises necessrio para deter minar o local da chave no momento da insero na tabela. c) O tratamento de colises necessrio quando a tabela est vazia, pois no possvel calcular o endereo diretamente nesse caso. d) O tratamento de colises necessrio quando a chave inserida ainda no existir na tabela de endereamento. e) O tratamento de colises necessrio, pois o hashing gera repetio de endereo para diferentes chaves. 370
www.professoresalgoritmos.com
Exerccios
3- (CESPE - 2010 - TRE-MT - Tcnico Judicirio - Programao de Sistemas) Em sistema computacional, a forma de armazenar os dados tem papel essencial no tempo e na quantidade de memria necessrios execuo de um programa. Em relao a diferentes tipos de estruturas dinmicas de dados, assinale a opo correta. a) Pilhas e filas so estruturas de dados em que a insero e remoo de dados so realizadas em posies previamente especificadas pelo programador. b) Listas ligadas, tambm chamadas listas encadeadas, podem ser organizadas de vrias maneiras diferentes: simplesmente encadeadas ou duplamente encadeadas; circulares ou no circulares; ordenadas ou no ordenadas; lineares ou no lineares.
www.professoresalgoritmos.com 371
Exerccios
(continuao questo 3) c) rvores binrias so estruturas de dados adequadas representao de hierarquias, e cada n da rvore tem zero, um ou mais filhos. A relao hierrquica entre seus filhos definida por sua localizao nas subrvores. d) Tabelas de disperso ou hash tables apresentam como aspecto negativo a possibilidade de haver coliso na insero de informaes. Entre as tcnicas utilizadas para tratar esse problema, inclui-se o endereamento aberto e o uso de listas encadeadas. e) Listas de adjacncias e matriz de adjacncia possuem a desvantagem comum de no ser possvel determinar se uma aresta pertence ou no ao grafo.
www.professoresalgoritmos.com 372
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007. Captulo 5. CORMEN, Thomas. Algoritmos: teoria e prtica. Campus, 2002.
Celes, Waldemar; Cerqueira, Renato e Rangel, Jos Lucas. Introduo a Estruturas de Dados. Rio de Janeiro: Elsevier, 2004 5 impresso. Captulo 18.
www.professoresalgoritmos.com 373
www.professoresalgoritmos.com
Introduo
A pesquisa digital baseada na representao das chaves como um sequncia de caracteres ou de dgitos
www.professoresalgoritmos.com
375
TRIE
Definida em 1960 Vem da palavra RETRIEVAL (relacionado a recuperao de informao) Usa parte da chave para guiar a pesquisa Cada chave uma sequencia de caracteres, e uma TRIE organizada ao redor desses caracteres, no ao redor de chaves inteiras
www.professoresalgoritmos.com
376
TRIE
Cada n contm informaes sobre um ou mais smbolos do Alfabeto Alfabeto pode abranger: {0,1}, {A, B, C, D ...} ou {1,2,3,4,....} e mais o caracter nulo (ou branco)
www.professoresalgoritmos.com
377
TRIE
So usadas para: manuseamento de dicionrios; pesquisas em textos de grande dimenso; construo de ndices de documentos; expresses regulares (padres de pesquisa).
www.professoresalgoritmos.com
378
TRIE
O caminho da raiz da TRIE para qualquer outro n representa um prefixo de uma string Em Tries Compactas todos os descendentes diretos do mesmo pai so agrupados No ltimo nodo, o ltimo caracter da palavra que estiver sendo procurada dever ter associado a si (como seu apontador) a posio da palavra no texto
www.professoresalgoritmos.com 379
Exemplo
x
www.professoresalgoritmos.com
380
Exemplo
www.professoresalgoritmos.com
381
Concluso
Portanto: Cada nvel da rvore que se desce, corresponde a avanar um elemento na chave Cada n pode conter informao sobre um ou mais smbolos do alfabeto utilizado Assim: uma dada sequncia de arestas pode formar qualquer palavra (chave) possvel com base nesse alfabeto; no existe limite para o tamanho de uma sequncia (e portanto para o tamanho de uma chave); as sequncias tm comprimento varivel
www.professoresalgoritmos.com 382
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007. Captulo 5. CORMEN, Thomas. Algoritmos: teoria e prtica. Campus, 2002.
Celes, Waldemar; Cerqueira, Renato e Rangel, Jos Lucas. Introduo a Estruturas de Dados. Rio de Janeiro: Elsevier, 2004 5 impresso. Captulo 18.
www.professoresalgoritmos.com 383
Ordenao
Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)
www.professoresalgoritmos.com
Introduo
A eficincia do manuseio de dados muitas vezes pode ser aumentada se os dados forem dispostos de acordo com algum critrio de ordem
Ex.: Dicionrios, ndices de livros, folhas de pagamento, contas bancrias, listas de estudantes, etc
Embora um computador possa manipular um agenda de telefones no-ordenado mais fcil e rapidamente do que um ser humano, extremamente ineficiente ter um computador processando dados desordenados.
www.professoresalgoritmos.com 385
Introduo
Sendo assim, frequentemente necessrio ordenar dados antes do processamento 1 Etapa => escolher o critrio de ordenao
A escolha varia de aplicao a aplicao e precisa ser definida pelo usurio Ex.: Ordem ascendente e descendente
2 Etapa => como usar o critrio escolhido para colocar os dados em ordem
www.professoresalgoritmos.com 386
Introduo
A ordenao final pode ser obtida de vrios modos, mas apenas algumas delas podem ser significativas e eficientes Para decidir o melhor mtodo, certos critrios de eficincia devem ser estabelecidos e um mtodo deve ser selecionado para comparar quantitativamente diferentes algoritmos
Propriedades usadas para comparar: nmero de comparaes e nmero de movimentos de dados
387
www.professoresalgoritmos.com
Introduo
Para ordenar um conjunto de dados, eles tm que ser comparados e movidos conforme necessrio
A eficincia dessas duas operaes depende do tamanho do conjunto de dados Vamos calcular o numero de comparaes e de movimentaes apenas quando for possvel (pior caso, melhor caso e caso mdio)
Aspecto predominante na escolha do algoritmo de ordenao: tempo gasto para ordenar registros em um arquivo
www.professoresalgoritmos.com 388
Introduo
Um mtodo de ordenao dito estvel se a ordem relativa dos itens com chaves iguais mantm-se inalterada pelo processo de ordenao
www.professoresalgoritmos.com
389
www.professoresalgoritmos.com
391
www.professoresalgoritmos.com
www.professoresalgoritmos.com
394
Complexidade O(n)
395
www.professoresalgoritmos.com
396
1
Chaves iniciais i=1 i =2
2 R
D
O
A A
D E N A
R E N O
R D E N O
i=3
i=4 i=5
www.professoresalgoritmos.com
A A
A
D D
D
R N O
R
397
E N R O
E N O
1
Chaves iniciais i=1 i =2
2 1
8 2
3 4
4 4
4 9
9 9
5 2
2 8
6 3
3 3
8
1 1
i=3
i=4 i=5
www.professoresalgoritmos.com
1 1
1
2 2
2
3 3
3
9 4
4
8 8
8
4 9
9
398
www.professoresalgoritmos.com
399
www.professoresalgoritmos.com
400
void insertionSort(char v[], int n) { for (int i = 1; i < n; i++) { int x = v[i]; for (int j = i; j > 0 && x < v[j - 1]; j--) v[j] = v[j-1]; v[j] = x; } }
www.professoresalgoritmos.com
401
1
Chaves iniciais i=2 i =3
O R D E N A
O R D E N A D O R E N A
i=4
i=5 i=6
www.professoresalgoritmos.com
D D
E O R N A E N O R A
402
A D
E N O R
www.professoresalgoritmos.com
403
Ordenao Shellsort
Shell (1939) props uma extenso do algoritmo de ordenao por insero O mtodo da insero troca itens adjacentes quando est procurando o ponto de insero as sequncia destino Se o menor item estiver na posio mais direita no vetor, ento o nmero de comparaes e movimentaes igual a n-1 para encontrar o seu ponto de insero
www.professoresalgoritmos.com 404
Ordenao Shellsort
A ordenao Shell Sort compara os elementos de uma matriz que esto separados por uma distncia especfica chamada gap at que os elementos comparados com o gap corrente estejam em ordem O gap ento dividido por 2 e o processo continua, at que o gap seja igual a 1 e nenhuma diviso possa mais ser feita (com um valor inteiro como resultado) Ao final do processo, a matriz estar ordenada
www.professoresalgoritmos.com 405
406
1
Chaves iniciais
2 R
D E N A
gap = 3
E E
E
D O N A A
D
N D O R
N A O R
www.professoresalgoritmos.com
407
1
Chaves iniciais
6 D
N A O R
gap = 1
E
A A A
N A O R
E E E N O R N O R N O R
D
D D D
A
www.professoresalgoritmos.com
E N O
R
408
Ordenao Shellsort
Este mtodo se parece muito com o algoritmo tipo bolha (Bubble Sort) somado ao tipo seleo (Select Sort), com a diferena de ser mais rpido e podermos escolher quais elementos da matriz sero ordenados Assim, este algoritmo pode ser considerado um dos que consome menor processamento e tambm tempo de execuo
www.professoresalgoritmos.com 409
Ordenao Shellsort
uma tima opo para arquivos de tamanho moderado
mesmo porque sua implementao simples e requer uma quantidade de cdigo pequena Existem mtodos mais eficientes, mas so tambm muito mais complicados para implementar
www.professoresalgoritmos.com
410
Ordenao Quicksort
Este algoritmo seleciona o valor central da lista como um separador (piv) A partir da ele cria duas listas:
a primeira com os valores menores que o separador e outra com os valores maiores ou iguais ao separador.
www.professoresalgoritmos.com
411
Ordenao Quicksort
A seguir a ordenao chama a si mesma recursivamente, sempre selecionando um novo separador nas listas, e criando novas listas menores at que estas tenham apenas um nico elemento O algoritmo ento reposiciona os valores das novas listas na lista original Ao final do algoritmo uma matriz (lista) estar ordenada
www.professoresalgoritmos.com 412
Ordenao Quicksort
void quick_sort(int matriz[], int primeiro, int ultimo) { int temp, high, low, separador, temp1; low = primeiro; high = ultimo; separador = matriz[(primeiro+ultimo)/2]; do { while(matriz[low]<separador) low++; while(matriz[high]>separador) high--;
www.professoresalgoritmos.com
413
Ordenao Quicksort
if(low<=high) { temp = matriz[low]; matriz[low++] = matriz[high]; matriz[high--]=temp; } }while(low<=high); if(primeiro<high) quick_sort(matriz, primeiro, high); if(low<ultimo) quick_sort(matriz, low, ultimo); }
414
www.professoresalgoritmos.com
1
O A A
2
R D D
3
D R E
4
E E R
5
N N N
6
A O O
A
A
D
D
E
E
N
N
R
O
O
R
415
www.professoresalgoritmos.com
Ordenao Quicksort
www.professoresalgoritmos.com
416
Ordenao Quicksort
Note que as novas listas so geradas levando em conta a posio da lista anterior
Assim o programa saber exatamente qual a posio de cada valor
Observe que neste mtodo, o consumo de memria bem grande Em mdia o tempo de execuo do quicksort O(n log n)
www.professoresalgoritmos.com 417
Ordenao Mergesort
Complexidade: O(n log n) O algoritmo baseado na abordagem de desenvolvimento dividir e conquistar. Ainda, explora a recursividade, o que o torna bastante intuitivo
www.professoresalgoritmos.com
418
Ordenao Mergesort
Idia: dividir a sequncia de entrada em duas subsequncias. Ento, realiza-se a ordenao das duas subsequncias, de forma recursiva Por fim, intercala-se as sequncias ordenadas para obter o resultado final
www.professoresalgoritmos.com
419
Ordenao Mergesort
O algoritmo consiste em intercalar pares de sequncias de um item para formar sequncias ordenadas de comprimento 2 Intercalar pares de sequncias de comprimento 2 para formar sequncias ordenadas de comprimento 4 e assim por diante... at duas sequncias de comprimento n/2 serem intercaladas para formar a sequncia ordenada final, de comprimento n.
www.professoresalgoritmos.com 420
Ordenao Mergesort
5 2 2 5 4 4 7 7 1 1 3 3 2 2 6 6
2 1
4 2
5 2
7 3
1 4
2 5
3 6
6 7
421
www.professoresalgoritmos.com
Ordenao Heapsort
Complexidade: O(n log n) O algoritmo leva esse nome por utilizar, na sua soluo, uma estrutura do tipo heap Um heap um arranjo (sequncia) representado por uma rvore binria (completa)
www.professoresalgoritmos.com
422
Ordenao Heapsort
Para constru-lo, necessrio conhecer
o comprimento do arranjo a ser representado (nmero de elementos) e o tamanho do heap, que definido como o nmero de elementos no heap armazenados dentro do arranjo A
www.professoresalgoritmos.com
423
Ordenao Heapsort
O algoritmo de ordenao Heapsort utiliza um heap mximo, isto , para cada n diferente da raiz, seu valor deve ser menor que o valor do n pai Para que a ordenao ocorra, primeiro construdo um heap mximo que represente a sequncia O heap construdo de baixo pra cima, a partir do penltimo nvel, subindo os valores maiores para os nveis superiores.
www.professoresalgoritmos.com 424
Ordenao Heapsort
A ordenao de heap usa o heap, uma rvore binria com as seguintes propriedades:
O valor de cada n no menor do que os valores de cada um de seus filhos A rvore perfeitamente balanceada e as folhas no ltimo nvel esto todas nas posies mais a esquerda
www.professoresalgoritmos.com
425
Ordenao Heapsort
Etapas: 1- na primeira fase a matriz transformada em um heap 2- essa fase comea depois que a heap construda, vamos criar uma matriz e trocar o ltimo valor com o primeiro
Essas etapas iro repetir at que a matriz esteja toda ordenada
www.professoresalgoritmos.com 426
Ordenao Heapsort
Procedimento HeapSort (A vetor, tamA, tam_heap inteiro) Incio declare i inteiro; {Constri o heap que representa o arranjo} para i de tamA at 2 passo -1 faa Troca A[1] por A[i]; tam_heap = tam_heap - 1; Reorganiza o heap; fim para Fim
www.professoresalgoritmos.com 427
www.professoresalgoritmos.com
428
www.professoresalgoritmos.com
429
www.professoresalgoritmos.com
430
www.professoresalgoritmos.com
431
www.professoresalgoritmos.com
432
Ficou assim...
www.professoresalgoritmos.com
433
12
11
10
15
www.professoresalgoritmos.com
434
www.professoresalgoritmos.com
435
www.professoresalgoritmos.com
436
Ficou assim...
www.professoresalgoritmos.com
437
11
10
12
15
www.professoresalgoritmos.com
438
www.professoresalgoritmos.com
439
www.professoresalgoritmos.com
440
Ficou assim...
www.professoresalgoritmos.com
441
10
11
12
15
www.professoresalgoritmos.com
442
www.professoresalgoritmos.com
443
www.professoresalgoritmos.com
444
Ficou assim...
www.professoresalgoritmos.com
445
10
11
12
15
www.professoresalgoritmos.com
446
www.professoresalgoritmos.com
447
www.professoresalgoritmos.com
448
Ficou assim...
www.professoresalgoritmos.com
449
10
11
12
15
www.professoresalgoritmos.com
450
www.professoresalgoritmos.com
451
Ficou assim...
www.professoresalgoritmos.com
452
10
11
12
15
www.professoresalgoritmos.com
453
www.professoresalgoritmos.com
454
Ficou assim...
www.professoresalgoritmos.com
455
10
11
12
15
www.professoresalgoritmos.com
456
www.professoresalgoritmos.com
457
Ficou assim...
www.professoresalgoritmos.com
458
10
11
12
15
www.professoresalgoritmos.com
459
* A tabela apresenta uma comparao do tempo total real para ordenar arranjos com 500, 5.000, 10.000 e 30.000 registros
www.professoresalgoritmos.com
www.professoresalgoritmos.com
www.professoresalgoritmos.com
Referncia Bibliogrfica
ZIVIANI, Nivio. Projeto de Algoritmos com implementaes em Java e C++. So Paulo: Thomson Learning, 2007. CORMEN, Thomas. Algoritmos: teoria e prtica. Campus, 2002. DROZDEK, Adam. Estrutura de dados e algoritmos em c++. So Paulo: Cengage Learning, 2009. Captulo 9.
Notas de aula da Prof. Raquel Marcia Mller. Disponvel em: http://www.comp.uems.br/Members/rmmuller/pt_aedii/Aula 4-Ordenacao.pdf
www.professoresalgoritmos.com 463