Árvores binárias de busca - 0.5cmscc0202 - algoritmos e ... · nestecaso,existem2 opções...

Post on 08-Jan-2019

217 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Árvores Binárias de Busca

Árvores Binárias de Busca

SCC0202 - Algoritmos e Estruturas de Dados I

Prof. Fernando V. Paulovich*Baseado no material do Prof. Gustavo Batista

http://www.icmc.usp.br/~paulovicpaulovic@icmc.usp.br

Instituto de Ciências Matemáticas e de Computação (ICMC)Universidade de São Paulo (USP)

4 de novembro de 2010

Árvores Binárias de BuscaConceitos Introdutórios

Sumário

1 Conceitos Introdutórios

2 Inserção em Árvores Binárias de Busca

3 Pesquisa em Árvores Binárias de Busca

4 Remoção em Árvores Binárias de Busca

5 Conceitos Adicionais

Árvores Binárias de BuscaConceitos Introdutórios

Sumário

1 Conceitos Introdutórios

2 Inserção em Árvores Binárias de Busca

3 Pesquisa em Árvores Binárias de Busca

4 Remoção em Árvores Binárias de Busca

5 Conceitos Adicionais

Árvores Binárias de BuscaConceitos Introdutórios

Definições

Uma Árvore Binária de Busca (ABB) possui asseguintes propriedades

É uma Árvore Binária (AB)Seja S = {s1, . . . , sn} o conjunto de chaves dos nós daárvore T

Esse conjunto satisfaz s1 < . . . < snA cada nó vj ∈ T está associada uma chave distintasj ∈ S, que pode ser consultada por r(vj) = sj

Dado um nó v de T

Se vi pertence a sub-árvore esquerda de v, entãor(vi) < r(v)Se vi pertence a sub-árvore direita de v, entãor(vi) > r(v)

Árvores Binárias de BuscaConceitos Introdutórios

Definições

Em outras palavrasOs nós pertencentes à sub-árvore esquerda possuemvalores menores do que o valor associado ao nó-raiz rOs nós pertencentes à sub-árvore direita possuem valoresmaiores do que o valor associado ao nó-raiz r

Árvores Binárias de BuscaConceitos Introdutórios

Definições

Um percurso em-ordem em uma ABB resulta nasequência de valores em ordem crescenteSe invertêssemos as propriedades descritas nadefinição anterior, de maneira que a sub-árvore esquerdade um nó contivesse valores maiores e a sub-árvore direitavalores menores, o percurso em-ordem resultaria nosvalores em ordem decrescenteUma ABB criada a partir de um conjunto de valoresnão é única: o resultado depende da sequência deinserção dos dados

Árvores Binárias de BuscaConceitos Introdutórios

Definições

A grande utilidade da árvore binária de busca é armazenardados contra os quais outros dados são frequentementeverificados (busca!)Uma árvore de binária de busca é dinâmica e pode sofreralterações (inserções e remoções de nós) após ter sidocriada

Árvores Binárias de BuscaConceitos Introdutórios

Operações em ABB’s

InserçãoPesquisaRemoção

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Sumário

1 Conceitos Introdutórios

2 Inserção em Árvores Binárias de Busca

3 Pesquisa em Árvores Binárias de Busca

4 Remoção em Árvores Binárias de Busca

5 Conceitos Adicionais

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Inserção (operações em ABB’s)

Passos do algoritmo de inserçãoProcure um “local” para inserir o novo nó, começando aprocura a partir do nó-raizPara cada nó-raiz de uma sub-árvore, compare; se o novonó possui um valor menor do que o valor no nó-raiz (vaipara sub-árvore esquerda), ou se o valor é maior que ovalor no nó-raiz (vai para sub-árvore direita)Se um ponteiro (filho esquerdo/direito de um nó-raiz)nulo é atingido, coloque o novo nó como sendo filho donó-raiz

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Inserção

Para entender o algoritmo considere a inserção doconjunto de números, na sequência

17,99,13,1,3,100,400

No início a ABB está vazia!

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Inserção

O número 17 será inseridotornando-se o nó raizA inserção do 99 inicia-se naraiz. Compara-se 99 com 17Como 99 > 17, 99 deve sercolocado na sub-árvore direitado nó contendo 17 (subárvoredireita, inicialmente, nula)

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Inserção

A inserção do 13 inicia-se naraizCompara-se 13 com 17.Como 13 < 17, 13 deve sercolocado na sub-árvoreesquerda do nó contendo 17Já que o nó 17 não possuidescendente esquerdo, 13 éinserido na árvore nessaposição

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Inserção

Repete-se o procedimentopara inserir o valor 11 < 17, então será inserido nasub-árvore esquerdaChegando nela, encontra-se onó 13, 1 < 13 então ele seráinserido na sub-árvoreesquerda de 13

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Inserção

Repete-se o procedimentopara inserir o elemento 3

3 < 173 < 133 > 1

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Inserção

Repete-se o procedimentopara inserir o elemento 100

100 > 17100 > 99

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Inserção

Repete-se o procedimentopara inserir o elemento 400

400 > 17400 > 99400 > 100

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Relembrando

1 typedef struct {2 int chave;3 int valor;4 } INFO;56 typedef struct NO {7 INFO info;8 struct NO *fesq;9 struct NO *fdir;

10 } NO;1112 typedef struct {13 NO *raiz;14 } ARVORE;

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Relembrando

1 void criar(ARVORE *arv) {2 arv->raiz = NULL;3 }45 int criar_raiz(ARVORE *arv, INFO *info) {6 arv->raiz = (NO*)malloc(sizeof(NO));78 if (arv->raiz != NULL) {9 arv->raiz->fesq = NULL;

10 arv->raiz->fdir = NULL;11 arv->raiz->info = *info;12 return 1;13 }1415 return 0;16 }

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Relembrando

1 NO *inserir_direita(NO *no, INFO *info) {2 no->fdir = (NO*)malloc(sizeof(NO));34 if (no->fdir != NULL) {5 no->fdir->fesq = NULL;6 no->fdir->fdir = NULL;7 no->fdir->info = *info;8 }9

10 return no->fdir;11 }1213 NO *inserir_esquerda(NO *no, INFO *info) {14 no->fesq = (NO*)malloc(sizeof(NO));1516 if (no->fesq != NULL) {17 no->fesq->fesq = NULL;18 no->fesq->fdir = NULL;19 no->fesq->info = *info;20 }2122 return no->fesq;23 }

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Código

1 int inserir_aux(NO *no, INFO *info) {2 if (no->info.chave > info->chave) {3 if (no->fesq == NULL) {4 return (inserir_esquerda(no, info) != NULL);5 } else {6 return inserir_aux(no->fesq, info);7 }8 } else {9 if (no->fdir == NULL) {

10 return (inserir_direita(no, info) != NULL);11 } else {12 return inserir_aux(no->fdir, info);13 }14 }15 }161718 int inserir(ARVORE *arv, INFO *info) {19 if (arv->raiz == NULL) {20 return criar_raiz(arv, info);21 } else {22 return inserir_aux(arv->raiz, info);23 }24 }

Árvores Binárias de BuscaInserção em Árvores Binárias de Busca

Exercícios

Criar um método iterativo para inserção em ABB

Árvores Binárias de BuscaPesquisa em Árvores Binárias de Busca

Sumário

1 Conceitos Introdutórios

2 Inserção em Árvores Binárias de Busca

3 Pesquisa em Árvores Binárias de Busca

4 Remoção em Árvores Binárias de Busca

5 Conceitos Adicionais

Árvores Binárias de BuscaPesquisa em Árvores Binárias de Busca

Pesquisa (operações em ABB’s)

Passos do algoritmo de buscaComece a busca a partir do nó-raizPara cada nó-raiz de uma sub-árvore compare: se o valorprocurado é menor que o valor no nó-raiz (continua pelasub-árvore esquerda), ou se o valor é maior que o valorno nó-raiz (sub-árvore direita)Caso o nó contendo a chave pesquisada seja encontrado,retorne true e o nó pesquisado, caso contrário retornefalse

Árvores Binárias de BuscaPesquisa em Árvores Binárias de Busca

Pesquisa

1 int buscar_aux(NO *no, INFO *info) {2 if (no == NULL) {3 return 0;4 } else {5 if (no->info.chave > info->chave) {6 return buscar_aux(no->fesq, info);7 } else if (no->info.chave < info->chave) {8 return buscar_aux(no->fdir, info);9 } else {

10 info->valor = no->info.valor;11 return 1;12 }13 }14 }1516 int buscar(ARVORE *arv, INFO *info) {17 return buscar_aux(arv->raiz, info);18 }

Árvores Binárias de BuscaPesquisa em Árvores Binárias de Busca

Exercícios

Criar um método iterativo para busca em ABB

Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca

Sumário

1 Conceitos Introdutórios

2 Inserção em Árvores Binárias de Busca

3 Pesquisa em Árvores Binárias de Busca

4 Remoção em Árvores Binárias de Busca

5 Conceitos Adicionais

Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca

Remoção (operações em ABB’s)

Casos a serem considerados no algoritmo de remoção denós de uma ABB

Caso 1: o nó é folhaO 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-árvoresO nó contendo o menor valor da sub-árvore direita pode“ocupar” o lugarOu o maior valor da sub-árvore esquerda pode “ocupar”o lugar

Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca

Remoção - Caso 1

Caso o valor a ser removidoseja o 15Pode ser removido semproblema, não requer ajustesposteriores

Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca

Remoção - Caso 1

Os nós com os valores 10 e 13também podem ser removidos

Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca

Remoção - Caso 2

Removendo-se o nó com ovalor 5Como ele possui somente asub-árvore direita, o nócontendo o valor 6 pode“ocupar” o lugar do nóremovido

Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca

Remoção - Caso 2

Esse segundo caso é análogo,caso existisse um nó comsomente uma sub-árvoreesquerda

Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca

Remoção - Caso 3

Eliminando-se o nó de chave11Neste caso, existem 2 opções

O nó com chave 10 pode“ocupar” o lugar donó-raiz, ouO nó com chave 12 pode“ocupar” o lugar do nó-raiz

Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca

Remoção

1 int remover_aux(ARVORE *arv, NO *pant, NO *prem, int chave) {2 if (prem == NULL) { //chave não encontrada3 return 0;4 } else if (prem->info.chave > chave) {5 return remover_aux(arv, prem, prem->fesq, chave);6 } else if (prem->info.chave < chave) {7 return remover_aux(arv, prem, prem->fdir, chave);8 } else {9 //tem apenas um filho

10 if (prem->fdir == NULL || prem->fesq == NULL) {11 //pega o único filho não nulo12 NO *pprox = (prem->fdir == NULL) ? prem->fesq : prem->fdir;1314 if (pant == NULL) arv->raiz = pprox;15 else if (pant->fdir == prem) pant->fdir = pprox;16 else pant->fesq = pprox;1718 free(prem);19 } else { //tem os dois filhos20 //troca com o maximo da subarvore esquerda21 trocar_max_esq(prem, prem, prem->fesq);22 }2324 return 1;25 }26 }

Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca

Remoção

Troca com o máximo elemento da sub-árvore esquerda

1 void trocar_max_esq(NO *prem, NO *pant, NO *pno) {2 if (pno->fdir != NULL) {3 trocar_max_esq(prem, pno, pno->fdir);4 } else {5 //raiz da arvore esquerda tem filhos a direita6 if (pant != prem) pant->fdir = pno->fesq;7 else pant->fesq = pno->fesq;89 prem->info = pno->info;

10 free(pno);11 }12 }

Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca

Remoção

1 int remover(ARVORE *arv, int chave) {2 if (arv->raiz != NULL) {3 return remover_aux(arv, NULL, arv->raiz, chave);4 }5 return 0;6 }

Árvores Binárias de BuscaConceitos Adicionais

Sumário

1 Conceitos Introdutórios

2 Inserção em Árvores Binárias de Busca

3 Pesquisa em Árvores Binárias de Busca

4 Remoção em Árvores Binárias de Busca

5 Conceitos Adicionais

Árvores Binárias de BuscaConceitos Adicionais

Complexidade da busca em ABB

Pior casoNúmero de passos é determinado pela altura da árvoreÁrvore degenerada possui altura igual a n

Altura da árvore depende da sequência de inserção daschaves

O que acontece se uma sequência ordenada de chaves éinserida

Busca eficiente se árvore razoavelmente balanceada

Árvores Binárias de BuscaConceitos Adicionais

Árvores Binárias de Busca

ABB “aleatória”Nós externos: descendentes dos nós folha (não estão, defato, na árvore)Uma árvore A com n nós possui n+ 1 nós externosUma inserção em A é considerada “aleatória” se ela temprobabilidade igual de acontecer em qualquer um dosn+ 1 nós externosUma ABB aleatória com n nós é uma árvore resultantede n inserções aleatórias sucessivas em uma árvoreinicialmente vazia

Árvores Binárias de BuscaConceitos Adicionais

Árvores Binárias de Busca

É possível demonstrar que para uma ABB “aleatória” onúmero esperado de comparações para recuperar umregistro qualquer é cerca de 1, 39 ∗ log2(n)

39% pior do que o custo do acesso em uma árvorebalanceada

Pode ser necessário garantir um melhor balanceamento daABB para melhor desempenho na busca

Árvores Binárias de BuscaConceitos Adicionais

Árvores Binárias de Busca

As complexidade das operações de inserção e remoçãotambém dependem da eficiência da buscaO tempo necessário para realizar essas operações dependeprincipalmente do tempo necessário para encontrar aposição do nó a ser inserido/removidoA remoção ainda pode requerer encontrar o nó máximoda sub-árvore esquerda (troca_max_esq(...)), mas onúmero de operações realizadas é sempre menor ou igualdo que a altura da árvore

Árvores Binárias de BuscaConceitos Adicionais

Exercícios

Quais sequências de inserções criam uma ABBdegenerada? Quais sequências criam uma ABBbalanceada?Implemente um TAD para árvores binárias de busca comas operações discutidas em aulaImplemente uma versão iterativa do algoritmo deremoção em ABBs

Árvores Binárias de BuscaConceitos Adicionais

Exercícios

Escreva uma função que verifique se uma árvore bináriaestá perfeitamente balanceada

O número de nós de suas sub-árvores esquerda e direitadifere em, no máximo, 1

top related