inf 1010 estruturas de dados avançadasnoemi/eda-16.2/comentarios.pdf · 2016. 9. 28. · remoção...

Post on 20-Mar-2021

0 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

INF 1010Estruturas de Dados Avançadas

26/09/16 © 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1 1

voltando ao tempo de CPU

26/09/16 2© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

P1 P2 P3 P1 P3 P1 P2 P3 P1

tempo

medidas de tempo

c1 = clock();

...

c1 = clock() = c1;

não precisamos dividir por ”número de ticks porsegundo”, pois só estamos interessados emcomparar coisas, não em obter tempos absolutos!

26/09/16 3© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

questões comuns

• medidas com TAM muito pequeno

• computador é muito rápido (ainda bemJ)

questões comuns – árvore binária

• problemas na remove (1)

remove (m, chave):if (chave < m->chave)desce subárvore à esquerda

else if (chace > m->chave)desce subárvore à direita

else/* encontrou *//* tratar casos distintos *//* folha, filho único, dois filhos */

questões comuns – árvore binária

• problemas na remove (2)

remove (m, chave):…/* dois filhos */ procura filho mais à esquerda em sa à direita”troca” com nó correntelibera filho

questões comuns – árvore binária

• problemas na remove (3)

remove (m, chave):…/* dois filhos */sucessor = m->dir;while (sucessor->esq != NULL) {sucessor = sucessor->esq;

}aux = m;m = sucessor;sucessor = aux;free(aux);m->dir = remove(m->dir, chave);

100

140

183

50

12117 61

270170

questões comuns – árvore binária

• problemas na remove (3)

remove (m, chave):…/* dois filhos */while (sucessor->esq != NULL)

sucessor = sucessor->esq;

m->chave = sucessor->chave; /* troca as chaves */sucessor->chave = chave;

m->dado = sucessor->dado;

free(sucessor);0

100

140

183

50

12117 61

270170

questões comuns – árvore binária

• problemas na remove (3)

remove (m, chave):…/* dois filhos */aux = m->esq;while(aux->dir != NULL)

aux = aux->dir;m->dado = aux->dado;m->chave – aux->chave;m->esq = removeNo(m->esq, aux->chave);

100

140

183

50

12117 61

270170

questões comuns – árvore binária

• problemas na remove (3)

remove (m, chave):…/* dois filhos */Mapa *temp = m->dir; Mapa *tempAnterior = NULL;while(temp->esq != NULL) { //Caminha mais à esquerda possível com

tempAnterior = temp;temp = temp->esq;

}... acerta a árvore diretamente pois tem ponteiro p/ anterior

100

140

183

50

12117 61

270170

outro comentário

• fazer uma debug_mostra_mapa que

mostre de fato!100

140

183

50

12117 61

270

100, 50, 17, 61, 140, 121, 183, 270

100

140

183

50

12117 61

270100

140

183

50

12117

61

270

(100 (50 (17 () ()) (61()()))(140 (121()())(183 ()(270()()))))

100

140

183

50

12117 61

270

100

140

183

50

12117

61

270

(100 (50 (17 (61()()) ()) ())(140 (121(183()())())(270()()))))

árvores AVL

100

140

183

50

12117 61

270

remoção

• voltamos a precisar de ajustes

• só que podemos precisar de váriosajustes

remoção árvore AVL

100

140

183

50

12117 61

2 197

remoção árvore AVL

100

140

183

50

12117 61

2 197

remoção árvore AVL

100

140

183

50

12117

2 197

remoção árvore AVL: um ajuste

100

140

183

17

1212

197

50

remoção árvore AVL – outro exemplo

100

140

183

50

12161

197

300

h=4h=4

h=3

remoção árvore AVL – outro exemplo

100

140

183

50

12161

197

300

h=4h=4

h=3

remoção árvore AVL – outro exemplo

100

140

183

50

61

197

300

h=4h=4

h=3

remoção árvore AVL – outro exemplo

100

183

140

50

61 197

300

h=4h=4

h=2

Exemplo: Remove 8

26/09/16 24

5

3

82

1 7 10

9 116

5

3

72

1 6 10

9 11

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Exemplo: Remove 6

26/09/16 25

5

3

72

1 6 10

9 11

5

3

72

1 10

9 11

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Exemplo: Remove 6

26/09/16 26

5

3

72

1 6 10

9 11

5

3

72

1 10

9 11

rotação à esquerda

5

3 7

2

1

10

9

11

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Problemas com as Árvores AVL

•Problema:• Nem sempre uma ÚNICA rotação

(simples ou dupla) resolve o problema de desbalanceamento dos nós

• Há casos em que O(log n) rotações são necessárias para tornar a árvore balanceada

•Exemplo (a seguir):• exclusão do nó provoca diversas rotações

26/09/16 27© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

remove 3

Múltiplas Rotações na Árvore AVL

26/09/16 28

5

4

93

1 8 11

10 1272

6

5

93

1 8 11

10 1272

6

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

rotação dupla

Múltiplas Rotações na Árvore AVL

26/09/16 29

5

4

93

1 8 11

10 1272

6

5

93

1 8 11

10 1272

6

5

9

31 8 11

10 127

2

6

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

rotação duplaMúltiplas Rotações na Árvore AVL

26/09/16 30

5

4

93

1 8 11

10 1272

6

5

93

1 8 11

10 1272

6

5

9

31 8 11

10 127

2

6

5

9

31 8 11

10 127

2

6

rotação dupla 5 9

31

8

11

10 12

72

6

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Esboço do algoritmo de remoção

•Pesquise o nó que contém a chave procurada,

aplicando recursivamente o algoritmo de remoção

•Quando achar o nó

• faça a remoção

(semelhante à remoção em árvore de busca binária)

• analise o balanceamento

• Se o nó estiver desbalanceado ( |fb| >1 ),

faça as devidas rotações

•Recursivamente, reporte uma mudança na altura de um nó

ao seu pai para que ele faça as devidas correções

26/09/16 31© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Esboço do algoritmo de remoção

•Pontos adicionais da remoção

(que não ocorrem na inserção)

• tratar todos os casos possíveis de altura nas

rotações

• analisar quando uma sub-árvore muda de altura

para reportar esta informação ao pai

26/09/16 32© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Casos de rotação à esquerda (a s.a.e. perdeu altura)

26/09/16 33

2r

t

T4

1

T1

m

rotação à esquerda

0r

t

T4

0

T1 m

2r

t

T4

0

T1

m

rotação à esquerda

1r

t

T4

-1

T1 m

2r

t

T4

-1

T1

s

T2 T3

rotação dupla

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

Rotação dupla direita-esquerda (fb=2)

26/09/16 34

2r

t

T4

-1

T1

s

T2 T3

0

2r

t

T4

-1

T1

s

T2 T3

-1

2r

t

T4

-1

T1

s

T2 T3

1

r t

T4T1

s

T2 T3

0

10r t

T4T1

s

T2 T3

0

0-1r t

T4T1

s

T2 T3

0

00

© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1

top related