30
Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II

Árvores binárias de pesquisa com balanceamento

Embed Size (px)

DESCRIPTION

Árvores binárias de pesquisa com balanceamento. Algoritmos e Estruturas de Dados II. Árvores binárias de pesquisa. 1. Ordem de inserção: 1 3 2 4 5 6. 3. 2. 4. 5. 6. Pior caso para uma busca é O(n). Árvore Binária Balanceada. - PowerPoint PPT Presentation

Citation preview

Page 1: Árvores binárias de pesquisa com balanceamento

Árvores binárias de pesquisa com balanceamento

Algoritmos e Estruturas de Dados II

Page 2: Árvores binárias de pesquisa com balanceamento

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

25

Remoção

Inicialmente, tem-se três casos principais

Page 26: Árvores binárias de pesquisa com balanceamento

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

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

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

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

30

Remoção: Restaurando altura vertical e 2 filhos

Caso 4 e análogos

Sub-árvore curta está na

horizontalAltura vertical reestabelecida

. Fim