20
MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp Segundo Semestre de 2016

MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

MC-202 — Unidade 10Árvores Balanceadas

Lehilton Pedrosa

Instituto de Computação – Unicamp

Segundo Semestre de 2016

Page 2: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Roteiro

1 Introdução

2 Árvores AVL

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 2 / 20

Page 3: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

IntroduçãoVamos inserir alguns número em uma Árvore de Busca:

1

12

12

3

12

34

12

34

5

12

34

56

12

34

56

7

A árvore virou uma lista!Problema: A busca pelo 7 tem que percorrer todos elementos!

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 3 / 20

Page 4: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Solução

Como diminuir o tempo de busca?Cada subárvore divida o número de elementos tanto quanto possível!Modificamos a árvore sempre que um novo elemento é inserido

Solução 1:Ao inserir um nó, calcular a árvorede altura mínima!

Busca: no máximo a altura daárvore mínima: ⌈log2(n + 1)⌉

Inserção: criar uma árvore dealtura mínima: Θ(n)

Solução 2:Árvore de altura quase mínima!

Busca: no máximo a altura daárvore: O(log2 n)

Inserção: “consertar” obalanceamento: O(log2 n)

Exemplos de árvores aproximadas: Árvore AVL, árvore rubro-negra

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 4 / 20

Page 5: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Árvore AVLintroduzida por Adelson-Velsky and Evgenii Landis (1962)tenta diminuir a diferença entre as alturas das subárvores

Dado um nó, o fator de balanceamento é definido como:

fb = altura da subárvore direita − altura da subárvore esquerda

DefiniçãoUma árvore de busca é chamada Árvore AVL se:

ela é vazia; ouo fator de balanceamento é −1, 0 ou 1.

Note que fb é na verdade uma diferença!

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 5 / 20

Page 6: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Especificação do nó

Nó de árvore AVLtypedef struct NoArv{

int chave;struct NoArv *esq, *dir;

enum { MENOS, ZERO, MAIS } fb;} *NoArv;

Em uma árvore AVL, fb só pode assumir 3 valores distintos!

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 6 / 20

Page 7: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Exmplos de árvores AVL

8

3 13

1 7 10

4

-

+ -

- 00

0

“quase” mínima

8

3

131

7

10

40

árvore mínima

0 0 0

0 0

0

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 7 / 20

Page 8: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Preliminares

12

34

56

7

12

34

56

7

fb = 6

12

34

56

7

fb = 6

1 23

45

67

fb = 6

12

34

56

7

fb = 6

12

34

56

7

fb = 4

12

34

56

7

fb = 2

12

34

56

7

fb = 0

Qual o FB do nó raiz? Como diminuí-lo?Imaginamos um eixo“Rodamos” a árvore para a esquerdaE alteramos o fb!

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 8 / 20

Page 9: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Rotações

A

B

α βαγ

raiz

A

β

α

γ

raiz

direita

esquerda

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 9 / 20

Page 10: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Implementando rotação

Rotação para a direitavoid rodar_direita(NoArv **raiz) {

NoArv *a, *b;

// obtém partesb = *raiz;a = b->esq;

// troca ponteiros*raiz = a;b->esq = a->dir;a->dir = b;

}

Exercício: Implementar rotação para a esquerda.

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 10 / 20

Page 11: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Revendo inserção

Inserção recursivavoid inserir(NoArv **r, int x) {

// caso baseif (*r == NULL) {

*r = malloc(sizeof(NoArv));(*r)->chave = x; (*r)->esq = (*r)->dir = NULL;return ;

}

// caso geralif ((*r)->chave < x)

inserir(&((*r)->dir), x);else

inserir(&((*r)->esq), x);}

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 11 / 20

Page 12: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Corrigindo o balanceamentoQuando uma inserção altera fb? Quando a subárvore aumenta de tamanho!

A

βαh1 h2

fb = 1

r

A

βαh1 h2

fb = 1

r

A

αh1

fb = 1

r

β

x

insere x

h2

A

βαh1 h2

fb = 1

r

A

αh1

fb = 2

r

β

x

insere x

h2+1

A

βαh1 h2

fb = 1

r

A

αh1

fb = 2

r

β

x

insere x

h2+1

Estratégiaredefinimos: int inserir(NoArv **r, int x): devolve 1 se aumenta

nesse caso, ajustamos a árvore usando rotações

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 12 / 20

Page 13: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Caso 1: árvore é vaziar

NULLh = 0

insere x

r

x

r

NULLh = 0

insere x

r

xfb = 0

r

NULLh = 0

insere x

r

xh+1

fb = 0

r

NULLh = 0

Procedimento: Inserimos o item

Fator de balanceamento: fb = 0

Altura: aumentou

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 13 / 20

Page 14: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Caso 2: insere em subárvore menor

A

βα

h

fb = -1

r

A

βα

h

fb = -1

r

A

βα

r

insere x

x

A

βα

h

fb = -1

r

A

βα

fb = 0

r

insere x

x

A

βα

h

fb = -1

r

A

βα

h

fb = 0

r

insere x

x

Procedimento: Inserimos o item

Fator de balanceamento: fb = 0

Altura: não aumentou

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 14 / 20

Page 15: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Caso 3: subárvore da mesma altura

A

βαh

fb = 0

r

A

βαh

fb = 0

r

A

βα

r

insere x

x

A

βαh

fb = 0

r

A

βα

fb = +1

r

insere x

x

A

βαh

fb = 0

r

A

βαh+1

fb = +1

r

insere x

x

Procedimento: Inserimos o item

Fator de balanceamento: fb = +1

Altura: aumentou

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 15 / 20

Page 16: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Caso 4: insere em subárvore maior

A

βαh

fb = +1

r

A

βαh

fb = +1

r

insere x A

β

α

r

x

A

βαh

fb = +1

r

insere x A

β

αh-2

r

xh

A

βαh

fb = +1

r

insere x A

β

αh-2

fb = +2

r

xh

Procedimento: Inserimos o item

Árvore não é mais AVL:⇒ temos que ajustar a árvore!

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 16 / 20

Page 17: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Caso 4: i) subárvore desbalanceada positivamente

γ2

A

αh+1

+1

r

B

γ1

+1

γ2

roda A paraesquerdaA

αh+1

+1

r

B

γ1

+1

γ2

A

α

r

B

γ1

γ2

roda A paraesquerdaA

αh+1

+1

r

B

γ1

+1

γ2

A

α

0

r

B

γ1

0

γ2

roda A paraesquerdaA

αh+1

+1

r

B

γ1

+1

γ2

A

αh

0

r

B

γ1

0

Procedimento: rotação para esquerda

Fator de balanceamento: fb = 0 (ajusta filho)

Altura: não aumentou

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 17 / 20

Page 18: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Caso 4: ii) subárvore desbalanceada negativamente

γ3

A

α

h+1

B-1

γ2

C

γ1

r+1

γ3

roda B para direita

A

α

h+1

B-1

γ2

C

γ1

r

γ3

A

αB

γ2

C

γ1

r+1

γ3

roda B para direita

A

α

h+1

B-1

γ2

C

γ1

r

γ3

A

αB

γ2

C

γ1

r

γ3

A

α

B

γ2

C

γ1

r

roda A para esquerda

+1

γ3

roda B para direita

A

α

h+1

0

B-1

γ2

C

γ1

r

γ3

A

αB

γ2

C

γ1

r

γ3

A

α

B

γ2

C

γ1

r

roda A para esquerda

+1

0 ou +10 ou -1

γ3

roda B para direita

A

α

h+1

0

B-1

γ2

C

γ1

r

γ3

A

αB

γ2

C

γ1

r

γ3

A

α

B

γ2

C

γ1

r

roda A para esquerda

h

+1

0 ou +10 ou -1

Procedimento: rotação para direita e para esquerda

Fator de balanceamento: fb = 0 (também ajusta filhos)

Altura: não aumentou

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 18 / 20

Page 19: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Inserção em AVLvoid inserir(NoArv **r, int x) {

int aumentou;// árvore vaziaif (*r == NULL) {

*r = malloc(sizeof(NoArv));(*r)->chave = x;return 1; // aumentou

}// insere na direitaif ((*r)->chave < x) {

aumentou = inserir(&((*r)->dir), x);if (aumentou) {

// analisa casos...

} elsereturn 0;

// inserção na esquerda é simétrica} else {

...}

}Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 19 / 20

Page 20: MC-202 — Unidade 10 Árvores Balanceadaslehilton/mc202ef/handout-unidade10.pdf · MC-202 — Unidade 10 Árvores Balanceadas Lehilton Pedrosa Instituto de Computação – Unicamp

Exercício

1 Desenhe uma árvore AVL após a inserção de 9,1,5,6,7.2 Pesquise sobre as árvores de Fibonacci e descubra qual é a maior altura de

uma árvore AVL com n nós.3 Remover um item de uma árvore AVL é tão (ou mais) problemático quanto

inserir. Esboce um algoritmo para remoção de um nó de uma árvore AVL.Quais são todos os casos que você deve considerar? Tente fazer um desenhono papel de cada caso

4 Crie uma função que verifique se uma dada árvore binária arbitrária é umaárvore AVL.

5 Crie uma função que receba um vetor ordenado e cria uma árvore de alturamínima.

Lehilton Pedrosa (IC/Unicamp) MC-202 — Unidade 10 Segundo Semestre de 2016 20 / 20