classificação e pesquisa - bolinhabolinha – página ... · • tabelas hash ¾estática e...
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.