Pesquisa em Memória Primária – Árvores de Busca

Slides:



Advertisements
Apresentações semelhantes
LISTAS Dilvan Moreira, parcialmente baseado em material do prof. Ricardo Campello.
Advertisements

Aula T10 – BCC202 Listas – Parte 2 Túlio Toffolo www. decom. ufop
Aula T-09 – BCC202 Listas (Parte 1) Túlio Toffolo www. decom. ufop
Marco Antonio Montebello Júnior
Aula 10 Algoritmos de Busca
Estruturas de Dados Árvores Binárias
Recursividade Prof. Rosana Palazon.
Listas encadeadas Prof. Rosana Palazon.
Listas duplamente encadeadas
Árvores.

David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Estruturas de Dados I DECOM – UFOP
Pesquisa em Memória Primária
Pesquisa em Árvores Digitais
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Pesquisa em Memória Primária – Árvores AVL
Filas David Menotti Estruturas de Dados I DECOM – UFOP.
David Menotti Estruturas de Dados I DECOM – UFOP
Pesquisa em Memória Primária - Hashing
HeapSort Filas de Prioridade – Heap
Pesquisa em Memória Primária – Árvores de Busca
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Medida do Tempo de Execução de um Programa
David Menotti Estruturas de Dados I DECOM – UFOP
Pilha David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP.
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Medida do Tempo de Execução de um Programa
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Pesquisa em Memória Primária
Aula T12 – BCC202 Listas Túlio Toffolo
David Menotti Estruturas de Dados I DECOM – UFOP
Árvores Introdução e Aplicações Árvores de Busca Binária Fundamentos
Pesquisa em Memória Primária
Pesquisa em Memória Primária (cont.)
Análise Léxica Supondo o trecho de programa abaixo:
Listas com Ponteiros Listas encadeadas Listas circulares.
Listas Encadeadas.
Fundamentos sobre Árvores
ALGORITMOS E ESTRUTURAS DE DADOS
Algoritmos e Estruturas de Dados II
Pesquisa em Memória Primária
Árvores binárias de pesquisa com balanceamento
INTELIGÊNCIA ARTIFICIAL
Árvore de Pesquisa Memória Secundária Engenharia de Computação - UFG.
Árvores Binárias de Pesquisa
Algorítmos e estrutura de dados III
Lista Encadeada Circular Lista Duplamente Encadeada
Algorítmos e estrutura de dados III Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Aula 03 – BCC202 Análise de Algoritmos (Parte 1) Túlio Toffolo www
Estruturas de Dados Aula 9: Listas (parte 1)
© Copyright 2007 Algoritmos e Estruturas de Dados - Todos os direitos reservados Átila Valgueiro Malta Moreira Juliana Medeiros de Lucena Rafael Alberto.
Árvore Binária de Busca
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática

Árvores Binárias Profa. Patrícia A. Jaques Luiz Gonzaga Jr
Estruturas de Dados Aula 15: Árvores
– Aula 20 Adaptado por Reinaldo Fortes para o curso de
Aula 10 Algoritmos de Busca
Prof. Hilton Cardoso Marins Junior ÁRVORES BINÁRIAS.
Capítulo VI – Variáveis Indexadas 6.1 – A necessidade de variáveis indexadas 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações.
© 2011 Pearson Prentice Hall. Todos os direitos reservados.slide 1 © 2011 Pearson Prentice Hall. Todos os direitos reservados.slide 1 © 2011 Pearson Prentice.
Prof. Hilton Cardoso Marins Junior

BANCO DE DADOS II Árvore de Dados. FATEC - GUARATINGUETÁ Professor: Eduardo Barbosa Adiel Lemos Ana Renata Bruno Michael Jéssica Fernanda Layla Monique.
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
UNIVERSIDADE FEDERAL DE MINAS GERAIS Árvores Cristiano Arbex Valle Vinicius Fernandes dos Santos
Transcrição da apresentação:

Pesquisa em Memória Primária – Árvores de Busca David Menotti Estruturas de Dados I DECOM – UFOP

Árvores de Pesquisa A árvore de pesquisa é uma estrutura de dados muito eficiente para armazenar informação. Particularmente adequada quando existe necessidade de considerar todos ou alguma combinação de: 1. Acesso direto e sequencial eficientes. 2. Facilidade de inserção e retirada de registros. 3. Boa taxa de utilização de memória. 4. Utilização de memória primária e secundária.

Árvores Binárias de Pesquisa sem Balanceamento Para qualquer nó que contenha um registro Temos a relação invariante Todos os registros com chaves menores estão na subárvore à esquerda. Todos os registros com chaves maiores estão na subárvore à direita.

Árvores Binárias de Pesquisa sem Balanceamento O nível do nó raiz é 0. Se um nó está no nível i então a raiz de suas subárvores estão no nível i + 1. A altura de um nó é o comprimento do caminho mais longo deste nó até um nó folha. A altura de uma árvore é a altura do nó raiz.

TAD-Árvore Binária de Pesquisa Estrutura de dados: typedef long TChave; typedef struct Registro { TChave Chave; /* outros componentes */ } Registro; typedef struct TNo * Apontador; typedef Apontador TipoDicionario; typedef struct No { Registro Reg; Apontador pEsq, pDir; } TNo;

Procedimento para Pesquisar na Árvore Para encontrar um registro com uma chave x: Compare-a com a chave que está na raiz. Se x é menor, vá para a subárvore esquerda. Se x é maior, vá para a subárvore direita. Repita o processo recursivamente, até que a chave procurada seja encontrada ou um nó folha é atingido. Se a pesquisa tiver sucesso então o conteúdo do registro retorna no próprio registro x.

Procedimento para Pesquisar na Árvore int Pesquisa(Apontador pRaiz,Registro *pX)‏ { if (pRaiz == NULL) return 0; if (pX->Chave < pRaiz->Reg.Chave) return Pesquisa(pRaiz->pEsq,pX); if (pX->Chave > pRaiz->Reg.Chave) return Pesquisa(pRaiz->pDir,pX); *pX = pRaiz->Reg; return 1; }

Procedimento para Pesquisar na Árvore (não recursivo) int Pesquisa(Apontador pRaiz, Registro *pX)‏ { Apontador pAux; pAux = pRaiz; while(pAux != NULL) if (pX->Chave == pAux->Reg.Chave) { *pX = pAux->Reg; return 1; } else if (pX->Chave > pAux->Reg.Chave) pAux = pAux->pDir; else /* if (pX->Chave < pAux->Reg.Chave) */ pAux = pAux->pEsq; } return 0; /* não encontrado! */

Procedimento para Inserir na Árvore Onde inserir? Atingir um apontador nulo em um processo de pesquisa significa uma pesquisa sem sucesso. O apontador nulo atingido é o ponto de inserção. Como inserir? Cria célula contendo registro Procura lugar na árvore Se registro não tiver na árvore, insere-o

Procedimento para Inserir na Árvore int Insere(No** ppR,Registro x)‏ { if (*ppR == NULL) { *ppR = CriaNo(X); return 1; } if (X.Chave < (*ppR)->Reg.Chave) return Insere(x, &((*ppR)->pEsq) ); if (X.Chave > (*ppR)->Reg.Chave) return Insere(x, &((*ppR)->pDir) ); return 0; /* elemento jah existe */ }

Procedimento para Inserir na Árvore (não recursivo) int Insere(No** ppRaiz,Registro x)‏ { No** ppAux; ppAux = ppRaiz; while (*ppAux != NULL) if (X.Chave < (*ppAux)->Reg.Chave) ppAux = &((*ppAux)->pEsq); else if (X.Chave > (*ppAux)->Reg.Chave) ppAux = &((*ppAux)->pDir); else return 0; } *ppAux = CriaNo(X); return 1;

Procedimento para Inserir na Árvore (não funciona para arv. Vazia) int Insere(No* pRaiz,Registro X)‏ { if (pRaiz == NULL) return -1; /* arvore vazia */ if (X.Chave < pRaiz ->Reg.Chave) if (pRaiz->pEsq == NULL) { pRaiz->pEsq = CriaNo(X); return 1; } else return Insere(pRaiz->pEsq,X); } if (X.Chave > pRaiz->Reg.Chave) if (pRaiz->pDir == NULL) { pRaiz->pDir = CriaNo(X); return 1; } else return Insere(pRaiz->pDir,X); return 0; /* elemento igual */

Procedimentos para Inicializar a Árvore void Inicializa(Apontador *Dicionario) { *Dicionario = NULL; }

Retirada de um Registro da Árvore Como retirar? Folha? Nó interno, contendo um filho? Raiz da árvore ou subárvore?

Procedimento para Retirar x da Árvore Alguns comentários: 1. A retirada de um registro não é tão simples quanto a inserção. 2. Se o nó que contém o registro a ser retirado possui no máximo um descendente ⇒ a operação é simples. 3. No caso do nó conter dois descendentes o registro a ser retirado deve ser primeiro: – substituído pelo registro mais à direita na subárvore esquerda; – ou pelo registro mais à esquerda na subárvore direita.

Exemplo de Retirada de um Registro da Árvore Assim: para retirar o registro com chave 5 da árvore basta trocá-lo pelo registro com chave 4 ou pelo registro com chave 6, e então retirar o nó que recebeu o registro com chave 5.

Exemplo de Retirada de um Registro da Árvore Int Retira(Registro x, Apontador *p)‏ { Apontador Aux; if (*p == NULL) { printf("Erro : Registro nao esta na arvore\n"); return 0; } if (x.Chave < (*p)->Reg.Chave) return Retira(x, &(*p)->pEsq); if (x.Chave > (*p)->Reg.Chave) return Retira(x, &(*p)->pDir); if ((*p)->pDir == NULL) { Aux = *p; *p = (*p)->pEsq; free(Aux); return 1; } if ((*p)->pEsq != NULL) { Antecessor(*p, &(*p)->pEsq); return; /* ((*p)->pEsq == NULL) */ *p = (*p)->pDir;

Exemplo de Retirada de um Registro da Árvore void Antecessor(Apontador q, Apontador *r)‏ { Apontador aux; if ( (*r)->pDir != NULL) Antecessor(q, &(*r)->pDir); return; } q->Reg = (*r)->Reg; aux = *r; *r = (*r)->pEsq; free(aux);

Exemplo de Retirada de um Registro da Árvore Obs.: proc. recursivo Antecessor só é ativado quando o nó que contém registro a ser retirado possui 2 descendentes. Solução usada por Wirth, 1976, p.211.

Outro Exemplo de Retirada de Nó

Outro Exemplo de Retirada de Nó

Caminhamento Central Percorrer a árvore: Em que ordem chaves são recuperadas (usando caminhamento central)? 1, 2, 3, 4, 5, 6 e 7.

Caminhamento Central Após construída a árvore, pode ser necessário percorrer todo os registros que compõem a tabela ou arquivo. Existe mais de uma ordem de caminhamento em árvores, mas a mais útil é a chamada ordem de caminhamento central. O caminhamento central é mais bem expresso em termos recursivos: 1. caminha na subárvore esquerda na ordem central; 2. visita a raiz; 3. caminha na subárvore direita na ordem central. Uma característica importante do caminhamento central é que os nós são visitados de forma ordenada.

Caminhamento Central O procedimento Central é mostrado abaixo: void Central(Apontador p)‏ { if (p == NULL) return; Central(p->pEsq); printf("%ld\n", p->Reg.Chave); Central(p->pDir); }

Análise O número de comparações em uma pesquisa com sucesso: melhor caso : C(n) = O(1)‏ pior caso: C(n) = O(n)‏ caso médio : C(n) = O(log n)‏ O tempo de execução dos algoritmos para árvores binárias de pesquisa dependem muito do formato das árvores.

Análise 1. Para obter o pior caso basta que as chaves sejam inseridas em ordem crescente ou decrescente. Neste caso a árvore resultante é uma lista linear, cujo número médio de comparações é (n + 1)/2. 2. Para uma árvore de pesquisa aleatoria o número esperado de comparações para recuperar um registro qualquer é cerca de 1,39 log n, apenas 39% pior que a árvore completamente balanceada.