Escolar Documentos
Profissional Documentos
Cultura Documentos
Atps Classificacao e Pesquisa
Atps Classificacao e Pesquisa
ATIVIDADES PRTICAS
SUPERVISIONADAS - ETAPA 2
Niteri
2015
Passo 1
Fazer leitura de material disponibilizado.
Passo 2
Fazer a discusso em equipe e tomar nota dos principais diferenciais entre os
modelos de rvores apresentados nas leituras realizadas, focando na implementao das
rvores no que tange:
Insero de dados em rvores Binrias.
ordenao. Aqui, temos um exemplo de como usaramos a rvore para ordenar. Veja o
exemplo:
Exemplo de implementao:
//todosnaonulos
def organiza(valores):
_arvore = None
if valores is not None:
_arvore = []
for _v in valores:
insere(_arvore, _v)
_res = []
percorre(_arvore, lambda valor: _res.append(valor))
return _res
Remoo de dados em rvores Binrias.
Para a remoo de um n em uma rvore binria, devem ser considerados trs
casos:
Caso 1: o n folha O n pode ser retirado sem problema;
Caso 2: o n possui uma sub-rvore (esq./dir.) O n-raiz da sub-rvore (esq./dir.)
ocupa o lugar do n retirado;
Caso 3: o n possui duas sub-rvores O n contendo o menor valor da sub-rvore direita
pode ocupar o lugar; ou o maior valor da sub-rvore esquerda pode ocupar o lugar
Exemplo de implementao
def exclusao_em_arvore_binaria(n_arvore, valor):
if n_arvore is None: return None # Valor no encontrado
esquerda, n_valor, direita = n_arvore.esquerda, n_arvore.valor, n_arvore.direita
if n_valor == valor:
if esquerda is None:
return direita
elif direita is None:
return esquerda
else:
valor_max, novo_esquerda = busca_max(esquerda)
return TreeNode(novo_esquerda, valor_max, direita)
elif valor < n_valor:
return TreeNode(exclusao_em_arvore_binaria(esquerda, valor), n_valor, direita)
else:
return TreeNode(esquerda, n_valor, exclusao_em_arvore_binaria(direita, valor))
def busca_max(n_arvore):
esquerda, n_valor, direita = n_arvore.esquerda, n_arvore.valor, n_arvore.direita
if direita is None: return (n_valor, esquerda)
else:
(valor_max, novo_direita) = busca_max(direita)
return (valor_max, (esquerda, n_valor, novo_direita))
Passo 3
printf("Rua.........:%s\n", pRaiz->rua);
printf("Residencia..:%s\n", pRaiz->residencia);
printf("---------------------------\n");
EmOrdem(pRaiz->direita);
}
}
// Exibio dos valores seguindo a seguinte ordem:
// Raiz - Subarvore Esquerda - Subarvore Direita
void PreOrdem(No *pRaiz){
if(pRaiz != NULL){
printf("---------------------------\n");
printf("Medidor.....:%d\n", pRaiz->medidor);
printf("Rua.........:%s\n", pRaiz->rua);
printf("Residencia..:%s\n", pRaiz->residencia);
printf("---------------------------\n");
PreOrdem(pRaiz->esquerda);
PreOrdem(pRaiz->direita);
}
}
// Exibio dos valores seguindo a seguinte ordem:
// Subarvore Esquerda - Subarvore Direita - Raiz
void PosOrdem(No *pRaiz){
if(pRaiz != NULL){
PosOrdem(pRaiz->esquerda);
PosOrdem(pRaiz->direita);
printf("---------------------------\n");
printf("Medidor.....:%d\n", pRaiz->medidor);
printf("Rua.........:%s\n", pRaiz->rua);
printf("Residencia..:%s\n", pRaiz->residencia);
printf("---------------------------\n");
}
}
DE RESIDENCIAS
|\n");
printf("---------------------------\n");
printf("---------------------------\n");
printf("MENU PRINCIPAL
\n");
\n");
\n");
printf("---------------------------\n");
scanf("%d",&op);
switch(op){
\n");
case 1:
printf("Digite a rua da residencia: \n");
scanf("%s",&rua);
printf("Digite o numero da residencia: \n");
scanf("%s",&res);
printf("Digite o medidor de consumo: \n");
scanf("%d",&med);
inserir(&arvore, rua, med, res);
break;
case 2:
printf("Escolha a forma de exibio: \n");
printf("1 - Pre-Ordem \n");
printf("2 - Em Ordem \n");
printf("3 - Pos Ordem \n");
scanf("%d",&es);
switch (es){
case 1:
PreOrdem(arvore);
break;
case 2:
EmOrdem(arvore);
break;
case 3:
PosOrdem(arvore);
break;
}
break;
case 3:
printf("Qual valor do medidor de consumo deseja pesquisar? \n");
scanf("%d",&busca);
aux= arvorebusca(arvore, busca);
if(aux->medidor == busca){
printf("O valor foi encontrado \n");
printf("---------------------------\n");
printf("Medidor.....:%d\n", aux->medidor);
printf("Rua.........:%s\n", aux->rua);
printf("Residencia..:%s\n", aux->residencia);
printf("---------------------------\n");
}
else
printf("Valor nao encontrado \n");
break;
case 4:
printf("Qual valor do medidor de consumo deseja remover? \n");
scanf("%d",&busca);
remover(arvore,busca);
break;
}
}
system("PAUSE");
return 0;
}
ETAPA 4
TEMA NOVO: MergeSort. Tabelas Hash estticas. Tabelas Hash dinmicas.
- Toda a etapa ser transformada em pesquisa terica.
- De cada um dos temas propostos, dever ser pesquisado o funcionamento, principais
caractersticas, principais aplicaes e exemplos de implementao em C.
Mergesort
O mergesort, ou ordenao por mistura, um exemplo de algoritmo de
ordenao do tipo dividir-para-conquistar.
Sua ideia bsica consiste em Dividir (o problema em vrios subproblemas e
resolver esses subproblemas atravs da recursividade) e conquistar (aps todos os
subproblemas terem sido resolvidos ocorre a conquista que a unio das resolues dos
subproblemas). Como o algoritmo do MergeSort usa a recursividade em alguns
problemas esta tcnica no muito eficiente devido ao alto consumo de memria e
tempo de execuo.
Os trs passos teis dos algoritmos dividir-para-conquistar, ou divide and
conquer, que se aplicam ao mergesort so:
Dividir: Dividir os dados em subsequncias pequenas;
Conquistar: Classificar as duas metades recursivamente aplicando o merge sort;
Combinar: Juntar as duas metades em um nico conjunto j classificado.
Implementao em C
Exemplo 1 :
if (tmp == NULL) {
exit(1);
}
mid = vecSize / 2;
i = 0;
j = mid;
k = 0;
while (i < mid && j < vecSize) {
if (vec[i] <= vec[j]) {
tmp[k] = vec[i++];
}
else {
tmp[k] = vec[j++];
}
++k;
}
if (i == mid) {
while (j < vecSize) {
tmp[k++] = vec[j++];
}
}
else {
while (i < mid) {
tmp[k++] = vec[i++];
}
}
for (i = 0; i < vecSize; ++i) {
vec[i] = tmp[i];
}
free(tmp);
}
void mergeSort(int vec[], int vecSize) {
int mid;
if (vecSize > 1) {
mid = vecSize / 2;
mergeSort(vec, mid);
mergeSort(vec + mid, vecSize - mid);
merge(vec, vecSize);
}
}
Tabelas hash esttica
-
A remoo de um registro feita usando a funo hash para localizar o bucket onde
o registro se encontra. Uma vez localizado, o registro removido de acordo com a
estratgia de remoo sendo adotada.
No arquivo mantido por uma funo hash as pginas so mantidas com 80% de
ocupao no momento em que os registros so inicialmente organizados. O objetivo
deixar algum espao para futuras inseres e minimizar pginas adicionais
medida que o nmero de dados no arquivo aumenta.
A organizao dos registros num hashed file pode exigir mais pginas que num heap
file
Exemplo 1:
Considere uma relao cliente (cod, nome, idade);
Considere que a chave de pesquisa seja idade;
Considere que o hashed file seja divido em 4 buckets e que a funo hash seja
h(idade) = idade mod 4;
Anlise de custo
- Varredura (scan)
Custo =1.25* NP*(TP+TR*NR)
-
b)
Custo = H+TP+0,5*(NR*TR)
Custo = 1,25*NP*(TP+TR*NR)
- Insero
O registro ser inserido no final da pgina do grupo definido pela funo hash.
- Remoo
Remove a primeira ocorrncia do registro
Custo = H+ TP+0,5*(NR*TR)+TR+TP
No exigido que cada bucket esteja associado a apenas uma entrada no diretrio de
buckets, ou seja, vrios buckets podem compartilhar uma mesma entrada no
diretrio de buckets se esta for suficiente para armazenar todos os registros dos
buckets associados;
A funo hash h calcula para cada chave de pesquisa uma sequncia de N bits para
algum valor alto de N., No entanto a identificao dos buckets num determinado
momento pode precisar de um nmero menor de bit, digamos i bits. Neste caso o
dirtrio de buckets ter 2i entradas quando i for o nmero de bits usados para
identificar os buckets
Exemplo:
Considere a seguinte situao: suponha que SEQ=4, ou seja, a funo hash
produz uma sequncia de 4 bits (mximo de 16 buckets) e at o momento apenas 1 bit
est sendo utilizado (foram inseridos os registros 1, 2 e 3 sabendo que h (k 1) = 0001, h
(k2)=1001 e h (k3)=1100, onde kn a chave de pesquisa do registro n):
i=1
j
0001 (reg1)
0
1
j
1001 (reg2)
Diretrio de
de dados)
1
buckets
1100 (reg3)
buckets (pginas
1.
Note que esta diviso pode no resolver o problema uma vez que todos os
registros podem ter o mesmo (j+1) esimo bit. Neste caso outras divises sero
necessrias.
Se j=i ento (no h mais entradas disponveis no diretrio de buckets apenas uma
entrada aponta para o bucket):
-
Exemplo:
i=2
j
0001
00
01
10
11
1001
1100
O registro dever ser inserido na segunda pgina, como agora j<i, ento:
i=2
j
0001
00
01
1001
10
1010
11
1100
Exemplo 2:
Insira agora os registros t e s, cujas funes hash so: h (t) =0000 e h (s) = 0111.
O registro t deve ser colocado no primeiro bucket de acordo com o diretrio de buckets.
O registro s tambm deve ser colocado no primeiro bucket, mas este est cheio. Como
j<i, basta dividir o primeiro bucket:
i=2
0001
0000
2
00
01
10
11
1001
0111
1010
1100
Vantagens:
Apenas uma pgina de dados deve ser buscada para cada registro a ser acessado.
Desvantagens:
1. O crescimento do diretrio de buckets exponencial, o que compromete na
etapa de insero em tempo.
2. O diretrio de buckets pode ficar grande o suficiente que precise ser
armazenado em disco, o que provoca mais acessos de I/O para acessar um registro.
3. O espao para suportar o diretrio de buckets pode ser muito maior do que o
necessrio, quando a ocupao das pginas pequena.
Referncias bibliogrficas
Livro texto:
ZIVIANI, Nivio. Projeto de Algoritmos: com implementao em Pascal e C.. 2 ed.
So Paulo: Pioneira Thomson Learning, 2004.
VELOSO, Paulo A. S. Estrutura de Dados. 1 ed. So Paulo: Campus, 1983.
CORMEN, Thomas H. Algoritmos: teoria e prtica. 1 ed. Rio de Janeiro: CAMPUS,
2002. Complementar SCHILDT, Herbert. C Completo e Total. 3 ed. So Paulo:
Pearson Education, 2005.
CELES, Waldemar; CERQUEIRA, Renato. Introduo a Estruturas de Dados: com
tcnicas de programao em C. 4 ed. Rio de Janeiro: Elsevier, 2004
WIRTH, Niklaus. Algoritmos e Estruturas de Dados. 1 ed. Rio de Janeiro: LTC, 1989
TENENBAUM, Aaron M; SOUZA, Tereza Cristina Flix de. Estruturas de Dados
usando C. 1 ed. So Paulo: Makron Books,1995.
Material Complementar:
http://pt.wikipedia.org/wiki/%C3%81rvore_bin%C3%A1ria
http://equipe.nce.ufrj.br/adriano/c/apostila/arvore.htm
http://pt.slideshare.net/renatopaschoal/rvores-binrias-balanceadas
https://www.youtube.com/watch?v=MiUDxjVMeow
http://pt.wikibooks.org/wiki/Programar_em_C/%C3%81rvores_bin
%C3%A1rias
http://pt.wikipedia.org/wiki/Tabela_de_dispers%C3%A3o
http://pt.slideshare.net/CriatividadeZeroDocs/aula-sobre-tabela-hash
http://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node26.html
http://pt.wikibooks.org/wiki/Algoritmos_e_Estruturas_de_Dados/Tabela_de_Ha
sh