Você está na página 1de 463

Apostila: Estruturas de dados e Arquivos

Linguagem de programao C++

Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)

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

struct Aluno { char nome[255]; int idade, cel; char endereco[300]; };


Ponto-e-vrgula

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

Declarao de Variveis do Tipo Registro


Para utilizar uma struct, necessria a declarao de variveis desse tipo:
nome_do_registro nome_da_varivel;

Para o nosso exemplo:


Aluno alu1, alu2;
Tipo de dado www.professoresalgoritmos.com variveis

10

Declarao de Variveis do Tipo Registro


A declarao reserva espao de memria suficiente para armazenar cada um dos membros da estrutura (nome, idade, cel e endereco) para a varivel alu1 e alu2 Tambm possvel declarar um vetor ou uma matriz do tipo da estrutura, como:
Aluno alu[10], mat[2][3];
vetor
www.professoresalgoritmos.com matriz 11

Acesso a Membros de Estruturas


Aps a varivel ser declarada, o programa precisa manipular o contedo de cada campo individualmente Para isso, preciso informar o nome da varivel e o do campo desejado, separados por um ponto
nome_da_varivel.nome_do_campo
ponto www.professoresalgoritmos.com 12

Acesso a Membros de Estruturas


Para armazenar um determinado valor nas variveis do exemplo:
strcpy(alu1.nome,Maria); alu1.idade = 16;

Para armazenar um dado digitado pelo usurio


gets(alu1.nome); Cin<<alu1.idade;
www.professoresalgoritmos.com 13

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

Declarao de Vetor do tipo Registro


Pode-se criar vetores utilizando uma estrutura de dados Alterando o exemplo para que sejam armazenados os dados (nome, idade, cel, endereco) de 10 alunos.
Aluno alu[10];
vetor www.professoresalgoritmos.com 18

Acesso a Membros com Vetor de Estruturas


Para preencher o vetor todo com 10 alunos
for(i=0; i<10; i++) { gets(alu1[i].nome); cin<<alu1[i].idade; }
ndice do vetor

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

Passando Registros para Funes


As estruturas podem ser passadas como parmetros de funes da mesma maneira que uma varivel simples O nome de uma estrutura no um endereo, portanto, ela pode ser passada por valor O exemplo a seguir apresenta uma funo que recebe duas estruturas como parmetro e imprime os valores da soma de seus membros
www.professoresalgoritmos.com 22

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

Passando Registros para Funes por referncia


A sintaxe das passagem de estrutura para funes por referncia a mesma da passagem de variveis simples por referncia Como as estruturas, em geral, so dados que ocupam uma grande quantidade de memria, conveniente que se use passagem de parmetro por referncia Usando referncia no h criao de uma cpia da varivel na funo
www.professoresalgoritmos.com 25

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

Funes que retornam um Registro


A linguagem C++ permite que as funes retornem uma estrutura completa para outra funo, como o exemplo:
Venda novavenda() { Venda x; cout<<"\nVenda A"; cout<<"\nInsira o numero de pecas: "; cin>>x.pecas; cout<<"\nInsira o preco: "; cin>>x.preco; return x; }
www.professoresalgoritmos.com 30

Exerccios

1- Explique qual a diferena entre vetor e registro. D exemplos.

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

Alocao Dinmica de Memria


Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)

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

Reserva de espao de memria


Existem 3 maneiras de reservar espao de memria: 1. Usar variveis globais (e estticas): o espao reservado existe enquanto o programa estiver sendo executado 2. Usar variveis locais: o espao existe apenas enquanto a funo que declarou a varivel est sendo executada 3. Requisitar ao sistema, em tempo de execuo, um espao de um determinado tamanho: Esse espao permanece reservado at que seja explicitamente liberado pelo programa.
38

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);

Considerando que 1 inteiro ocupa 4 bytes

www.professoresalgoritmos.com

40

Funo Malloc()
Para ficarmos livres de compiladores e mquinas, usamos o operador sizeof()
int *v; v = malloc(10 * sizeof(int));

diz quantos bytes o tipo especificado tem

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));

Converso para o tipo 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.

*A = 10 Resposta: (*A = _____ e *B = _____ ) *A = 35 Resposta: (*A = _____ e *B = _____ )


49

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

Ponteiro varivel um lugar na memria que armazena o endereo de outra varivel


www.professoresalgoritmos.com 52

Razes para usar ponteiros


Receber parmetros em funes que necessitem modificar o parmetro original Criar estruturas complexas, como listas encadeadas e rvores binrias, em que um item deve conter referncia a outro Alocar e desalocar memria do sistema Passar para uma funo o endereo de outra

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:

int a, *ptr; a = 5; ptr = &a; *ptr = 6;


www.professoresalgoritmos.com

112 ptr -> a 5 108 104


55

Declarao de Ponteiros
int *ptr;
Tipo de dado Nome_ponteiro

Exemplo:

int a, *ptr; a = 5; ptr = &a; *ptr = 6;


www.professoresalgoritmos.com

112 ptr -> a 104 5 108 104


56

Declarao de Ponteiros
int *ptr;
Tipo de dado Nome_ponteiro

Exemplo:

int a, *ptr; a = 5; ptr = &a; *ptr = 6;


www.professoresalgoritmos.com

112 ptr -> a 104 6 108 104


57

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

Operaes com Ponteiros


1. Atribuio:
px = &x;

2. Incrementando: px++; 3. Diferena: px - py;

px = py + 3;

4. Comparaes: usando os operadores ( >, <, <=, >=, ==, != )


www.professoresalgoritmos.com 62

Ponteiros para Estruturas


Do mesmo modo que podemos declarar variveis do tipo estrutura:
struct Aluno { int mat; char nome[255], curso[50]; }; Aluno alu;
www.professoresalgoritmos.com 63

Ponteiros para Estruturas


Podemos declarar variveis do tipo ponteiro para estrutura:
Aluno *palu;

palu->

mat

nome

curso

www.professoresalgoritmos.com

64

Acesso aos campos da Estrutura


Para acessar os campos da estrutura com um ponteiro:
(*nome_ponteiro). Nome_campo
ponto

Os parnteses so indispensveis, pois o operador * tem precedncia menor do que o operador de acesso .
www.professoresalgoritmos.com 65

Acesso aos campos da Estrutura


Outra forma de acessar os membros :
nome_ponteiro -> Nome_campo

E para acessar o endereo de um campo:


&nome_ponteiro -> Nome_campo
66

www.professoresalgoritmos.com

Alocao dinmica de Estruturas


struct Aluno { int mat; char nome[255], curso[50]; };

Aluno *palu; palu = (Aluno*)malloc(sizeof(Aluno));


Estrutura Aluno criada anteriormente www.professoresalgoritmos.com

67

Alocao dinmica de Estruturas


Aps uma alocao dinmica, podemos acessar normalmente os campos da estrutura com a varivel ponteiro que armazena seu endereo

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

Exemplo2 Nova verso


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) min = vet[i]; } }
88

www.professoresalgoritmos.com

Exemplo2 Nova verso


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) }

Caso mdio: f(n) = 3n/2-3/2


www.professoresalgoritmos.com 89

Exemplo2 Nova verso


void calculaMaxMin(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) min = vet[i]; } }

www.professoresalgoritmos.com

90

Comportamento Assinttico de Funes


O n de comparaes para encontrar o maior elemento de um conjunto de n inteiros, ou para ordenar os elementos de um conjunto com n elementos, aumenta com n Parmetro n fornece uma medida da dificuldade para se resolver o problema
O custo para obter uma soluo para um dado problema aumenta com o tamanho de n do problema
www.professoresalgoritmos.com 91

Comportamento Assinttico de Funes


Para valores suficientemente pequenos de n, qualquer algoritmo custa pouco para ser executado, mesmo os algoritmos ineficientes
Para problemas de tamanho pequeno a escolha do algoritmo no um problema crtico A anlise de algoritmos realizada apenas para valores grandes de n A anlise de um algoritmo geralmente conta com apenas algumas operaes elementares, e em muitos casos com uma operao elementar
www.professoresalgoritmos.com 92

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

Comparao de funes de complexidades


Funo de custo

Tamanho n
10 20 30 40 50 60

n
n

0,00001 s
0,0001 s

0,00002 0,00003 0,00004 0,00005 0,00006 s s s s


0,0004 s 0,0009 s 0,0016 s 0,0035 s 0,0036 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.

Notas de aula Prof Raquel Marcia Mller (http://www.comp.uems.br/Members/rmmuller/ pg_aedii)


www.professoresalgoritmos.com 100

Tcnicas de Anlise de Algoritmos


Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)

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

Complexidade de algumas estruturas de controle


Regras rgidas sobre o clculo da complexidade de qualquer algoritmo no existem, cada caso deve ser estudado em suas condies. No entanto, as estruturas de controle clssicas da programao estruturada permitem uma estimativa tpica de cada uma. A partir disso, algoritmos construdos com combinaes delas podem ter sua complexidade mais facilmente estabelecida.
www.professoresalgoritmos.com 110

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).

for (i=0; i<k ; i++) trecho com O(g(n))


www.professoresalgoritmos.com

se k no f(n)ento o trecho O(g(n))

112

for (i=0; i<10 ; i++) { x = x+v; printf (%d, x); }

isto O(1), logo toda a repetio O(1)

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

for (i=0; i<n; i++) trecho com O(g(n))

como o nmero de iteraes f(n)=n ento o trecho O(n*g(n))

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

Exemplo 1- Algoritmo recursivo


void pesquisa(int n) {

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

Exemplo 1- Algoritmo recursivo


void pesquisa(int n) {

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 }
}

ser O(n), Complexidade linear.


126

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

Exemplo 2- Programa para ordenar

www.professoresalgoritmos.com

128

Exemplo 2- Programa para ordenar


O nmero n de elementos representa o tamanho da entrada de dados.

www.professoresalgoritmos.com

129

Exemplo 2- Programa para ordenar

O programa contm dois anis, um dentro do outro.

www.professoresalgoritmos.com

130

Exemplo 2- Programa para ordenar

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

Exemplo 2- Programa para ordenar

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

Exemplo 2- Programa para ordenar

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

Exemplo 2- Programa para ordenar

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

Exemplo 2- Programa para ordenar

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

Exemplo 2- Programa para ordenar

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

Exemplo 2- Programa para ordenar

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

Exemplo 2- Programa para ordenar

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

Exemplo4 Nova verso


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) min = vet[i]; } }
142

www.professoresalgoritmos.com

Exemplo4 Nova verso

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

Caso mdio: f(n) = (3n-3)/2


www.professoresalgoritmos.com 143

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.

Notas de aula Prof Raquel Marcia Mller (http://www.comp.uems.br/Members/rmmuller/ pg_aedii)


www.professoresalgoritmos.com 144

Tipos Abstratos de dados (TAD)


Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)

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: diviso de um programa em vrios arquivos-fontes.


www.professoresalgoritmos.com 148

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

Exemplo 1 TAD Ponto


Operaes:
Cria: operao que cria um ponto com coordenadas x ey Atribui: operao que atribui novos valores s coordenadas de um ponto Distancia: operao que calcula a distncia entre dois pontos Libera: operao que libera a memria alocada por um ponto

Interface: arquivo ponto.h


www.professoresalgoritmos.com 151

Exemplo 2 TAD Circulo


Operaes:
Cria: operao que cria um circulo com centro (x,y) e raio r Area: operao que calcula a area do circulo Interior: operao que verifica se um dado ponto est dentro do circulo Libera: operao que libera a memria alocada por um circulo

Interface: arquivo circulo.h


www.professoresalgoritmos.com 152

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

TAD Listas Encadeadas


Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)

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

Lista Linear Encadeada

www.professoresalgoritmos.com

158

Lista Linear Encadeada


Para cada novo elemento inserido na estrutura => alocamos um espao de memria para armazen-lo Assim, o espao total de memria gasto pela estrutura proporcional ao nmero de elementos armazenados No podemos garantir que os elementos armazenados na lista ocuparo um espao contguo de memria
Portanto, no temos acesso direto aos elementos da lista
www.professoresalgoritmos.com 159

Lista Linear Encadeada


Exemplos de listas:
Lista Telefnica Lista de clientes de uma agncia bancria Lista de setores de disco a serem acessados por um sistema operacional Lista de pacotes a serem transmitidos em um n de uma rede de computao de pacotes

www.professoresalgoritmos.com

160

Lista Linear Encadeada


Para percorrer todos os elementos da lista, devemos explicitamente guardar o seu encadeamento

Isso feito armazenando-se junto com a informao de cada elemento, um ponteiro para o prximo elemento da lista
www.professoresalgoritmos.com 161

Lista Linear Encadeada

prim

Info1

Info2

Info3

NULL

www.professoresalgoritmos.com

162

Lista Linear Encadeada


Estrutura:
Consiste em uma sequncia encadeada de elementos, em geral chamados ns (nodos) da lista Um n da lista representado por um estrutura que contm dois campos: a informao armazenada e o ponteiro para o prximo elemento da lista

www.professoresalgoritmos.com

163

Lista Linear Encadeada


A lista representada por um ponteiro para o primeiro elemento (ou n) Do primeiro elemento, podemos alcanar o segundo, seguindo o encadeamento, e assim por diante O ltimo elemento da lista possui um ponteiro para invlido, com valor NULL e sinaliza que no existe um prximo elemento
www.professoresalgoritmos.com 164

Exemplo Lista Encadeada


struct nodo { int valor; nodo* prox; };

valor
www.professoresalgoritmos.com

prox
165

Principais Operaes Lista Encadeada


1. 2. 3. 4. Funo Inserir na Lista Funo Imprime os elementos da Lista Funo Verifica se a Lista est vazia Funo Remover um elemento da Lista

www.professoresalgoritmos.com

166

1- Funo Inserir na Lista


Uma vez criada a lista vazia, podemos inserir nela novos elementos Para cada elemento inserido, devemos alocar dinamicamente a memria necessria para armazenar o elemento e encade-lo na lista existente Parmetros para a funo: o ponteiro para a lista e o valor/ informao do novo elemento
www.professoresalgoritmos.com 167

1- Funo Inserir na Lista


A funo inserir na lista pode:
Inserir um novo elemento no fim da lista, fazendo que o ltimo elemento aponte para NULL, Inserir no incio da lista fazendo com que o prim (primeiro ponteiro) aponte para esse novo elemento.

www.professoresalgoritmos.com

168

2- Funo Imprime os elementos


Essa funo percorre todos os elementos da Lista e imprime os valores dos elementos armazenados na lista Usamos uma varivel auxiliar que um ponteiro (aux) que aponta para cada uma das estruturas at chegar no NULL

www.professoresalgoritmos.com

169

3- Funo Verifica se a Lista est vazia


Essa funo pode ser til e utilizada em outras funes A funo recebe a lista e retorna 1 se estiver vazia ou 0 se no estiver vazia Uma lista est vazia se seu valor NULL

www.professoresalgoritmos.com

170

3- Funo Verifica se a Lista est vazia


int ListaVazia(nodo * primeiro) { if(primeiro == NULL) return 1;
else return 0;

www.professoresalgoritmos.com

171

4- Funo Remover um elemento


Parmetros: lista e o valor do elemento que desejamos remover da lista Funo mais complexa Se o elemento a ser retirado for o primeiro da lista: devemos fazer

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

prim Info1 Info2 Info3

www.professoresalgoritmos.com

175

Funo Imprime elementos Lista Circular


Para percorrer os elementos de uma lista circular necessrio visitar todos os elementos a partir de um ponteiro do elemento inicial at alcanar novamente esse mesmo elemento

www.professoresalgoritmos.com

176

Funo Imprime elementos Lista Circular


void imprimeListaCircular(nodo* primeiro) { nodo* aux = primeiro; if(aux != NULL) { do{ cout<<prim->valor; aux = aux -> prox; }while (aux != primeiro); } }
www.professoresalgoritmos.com 177

Lista Duplamente Encadeada

www.professoresalgoritmos.com

178

Listas Duplamente Encadeada


A lista encadeada vista anteriormente, tambm chamada Lista Simplesmente Encadeada (LSE), caracteriza-se por formar um encadeamento simples entre os elementos: Cada elemento armazena um ponteiro para o prximo elemento da lista

www.professoresalgoritmos.com

179

Listas Duplamente Encadeada


Problemas da LSE:
no conseguimos percorrer eficientemente os elementos em ordem inversa (do final para o incio da lista) O encademento simples tambm dificulta a retirada de um elemento da lista, pois no temos um ponteiro para o elemento anterior ao ser retirado

www.professoresalgoritmos.com

180

Listas Duplamente Encadeada


Soluo: Listas duplamente encadeadas Nessas listas, cada elemento tem um ponteiro para o prximo e um ponteiro para o elemento anterior Assim, dado um elemento, podemos acessar os dois elementos adjacentes: o prximo e o anterior

www.professoresalgoritmos.com

181

Listas Duplamente Encadeada

prim Info1 Info2 Info3


Ou NULL
182

www.professoresalgoritmos.com

Exemplo Lista Duplamente Encadeada


struct nodo2 { int valor; nodo* ant; nodo* prox; };

ant valor prox


www.professoresalgoritmos.com 183

Principais Operaes Lista Duplamente Encadeada


1. Funo Inserir na Lista 2. Funo Remover um elemento da Lista 3. Funo Buscar elemento na Lista

www.professoresalgoritmos.com

184

Funo Remover Elemento da Lista Duplamente Encadeada


A funo fica mais complicada, pois necessrio acertar o encadeamento duplo
Em contrapartida, podemos retirar um elemento da lista se conhecermos apenas o ponteiro para esse elemento

www.professoresalgoritmos.com

185

Funo Remover Elemento da Lista Duplamente Encadeada


Se p representa o ponteiro do elemento que desejamos retirar, para acertar o encadeamento devemos conceitualmente fazer:
p-> ant-> prox = p-> prox; p-> prox -> ant = p-> ant;
Isto , o anterior passa a apontar para o prximo, e o prximo passa a apontar para o anterior
www.professoresalgoritmos.com

186

Funo Remover Elemento da Lista Duplamente Encadeada


Se p aponta para um elemento no meio da lista: as duas atribuies so suficientes para acertar o encadeamento Se p aponta para um elemento no extremo da lista:
Se p for o ltimo elemento, o elemento anterior dever apontar para NULL quando p for removido Se p for o primeiro elemento, o ponteiro para o primeiro dever apontar para o prximo elemento
www.professoresalgoritmos.com 187

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

Principal ideia: todo acesso a seus elementos feito a partir do topo

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

Implementao de pilha com lista


struct Lista { float valor; Lista* prox; };

struct Pilha { Lista* topo; };


www.professoresalgoritmos.com 205

Pilha* cria_pilha(void) { Pilha* p = (Pilha*)malloc(sizeof(Pilha)); p->topo = NULL; return p; }


void push_pilha(Pilha* p, float num) { Lista* n = (Lista*)malloc(sizeof(Lista)); n->valor = num; n->prox = p->topo; p->topo = n; } int pilha_vazia(Pilha* p) { return (p->topo == NULL); }
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

int main() { Pilha* pi = cria_pilha(); push_pilha(pi,2); push_pilha(pi,4); push_pilha(pi,1); imprime_pilha(pi); getch();

system("cls"); pop_pilha(pi); imprime_pilha(pi); getch(); }


www.professoresalgoritmos.com 209

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

P1 topo -> 7.2 3.1


9.8 2.1 4.5 1.0 210

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

Estrutura de fila com lista encadeada


ini fim

Info1

Info2

Info3

www.professoresalgoritmos.com

219

Implementao de fila com lista


struct Lista { float info; Lista* prox; };

struct Fila { Lista* ini; Lista* fim; };


www.professoresalgoritmos.com

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

Exemplo Fatorial Recursivo


int fatorial(int n) { if(n==0) { return 1; } else { return(n * fatorial(n-1)); } }
www.professoresalgoritmos.com 230

Exemplo Fatorial Recursivo


int main() { int num;
do{ cout<<"\nDigite um numero ou negativo para terminar: "; cin>>num; if(num>0) { cout<<"\nO fatorial de "<<num<<" e: "<<fatorial(num); } }while(num>0); cout<<"\nFim do programa"; getch(); }
www.professoresalgoritmos.com 231

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

Criando uma funo recursiva


1 Passo: definir o problema em termos recursivos Isso significa definir o problema usando ele mesmo na definio Ex.: O fatorial de um nmero pode ser definido por meio da seguinte expresso: n! = n * (n-1)!

www.professoresalgoritmos.com

233

Criando uma funo recursiva


2 Passo: encontrar a condio bsica. Toda funo recursiva deve ter uma condio de trmino chamada de condio bsica A funo fatorial(), quando chamada, verifica se num zero Se a condio for satisfeita, interrompe a recurso

www.professoresalgoritmos.com

234

Criando uma funo recursiva


3 Passo: cada vez que a funo chamada recursivamente deve estar mais prxima de satisfazer a condio bsica Isso garante que o programa no girar em uma sequncia infinita de chamadas No exemplo, a cada chamada, o valor de num estar mais prximo de zero

www.professoresalgoritmos.com

235

Como trabalha uma funo recursiva?


Para entender o funcionamento de uma funo recursiva, vamos imaginar que a chamada recursiva a chamada a outra funo que tenha o mesmo cdigo da funo original

www.professoresalgoritmos.com

236

Como trabalha uma funo recursiva?


Supondo que o nmero digitado tenha sido 3:
int fatorial(int 3) { ... else { return(3 * fatorial(2)); } }

www.professoresalgoritmos.com

237

Como trabalha uma funo recursiva?


Supondo que o nmero digitado tenha sido 3:
int fatorial(int 3) { int fat1(int 2) ... { else ... { else return(3 * fatorial(2)); { } return(2 * fatorial(1)); } } }

www.professoresalgoritmos.com

238

Como trabalha uma funo recursiva?


Supondo que o nmero digitado tenha sido 3:
int fatorial(int 3) { int fat1(int 2) ... { else ... { int fat2(int 1) else return(3 * fatorial(2)); { { } ... return(2 * fatorial(1)); } else } { } return(1 * fatorial(0)); } }

www.professoresalgoritmos.com

239

Como trabalha uma funo recursiva?


Supondo que o nmero digitado tenha sido 3:
int fatorial(int 3) { int fat1(int 2) ... { else ... { int fat2(int 1) else return(3 * fatorial(2)); { { } ... return(2 * fatorial(1)); int fat3(int 0) } else } { { } if(n == 0) return(1 * fatorial(0)); { } return (1); } } ... }

www.professoresalgoritmos.com

240

Como trabalha uma funo recursiva?


Supondo que o nmero digitado tenha sido 3:
int fatorial(int 3) { ... else { return(3 * fatorial(2)); } } int fat1(int 2) { ... else { return(2 * fatorial(1)); } }

int fat2(int 1) { ... else { return(1 * fatorial(0)); } }

int fat3(int 0) { if(n == 0) { return (1); } ... }

www.professoresalgoritmos.com

241

Como trabalha uma funo recursiva?


O que ocorre na memria quase a mesma coisa, exceto pelo fato de que no h repetio do cdigo da funo Observe que vrias chamadas esto ativas ao mesmo tempo Enquanto a ltima chamada no terminar, a penltima no termina e assim por diante
Isso faz as variveis de cada chamada serem todas mantidas na memria, o que requer mais memria
www.professoresalgoritmos.com 242

Como trabalha uma funo recursiva?


1

1* 0!

2 * 1!

3 * 2!

3!
www.professoresalgoritmos.com 243

Caracterstica da funo recursiva


As funes recursivas devem ter:
Ponto de Parada: resolvido sem utilizao de recursividade, sendo este ponto geralmente um limite superior ou inferior da regra geral. Regra Geral: o mtodo geral da recursividade reduz a resoluo do problema atravs da invocao recursiva de casos mais pequenos, sendo estes casos menores resolvidos atravs da resoluo de casos ainda menores, e assim sucessivamente, at atingir o ponto de parada que finaliza o mtodo.
www.professoresalgoritmos.com 244

Caracterstica da funo recursiva


Exemplo
Fatorial(n) = (n == 0) 1 // Ponto de parada (n) n * (n-1)! // Regra geral

www.professoresalgoritmos.com

245

Exemplo Torre de Hani

1 2

3
www.professoresalgoritmos.com 246

Exemplo Torre de Hani


void mover(int n, char orig, char temp, char dest) { if(n==1) { cout<<"\n Mova o disco 1 da haste "<<orig<<" para haste "<<dest; } else { mover(n-1, orig, dest, temp); cout<<"\n Mova o disco "<<n<<" da haste "<<orig<<" para haste "<<dest; mover(n-1, temp, orig, dest); } }
www.professoresalgoritmos.com 247

Exemplo Torre de Hani


int main() { mover(3, 'A', 'B', 'C'); getch(); }

www.professoresalgoritmos.com

248

Exemplo Torre de Hani

www.professoresalgoritmos.com

249

Exemplo Impresso de um seqncia de nmeros


void print_numero(int num) { if (num > 0) { print_numero(num-1); cout << num << " "; } } void print_numero_inv(int num) { if (num > 0) { cout << num << " "; print_numero_inv(num-1); } }

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

Exemplo Resto da diviso de um nmero por outro (mtodo sem recurso)


#include <iostream.h> int resto(int x, int y) { while(x >= y) { x = x y; } return( x ); } 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

251

Exemplo Resto da diviso de um nmero por outro (mtodo recursivo)

#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

Recursividade: habilidade de uma funo chamar a si mesma

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

Representao das rvores


N Raiz

...

Folhas
www.professoresalgoritmos.com

262

rvores
tradicional desenhar as estruturas de rvores com a raiz para cima e as folhas para baixo

No fica explicita a direo dos ponteiros


Fica subentendido que os ponteiros apontam sempre do pai para os filhos Os tipos de rvores existentes so diferenciados pelo nmero de filhos por n e as informaes armazenadas em cada n
www.professoresalgoritmos.com 263

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

No entanto, o 2 argumento, nem sempre se mantm

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)

O Fator de uma folha sempre Zero (0)


www.professoresalgoritmos.com 287

Exemplos de rvores AVL


Os nmeros nos nodos representam o FB para cada nodo. Para uma rvore ser AVL os fatores de balano devem ser necessariamente -1, 0, ou 1.

www.professoresalgoritmos.com

288

Exemplos de rvores No-AVL

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

Balanceamento de rvore AVL


Inicialmente inserimos um novo nodo na rvore.
A insero deste novo nodo pode ou no violar a propriedade de balanceamento.

Caso a insero do novo nodo no viole a propriedade de balanceamento


Podemos ento continuar inserindo novos nodos.

www.professoresalgoritmos.com

291

Balanceamento de rvore AVL


Caso contrrio precisamos nos preocupar em restaurar o balano da rvore.
A restaurao deste balano efetuada atravs do que denominamos ROTAES na rvore. Rotaes => movimentaes dos ns, pode ser feito a medida que um n inserido

www.professoresalgoritmos.com

292

Balanceamento de rvore AVL


Primeiro caso: resultado de inserir um n na subrvore da direita do filho direita (ver prximo slide)
Inserindo um n em algum lugar da subarvore da direita de Q, perturba o balanceamento da rvore P Para resolver: girar o n Q ao redor de seu ascendente P, de modo que o fator de balanceamento tanto de P como de Q se torna zero, o que ainda melhor do que no princpio

www.professoresalgoritmos.com

293

Balanceamento de rvore AVL


(a) (b)

(c)

www.professoresalgoritmos.com

294

Balanceamento de rvore AVL


Segundo caso: resultado de inserir um n na subrvore da esquerda do filho direita (ver prximos slides)
Para trazer a rvore de volta ao balanceamento, uma dupla rotao realizada O balano da rvore P restaurado girando-se R ao redor do n Q e ento girando-se R novament, dessa vez ao redor do n P

www.professoresalgoritmos.com

295

Balanceamento de rvore AVL


(a) (b)

www.professoresalgoritmos.com

296

Balanceamento de rvore AVL


(c) (d)

www.professoresalgoritmos.com

297

Balanceamento de rvore AVL


(e)

www.professoresalgoritmos.com

298

Dicas: rvore AVL


1. Para identificarmos quando uma rotao simples ou dupla observamos os sinais de FatBal:
se o sinal for igual, a rotao simples. se o sinal for diferente a rotao dupla.

2. Se FB + rotao para esquerda 3. Se FB - rotao para direita


299

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

Pesquisa em Memria Primria rvore Binria de Busca


Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)

www.professoresalgoritmos.com

Introduo
Pesquisa = busca

www.professoresalgoritmos.com

304

rvore binria de busca


O algoritmo de busca binria apresentado tem bom desempenho computacional e deve ser usado quando temos os dados ordenados armazenados em um vetor

www.professoresalgoritmos.com

305

rvore binria de busca


Mas se precisarmos inserir e remover elementos da estrutura e ao mesmo tempo dar suporte a funes de busca eficientes, a estrutura de vetor
(e, consequentemente, a busca binria) no se mostra adequada

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

rvore binria de busca


Uma situao semelhante ocorre quando removemos um elemento do vetor Sendo assim, precisamos de uma estrutura dinmica que d suporte a operaes de busca No caso, podemos usar a estrutura estudada: rvore Binria

www.professoresalgoritmos.com

307

rvore binria de busca


As rvores binrias aqui consideradas tm uma propriedade fundamental:
o valor associado a raiz sempre maior do que os valores associados a qualquer ns das subrvores

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

rvore binria de busca


8

Ordem simtrica: 1 - 4 - 2 - 8 - 9
www.professoresalgoritmos.com

sae

sad

309

rvore binria de busca


Uma variao possvel permite a repetio de valores na rvore:
o valor associado raiz sempre maior do que o valor associado a qualquer n da sae e sempre menor ou igual ao valor associado a qualquer n sad

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

rvore binria de busca


Ao usar a propriedade de ordem simtrica, a busca de um valor em uma rvore pode ser feita de forma eficiente Para procurar um valor numa rvore, comparamos o valor que buscamos ao valor associado raiz
Em caso de igualdade, o valor foi encontrado Se o valor for menor, a busca continua em sae Se o valor for maior, a busca continua em sad
www.professoresalgoritmos.com 311

rvore binria de busca


Exemplo:
6

1 3
www.professoresalgoritmos.com

312

rvore binria de busca


Tipo da rvore binria:
struct Arv { int info; Arv* esq; Arv* dir; };

www.professoresalgoritmos.com

313

rvore binria de busca


A rvore representada pelo ponteiro para o n raiz A rvore vazia inicializada pela atribuio de NULL varivel que representa a rvore Uma funo simples para criar a rvore vazia :
Arv* abb_cria() { return NULL; }

www.professoresalgoritmos.com

314

rvore binria de busca


Caso j exista uma rvore binria de busca, podemos imprimir os valores da rvore em ordem crescente percorrendo os ns em ordem simtrica: void abb_imprime(Arv* a)
{

if(a!= NULL) { abb_imprime(a->esq); cout<<"\n"<<a->info; abb_imprime(a->dir); }


}
www.professoresalgoritmos.com 315

rvore binria de busca


At agora nada mudou para as rvores binrias que tnhamos visto Outras operaes vo explorar a propriedade das rvores de busca Busca: funo que busca um elemento na rvore Insere: funo que insere um novo elemento na rvore Retira: funo que retira um elemento da rvore
www.professoresalgoritmos.com 316

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

2 situao: acontece quando a raiz a ser retirada possui um nico filho


Ao se retirar esse n, a raiz da rvore passa a ser o nico filho existente
www.professoresalgoritmos.com 324

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

Pesquisa em Memria Primria Tabela Hash


Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)

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

Utilizao das tabelas hash:


Banco de dados Dicionrios Tabelas de smbolos Sistemas de senha e autenticao
www.professoresalgoritmos.com 336

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

Funo para insero


Aluno* hsh_insere(Hash tab, int mat, char* n, char* e, char t) { int h = hash(mat); while(tab[h]!= NULL) { if(tab[h]->mat == mat) { break; } h = (h+1)%N; } if(tab[h] == NULL) //no encontrou o elemento { tab[h]=(Aluno*)malloc(sizeof(Aluno)); tab[h]->mat = mat; } //atribui - modifica informao strcpy(tab[h]->nome, n); strcpy(tab[h]->email, e); tab[h]->turma = t; return tab[h]; 357 } www.professoresalgoritmos.com

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
* * * * *

* Os ndices da tabela que no tm elementos associados representam listas vazias.


www.professoresalgoritmos.com

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

Funo para insero


Aluno* hsh_insere(Hash tab, int mat, char* n, char* e, char t) { int h = hash(mat); Aluno* a = tab[h]; while(a!= NULL) { if(a->mat == mat) { break; } a = a->prox; } if(a == NULL) //no encontrou o elemento { a =(Aluno*)malloc(sizeof(Aluno)); a->mat = mat; a->prox = tab[h]; tab[h] = a; } //atribui - modifica informao strcpy(a->nome, n); strcpy(a->email, e); a->turma = t; return a; }

www.professoresalgoritmos.com

367

Etapas Mtodo Tabela Hash


Duas etapas principais: 1. Computar o valor da funo de transformao (hash) a qual transforma a chave de pesquisa em um endereo da tabela 2. Considerando que duas ou mais chaves podem ser transformadas em um mesmo endereo da tabela, necessrio existir um mtodo para lidar com colises
www.professoresalgoritmos.com 368

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

Pesquisa Digital rvore TRIE


Ivre Marjorie R. Machado (ivre.marjorie@gmail.com)

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

Ordenao Bubble Sort (Tipo bolha)


O algoritmo consome tempo e processamento Apesar de simples, no deve ser utilizado com matrizes ou listas muito extensas para evitar lentido no processamento Seu funcionamento muito simples O Algoritmo faz um loop (lao) pelos valores da matriz comparando-os e movendo o maior para a posio anterior
www.professoresalgoritmos.com 390

Ordenao Bubble Sort (Tipo bolha)


Este mtodo cria uma ordenao decrescente Para criar uma ordenao crescente, o algoritmo dever mover o maior valor para a posio posterior, aps o elemento testado

www.professoresalgoritmos.com

391

Ordenao Bubble Sort (Tipo bolha)


void bubble_sort(char matriz[], int tamanho) { int i, j; char temp; for (i=0; i < tamanho; i++) for(j=0;j < tamanho; j++) if (matriz[i] < matriz[j]) { temp = matriz[i]; matriz[i] = matriz[j]; matriz[j] = temp; } }
www.professoresalgoritmos.com 392

Ordenao por Seleo (Select Sort)


O algoritmo Select Sort tambm consome processamento e tempo, e assim, tambm no adequado em matrizes e listas muito grandes Ele trabalha selecionando um elemento como o primeiro da lista, por exemplo. realizada uma pesquisa na lista para encontrar o valor mnimo e este ento posicionado no lugar do elemento pesquisado.
393

www.professoresalgoritmos.com

Ordenao por Seleo (Select Sort)


Funcionamento:
1- Selecione o menor item do vetor 2- Troque-o com o item que est na primeira posio do vetor Repita essas duas operaes com os n-1 itens restantes, depois com os n-2 itens, at que reste apenas um elemento

www.professoresalgoritmos.com

394

Ordenao por Seleo (Select Sort)


void ordena(char v[], int n) { for(int i=0; i<n-1; i++) { int min = i; for(int j=i+1; j<n; j++) { if(v[j] < v[min]) { min = j; } //troca int aux = v[min]; v[min] = v[i]; v[i] = aux; } } }
www.professoresalgoritmos.com

Complexidade O(n)

395

Ordenao por Seleo (Select Sort)


Observaes: O fato de o arquivo j est ordenado no ajuda em nada, pois o custo continua quadrtico O algoritmo no estvel, pois ele nem sempre deixa os registros com chaves iguais na mesma posio

www.professoresalgoritmos.com

396

Ordenao por Seleo (Select Sort) Exemplo

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

Ordenao por Seleo (Select Sort) Exemplo agora com nmeros

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

Ordenao por Insero


Mtodo preferido dos jogadores de cartas Em cada passo, a partir de i = 2, o i-simo item da sequncia fonte apanhado e transferido para a sequncia destino, sendo inserido no seu lugar apropriado Exemplo: considere que as chaves sero inseridas nessa ordem: O R D E N A

www.professoresalgoritmos.com

399

Ordenao por Insero


Funcionamento: 1- A colocao do item no seu lugar apropriado na sequncia destino realizada movendo-se itens com chaves maiores para a direita e ento inserindo o item na posio deixada vazia.

www.professoresalgoritmos.com

400

Ordenao por Insero

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

Ordenao por Insero Exemplo

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

Ordenao por Insero


Observao: O mtodo de ordenao por insero estvel, pois ele deixa os registros com chaves iguais na mesmo posio relativa

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

Ordenao Shell Sort


void shell_sort(int matriz[], int tamanho) { int i, gap, temp, ret; gap = tamanho/2; do { do { ret = 0; for(i=0; i<(tamanho-gap);i++) { if(matriz[i]>matriz[i+gap]) { temp = matriz[i]; matriz[i]=matriz[i+gap]; matriz[i+gap]=temp; ret = 1; } } }while(ret == 1); }while(gap = gap/2); } www.professoresalgoritmos.com

406

Ordenao Shell sort Exemplo

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

Ordenao Shell sort Exemplo

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

Ordenao Quicksort Exemplo

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

Observe o nosso exemplo:

www.professoresalgoritmos.com

428

1- Transforma a matriz em um heap

www.professoresalgoritmos.com

429

1- Transforma a matriz em um heap

www.professoresalgoritmos.com

430

1- Transforma a matriz em um heap


3

www.professoresalgoritmos.com

431

1- Transforma a matriz em um heap

www.professoresalgoritmos.com

432

Ficou assim...

www.professoresalgoritmos.com

433

2- Construo de uma matriz troca entre o primeiro e ltimo valor


15 12 6 11 10 2 3 1 8

12

11

10

15

www.professoresalgoritmos.com

434

Monto a rvore novamente e transformo em um heap


1

www.professoresalgoritmos.com

435

Monto a rvore novamente e transformo em um heap

www.professoresalgoritmos.com

436

Ficou assim...

www.professoresalgoritmos.com

437

2- Construo de uma matriz troca entre o primeiro e ltimo valor


12 11 6 8 10 2 3 1 15

11

10

12

15

www.professoresalgoritmos.com

438

Monto a rvore novamente e transformo em um heap


1

www.professoresalgoritmos.com

439

Monto a rvore novamente e transformo em um heap

www.professoresalgoritmos.com

440

Ficou assim...

www.professoresalgoritmos.com

441

2- Construo de uma matriz troca entre o primeiro e ltimo valor


11 10 6 8 1 2 3 12 15

10

11

12

15

www.professoresalgoritmos.com

442

Monto a rvore novamente e transformo em um heap


1

www.professoresalgoritmos.com

443

Monto a rvore novamente e transformo em um heap

www.professoresalgoritmos.com

444

Ficou assim...

www.professoresalgoritmos.com

445

2- Construo de uma matriz troca entre o primeiro e ltimo valor


10 8 6 3 1 2 11 12 15

10

11

12

15

www.professoresalgoritmos.com

446

Monto a rvore novamente e transformo em um heap


1

www.professoresalgoritmos.com

447

Monto a rvore novamente e transformo em um heap

www.professoresalgoritmos.com

448

Ficou assim...

www.professoresalgoritmos.com

449

2- Construo de uma matriz troca entre o primeiro e ltimo valor


8 3 6 2 1 10 11 12 15

10

11

12

15

www.professoresalgoritmos.com

450

Monto a rvore novamente e transformo em um heap


1

www.professoresalgoritmos.com

451

Ficou assim...

www.professoresalgoritmos.com

452

2- Construo de uma matriz troca entre o primeiro e ltimo valor


6 3 1 2 8 10 11 12 15

10

11

12

15

www.professoresalgoritmos.com

453

Monto a rvore novamente e transformo em um heap


1

www.professoresalgoritmos.com

454

Ficou assim...

www.professoresalgoritmos.com

455

2- Construo de uma matriz troca entre o primeiro e ltimo valor


3 2 1 6 8 10 11 12 15

10

11

12

15

www.professoresalgoritmos.com

456

Monto a rvore novamente e transformo em um heap


1

www.professoresalgoritmos.com

457

Ficou assim...

www.professoresalgoritmos.com

458

Montando a matriz percebemos que ela j est ordenada:

10

11

12

15

www.professoresalgoritmos.com

459

*Comparao entre os mtodos de ordenao


Ordem aleatria dos registros 500 11,3 16,2 1,2 1 1,5 5.000 87 124 1,6 1 1,6 10.000 161 228 1,7 1 1,6 30.000 2 1 1,6
460

Insero Seleo Shellsort Quicksort Heapsort

* 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

Comparao entre os mtodos de ordenao


Ordem ascendente dos registros 500 1 128 3,9 4,1 12,2 5.000 1 1.524 6,8 6,3 20,8 10.000 1 3.066 7,3 6,8 22,4 30.000 1 8,1 7,1 24,6
461

Insero Seleo Shellsort Quicksort Heapsort

www.professoresalgoritmos.com

Comparao entre os mtodos de ordenao


Ordem descendente dos registros 500 40,3 29,3 1,5 1 2,5 5.000 305 221 1,5 1 2,7 10.000 575 417 1,6 1 2,7 30.000 1,6 1 2,9
462

Insero Seleo Shellsort Quicksort Heapsort

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