Buscar

Árvore B e Hashing

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 4 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Prova de ED2 - Integral - 08-11-12
(3 pontos) Fazer uma função que receba como parametros MIN e MAX, a função percorre uma árvore B e imprime os valores que estiverem entre o intervalo MIN MAX.
algoritmo que o david fez, da pra colocar mais 2 condições pra melhorar a perfomace, porém assim já ta no pêlo e vale 3 pontos;
VALEU DAVIDAO!!!
typedef struct arvore_b
{
   int keycount;//Numero de chaves no bloco
   int key[n];//onde N eh ordem-1
   int pointer[m];//onde m eh ordem. ponteiro nulo = -1
   int RRN[n];
}arvore_b
void buscar(int min, int max, int pointer)
{
   //considere o arquivo de arvore jah aberto e com nome arq_arvore;
   arvore_b bloco;
   int i;
   if(pointer != -1){ 
       fseek(arq_arvire, pointer, 0);
       fread(&bloco, sizeof(arvore_b), 1, arq_arvore);
       for(i=0; i<bloco.keycount; i++)
       {
           if(bloco.key[i] >= min && bloco.key[i] <= max)
           {            
               buscar(min,max,bloco.pointer[i]);
               printf("%d ", bloco.key[i]);
               if((i+1) == keycount) buscar(min,max,bloco.pointer[i+1]);
           }
       }
   }
}
Grego says: quem mandou esse algoritmo abaixo?
Não sei quem mandou mas Tá na Wikipedia! Só foram adicionados os parâmetros.
Pois é...ta errado, no faz sentido!
Não mesmo.. Falta uma estrutura de repetição para buscar em todas as páginas..
É o que tá escrito parece não é? Só falta os códigos heuhuehe
R: Decora isso e garante 0,5 uahiuahhiaaia
ED2 201x?????? sad. Ad Eternum
Achei a solução: http://www.anhanguera.com/graduacao/cursos/ciencia_computacao.php
Não é pra fazer busca. É pra percorrer toda(ta, nem toda) a árvore! Dai quando o valor que você ta lendo ta entre o intervalo MIN e MAX você imprime. A função não retorna nada.
Ta certo?
sim, ate um bixo saberia
a galera ai não tava parecendo q sabia uHAUHAU
void intervalo(bTree raiz, int min, int max){
	int i=0;
	for(i=0; i< raiz.n;i++){
		intervalo(raiz->ponteiro[i],min,max);
		if(raiz->chave[i]>=min && raiz->chave[i]<=max)
			printf(“%d”,raiz->chave[i]);
}
intervalo(raiz->ponteiro[raiz.n],min,max);
}
(1 ponto) Como funciona o Merge Sort? Qual o seu gargalo? Como diminuir o gargalo?
Resposta:
Como funciona?
Utiliza a idéia do heapsort, mas organizando o arquivo em corridas (subarquivos ordenados).
- Fase 1: Geração das corridas
Segmentos do arquivo são ordenados em memória RAM usando algum método de ordenação interna (heapsort) e gravados em disco (subarquivo).
- Fase 2: Intercalação
As corridas geradas são intercaladas, formando o arquivo ordenado.
Qual o gargalo?
O gargalo ocorre durante a leitura das corridas armazenadas na memória (secundária) para realizar o merge. 
o gargalo acontece pq para montar o arquivo final eh preciso acessar todos os subarquivos gerados nas corridas do passo1, ou seja, sao varios seeks, o que torna essa parte um gargalo (onde há mais processamento).
Como diminuir o gargalo?
Alocar mais Hardware, realizar o merge em mais de um passo, aumentar no algoritmo o tamanho de cada corrida, encontrar maneiras de sobrepor as operações de entrada e saída.
(1 ponto) Porque a árvore B é balanceada de acordo com a sua altura? Qual a complexidade do melhor e do pior caso?
Resposta:  Para ter uma quantidade máxima de acessos ao disco constante.
Melhor caso O(1) (a chave procurada se encontra na raiz.)
Pior caso O(log n na base M (M é o numero de chaves)) (a chave procurada está em uma folha.)
fonte: http://www.ic.unicamp.br/~zanoni/mo637/aulas/arvoresB.pdf
(2 pontos) Inserir passo a passo valores em uma árvore B e depois removê-los (ordem 4).
Grego says: ela da os valores a serem inseridos ou ela quer um algoritmo??? Ela dá os valores.
Resposta:       http://www.youtube.com/watch?v=ANZBJw3a944&feature=relmfu -> inserção e remoção.
http://www.youtube.com/watch?v=XxFzd8s2u60
app mostrando inserção e remoção:
http://slady.net/java/bt/view.php (essa animação não está errada com relação a ordem da árvore?) ta certo ou nao? :S
Inserção(imagem): http://upload.wikimedia.org/wikipedia/commons/3/33/B_tree_insertion_example.png
(3 pontos) Hash dinâmico e estático, fazer um desenho passo a passo de cada um (com inserção, remoção, etc). (ela dá valores)
vídeo que demonstra inserção com hasing-> http://jocafe.net63.net/anim6.html
Resposta: Ambas usam o bucket, não entendi a diferença de um pro outro
Grego: estático e dinamico usam bucket, mas estaticos o numero de buckets são definidos, ja os dinamicos, os buckets são encadeados e criados conforme a necessidade
No estatico, seria o caso dela falar que o tamanho do bucket é 2? Ai quando ultrapassa vai quebrando?
Sim, mas não é necessariamente 2...o programador q define o tamanho
Ah sim.
Mas como eu faria esse desenho no dinâmico? nunca vai ter quebras? eu vou acrescentando sempre que for entrando chaves?
no dinamico nunca a quebras...e sempre o ultimo elemento aponta para NULL
www.facom.ufu.br/~ilmerio/gbd2/gbd2_s4_hash.pdf (acho que ajuda um pouco)
A questão do hashing dinâmico é igual aquela que ela deu no fim da penúltima aula, que você tinha números binários 0001, 0010,... e tinha que colocar nos buckets.
Então, por exemplo, você tem que adicionar 0010, 0011, 1000.
Fica assim:
0/1 ->  0010
	0011
00 -> 0010
01-> 0011
10-> 1000
Não sei se deu pra lembrar...
DEu sim!!!!
e estatico? kkkk
Então, o estático pelo que eu lembro, você tem um vetor e vai armazenando os valores, se eles forem duplicados, vai pra uma lista encadeada de sinônimos.
e essa lista é infinita? posso ir adicionando quanto quiser nela?
Acho que sim, só que aí o tamanho do arquivo aumenta...Na verdade essa lista só trata colisões...Ah, respondendo a questão do tamanho, é ruim ter longas cadeias de overflow, por isso se usa o hashing dinâmico. Tem o desenho no link passado acima.
Muita cadeia de overflow = menos espaço verdadeiro do campo, acho que li algo sobre isso
a questão da penúltima aula não era pra fazer com hash extensível?
hash extensivel = hash dinamico (ou nao?)
Isso!

Continue navegando