Árvores binárias de pesquisa com balanceamento algoritmos e estruturas de dados ii
TRANSCRIPT
![Page 1: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/1.jpg)
Árvores binárias de pesquisa com balanceamento
Algoritmos e Estruturas de Dados II
![Page 2: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/2.jpg)
2
Árvores binárias de pesquisa
Pior caso para uma busca é O(n)
3
1
4
5
6
2
Ordem de inserção:1 3 2 4 5 6
![Page 3: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/3.jpg)
3
Árvore Binária Balanceada
Uma árvore binária está balanceada se e somente se para todo nó, as alturas de suas duas sub-árvores diferem de no máximo 1.
Objetivo: Funções para pesquisar, inserir e retirar
eficientes O(lg(n))
Problema: manter árvore completamente balanceada após cada inserção é muito caro
![Page 4: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/4.jpg)
4
Árvore Binária Balanceada
Exemplo: Para inserir a chave 1 na árvore à esquerda e manter a árvore completamente balanceada precisamos movimentar todos os nós
![Page 5: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/5.jpg)
5
Árvores “Quase Balanceadas”
Solução intermediária que mantém a árvore “quase balanceada”, em vez de tentar manter a árvore completamente balanceada
Manter a altura da árvore pequena diante de inserções e remoções arbitrárias.
Ex: Árvores AA, AVL, Red-Black (ou SBB), Splay, Treap, etc.
![Page 6: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/6.jpg)
6
Árvores SBB
Árvore SBB Árvore binária de busca. Os ponteiros à esquerda ou direita podem ser do
tipo horizontal ou vertical. Todos os caminhos da raiz até cada nó externo
possuem o mesmo número de apontadores verticais
Todos os nós, exceto aqueles no último nível, têm dois filhos
Não podem existir dois apontadores horizontais sucessivos
![Page 7: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/7.jpg)
7
Árvores SBB – estrutura
#define SBB_VERTICAL 0#define SBB_HORIZONTAL 1 struct sbb { struct registro reg; struct sbb *esq; struct sbb *dir; int esqtipo; int dirtipo;}
![Page 8: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/8.jpg)
8
Pesquisa em árvore SBB
Idêntica à pesquisa em uma árvore de busca binária não balanceada Ignoramos o tipo (horizontal ou vertical) dos
apontadores
![Page 9: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/9.jpg)
9
Inserção numa árvore SBB
A chave a ser inserida é sempre inserida horizontalmente na posição adequada
Dependendo da situação anterior à inserção podem aparecer dois apontadores horizontais
Transformação local para manter as propriedades da árvore SBB
Inserção do 4, 6, 8, 11?
![Page 10: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/10.jpg)
10
Métodos para reorganizar casos onde aparecem dois ponteiros horizontais consecutivos Esquerda-esquerda (e direita-direita)
Esquerda-direita (e direita-esquerda)
Transformações para manter propriedadas da árvore SBB
![Page 11: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/11.jpg)
11
Exemplo de inserção em árvore SBB Inserir chaves 7, 10, 5, 2, 4, 9, 3, 6
![Page 12: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/12.jpg)
12
Transformações para manter propriedadas da árvore SBB - código
void ee(struct sbb *ptr) {struct sbb *no = ptr;struct sbb *esq = no->esq;
no->esq = esq->dir; esq->dir = no; esq->esqtipo = SBB_VERTICAL; no->esqtipo = SBB_VERTICAL; &ptr = esq;}
ptr
noesq
x
x
ptr
![Page 13: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/13.jpg)
13
Transformações para manter propriedadas da árvore SBB - código
void dd(struct sbb *ptr) {struct sbb *no = ptr;struct sbb *dir = no->dir;
no->dir = dir->esq; dir->esq = no; dir->dirtipo = SBB_VERTICAL; no->dirtipo = SBB_VERTICAL; &ptr = dir;} ptr
1 2 3
x
ptrdirno
x
![Page 14: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/14.jpg)
14
Transformações para manter propriedadas da árvore SBB - código
void ed(struct sbb *ptr) {struct sbb *no = ptr;struct sbb *esq = no->esq;struct sbb *dir = esq->dir;
esq->dir = dir->esq; no->esq = dir->dir; dir->esq = esq; dir->dir = no; esq->dirtipo = SBB_VERTICAL; no->esqtipo = SBB_VERTICAL; &ptr = dir;}
ptr
noesq dir
x y
x y
ptr
![Page 15: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/15.jpg)
15
Transformações para manter propriedadas da árvore SBB - código
void de(struct sbb *ptr) {struct sbb *no = ptr;struct sbb *dir = no->dir;struct sbb *esq = dir->esq;
no->dir = esq->dir; dir->esq = esq->dir; esq->esq = no; esq->dir = dir; dir->esqtipo = SBB_VERTICAL; no->dirtipo = SBB_VERTICAL; &ptr = dir;}
esq
1 2 3
x
ptrdir
no
y
ptr
x y
![Page 16: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/16.jpg)
16
Inserção em árvores SBBvoid iinsere(struct registro reg, struct sbb **ptr, int *incli, int *fim) { /* adiciona, pois encontrou uma folha */ if(*ptr == NULL) iinsere_aqui(reg, ptr, incli, fim);
/* busca na sub-árvore esquerda */ } else if(reg.chave < *ptr->reg.chave) { iinsere(reg, &(*ptr->esq), &(*ptr->esqtipo), fim); if(*fim) return; if(*ptr->esqtipo == SBB_VERTICAL) { *fim = TRUE; } else if(*ptr->esq->esqtipo == SBB_HORIZONTAL) { ee(ptr); *incli = SBB_HORIZONTAL; } else if(*ptr->esq->dirtipo == SBB_HORIZONTAL) { ed(ptr); *incli = SBB_HORIZONTAL; } } /* continua */
![Page 17: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/17.jpg)
17
Inserção em árvores SBB /* busca na sub-árvore direita */ } else if(reg.chave > (*ptr)->reg.chave) { iinsere(reg, &(*ptr->dir), &(*ptr->dirtipo), fim); if(*fim) return; if(*ptr->dirtipo == SBB_VERTICAL) { *fim = TRUE; } else if(*ptr->dir->dirtipo == SBB_HORIZONTAL) { dd(ptr); *incli = SBB_HORIZONTAL; } else if(*ptr->dir->esqtipo == SBB_HORIZONTAL) { de(ptr); *incli = SBB_HORIZONTAL; }
/* chave já existe */ } else { printf(“erro: chave já está na árvore.\n”); *fim = TRUE; } }
![Page 18: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/18.jpg)
18
Inserção em árvores SBBvoid iinsere_aqui(struct registro reg, struct sbb **ptr, int *incli, int *fim) {
struct sbb *no = malloc(sizeof(struct sbb)); no->reg = reg; no->esq = NULL; no->dir = NULL; no->esqtipo = SBB_VERTICAL; no->dirtipo = SBB_VERTICAL; *ptr = no; *incli = SBB_HORIZONTAL; *fim = FALSE;}
![Page 19: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/19.jpg)
19
Inserção em árvores SBB
void insere(struct registro reg, struct sbb **raiz){ int fim = FALSE; int inclinacao = SBB_VERTICAL; iinsere(reg, raiz, &inclinacao, &fim);}
void inicializa(struct sbb **raiz){ *raiz = NULL;}
![Page 20: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/20.jpg)
20
Exemplo de inserção em árvore SBB Inserir a chave 5.5 na árvore a seguir
![Page 21: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/21.jpg)
21
SBBs – análise
Dois tipos de altura Altura vertical h: conta o número de
apontadores verticais da raiz até as folhas Altura k: o número de ponteiros atravessados
(comparações realizadas) da raiz até uma folha
A altura k é maior que a altura h sempre que existirem apontadores horizontais na árvore
Para qualquer árvore SBB temos hkh 2
![Page 22: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/22.jpg)
22
SBBs – análise
Bayer (1972) mostrou que
Custo para manter a propriedade SBB depende da altura da árvore O(lg(n))
Número de comparações em uma pesquisa com sucesso numa árvore SBB Melhor caso: C(n) = O(1) Pior caso: C(n) = O(lg(n)) Caso médio: C(n) = O(lg(n))
2221 )lg()lg( nkn
![Page 23: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/23.jpg)
23
Exercícios
Desenhe a árvore SBB resultante da inserção das chaves Q U E S T A O F C I L em uma árvore vazia.
Dê a lista de inserções que gera a árvore SBB abaixo:
6
85
4
2
![Page 24: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/24.jpg)
24
Remoção
Para remover um nó com dois filhos, o trocamos pelo nó de maior chave à sua esquerda, ou pelo de menor chave à sua direita e removemos aquele nó
Todos os nós têm dois filhos, exceto os do último nível
Portanto, remoções acontecem no último nível somente
É preciso manter duas condições: A altura vertical de todo nó folha é igual Não podem haver dois ponteiros sucessivos na
horizontal Todos os nós têm dois filhos, exceto os do último
nível
![Page 25: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/25.jpg)
25
Remoção
Inicialmente, tem-se três casos principais
![Page 26: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/26.jpg)
26
Remoção
Inicialmente, tem-se três casos principais
Fim. Altura não mudou
No interno com 1filho apenas
![Page 27: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/27.jpg)
27
Remoção: Restaurando altura vertical e 2 filhos
Caso 1 e análogos
Este lado perdeu 1 nível.
Restaurar recursivamente
Sub-árvore curta
![Page 28: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/28.jpg)
28
Remoção: Restaurando altura vertical e 2 filhos
Caso 2 e análogosDois pointeiros
horizontais sucessivos
Sub-árvore ganhou um
nível novamente.
Fim
Sub-árvore curta
![Page 29: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/29.jpg)
29
Remoção: Restaurando altura vertical e 2 filhos
Caso 3 e análogosJá está na horizontal
Pode haver dois ponteiros
horizontais sucessivos
O tamanho da sub-árvore é
restaurado. Fim
Sub-árvore curta
![Page 30: Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II](https://reader036.vdocuments.site/reader036/viewer/2022062307/552fc130497959413d8d5073/html5/thumbnails/30.jpg)
30
Remoção: Restaurando altura vertical e 2 filhos
Caso 4 e análogos
Sub-árvore curta está na
horizontalAltura vertical reestabelecida
. Fim