DATA STRUCTURES, AN ADVANCED APPROACH USING C

Documentos relacionados
Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

ESTRUTURA DE DADOS. Árvores, árvores binárias e percursos. Cristina Boeres

Arvores, Percursos não recursivos, Arvores heterogêneas. Aula 19

Árvores & Árvores Binárias

AED1 - Árvores. Hebert Coelho. Instituto de Informática Universidade Federal de Goiás. HC AED1-Árvores 1/49

Árvores. Prof. Byron Leite Prof. Tiago Massoni Prof. Fernando Buarque. Engenharia da Computação. Poli - UPE

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

ÁRVORES E ÁRVORES BINÁRIAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Árvores Binárias. 16/11 Representação e Implementação: Encadeada Dinâmica O TAD

Pesquisa em memória primária

Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

INF 1620 P2-01/11/03 Questão 1 Nome:

Aula 08. Estruturas de dados Árvore e Grafo

Aula T13 BCC202 Árvores. Túlio Toffolo

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

INF 1620 P2-23/10/04 Questão 1 Nome:

INF 1010 Estruturas de Dados Avançadas. Árvores binárias

CES-11. Algoritmos e Estruturas de Dados

Árvores Binárias. 9/11 e 11/11 Conceitos Representação e Implementação

UNIVERSIDADE DE SÃO PAULO ICMC SCC 202 Algoritmos e Estrutura de Dados I - 2º Semestre 2010 Profa. Sandra Maria Aluísio;

CES-11. Árvores. Conceito de árvore. Definição recursiva de árvore Definições associadas a árvore. Ordenação dos nós de uma árvore

Árvores. Algoritmos e Estruturas de Dados I. José Augusto Baranauskas Departamento de Física e Matemática FFCLRP-USP

Estruturas de Dados II

Árvores de Pesquisa. A árvore de pesquisa é uma estrutura de dados muito eficiente para armazenar informação.

INE5408 Estruturas de Dados

Árvores. Prof. César Melo DCC/ICE/UFAM

DAINF - Departamento de Informática

Árvores. Prof. César Melo DCC/ICE/UFAM

Árvores Binárias de Busca (ABB) 18/11

ESTRUTURAS DE DADOS. prof. Alexandre César Muniz de Oliveira. 1. Introdução 2. Pilhas 3. Filas 4. Listas 5. Árvores 6. Ordenação 7. Busca 8.

PAA-DCC-UFAM. Árvores. Universidade Federal do Amazonas Departamento de Eletrônica e Computação

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca

Árvores. ! utilizada em muitas aplicações. ! modela uma hierarquia entre elementos. ! O conceito de árvores está diretamente ligado à recursão

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

INF1010 Lista de Exercícios 2

Árvores Conceitos gerais

Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM

EAD Árvore árvore binária

ADT - Árvores. ADT Árvores Definição

Árvore Binária Exemplo de Implementação

Árvore Binária de Busca. Prof. César Melo

Heaps. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

ÁRVORE BINÁRIA DE BUSCA

ÁRVORE BINÁRIA DE BUSCA TDA-ABB

1. Proponha algoritmos para: a. Calcular a altura dos nós de uma árvore binária dada, armazenando o valor da altura no nó.

Árvores Binárias de Busca

CONCEITO DE ÁRVORE CES-11. A raiz é o único nó que não possui ancestrais. As folhas são os nós sem filhos. Exemplos:

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

Árvores Binárias de Busca

Árvores Binárias de Busca

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P4 07/12/2010

Árvores Binárias de Busca (ABB) 18/11

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Aplicação de Árvores: Código de Huffman

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Árvores. SCC-214 Projeto de Algoritmos. Thiago A. S. Pardo. Um nó após o outro, adjacentes Sem relações hierárquicas entre os nós, em geral

Árvores binárias de busca

Árvores Binárias Balanceadas Estrutura de Dados I

Revisão: Tipo Abstrato de Dados Recursividade

INF 1007 Programação II

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 23/06/2010

Aula 19: Percursos em árvores binárias. Percurso em pré-ordem, ordem simétrica e pós-ordem. Algoritmo para cálculo de altura uma árvore binária

1. Proponha algoritmos para: a. Calcular a altura dos nós de uma árvore binária dada, armazenando o valor da altura no nó.

Transcrição:

ESTRUTURS DE DDOS prof. lexandre César Muniz de Oliveira 1. Introdução 2. Pilhas 3. Filas 4. Listas 5.Árvores 6. Classificação 7. Busca 8. Grafos Sugestão bibliográfica: ESTRUTURS DE DDOS USNDO C aron M. Tenenbaum, et alli DT STRUCTURES, N DVNCED PPROCH USING C Jeffrey Esakov & Tom Weiss ESTRUTURS DE DDOS E LGORITMOS EM JV (2ED) Michael Godrich & Roberto Tamassia

ÁRVORES 1. Definição Estrutura de dados contendo um número finito de elementos que pode estar vazia ou particionanda em subconjuntos. O primeiro subconjunto contém um único elemento chamado raiz. Os outros subconjuntos são, em si mesmo árvores, chamados subárvores. Essa é uma definição recursive de árvore: Árvores raiz + Árvores raiz + Árvores EXEMPLOS: B C B D E F G H I C D E F G B C D E F G B C B C D E

2. Árvores Binárias Cada elemento está particionado em 3 subconjuntos distintos: Árvore : = [RIZ + <sub_árvore_esq> + <sub_árvore_dir>] [VZI] sub_árvore_esq := <Árvore> sub_árvore_dir := <Árvore> 3. Conceitos SUBIR NÍVEL 0 B C 1 D E F G H I J K L 2 3 DESCER NÍVEL M N 4 a) Pai e filho: é pai de B e C J é filho de F b) ncestral e descendente M é descendente de G B é ancestral de I c) Folha é um nó sem filhos d) Árvore estritamente binária: Árvore cujos nós não-folha tem dois filhos árvore do exemplo não é estritamente binária e) Nível e profundidade Nível 0 = raiz Profundidade é o maior nível encontrado em uma árvore f) Árvore completa: Árvore estritamente binária com folhas no mesmo nível árvore do exemplo, por não ser estritamente binária também não é completa

4. Operações sobre Árvores Binárias B Filho_Esq C Filho_Dir IRMÃOS ESQ (p) IRMO (p) COM DIR (p) GERR: EH_ESQ (p) PI (p) EH_DIR (p) ROTINS EH_ESQ (p) q = PI (p); if (q == NULL) return FLSE; if (ESQ (q) == p) return TRUE; return FLSE; IRMO (p) if (PI (p) == NULL) return FLSE; if (EH_ESQ (p)) return (DIR(PI(p))); else return (ESQ(PI(p))); Operações para criar um nó: CRI_RVORE (x) CRI_ESQUERD (p, x) CRI_NO (p, x) CRI_DIREIT (p, x)

5. Tipos de Percurso 9 Por ordem de visita 9 Por nível 5.1 Percurso por ordem de visita Operações básicas em árvores binárias Visitar um nó Percorrer subárvore à esquerda Percorrer subárvore à esquerda VISIT(no) PERCORRE(no_esq) PERCORRE(no_dir) ordem em que essas operações são efetuadas em cada nó define o tipo de percurso: Pré-ordem ou profundidade VED Em ordem ou simétrica EVD Pós-ordem ou largura EDV 5.1.1 Percurso em Pré-ordem 1) Visita (no) 2) Se existe esq (no) percorre_pre (esq (no)) 3) Se existe dir (no) percorre_pre (dir (no)) 5.1.2 Percurso em Ordem 1) Se existe esq (no) percorre_em (esq (no)) 2) Visita (no) 3) Se existe dir (no) percorre_em (dir (no)) 5.1.3 Percurso em Pós-ordem 1) Se existe esq (no) percorre_pos (esq (no)) 2) Se existe dir (no) percorre_pos (dir (no)) 3) Visita (no)

B C D E F G H I Esquema gráfico de cada um dos percursos Pré-ordem (profundidade) : Ordem (simétrica): Pós-ordem (largura): B D G C E H I F D G B H E I C F G D B H I E F C 5.2 Percurso por nível 1) Visita a raiz (NÍVEL 0) 2) Visita todos os nós de NÍVEL 1 3) Visita todos os nós de NÍVEL 2... n) Visita todos os nós de NÍVEL (n 1)... insere (fila, raiz); enquanto (não vazia(fila)) no := remove (fila); visita (no); if (esq (no) existe) insere (fila, esq (no)); if (dir (no) existe) insere (fila, dir (no)); Obs.: aplicações com árvores, em geral, consiste em duas fases: - construir a árvore baseado em algum algoritmo - percorrer a árvore usando um tipo de percurso

6. Exemplo de aplicações 6.1 Ordenação Dada a sequência 14, 15, 4, 9, 7, 18, 3, 5, 16, 4, 20, 17, 9, 14, 5 CONSTRUÇÃO INTERTIV num := le_numero ( ); raiz := cria_arvore (num); Enquanto (há números na entrada) num := le_numero; p = q = free; enquanto (q NULL) e (num info (p)); p = q; if (num < info (p)) q := esq (p); else q := dir (p); if (num = info (p)) imprime_aviso (num); else if (num < info (p)) cria_esquerda(p, num) else cria_direita(p, num); CONSTRUÇÃO RECURSIV Num = Le_num ( ); Enquanto (há números na entrada) Insere_rvore (root, num); Num = Le_num ( ); Insere_rvore (raiz, x) Se (raiz == NULO) Cria_no (raiz, x); Senao Se ( x < info) Se (esq(raiz)!= NULO) Insere_rvore (esq, x) Senao Cria_no(esq(raiz), x); Senao Se (dir(raiz)!= NULO) Insere_rvore (dir(raiz), x) Senao Cria_no(dir(raiz), x); return; 14 4 15 3 9 18 7 16 20 5 17

6.2 Expressões ritméticas + (B C) * D ^ (E * F) PRÉ-ORDEM: +* BC^D*EF PÓS-ORDEM: BC DEF*^*+ + * ^ B C D * Obs.: folhas são operandos 6.3 Árvore de Jogos E F X O X O X O X O X O X O X O X X X X X X X X O X O X O O O 3 2 3 1 3 1 3 1 3 1 X O X X X X O O X O X O X O O O X X X X O X X X X VITÓRI O O O O O O 2 2 2 2 2 2 2 1 Livres O + Livres X

7 Implementação de Árvores Binárias Struct noarvore void * info; struct noarvore * esquerda; struct noarvore * direita; struct noarvore * pai; ; typedef struct noarvore *PTRNORV; # define info (p) ( (p) info) # define left (p) ( (p) esquerda) # define right (p) ( (p) direita) # define father (p) ( (p) pai) aloca_arvore ( ) libera_arvore (PTRNORV p) dmitindo-se os percursos por ordem de visita e percurso por nível (percurso de cima p/ baixo) é desnecessário o campo PI. IMPLEMENTÇÃO PTRNORV Cria_rvore (void * x) p = aloca_arvore ( ); if (p == NULL) return NULL; info (p) = x; left (p) = right (p) = NULL; return p; Cria_No (PTRNORV * raiz, void * x) if (*raiz!=null) return FLSE; /* já alocado * raiz = loca_rvore ( ); if (*raiz ==NULL) return FLSE; info (*raiz) = x; left (*raiz) = right (*raiz) = NULL; return TRUE; Cria_Esquerda (PTRNORV raiz, void * x) if (raiz == NULL) and left(raiz)!= NULL) return FLSE; left(raiz) = Cria_rvore (x); Cria_Direita (PTRNORV raiz, void * x);

IMPLEMENTÇÃO DE PERCURSO EM ÁRVORE BINÁRI O percurso por ordem de visita pode ser implementado de forma interativa: Enquanto (existir no_esquerdo) P = left (p); Visita (p); Enquanto (existir no_direito) Não vai funcionar: necessário salvar o contexto para se saber a última operação ou a próxima operação a ser realizada. SUGESTÃO: Usar uma pilha de ponteiros para nós de árvores, apontando para o próximo nó a ser seguido DESVNTGENS: lento (muitos PUSHs e POPs) complexo deselegante SUGESTÃO: Recursividade, pois para cada nó, as operações se repetem e chamadas recursivas, automaticamente, salvam o contexto. IMPLEMENTÇÃO DE PERCURSO EM ÁRVORE BINÁRI Pre_ordem (PTRNORV raiz) if (raiz!= NULL) Visita(raiz); Pre_ordem(left(raiz)); Pre_ordem(right(raiz)); Pos_ordem (PTRNORV raiz) if (raiz!= NULL) Pos_ordem(left(raiz)); Pos_ordem(right(raiz)); Visita(raiz); Em_ordem (PTRNORV raiz) if (raiz!= NULL) Em_ordem(left(raiz)); Visita(raiz); Em_ordem(right(raiz));

8 Árvores Binárias Encadeadas Usando elo pai Implementação Usando pilha de Percursos Rec Recursivo Usando fila B C D E F G H I struct noarvore void *info; struct noarvore *esquerdo; struct noarvore *direito; char flag; ponteiro à direita é ou não elo

9. Árvores Binárias Heterogêneas + + 3 3 * 5 4 6 7 Como distinguir operando de operador? Como armazenar diferentes tipos de dados no mesmo tipo de árvore? Struct noarvore unsigned utipo; union char chinfo; float flinfo; info; struct noarvore *esquerdo; struct noarvore *direito; #define operador(x) ( (x) utipo = = 1) #define operando(x) ( (x) utipo = = 0)

lgoritmo de valiação Float avaliarvore (PTRNORV raiz) float op1, op2, resp; char simb; if (operando(raiz)) return (info(raiz)); op1 := avaliarvore(esq(raiz)); op2 := avaliarvore(dir(raiz)); simb:= info(raiz); operacao(op1, simb, op2, &resp) ; return resp; lgoritmo de Construção 10. lgoritmo de Huffman Problema de compactação p/ transmissões Símbolo Código Mensagem: BCCD 00 B 01 00010010101100 C 10 D 11 Comprimento: 14 bits Observando a freqüência em que aparecem os símbolos temos: = 3 B = 2 C = 1 D = 1 0 1 (BD = 2) 0 (CBD = 4) 0 BCD = 7

TBEL COM CÓDIGOS DE TMNHO VRIÁVEL Símbolo Código Mensagem: BCCD 0 B 110 0110010101110 C 10 D 111 Comprimento: 13 bits Como calcular a freqüência? Vantagens para grandes volumes Exemplo: = 15 B = 6 C = 7 D = 12 E = 25 F = 4 G = 6 H = 1 PSSOS : Ordenação (lista classificada por freqüência ) Geração de árvore de menor para maior freqüência Geração de tabela de código de tamanho variável lgoritmo de compactação