• Nenhum resultado encontrado

E STRUTURAS DED ADOSE A LGORITMOS Á RVORESR UBRO -N EGRAS

N/A
N/A
Protected

Academic year: 2019

Share "E STRUTURAS DED ADOSE A LGORITMOS Á RVORESR UBRO -N EGRAS"

Copied!
32
0
0

Texto

(1)

E

STRUTURASDE

D

ADOS E

A

LGORITMOS

Á

RVORES

R

UBRO

-N

EGRAS Adalberto Cajueiro

Departamento de Sistemas e Computação Universidade Federal de Campina Grande

1

Á

RVORE

PV

 É uma árvore binária de busca cujo nó contém uma informação extra: cor.

 Através de restrições (invariantes ou propriedades) é possível se atingir uma configuração aproximadamente balanceada.

 A altura de um filho nunca é maior que o dobro da altura do outro filho

(2)

Á

RVORE

PV

 Invariantes (propriedades)

 Cada nó possui uma cor: ou preta ou vermelha

 Toda folha (NIL) é preta

 A raiz é preta

 Todos os filhos de um nó vermelho são pretos

 Todo caminho simples de um nó a uma folha

descendente contém o mesmo número de nós (≠ NIL) pretos.

Black-height

3

Á

RVORE

PV

 Exemplo

(3)

E

XERCÍCIO

 Quais destas árvores são preto-vermelho?

42

50 44

42

50 40

42

50 40

5

E

XERCÍCIO

 Qual o black-height do nó 7?

(4)

E

XERCÍCIO

 Qual o black-height do nó 7?

 2

 O black-height da raiz é o black height da árvore pv

7

POSCOMP 2009

(5)

POSCOMP 2009

9

Á

RVORE

PV

Lema: uma árvore preto-vermelho com n nós internos tem no máximo a altura de:

 Consequencia imediata:

 Busca, Maximo e Minimo podem ser implementados em O(lg n).

 Insercoes e remocoes sao um pouco diferente: devem garantir as propriedades de uma árvore PV.

h

2.lg(n+1)

(6)

Á

RVORE

PV (E

XERCÍCIO

)

 Desenhe uma arvore binaria completa com os

valores {1,2,…,15}, e os nós vazios. Em seguida

pinte os nós de tres formas diferentes tal que o black-height das arvores PV resultantes sejam 2, 3 e 4

11

Á

RVORE

PV (E

XERCÍCIO

)

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

(7)

Á

RVORE

PV (E

XERCÍCIO

)

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

Bh= 2

13

Á

RVORE

PV (E

XERCÍCIO

)

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

Bh= 3

(8)

Á

RVORE

PV (E

XERCÍCIO

)

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

Bh= 3

15

Á

RVORE

PV (E

XERCÍCIO

)

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

Bh= 3

(9)

Á

RVORE

PV (E

XERCÍCIO

)

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

Bh= 4

17

Á

RVORE

PV

 Como representar o nó e uma árvore PV em Java?

 É possível reusar algo anterior?

(10)

Á

RVORE

PV

 Como representar o nó e uma árvore PV em Java?

 É possível reusar algo anterior?

public class RBNode<T extends Comparable<T>> extends BSTNode<T> {

enum Color {BLACK, RED};

protected Color color; public RBNode() {

this.color = Color.BLACK;

}

@Override

public boolean equals(Object obj) { return super.equals(obj)

&& this.colour == ((RBNode<T>) obj).getColour();

} }

19

Á

RVORE

PV

 Como representar o nó e uma árvore PV em Java?

 É possível reusar algo anterior?

...

@Override

public String toString(){

String resp = "NIL";

if(!isEmpty()){

resp = "(" + data.toString();

if(colour == Colour.RED){

resp = resp + ",R)"; }else{

resp = resp + ",B)"; }

}

return resp;

}

(11)

Á

RVORE

PV

 Como representar o nó e uma árvore PV em Java?

 É possível reusar algo anterior?

public interface RBTree<T extends Comparable<T>> extends AVLTree<T>{

public RBNode<T>[] extendedPreOrder();

}

public class RBTreeImpl<T extends Comparable<T>> extends AVLTreeImpl<T>implements RBTree<T> {

} 21

Á

RVORE

PV

 Como representar o nó e uma árvore PV em Java?

 É possível reusar algo anterior?

public interface RBTree<T extends Comparable<T>> extends AVLTree<T>{

public RBNode<T>[] extendedPreOrder();

}

public class RBTreeImpl<T extends Comparable<T>> extends AVLTreeImpl<T>implements RBTree<T> {

} 22

(12)

Á

RVORE

PV

 Como representar o nó e uma árvore PV em Java?

 É possível reusar algo anterior?

public interface RBTree<T extends Comparable<T>> extends AVLTree<T>{

public RBNode<T>[] extendedPreOrder();

}

public class RBTreeImpl<T extends Comparable<T>> extends AVLTreeImpl<T>implements RBTree<T> {

public void insert(T elem);

public void remove(T elem); //nao implementar

} 23

Que métodos auxiliares precisam ser implementados!

Á

RVORE

PV

24 public class RBTreeImpl<T extends Comparable<T>> extends AVLTreeImpl<T>implements RBTree<T> {

public void insert(T elem); public void remove(T elem);

int blackHeight();

protected boolean verifyProperties(){ return verifyNodesColour() &&

verifyNILNodeColour() && verifyRootColour() &&

verifyChildrenOfRedNodes() && verifyBlackHeight();

}

void fixUpInsert(RBNode<T> node);

(13)

Á

RVORE

PV

 Como é feita a pesquisa em uma árvore PV?

25

Á

RVORE

PV

 Como é feita a pesquisa em uma árvore PV?

 A pesquisa realizada em uma árvore preto-vermelho é igual a realizada em uma árvore binária de

pesquisa

 Tempo = O(log n)

(14)

Á

RVORE

PV

 Inserções

 Insira o nó 51 na árvore abaixo. Qual a melhor cor para o novo nó e por que?

27

Á

RVORE

PV

 Inserções

 Insira o nó 51 na árvore abaixo. Qual a melhor cor para o novo nó e por que?

51

(15)

Á

RVORE

PV

 Inserções

 Insira o nó 87. Preserva o invariante?

29

Á

RVORE

PV

 Inserções

 Insira o nó 87. Preserva o invariante?

87

(16)

Á

RVORE

PV

 Inserções

 Insira o nó 87. Preserva o invariante?

31

87 Como manter o invariante de uma árvore PV após uma inclusão?

Á

RVORE

PV

 Inserções

 Novo nó tem sempre cor vermelha

 Insere o novo elemento normalmente como na BST

 Se violar invariantes tem que consertar a árvore

Considerar 5 casos sequenciais: 1  2  3  4  5 Dica: focar no tio do novo nó

(17)

Á

RVORE

PV

 Inserções

33

RB-INSERT(N)

TREE-INSERT(N)

color[N]

← RED

FIXUP_CASE1(N)

Á

RVORE

PV

 Inserções

34

FIXUP_CASE1(N){

if (N is root)

N.color = BLACK

else

FIXUP_CASE2(N)

}

(18)

Á

RVORE

PV

 Inserções

35

FIXUP_CASE2(N){

if (N.parent.color = BLACK) //OK.

else

FIXUP_CASE3(N) }

N P

OK

Á

RVORE

PV

 Inserções

36

FIXUP_CASE3(N){ if (U.color = RED) P.color = BLACK U.color = BLACK G.color = RED FIXUP_CASE1(G) else

(19)

FIXUP_CASE4(N){ Next = N

if (N is right child and P is left child) leftRotation(P)

Next = N.left

else if (N is left child P is right child) rightRotation(P)

Next = N.right

FIXUP_CASE5(Next) }

Á

RVORE

PV

37

Á

RVORE

PV

38

FIXUP_CASE4(N){ Next = N

if (N is right child and P is left child) leftRotation(P)

Next = N.left

else if (N is left child P is right child) rightRotation(P)

Next = N.right

(20)

Á

RVORE

PV

39

//N is left child and P is left child FIXUP_CASE5(N){

P.color = BLACK G.color = RED if (N is left child) rightRotation(G) else

leftRotation(G) }

Á

RVORE

PV

40

//N is left child and P is left child FIXUP_CASE5(N){

P.color = BLACK G.color = RED if (N is left child) rightRotation(G) else

(21)

E

XEMPLO

 Insira o nó 8

41

8

FIXUP_CASE1(8)

E

XEMPLO

 Insira o nó 8

42

8

(22)

E

XEMPLO

 Insira o nó 4

43

8

FIXUP_CASE1(4) FIXUP_CASE2(4)

4

E

XEMPLO

 Insira o nó 4

44

8

FIXUP_CASE1(4) FIXUP_CASE2(4) if P.color = BLACK //OK

(23)

E

XEMPLO

 Insira o nó 2

45

8

FIXUP_CASE1(2) FIXUP_CASE2(2) if P.color = BLACK //OK

else

FIXUP_CASE3(2) 4

2

E

XEMPLO

 Insira o nó 2

46

8

FIXUP_CASE1(2) FIXUP_CASE2(2) FIXUP_CASE3(2) if (U.color = RED) ...

else

FIXUP_CASE4(N) 4

(24)

E

XEMPLO

 Insira o nó 2

47

8

FIXUP_CASE1(2) FIXUP_CASE2(2) FIXUP_CASE3(2) if (U.color = RED) ...

else

FIXUP_CASE4(N) 4

2 N

E

XEMPLO

 Insira o nó 2

48

8

FIXUP_CASE1(2) FIXUP_CASE2(2) FIXUP_CASE3(2) FIXUP_CASE4(N) 4

(25)

E

XEMPLO

 Insira o nó 2

49 8 FIXUP_CASE1(2) FIXUP_CASE2(2) FIXUP_CASE3(2) FIXUP_CASE4(2) Next = 2

if (N is right child and P is left child) ...

else if (N is left child P is right child) ... FIXUP_CASE5(Next) 4 2 N

E

XEMPLO

 Insira o nó 2

(26)

E

XEMPLO

 Insira o nó 2

51 8 FIXUP_CASE1(2) FIXUP_CASE2(2) FIXUP_CASE3(2) FIXUP_CASE4(2) FIXUP_CASE5(2) P.color = BLACK G.color = RED if (N is left child) rightRotation(G) else leftRotation(G) 4 2 N P G

E

XEMPLO

 Insira o nó 2

52 8 FIXUP_CASE1(2) FIXUP_CASE2(2) FIXUP_CASE3(2) FIXUP_CASE4(2) FIXUP_CASE5(2) P.color = BLACK G.color = RED if (N is left child) rightRotation(G) else

leftRotation(G) 4

(27)

Á

RVORE

PV (R

EMOÇÕES

)

 Como remover um nó de uma árvore PV?

 Podemos usar a remoção de BST?

 As remoções da BST preservam os invariantes da árvore PV?

 Que tipos de remoções causma problema?

53

Á

RVORE

PV (R

EMOÇÕES

)

 Remover uma folha vermelha (6)

(28)

Á

RVORE

PV (R

EMOÇÕES

)

 Remover uma folha vermelha (6)

55

Á

RVORE

PV (R

EMOÇÕES

)

 Remover um nó interno vermelho (17) com filho substituto vermelho (22)

(29)

Á

RVORE

PV (R

EMOÇÕES

)

 Remover um nó interno vermelho (17) com filho substituto vermelho (22)

57

Á

RVORE

PV (R

EMOÇÕES

)

 Remover um nó interno vermelho (17) com filho substituto vermelho (22)

(30)

Á

RVORE

PV (R

EMOÇÕES

)

 Remover folha preta (11)

59

Á

RVORE

PV (R

EMOÇÕES

)

 Remover folha preta (11)

 Violação do black-height  foca no irmão (sibling 1) e sobrinho mais proximo (6)

(31)

Á

RVORE

PV (R

EMOÇÕES

)

 Remover nó interno preto (13) com substituto preto (15)

61

Á

RVORE

PV (R

EMOÇÕES

)

 Remover nó interno preto (13) com substituto preto (15)

 Violação do black-height  foca no irmao (25) e sobrinho mais proximo(22)

(32)

R

EFERÊNCIAS

 Capítulo 14

 1a edição

Referências

Documentos relacionados

In this work we will analyze three different methods, the Graphical Lasso GLasso, Graphical Ridge GGMridge and a novel method called LPC, or Local Partial Correlation.. The

Era de conhecimento de todos e as observações etnográficas dos viajantes, nas mais diversas regiões brasileiras, demonstraram largamente os cuidados e o apreço

Neste estudo foram estipulados os seguintes objec- tivos: (a) identifi car as dimensões do desenvolvimento vocacional (convicção vocacional, cooperação vocacio- nal,

O presente estudo teve como objetivo identificar as características esperadas de um professor atuante nos cursos de Administração e Ciências Contábeis, sob a ótica

 Para algumas aplicações, skip lists são mais naturais que árvore e levam a algoritmos mais simples e fáceis de implementar..  Performance melhorada por um fator constante em

 Alguns conjuntos dinamicos pressupoem que existe uma relação de ordem entre as chaves.. Isso permite falar do próximo elemento ao invés de um elemento

 Chaves que colidam precisam ter seu hash code “recalculado” para encontrar um slot vazio?.  Todas as chaves estão em

 A alocação dinâmica é muito utilizada em problemas de estrutura de dados como por exemplo, listas encadeadas, pilhas, filas, arvores binárias e grafos ...  O interessante