Estruturas de Dados Dinâmicas

Slides:



Advertisements
Apresentações semelhantes
Lista Encadeada Circular Lista Duplamente Encadeada
Advertisements

Lista encadeada Representar um grupo de dados.
© Copyright 2007 Algoritmos e Estruturas de Dados - Todos os direitos reservados Átila Valgueiro Malta Moreira Juliana Medeiros de Lucena Rafael Alberto.
Conjuntos Algoritmos e Estruturas de Dados - IF672
© Copyright 2003 Algoritmos e Estruturas de Dados - Todos os direitos reservados Grafos IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório.
Árvores AVL Algoritmos e Estruturas de Dados - IF672
© Copyright 2007 Algoritmos e Estruturas de Dados - Todos os direitos reservados Estruturas de Dados Dinâmicas IF672 - Algoritmos e Estruturas de Dados.
© Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.
Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva.
© Copyright 2003 Algoritmos e Estruturas de Dados - Todos os direitos reservados Busca em Grafos IF672 - Algoritmos e Estruturas de Dados CIn - UFPE ©
© Copyright 2007 Algoritmos e Estruturas de Dados - Todos os direitos reservados Ponteiros IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Murilo Raphael.
Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva Botelho Matheus Bispo.
© Copyright 2003 Algoritmos e Estruturas de Dados - Todos os direitos reservados Busca Gulosa em Grafos IF672 - Algoritmos e Estruturas de Dados CIn -
Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva.
INE5408 Estruturas de Dados Ponteiros, passagem de parâmetros e modelos de memória.
PROGRAMAÇÃO ORIENTADA A OBJETOS EM C++ Professor: Dilvan Moreira.
Estrutura de Dados (DPADF 0056) Aula 5 – Estr. Clássicas - Fila Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior.
Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP Alocação Dinâmica de Memória.
Estrutura de Dados (DPADF 0056) Aula 7 – Encadeamento de Memória Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior.
Estrutura de Dados (DPADF 0056) Aula 8 – Estr. Clássicas - Lista Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior.
Disciplina: Estrutura de Dados Professor: Jeovane Reges Caxias – MA 2015 ACULDADE DE CIÊNCIAS E TECNOLOGIA DO MARANHÃO.
Professor: Felipe Lopes M. Faria Disciplina: Sistemas Operacionais 1.
Supervisão e Redes Industriais Tutorial E3 Elipse Capítulo 14 ARMAZENAMENTO DE DADOS Felipe Domeni, Gabriel Martin, Leandro Gomes Rafael Benoliel, Tiago.
Classes Objetos Atributos Métodos Coletor de Lixo (Garbage Collector ) Confraria do Java Nivelamento. Caroline, Marcelo e Luiz 12/05/2007.
INE5408 Estruturas de Dados
Arquitetura de Computadores-S.O.
INF1007: Programação 2 8 – Listas Encadeadas
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2017
Vetores e Matrizes em C/C++
Persistência de dados e padrão DAO
SISTEMAS OPERACIONAIS
ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
INF1007: Programação 2 2 – Alocação Dinâmica
Programação Orientada a Objetos
INE5408 Estruturas de Dados
3.1 Classes e Objetos Em um programa orientado a objetos normalmente existem vários objetos de um mesmo tipo. Por exemplo, um programa de controle de.
INF1007 – Programação 2 9 – Pilhas
Métodos de Pesquisa e Ordenação
Prof. Wellington Franco
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas
Estruturas de Dados Aula 5: Matrizes
Estrutura de dados Pilhas e filas
Prof. Wellington Franco
FUNDAMENTO DE PROGRAMAÇÃO
CONCEITO DE VARIÁVEIS ESTÁTICAS
Criação e manipulação de objetos
Árvores.
Prof. Wellington Franco
Algoritmos e Estruturas de Dados I
XIX Escola de Verão IAG/USP Python Contêiner Marcelo Bianchi
Algoritmos e Programação MC102

Listas Encadeadas.
Entrada e Saída de Dados com Arquivos – Java
3.2 Sobrecarga de Métodos (Overloading)
Instalação e Manutenção de Computadores Técnico em Informática MAI1
Rosemary Silveira Filgueiras Melo
Prof. Rafael Mesquita Fila Prof. Rafael Mesquita
Computação Eletrônica Vetores e Matrizes
Algoritmos e Estruturas de Dados I – Ponteiros
Estruturas de Dados em C
Filas.
Estruturas definidas pelo programador
Universidade do Vale do Rio dos Sinos - São Leopoldo -
Prof. Rafael Mesquita Listas Encadeadas Prof. Rafael Mesquita
Estruturas de Dados Aula 5: Matrizes 16/03/2015. Matrizes Conjuntos bidimensionais declarados estaticamente float mat[4][3]; acesso de elemento: mat[2][0]
A interface java.util.List
CALCULADORA CARACTERE E VARIÁVEIS COMPOSTAS OU VETORES EM JAVA
RESULUÇÃO DOS EXERCÍCIOS E
Sobre a linguagem Criado em 1995 por Brendan Eich da Netscape nomeada inicialmente de Mocha, posteriormente LiveScript e por fim JavaScript. É um linguagem.
Transcrição da apresentação:

Estruturas de Dados Dinâmicas IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva Botelho Matheus Bispo Arrais de Souza Murilo Raphael de Souza Lira Rafael Alberto Gomes Pereira Lima Rafael Brandão Lobo Rafael Loureiro de Carvalho Tiago Carneiro Pessoa Canto Vinicius Miranda Cesar If672.ufpe@gmail.com © Copyright 2007 Algoritmos e Estruturas de Dados - Todos os direitos reservados

Tipos de Estruturas de Dados As estruturas de armazenamento de dados podem ser classificadas da seguinte maneira: Estruturas estáticas: podem armazenar até uma quantidade fixa de elementos, que deve ser indicada quando ela é criada; Estruturas dinâmicas: o tamanho e a capacidade variam de acordo com a demanda, a medida que o programa vai sendo executado. Em geral, são construídas com ponteiros/referências.

Estruturas Estáticas: Arrays Estruturas que armazenam uma quantidade fixa de elementos do mesmo tipo. O acesso a um elemento é feito a partir do índice do elemento desejado. A[0] A[3] A[n-1] A 1 2 3 ... n-1 Arrays não podem armazenar mais elementos do que o seu tamanho, logo, o tamanho deve ser o máximo necessário.

Estruturas Estáticas: Arrays Quando a quantidade de elementos é variável, o uso de arrays pode desperdiçar memória, já que nem todas as suas posições são necessariamente ocupadas. A 1 2 3 ... n-1 Espaço desperdiçado Espaço utilizado

Estruturas Dinâmicas: Listas Estruturas criadas para evitar o desperdício de memória, alocando apenas o espaço necessário para seus dados. A construção é feita a partir de ponteiros/referências. 5 8 1 4 Após a inserção: 3 Antes da inserção:

Listas Encadeadas Ao contrário de um array, uma lista não pode acessar seus elementos de modo direto, e sim, de modo seqüencial, ou seja, um por vez 3 L 1 2 7 A A estrutura Lista geralmente contém uma referência para o primeiro elemento da lista (NoLista inicio), a partir do qual todos os outros poderão ser acessados.

Lista de referências para objetos da classe String Listas Encadeadas Armazenam uma quantidade variável de elementos do mesmo tipo 5 L 8 1 4 Lista de inteiros L Lista de referências para objetos da classe String “Algoritmos” “Estruturas” “Dados”

Listas Simplesmente Encadeadas Listas são formadas por estruturas chamadas nós. Um nó é uma estrutura auto-referencial, isto é, contém uma referência para outra estrutura do mesmo tipo 3 L 1 2 Dado armazenado no nó atual Referência para o próximo elemento da lista Indicador do fim da lista (referência null)

Listas Simplesmente Encadeadas Ex: Nó de uma lista de inteiros class NoLista { int valor; NoLista next; } Elemento do nó Referência para o nó seguinte Ex: Nó de uma lista de objetos da classe String class NoLista { String nome; NoLista next; } Elemento do nó Referência para o nó seguinte

Listas Simplesmente Encadeadas O fim de uma lista é indicada por uma referência nula (representada por um X), ou seja, o último nó de uma lista referencia como o próximo elemento o null L 5 8 1 valor / next valor / next public NoLista (int valor) { this.valor = valor; this.next = null; } Indicador do fim da lista (referência null)

Listas Simplesmente Encadeadas Para criar a lista propriamente dita, criaremos a classe Lista, que manipula objetos do tipo NoLista class Lista { NoLista inicio; public Lista() { this.inicio = null; } // insere valor no começo da lista public void inserir(int valor) {...} // insere valor no fim da lista public void inserirNoFim(int valor) {...} }

Inserção em Listas Para inserir um elemento em um array, pode ser necessário expandi-lo e copiar os elementos um a um: 9 13 2 10 3 7 8 9 13 2 10 3 7 8 ... 5 Em uma lista, basta criar um nó, encontrar a posição desejada e inseri-lo 9 13 2 10 3 7 8 5

Inserção em Listas Qualquer operação em uma lista (inserção, remoção, busca, etc.) simples/duplamente encadeada é feita a partir de um NoLista armazenado na classe Lista. Se o NoLista não existir (referência nula), a lista está vazia if (lista.inicio == null) { ... } Se estiver vazia, a inserção torna-se uma tarefa fácil: basta atribuir o início ao novo nó. Senão, é preciso encontrar o local correto para inserir o novo elemento, sendo geralmente o começo ou o fim da lista.

Inserção em Listas L L Se a lista estiver vazia: 9 novo nó Caso contrário, inserindo no fim da lista teremos: 3 L 1 2 último nó? NÃO último nó? NÃO último nó? SIM 9 novo nó

Inserção em Listas public void inserirNoFim(int valor) { if (this.inicio == null) { // lista vazia this.inicio = new NoLista(valor); } else { // procura pelo fim da lista NoLista atual = this.inicio; while (atual.next != null) atual = atual.next; // insere o nó no fim da lista atual.next = new NoLista(valor); } }

Inserção em Listas public void inserir(int valor) { if (this.inicio == null) { // lista vazia, então só é preciso criar o nó this.inicio = new NoLista(valor); } else { // cria-se novo no e atualiza o NoLista inicio NoLista novoNo = new NoLista(valor); novoNo.next = this.inicio; this.inicio = novoNo; } }

Inserção Ordenada em Listas Para inserir um elemento em um array em uma posição qualquer, pode ser necessário mover vários elementos: ... 2 3 4 7 8 9 10 13 2 3 4 7 8 9 10 13 ... 5 Da mesma maneira, em uma lista, basta criar um nó, encontrar a posição desejada e inseri-lo 2 3 4 7 8 9 10 13 5

Inserção Ordenada em Listas Para inserir um nó entre dois outros nós: 4 7 anterior anterior.next ... anterior.next novo nó 5 NoLista novoNo = new NoLista(5); novoNo.next = anterior.next; anterior.next = novoNo;

Remoção em Listas Para remover um elemento de uma posição qualquer do array, pode ser necessário mover vários elementos: ... 5 2 3 4 7 8 9 10 13 2 3 4 7 8 9 10 13 ... Para remover um elemento de uma lista, basta encontrar o nó correspondente e alterar os ponteiros 2 3 4 7 8 9 10 13 5

Remoção em Listas Para excluir um nó entre dois outros nós: ... anterior.next nó atual 1 2 9 anterior anterior.next.next ... anterior.next = anterior.next.next; Após isso, o nó atual não é mais utilizado, e o garbage collector já pode liberar a memória ocupada. Não precisa e nem se deve chamar System.gc()!

Genéricos class NoListaI{ int valor; NoLista next; } Adicionado a C# 2.0 e posteriormente a Java 5 Classes Genéricas, que utilizam o conceito de “parâmetros tipo”<..> Lista com Genéricos: cada lista armazena um tipo específico, sem precisar criar código novo para cada tipo Sem Genéricos: Com Genéricos: class NoListaI{ int valor; NoLista next; } class NoLista<E> { E elemento; NoLista<E> next; } class NoListaS{ String nome; NoLista next; }

Listas com Genéricos class Lista<E> { NoLista<E> inicio; public Lista() { this.inicio = null; } public void inserir(E elemento) { if (this.inicio == null) { this.inicio = new NoLista<E>(elemento); } else { NoLista<E> novoNo = new NoLista<E>(elemento); novoNo.next = this.inicio; this.inicio = novoNo; } } }

Listas vs Pilhas vs Filas Listas podem apresentar diversas funções de inserção/remoção(no começo, no fim, em qualquer parte da lista). Pilhas seguem o padrão LIFO(Last-In-First-Out), usando apenas as funções push(inserir no começo) e pop(remover do começo) Filas seguem o padrão FIFO(First-In-First-Out), usando apenas as funções queue(inserir no fim) e dequeue (remover do começo) Sendo assim, implementar pilhas e filas a partir de listas é simples, já que listas incluem as funções do padrão LIFO e FIFO.

Arrays vs. Listas Arrays podem ocupar espaço desnecessário na memória, mas seu acesso é feito diretamente Listas ocupam apenas o espaço necessário, mas é preciso espaço extra para armazenar as referências. Além disso, seu acesso é seqüencial, ou seja, a busca inicia por um nó, depois vai pra outro nó, e assim por diante, até que se encontre o nó procurado. Listas duplamente encadeadas (dois ponteiros dentro de cada nó, um para o próximo nó e outro pro anterior) dão maior poder de implementação das funções, apesar dos custos adicionais de memória por conta do número de ponteiros.