classificação e pesquisa - bolinhabolinha – página ... · • tabelas hash ¾estática e...

21
1 Classificação e Pesquisa Árvores Prof. Rodrigo Rocha [email protected] http://www.bolinhabolinha.com Onde Estamos Ementa Pesquisa de Dados ¾ Seqüencial ¾ Binária Métodos de ordenação ¾ seleção e troca ¾ distribuição ¾ inserção ¾ Intercalação • Árvores ¾ Pesquisa ¾ Pesquisa ¾ Binária ¾ AVL ¾ Patrícia • B-Tree Tabelas hash ¾ Estática e Dinâmica

Upload: trinhkhue

Post on 12-Nov-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

1

Classificação e Pesquisa

Árvores

Prof. Rodrigo [email protected] http://www.bolinhabolinha.com

Onde EstamosEmenta• Pesquisa de Dados

SeqüencialBinária

• Métodos de ordenaçãoseleção e trocadistribuiçãoinserçãoIntercalação

• ÁrvoresPesquisaPesquisaBináriaAVLPatrícia

• B-Tree• Tabelas hash

Estática e Dinâmica

2

Árvores

É uma estrutura de dados hierárquica• Exemplo

chave de times em um campeonatoárvore genealógicaorganograma funcional

Componentes• raiz (root) – nó superior• aresta – linha que liga os nós• folhas nós filhos• folhas – nós filhos• floresta – conjunto de árvores• grau do nó - número de nós filhos • grau da árvore - é o máximo entre os graus de seus nós

ÁrvoresOperações

procura, predecessor, antecessor, mínimo, máximo, inserir e deletarIdealmente, temos

– Árvore balanceada» Red black, avl, b tree

– Altura: log n para n nós

armazenamento– Muito grande para RAMg p– Parte em RAM, parte em méio magnético

» Meio magnético + lento

3

Árvores bináriasEstrutura de dados: árvore• cada nó tem no máximo duas sub árvores• Operações

procura, predecessor, antecessor, mínimo, máximo, inserir e deletarTempo é proporcional a altura da árvore

Estrututa• Campo chave• Campo esquerdoCampo esquerdo• Campo direito• P = pai

Se algum filho ou pai estiver ausente, o campo conterá nulo• O nó raiz é o único que contém o campo pai nulo

Árvores binárias

Implementando em um vetor• Array com 7 posições:

• Armazenamento por nível: • posição do nó posição dos filhos do nó

1 2,32 4,53 6,7 i (2i,2i+1)

4

Árvores binárias

Implementando em uma estrutura• campo do valor• 2 ponteiros : para o filho da esquerda e direita• 2 ponteiros : para o filho da esquerda e direita• Estrutura (exemplo)

typedef struct sttNo { tipo inf; struct sttNo *esq, *dir;

} tNo;

Árvores bináriasProcedimento para imprimir todos os elementos de uma árvore binária

INORDER-TREE-WALK(x)( )if x ≠ NIL

then INORDER-TREE-WALK(left[x])print key[x]

INORDER-TREE-WALK(right[x])

ComplexidadeComplexidade• ɵ(n)

Pois, após a chamada ao procedimento inicial, o procedimento é chamado de forma recursiva duas vezes (filho da direita e filho da esquerda)

5

Árvore Binária de PesquisaÁrvore binária de pesquisa• nós são distribuídos de forma a facilitar a

pesquisapesquisa• Para qualquer nó x

elementos a esquerda são menores que o elemento paielementos a direita são maiores que o elemento pai

Árvores bináriasPesquisando

TREE-SEARCH(x, k)if x = NIL or k = key[x]then return xthen return x

if k < key[x]then return TREE-SEARCH(left[x], k)else return TREE-SEARCH(right[x], k)

Chamada inicial: TREE-SEARCH(root[T ], k).

Para procurar a chave 13• 15-6-7-13

6

Árvores bináriasVersão não recursiva do algoritmo

ITERATIVE-TREE-SEARCH(x, k)1 while x ≠ NIL and k ≠ key[x]2 do if k < ke [ ]2 do if k < key[x]3 then x ← left[x]4 else x ← right[x]5 return x

Complexidade• Relativa a altura da árvore O(altura)• Se a árvore estiver balanceada

para 1000 elementos, 10 comparaçõesO (log n)

• SenãoO (n)

Árvores bináriasMáximo e mínimo valor

TREE-MINIMUM(x)while left[x] = NIL

do x ← left[x]return x

TREE-MAXIMUM(x)while right[x] = NIL

do x ← right[x]return x

Complexidade• O(h), onde h é a altura da árvore( ),

7

Sucessor e Predecessor• TREE-SUCCESSOR(x)

if right[x] = NILthen return TREE-MINIMUM(right[x])

Árvores binárias

( g [ ])else y ← p[x]

while y = NIL and x = right[y] dox ← y

y ← p[y]return y

• Atenção:Os algoritmos de sucessor, mínimo, máximo e predecessor não procuram

pelos valores

Árvores bináriasInserção• ache a folha que será inserido o nó• conecte o nó ao pai da folha

Algortimo• TREE-INSERT (T, z)• y ← NILx ← root [T]while x ≠ NIL do

y ← xif key [z] < key[x]

then x ← left[x]else x ← right[x]

p[z] ← yif NILif y = NIL

then root [T] ← zelse if key [z] < key [y]

then left [y] ← zelse right [y] ← z

Complexidade relativa a altura O(h) h=altura

8

Árvores binárias

Remoção • nó sem filhos

somente ajustamos o ponteiro do nó paisomente ajustamos o ponteiro do nó pai

Árvores binárias

Remoção • nó com um único filho

mover o filho para a posição do nó paimover o filho para a posição do nó pai

9

Árvores bináriasRemoção • nó com dois filhos

procuramos o sucessor (ou predecessor), que deverá ocupar o lseu lugar

– nó mais a esquerda da sub-árvore da direita– como ele não tem filhos a esquerda, a sua sub-árvore a direita pode

ser movida

Árvores bináriasRemoção AlgoritmoTREE-DELETE (T, z)if left [z] = NIL .OR. right[z] = NIL

then y ← z else y ← TREE-SUCCESSOR (z)

if left [y] ≠ NIL then x ← left[y] else x ← right [y]

if x ≠ NIL then p[x] ← p[y]

if p[y] = NIL then root [T] ← x else if y = left [p[y]]

th l ft [ [ ]]then left [p[y]] ← x else right [p[y]] ← x

if y ≠ z then key [z] ← key [y]

if y has other field, copy them, too return y

Complexidade relativa a altura O(h) h=altura

10

Árvores bináriasExercício• Para a árvore abaixo representada, responda as

seguintes questões:seguintes questões:• Número de elementos• Altura• Elemento Root (Pai)• Elementos folhas

Árvores binárias - exercícios1-) Desenhe a árvore de pesquisa binária, com os itens S,U,P,E,R,F,A,C,I,L. Onde cada nó tenha somente uma letra.

2 ) (12 1 1 C ) T á d i bi á i d2-) (12.1.1 Cormen): Trace as árvores de pesquisa binária de altura 2,3,4,5 e 6 sobre o conjunto de chaves {1,4,5,10,16,17,21}

3-) Para a árvore binária abaixo, mostre os elementos que serão mostrados, utilizando o algoritmo INORDER-TREE-WALK(x)

11

Exercícios

4-) Escreva o algortimo tree-predecessor.

5 ) Q l l id d d l ti d5-) Qual a complexidade dos algortimos de sucessor e predecessor? Explique como você chegou nesta complexidade.

Exercícios6-) Para a seguinte árvore binária, responda as questões

a-) Mostre os nós que são percorridos para achar o nó com valor 9. O que o algoritmo retornou?) q p p q gb-) Mostre os nós que são percorridos para achar o nó com valor 8. O que o algoritmo retornou?

c-) Ache o sucessor de 15. (Mostre os nós que o algoritmo percorreu)d-) Ache o sucessor de 6 . (Mostre os nós que o algoritmo percorreu)e-) Ache o sucessor de 4 . (Mostre os nós que o algoritmo percorreu)

f-) Ache o predecessor de 6 . (Mostre os nós que o algoritmo percorreu)g-) Insira o valor 19. (Mostre os nós que o algoritmo percorreu)h-) Insira o valor 1. (Mostre os nós que o algoritmo percorreu)

i-) Remova o nó com valor 13. Desenhe o novo layout da árvorej-) Remova o nó com valor 6. Desenhe o novo layout da árvore

12

Exercícios7-) (12.2.1 Cormen) Suponha que você tenha os números de 1 a 1000 em uma árvore binária de busca, e quer localizar o número 363. Qual seqüência abaixo não pode ser a seqüência de nós examinados?

a-) 2, 252, 401, 398, 330, 344, 397, 363.b-) 924, 220, 911, 244, 898, 258, 362, 363.c-) 925, 202, 911, 240, 912, 245, 363.d-) 2, 399, 387, 219, 266, 382, 381, 278, 363.e-) 935, 278, 347, 621, 299, 392, 358, 363.

8-) Escreva um algoritmo que traga a soma de todos os valores de uma árvore. Qual a sua complexidade? Justifique.

Demo

Animações na web• http://www.engin.umd.umich.edu/CIS/course.des/

cis350/treetool/cis350/treetool/

• http://www.cosc.canterbury.ac.nz/mukundan/dsal/BSTNew.html

htt // t b / k d /d l/• http://www.cosc.canterbury.ac.nz/mukundan/dsal/BST.html

13

Árvores Balanceadas (AVL)Árvore binária de pesquisaBalanceadas pela altura• Para cada nó na árvore, a altura das sub-árvores da ,

direita e esquerda diferem em no máximo 1

Animações na WEBhttp://webpages.ull.es/users/jriera/Docencia/AVL/AVL%20tree%20applet.htmhttp://www strille net/works/media technologyhttp://www.strille.net/works/media_technology_projects/avl-tree_2001/

14

B-TreeÁrvores balanceadastrabalham com dispositivos secundários de armazenamento (ex. disco rígido)• quando o acesso é feito em meio físico a velocidade é prejudicada

devemos tentar minimizar estes acessos

Cada nó tem um número variável de chaves e filhosAs chaves são armazenadas em ordem crescenteCada chave tem um filho associado que é o root da sub-árvore contendo todos os nós com chave menor ou igual a chave,mas maior que a chave predecessoraUm nó também tem o filho mais a direita sendo o root da subárvore contendo todas as chaves maiores que qualquer chave no nó

B-TreeFator de minimização• Uma b-tree tem um número mínimo de filhos para cada nó, conhecido

como fator de minimização.Se t é o fator de mínimização, cada nó deve ter pelo menos t-1 chavesç , pEm algumas circustâncias, o nó root poderá violar esta propriedade tendo menos que t-1 chavesCada nó pode ter no máximo 2t-1 chaves, ou, 2t filhos

Quando cada nó tem um alto fator de crescimento (muitos filhos), e necessário atravessar vários nós antes de localizar a chave procurada

S ó di b t d á i i i• Se o acesso ao nó requer acesso ao disco, a b-tree deverá minimizar estes acessos

• O fator de minimização é normalmente escolhido de forma que o tamanho total de cada nó corresponda a um múltiplo do tamanho do bloco no dispositivo de armazenamento

• Esta escolha simplifica e otimiza o acesso a disco

15

B-TreeExemplo• B-tree com fator de minimização 3 (t=3)

mínimo de chaves (t-1) = 2mínimo de chaves (t 1) 2máximo de chaves (2t-1) = 5máximo de filhos (2t) = 6

B-TreeB-Tree é uma estrutura de dados ideal:

Situações onde todos os dados não podem residir em um único meio de armazenamento, e acessa um segundo

i d t ã i “ t ” (meio de armazenamento, que são mais “custosos” (ou consomem mais tempo)

16

B-TreeCriação• A operação de criação, cria uma árvore B

alocando um nó root sem valores e sendo também folha

Complexidade O(1)B-Tree-Create(T)

x <- Allocate-Node()leaf[x] <- TRUEn[x] <- 0Disk-Write(x)root[T] <- x

B-TreePesquisa

• Semelhante a pesquisa em árvore binária. • O filho correto é escolhido realizando uma busca linear nos valores do nó. (esquerda os

menores, a direita os maiores)Depois de achado o valor maior ou igual ao valor desejado, seguimos o filho a esquerda e realizamos novamente a pesquisa

• Se todos os valores são menores que o procurado, o maior filho a direita e seguido

• Complexidade depende do tamanho da árvore. logo O(log n)• B-Tree-Search(x, k)

• i <- 1• while i <= n[x] and k > keyi[x]• do i <- i + 1• if i <= n[x] and k = keyi[x]• then return (x i)• then return (x, i)• if leaf[x]• then return NIL• else Disk-Read(ci[x])• return B-Tree-Search(ci[x], k)

• Supomos que no segundo estágio, todos os nós estão armazenados em disco

17

B-TreeExemplo• Pesquisando o valor 21

B-TreeInserção• O nó apropriado para a inserção é localizado (algoritmo similar ao B-

Tree-Search)• A chave é inserida no nó• Se o nó não está cheio a chave é inserida sem nenhuma outra• Se o nó não está cheio, a chave é inserida sem nenhuma outra

operação• caso contrário, o nó deverá ser dividido para acomodar a nova chave

a operação de divisão consistem em mover uma das chaves para o nó PAI, este não pode estar cheio também, caso isso ocorra, outra operação de divisão deverá ser realizada.

• Se cada acesso ao nó pode custar um acesso ao disco, e recomendado que o pai nunca esteja cheio.

• Para satisfazer essa situação, o algoritmo divide qualquer nó que esti er cheio q ando esti er percorrendo a ár ore para efet ar aestiver cheio quando estiver percorrendo a árvore para efetuar a inserção.

As operações de divisão aumentam, mas você garante que o Pai nunca estará lotado

• Complexidade, desde que a operação de divisão rode em O(n), a inserção rodará em O(t log n)

18

B-Tree

B-Tree-Insert(T, k)

r < root[T]

B-Tree-Insert-Nonfull(x, k)

i <- n[x]r <- root[T]if n[r] = 2t - 1

then s <- Allocate-Node()root[T] <- s

leaf[s] <- FALSEn[s] <- 0c1 <- rB-Tree-Split-Child(s, 1, r)B-Tree-Insert-Nonfull(s, k)else B-Tree-Insert-Nonfull(r, k)

i <- n[x]if leaf[x]

then while i >= 1 and k < keyi[x]do keyi+1[x] <- keyi[x]

i <- i - 1keyi+1[x] <- k

n[x] <- n[x] + 1Disk-Write(x)

else while i >= and k < keyi[x]do i <- i - 1else B Tree Insert Nonfull(r, k)

i <- i + 1Disk-Read(ci[x])if n[ci[x]] = 2t - 1

then B-Tree-Split-Child(x, i, ci[x])if k > keyi[x]

then i <- i + 1B-Tree-Insert-Nonfull(ci[x], k)

B-TreeDivisão do nó (split)

• Se o nó está cheio, é necessário dividí-lo. • Movemos a chave média do nó x para seu pai y• Um novo nó z, torná-se o filho imediatamente a direita da chave média x que foi deslocada para o pai y• e o nó original x, torná-se o filho imediatamente a esquerda da chave média que foi deslocada para y• Esta operação transforma o nó com 2t-1 chaves em dois nós com t-1 chaves cada.• Atenção: Somente uma chave foi movida para o pai.

C l id d O(t) d t é t t• Complexidade O(t), onde t é constante

B-Tree-Split-Child(x, i, y)z <- Allocate-Node()leaf[z] <- leaf[y]n[z] <- t - 1for j <- 1 to t - 1

do keyj[z] <- keyj+t[y]if not leaf[y]

then for j <- 1 to tdo cj[z] <- cj+t[y]

[ ] 1n[y] <- t - 1for j <- n[x] + 1 downto i + 1

do cj+1[x] <- cj[x]ci+1 <- zfor j <- n[x] downto i

do keyj+1[x] <- keyj[x]keyi[x] <- keyt[y]n[x] <- n[x] + 1Disk-Write(y)Disk-Write(z)Disk-Write(x)

19

B-TreeExemplo• Inserindo o valor 33, em uma árvore de faor de minimização t=3

B-TreeRemoção

1. Se a chave não estiver numa folha, troque-a com seu sucessor imediato.2 Elimine a chave da folha2. Elimine a chave da folha.3. Se a folha continuar com o número mínimo de chaves, fim.4. A folha tem uma chave a menos que o mínimo. Verifique as páginas irmãs da esquerda e direita:

– 4.1.se uma delas tiver mais que o número mínimo de chaves, aplique redistribuição.

– 4.2.senão concatene a página com uma das irmãs e a chave pai. 5 Se ocorreu concatenação aplique passos de 3 a 6 para a5. Se ocorreu concatenação, aplique passos de 3 a 6 para a página pai.6. Se a última chave da raiz for removida, a altura da árvore diminui.

• Fonte: usp (http://www.icmc.sc.usp.br/manuals/sce183/btree4.html)

20

Exercícios1-) Onde b-trees são utilizadas? Dê exemplo de aplicações que façam uso delas.

2-) (usp) Explique a seguinte sentença: "B-Trees são construídas de baixo para cima enquanto árvores binárias são construídas de cima parabaixo para cima, enquanto árvores binárias são construídas de cima para baixo".

3-) Pesquise e descreva o processo de remoção.

4-) Crie uma árvore B de grau 2, com os seguintes valores {1, 2, 3, 4, 5}

5-) Para quais valores de t a árvore B abaixo é válida5 ) Para quais valores de t, a árvore B abaixo é válida.

.

Exercícios6-) Para a árvore B abaixo,com t=2, responda as seguintes questões:• Qual o número mínimo de itens?• Qual o número máximo de itens?• Quando o nó é dividido?• Insira os valores 42, 8, 14 • Desenhe a árvore depois da inserção

7-) Construa a b-tree com os seguintes valores (inseridos nesta ordem)7 ) Construa a b tree com os seguintes valores. (inseridos nesta ordem)• Escolha um grau para a árvore B e informe-o antes da sua construção• a-) 1 12 8 2 25 5 14 28 17 7 52 16 48 68 3 26 29 53 55 45• b-) 3, 7, 9, 23, 45, 1, 5, 14, 25, 24, 13, 11, 8, 19, 4, 31, 35, 56

8-) Utilizando a árvore B criada no exercício 7a:• Adicione as chaves : 2, 6,12• Remova as chaves: 4, 5, 7, 3, 14

21

DemonstraçãoAnimações na web• http://slady.net/java/bt/view.php?w=600&h=450

Bibliografia

Livro texto• ZIVIANI, Nivio. Projeto de Algoritmos : com implementação em Pascal

e C.. 2ª ed. São Paulo: Pioneira Thomson Learning, 2004.• VELOSO, Paulo A. S.. Estrutura de Dados. 1ª ed. São Paulo: Campus, , p ,

1983.• CORMEN, Thomas H. Algoritmos : teoria e prática. 1ª ed. Rio de Janeiro:

CAMPUS, 2002.

Complementar• SCHILDT, Herbert. C Completo e Total. 3ª ed. São Paulo: Pearson

Education, 2005.Education, 2005.• CELES, Waldemar; CERQUEIRA, Renato. Introdução a Estruturas de

Dados : com técnicas de programação em C. 4ª ed. Rio de Janeiro: Elsevier, 2004

• WIRTH, Niklaus. Algoritmos e Estruturas de Dados. 1ª ed. Rio de Janeiro: LTC, 1989

• TENENBAUM, Aaron M; SOUZA, Tereza Cristina Félix de. Estruturas de Dados usando C. 1ª ed. São Paulo: Makron Books,1995.