06/05/2010 1 Análise e Complexidade d Al it de Algoritmos Algoritmos de árvores - binária - avl ó B - arvóre B - heap http://www.bolinhabolinha.com Prof. Rodrigo Rocha [email protected]Onde Estamos Ementa • Revisão: Estrutura de dados;Crescimento de funções; Indução matemática e métodos matemáticos Indução matemática e métodos matemáticos. Medidas de complexidade, análise assintótica de limites de complexidades. Exemplos de análise de algoritmo iterativos e recursivos. Análise de desempenho de alguns algoritmos clássicos de busca e ordenação. Introdução aos principais paradigmas do projeto de algoritmos. Complexidade do Problema: Limites de Complexidade, Intratabilidade, Classes P, NP, problemas Np completos e NP-difíceis.
33
Embed
Análise e Complexidade dAl itde Algoritmos - BolinhaBolinha · Análise de desempenho de alguns algoritmos ... Introdução aos principais paradigmas do projeto de ... Escreva um
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
06/05/2010
1
Análise e Complexidade d Al itde AlgoritmosAlgoritmos de árvores
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]]
then left [p[y]] ← xthen 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
06/05/2010
10
Árvores binárias
Exercício• Para a árvore abaixo representada, responda as
seguintes questões:g q
• Número de elementos
• Altura
• Elemento Root (Pai)
• Elementos folhas
Árvores binárias - exercícios 1-) 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 Cormen): Trace as árvores de pesquisa binária de 2-) (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( )WALK(x)
06/05/2010
11
Exercícios
4-) Escreva o algortimo tree-predecessor.
5 ) Qual a complexidade dos algortimos de 5-) Qual a complexidade dos algortimos de sucessor e predecessor? Explique como você chegou nesta complexidade.
Exercícios
6-) 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
06/05/2010
12
Exercícios
7-) (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
üê i b i ã d üê i d ó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/c
trabalham 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 filhos
As chaves são armazenadas em ordem crescente
Cada 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 predecessora
Um 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-Tree Fator 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
Em algumas circustâncias, o nó root poderá violar esta propriedade tendo menos que t-1 chaves
Cada 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• Se o acesso ao nó requer acesso ao disco a b tree deverá minimizar• 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
06/05/2010
20
B-Tree
Exemplo• B-tree com fator de minimização 3 (t=3)mínimo de chaves (t-1) = 2( )
máximo de chaves (2t-1) = 5
máximo de filhos (2t) = 6
B-Tree
B-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 meio de armazenamento que são mais “custosos” (oumeio de armazenamento, que são mais custosos (ou consomem mais tempo)
06/05/2010
21
B-Tree
Criação• A operação de criação, cria uma árvore B
alocando um nó root sem valores e sendo t bé f lhtambém folhaComplexidade O(1)
B-Tree-Create(T)
x <- Allocate-Node()l f[ ] < TRUEleaf[x] <- TRUEn[x] <- 0Disk-Write(x)root[T] <- x
B-Tree Pesquisa
• 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• 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)( , )• 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• Outra busca binária em seus filhos => O(lg(t))• => O (log(t) log (n) )
06/05/2010
22
B-Tree Exemplo
• Pesquisando o valor 21
B-Tree Inserçã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 ,
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 estiver cheio quando estiver percorrendo a árvore para efetuar 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)
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-Tree Divisã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.• Complexidade O(t), onde t é constanteComplexidade 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]
n[y] <- t - 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)
06/05/2010
24
B-Tree Exemplo
• Inserindo o valor 33, em uma árvore de faor de minimização t=3
B-Tree
Remoção1. Se a chave não estiver numa folha, troque-a com seu sucessor
imediato.
2. Elimine a chave da folha.2. 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.
Exercícios 1-) 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ícios 6-) 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
D h á d i d i ã• Desenhe a árvore depois da inserção
7-) Construa a b-tree com os seguintes valores. (inseridos nesta ordem)) g ( )• 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
06/05/2010
26
Demonstração
Animações na web• http://slady.net/java/bt/view.php?w=600&h=450
Heap Estrutura de dados especial baseada em árvore binária
Propriedades do heap• uma árvore “quase” completa, ou seja todos os seus níveis estão
completos, com exceção do último que pode não estarcompletos, com exceção do último que pode não estar
• Se B é um filho de A, então chave(A) >= chave(B).
• Isto implica que: o elemento com a maior chave, está sempre no nó pai
• Chamado de heap máximo
Também existe a implementação do heap mínimo
O elemento maior(ou menor) sempre fica na raizO e e e o a o (ou e o ) se p e ca a a
Importantíssimo para:• Fila de prioridade
• Algortimos gráficos
06/05/2010
27
Heap
Estrutura• altura da heap = Ө(log n)
Implementação• vetor
raiz = A[1]
pai A[i] = [ � i/2⌡]
filho da esquerda A[i] = A[2*i]
filho da direita A[i] = A[2*i+1]
MAX-HEAPIFY Devemos sempre manter a propriedade do heap máximo
• Antes de MAX-HEAPIFY, A[i] pode ser menor que seus filhos.• Assumimos que a árvore a esquerda e direita de i são heap
máximos• Depois de MAX-HEAPIFY, sub-árvore de pai i é heap máximo
Funcionamento de MAX-HEAPIFY:
• Comparar A[i], A[ESQUERDA(i)], e A[DIREITA(i)].• Se necessário, trocar A[i] com o maior valor entre os filhos,
preservando as propriedades do heap• Continua o processo de comparação e troca nos níveisContinua o processo de comparação e troca nos níveis
inferiores da árvore, até a subárvore de i ser heap máximo. Se temos uma folha, ela já está no heap máximo
06/05/2010
28
Algoritmo Algoritmo
Max-Heapify (A, i)
1 l = Left (i)1 l = Left (i)
2 r = Right (i)
3 if l ≤ heap-size[A] and A[l] > A[i]
4 then largest = l
5 else largest = i
6 if r ≤ heap-size[A] and A[r] > A[largest]
7 then largest = rg
8 if largest <> i then
9 exchange A[i] = A[largest]
10 Max-Heapify (A, largest)
Exemplo Exemplo
• Max-Heapify(A,2), onde tamanho do heap=10
• A[2] viola a propriedade de heap máximo b-) A propriedade de heap máximo e restaurada
c ) depois de chamada recursiva o nó A[4] também é consertado c-) depois de chamada recursiva, o nó A[4] também é consertado
Complexidade : O(log n)
06/05/2010
29
Construção da árvore heap
Construindo uma árvore heap a partir de um vetor desordenado
• violou a propriedade do heap (15>8), logo é trocado
• continua violando a propriedade do heap (15>11), troco novamente
• Complexidade: O(log n)
Operações
Remoção da raiz• basicamente efetuamos a remoção
da raiz e troco pelo último elemento do vetorelemento do vetor
• removo a raiz e troco pelo elemento 4 (último elemento do vetor)
• violou a propriedade do heap (4<8), p p p ( ),logo é trocado
• Complexidade: O(log n)
06/05/2010
31
HeapSort
Algoritmo• Dado um vetor como entrada:
Construímos o heap máximo a partir do vetor
C d ó i ( l t á i ) l it lComeçando na nó raiz (elemento máximo), o algoritmo coloca o maior elemento em seu lugar correto no vetor, trocando-o com o elemento da última posição do vetor
“Descartamos” o último nó (sabendo que ele já está no lugar correto) diminuindo o tamanho do heap e chamando MAX-HEAPIFY na nova raiz (possivelmente está no lugar incorreto)
Repetimos a operação de descarte até restar um nó (o menor elemento) e ele se encontrar na posição corretaelemento), e ele se encontrar na posição correta
• ComplexidadeConstruímos o heap máximo O(n log n)
Repetidamente, removemos o elemento root e trocamos com o último elemento O(log n)
= O (n log n)
Exemplo
Exemplo
06/05/2010
32
Exercícios 1-) Represente as árvores binárias abaixo utilizando vetor. Qual destas árvores não pode ser denominadas heap máximo?
Justifique.
2-) Utilizando aritmética, calcule o índice do vetor para:• Pai de A[9] • nó esquerdo de A[2] • nó direito de A[2]
3-) Para o vetor a seguir, construa a árvore que o represente. Esta árvore é do tipo heap máximo? Por que?
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
99 90 85 71 72 66 69 32 45 50 41 20 14 11 5
Exercícios 4-) Crie uma árvore heap máximo a partir do vetor abaixo.
• Desenhe cada inserção. S houve troca, indicar a troca efetuada.
5 ) Na árvore do exercício anterior informe a complexidade das seguintes10 15 7 3 4 25
5-) Na árvore do exercício anterior, informe a complexidade das seguintes operações:• Ilustre as operações• - inserção de um elemento de valor 18• - remover a raiz• - heapsort
6-) Utilizando o vetor do exercício 4, crie (ilustrando graficamente) o heap ) ( g ) pmínimo.
7-) Qual a complexidade de unir duas árvores heap? Justifique.
8-) Por que heap pode ser utilizado como fila de prioridades?
06/05/2010
33
Exercícios
9-) Para a árvore de heap mínimo abaixo, insira o valor 42. Ilustre o processo.
10-) Para a árvore de heap mínimo do exercício anterior, ilustre o processo de remoção do nó com valor 6.