Você está na página 1de 39

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Estruturas de Dados
rvores Binrias de Pesquisa

Andr Gustavo dos Santos


Departamento de Informtica Universidade Federal de Viosa

INF 610 - 2013/1

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Dicionrio
Denio Um Dicionrio um tipo abstrato de dados para pesquisa. usado para recuperar informao a partir de uma grande massa de informao previamente armazenada A informao dividida em registros Cada registro possui uma chave a ser usada na pesquisa O objetivo da pesquisa encontrar uma ou mais ocorrncias de registros com chaves iguais chave de pesquisa Pesquisa com sucesso x Pesquisa sem sucesso

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Dicionrio

Operaes principais: Inicializar Pesquisar Inserir Retirar Outras operaes: Ordenar Unir ...

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Dicionrio

Estruturas mais utilizadas para implementar o TAD Dicionrio: lista (arranjo) rvore binria de pesquisa tabela hash A escolha da estrutura de dados e do mtodo de pesquisa associado dependem principalmente: da quantidade de dados envolvidos da frequncia de inseres e retiradas

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Pesquisa sequencial

Mtodo de pesquisa mais simples a partir do primeiro registro, pesquise sequencialmente at encontrar a chave procurada; ento pare.

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Pesquisa sequencial - Estrutura de Dados


#define MAX 100 typedef int TipoChave; typedef struct TipoItem { TipoChave chave; /* outros componentes */ }; typedef struct TipoDicionario { TipoItem item[MAX+1]; int tamanho; }
Obs.: armazenaremos os itens nas posies 1 a MAX.

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Pesquisa sequencial - implementao

Operaes I NICIALIZAR, I NSERIR e R ETIRAR semelhantes s operaes do TAD Lista.

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Pesquisa sequencial - implementao

Operao P ESQUISAR int Pesquisar(TipoDicionario T, TipoChave x) { for(int i=1; i<=T.tamanho; i++) if (T.item[i].chave == x) return i; //Pesquisa com sucesso return 0; //Pesquisa sem sucesso }

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Pesquisa sequencial - anlise de complexidade

Pesquisa com sucesso: melhor caso: C (n) = 1 pior caso: C (n) = n caso mdio: C (n) = (n + 1)/2 Pesquisa sem sucesso: C (n) = n

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Pesquisa sequencial

Note que a complexidade a mesma se a pesquisa for feita de trs pra frente int Pesquisar(TipoDicionario T, TipoChave x) { for(int i=T.tamanho; i>0; i--) if (T.item[i].chave == x) return i; //Pesquisa com sucesso return 0; //Pesquisa sem sucesso }

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Pesquisa sequencial

a mesma tambm se a comparao de chaves for feita no teste do lao

int Pesquisar(TipoDicionario T, TipoChave x) { for(int i=T.tamanho; i>0 && T.item[i].chave!=x; i--); return i; }
Obs.: a pesquisa para no ndice 0 ou ao encontrar um item com a chave.

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Pesquisa sequencial rpida


O uso de sentinela simplica o lao: int Pesquisar(TipoDicionario T, TipoChave x) { T.item[0].chave = x; //Sentinela for(int i=T.tamanho; T.item[i].chave != x; i--); return i; } O sentinela na posio 0 elimina o teste de limite do arranjo, garantindo uma pesquisa com sucesso A complexidade a mesma, mas o lao extremamente simples, diminuindo a constante (custo de cada iterao)

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Pesquisa sequencial

A pesquisa sequencial a melhor escolha para um dicionrio com poucos itens Note que o cdigo mostrado no suporta pesquisa por mais de uma ocorrncia... ...se for necessrio tal tipo de pesquisa, pode-se incluir um argumento a mais, para conter o ndice a partir do qual se quer pesquisar. Para encontrar outra ocorrncia, refazer a pesquisa a partir do item seguinte ao ltimo encontrado.

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Pesquisa binria

A pesquisa numa lista pode ser mais eciente se os itens forem mantidos em ordem Para pesquisar uma chave na lista: Compare a chave com a do item presente no meio da lista Se a chave menor ento pesquise na 1a metade da lista Se a chave maior ento pesquise na 2a metade da lista Repita o processo at encontrar a chave, ou car apenas um item e sua chave for diferente da pesquisada

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Pesquisa binria - implementao

Exerccio #1 :D

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Pesquisa binria
Complexidade melhor caso: C (n) = 1 pior caso: C (n) = log n caso mdio: C (n) log n Em comparao com a pesquisa sequencial: Complexidade bem menor no pior caso e caso mdio Porm, o custo para manter o dicionrio ordenado alto... ... Insero e retirada podem causar movimentao de muitos itens (n no pior caso) Ento no deve ser usada em aplicaes muito dinmicas

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore
rvore uma estrutura de dados muito eciente para armazenar informao. Adequada quando necessrio considerar todos ou uma combinao de: Acesso direto e sequencial ecientes Facilidade de insero e de retirada de itens Boa taxa de utilizao de memria Para cada item acima, existe uma estrutura mais eciente, porm com pior desempenho nas demais. A rvore apresenta um bom compromisso de todos os itens.

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore

Denio Uma rvore coleo nita de n nodos (n 0). Se n = 0 dizemos que a rvore nula. Seno, a rvore possui: um nodo especial, chamado raiz uma partio dos demais nodos em T1 , T2 , . . . , Tk subrvores disjuntas
Obs.: note que todo nodo de uma rvore raiz de alguma subrvore. note ainda que cada subrvore Ti uma rvore, a denio recursiva!

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore

** Desenho

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore

Terminologia: grau de um nodo grau de uma rvore folha lho/pai ancestral/descendente nvel de um nodo altura de uma rvore

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore

Uma rvore estabelece uma relao hierrquica entre os itens uma estrutura bastante usada em cincia da computao organizao de informaes em bancos de dados estrutura sinttica de programas fontes em compiladores tcnicas backtracking e branch-and-bound e muitas outras aplicaes entre elas, estrutura de dados eciente para dicionrios com grande volume de dados

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria

Denio Uma rvore binria um rvore que pode ser nula ou ento possuir: um nodo especial, chamado raiz uma partio dos demais nodos em T1 e T2 , duas rvores binrias disjuntas denominadas subrvore esquerda e subrvore direita
Obs.: ou seja, uma rvore de grau (no mximo) 2.

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria

** Desenho

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa


Denio Uma rvore binria de pesquisa um rvore binria com as propriedades: um nodo especial, chamado raiz todos os itens com chaves menores que a da raiz esto na subrvore da esquerda todos os itens com chaves maiores que a da raiz esto na subrvore da direita as subrvores tambm so rvores binrias de pesquisa
Obs.: itens com chaves iguais podem ser colocadas na subrvore da direita, por exemplo. Os da esquerda seriam menores, e os da direita no menores.

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa

** Desenho

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa - implementao


Estrutura do item typedef int TipoChave; typedef struct TipoItem { TipoChave chave; // outros componentes };

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa - implementao


Estrutura do nodo e da rvore
//A arvore e um apontador para um nodo, //... no caso seu nodo raiz

typedef struct TipoNodo* TipoArvore;


//Um nodo possui um item //... e apontadores para suas subarvores

typedef struct TipoNodo { TipoItem item; TipoArvore subArvEsq; TipoArvore subArvDir; };

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa - implementao

Operao I NICIALIZA void Inicializa(TipoArvore &a) { a = NULL; }

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa - implementao


Operao P ESQUISA

//Pesquisa e retorna um item com a chave x pesquisada TipoItem* Pesquisa(TipoArvore a, TipoChave x) { if (a == NULL) return NULL; //sem sucesso if (x == a->item.chave) return &(a->item); //com sucesso if (x < a->item.chave) return Pesquisa(a->subArvEsq, x); //pesquisa na subarv if (x > a->item.chave) return Pesquisa(a->subArvDir, x); //pesquisa na subarv }

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa - implementao


Operao I NSERE

//Insere um item x na posicao apropriada da arvore a void Insere(TipoArvore &a, TipoItem x) { if (a == NULL) { //Encontrou local de insercao a = new TipoNodo; //Cria novo nodo: - a arvore aponta a->item = x; //- ele contem o item inserido a->subArvEsq = NULL;//- nao tem subarvore esquerda a->subArvDir = NULL;//- nem subarvore direita return; } if (x.chave < a->item.chave) return Insere(a->subArvEsq, x); //insere na subarvore e if (x.chave >= a->item.chave) return Insere(a->subArvDir, x); //insere na subarvore d }

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa - implementao


Operao C AMINHAMENTO
//Caminha na arvore (percorre todos os nodos //... e os imprime em-ordem void Caminhamento(TipoArvore a) { if (a == NULL) return; Caminhamento(a->subArvEsq); cout << a->item.chave << endl; //imprime demais componentes Caminhamento(a->subArvDir); } Percorre toda a rvore, imprimindo todos os itens

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa - implementao


Operao R ETIRA Casos a considerar na retirada: Nodo retirado no tem lhos Nodo retirado tem um nico lho Nodo retirado tem dois lhos

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa - implementao


Operao R ETIRA ** Desenho

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa - implementao


Operao R ETIRA Casos a considerar na retirada: Nodo retirado no tem lhos
basta retir-lo (seu pai aponta para NULL)

Nodo retirado tem um nico lho


substitui-lo pelo lho (seu pai aponta para seu lho)

Nodo retirado tem dois lhos


substitui-lo pelo lho de maior chave da subrvore esquerda ou pelo lho de menor chave da subrvore direita ou seja, pelo descendente mais direita da subrvore esquerda ou pelo descendente mais esquerda da subrvore direita

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa - implementao


Operao R ETIRA

Exerccio #2 :(

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvore binria de pesquisa

Complexidade melhor caso: C (n) = 1 pior caso: C (n) = altura da rvore... (no pior caso, n) A altura depende muito do formato (ordem de insero)!!! Se os itens forem bem distribudos nas subrvores, a altura pode ser log n, e seria esse o pior caso.

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

rvores balanceadas

Numa rvore completamente balanceada, a diferena de altura das subrvores esquerda e direita no mximo 1. Dessa forma a operao P ESQUISA tem pior caso na ordem de log n. Entretanto, manter a rvore completamente balanceada todo o tempo aumenta a complexidade das operaes I NSERE e R ETIRA Soluo: rvores quase balanceadas

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Exerccios de implementao

Exerccio #1 Implementar a funo P ESQUISA B INARIA em arranjo ordenado Exerccio #2 Implementar a funo R ETIRA da rvore binria de pesquisa

Introduo

Pesquisa sequencial

Pesquisa binria

rvore de pesquisa

rvores balanceadas

Exerccios

Exerccios de implementao
Exerccio #3 Implementar uma funo A LTURA, que retorna a altura de uma rvore binria de pesquisa Exerccio #4 Implementar uma funo C ONT F OLHAS, que retorna o nmero de folhas Exerccio #5 Implementar uma funo C ONT I NTERNOS, que retorna o nmero de ns internos (no folhas) Exerccio #6 Implementar uma funo R ETIRA M AIOR, que retira o item com maior chave