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

Documentos relacionados
LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

Método de ordenação - objetivos:

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

INF1007: Programação 2 9 Tipos Abstratos de Dados. (c) Dept. Informática - PUC-Rio 1

Busca. Pesquisa sequencial

Estruturas de Dados Aula 15: Árvores 17/05/2011

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

Álgebra Linear Aplicada à Compressão de Imagens. Universidade de Lisboa Instituto Superior Técnico. Mestrado em Engenharia Aeroespacial

TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS TURMA 2008/1 2 PERÍODO MÓDULO 3 AVALIAÇÃO MP2 DATA 2/10/2008 ESTRUTURAS DE DADOS 2008/2

Lógica de Programação. Profas. Simone Campos Camargo e Janete Ferreira Biazotto

UNIVERSIDADE DO TOCANTINS TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS PRÁTICA EM PROGRAMAÇÃO DE SISTEMAS

PROGRAMAÇÃO II 3. FILA DINÂMICA

INF 1010 Estruturas de Dados Avançadas

UNIVERSIDADE DO VALE DO RIO DOS SINOS - UNISINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS - CENTRO 06. Funções, variáveis, parâmetros formais

Departamento de Informática - PUC-Rio INF 1005 Programação I P1 22/09/2010 Nota

CRIAÇÃO DE TABELAS NO ACCESS. Criação de Tabelas no Access

Exercícios: Recursão

Figura 13.1: Um exemplo de árvore de diretório.

Estruturas de Dados I

Métodos Computacionais. Fila

2ª Lista de Exercícios

2) Escreva um algoritmo que leia um conjunto de 10 notas, armazene-as em uma variável composta chamada NOTA e calcule e imprima a sua média.

Fundamentos de Bancos de Dados 3 a Prova Caderno de Questões

Introdução à orientação a objetos

ALGORITMOS E COMPLEXIDADE PROBLEMAS E ALGORITMOS

MDS II Aula 04. Concepção Requisitos Diagrama de Casos de Uso (Use Cases)

UNIVERSIDADE ESTADUAL PAULISTA. Apostila Pascal Ed Prof. Dr. Galeno José de Sena DMA/FEG CAPÍTULO 8

INF 1007 Programação II

INF 1007 Programação II

Curso C: Ponteiros e Arrays

Pilhas. Profa Morganna Diniz

Pesquisa Sequencial e Binária

Métodos Computacionais. Árvores

Programação Orientada a Objetos SANTOS, Rafael

ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) (a) Seja um TAD definido por uma lista circular implementada em um vetor.

ENG1000 Introdução à Engenharia

Árvores Binárias. Observação: Material elaborado a partir do material do Professor Marcos Costa.

/*(Atenção: Em se tratando de uma lista estaticamente alocada, temos utilizado a estratégia de passa o tamanho máximo do vetor.)*/

Algoritmo e Pseudo-código

Esta apresentação ensinará os conceitos de Orientação a Objetos com C++, do mais básico para o mais avançado. É suposto que o aluno já tenha

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

Introdução ao. Script. Baltazar Tavares (Psycho Mantys)

Universidade Federal de Uberlândia - UFU Faculdade de Computação - FACOM Lista de exercícios de programação em linguagem C. Exercícios: Structs

Inteligência Artificial

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

10. Listas Encadeadas

Algoritmos e Estruturas de Dados I. Recursividade. Pedro O.S. Vaz de Melo

EAD Árvore árvore binária

Simulado de Linguagem de Programação Java

BC1424 Algoritmos e Estruturas de Dados I Aula 02: Ponteiros, estruturas e alocação de memória

Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II

Unidade 1: O Computador

Os passos a seguir servirão de guia para utilização da funcionalidade Acordo Financeiro do TOTVS Gestão Financeira.

10. CPU (Central Processor Unit) Conjunto das instruções Estrutura interna Formato das instruções...

Exercício. Exercício

Modelos de Regressão Linear Simples - Erro Puro e Falta de Ajuste

Aplicação dos conceitos de programação orientada a objeto em linguagens de alto nível

EAD Árvore - representação usando listas ligadas

Listas Duplamente Encadeadas

Algoritmos e Estruturas de Dados I. Variáveis Indexadas. Pedro O.S. Vaz de Melo

2ª Lista de Exercícios

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Objetivo do Portal da Gestão Escolar

PROGRAMAÇÃO II 3. PILHA DINÂMICA

Carlos de Salles Soares Neto Segundas e Quartas, 17h40 às 19h10

Análise e Projeto Orientado a Objetos. Nazareno Andrade Baseado no material dos profs. Hyggo Almeida e Jacques Sauvé

tipo e tamanho e com os "mesmos" elementos do vetor A, ou seja, B[i] = A[i].

2 Segmentação de imagens e Componentes conexas

GGI026 - Árvore balanceada

Linguagem C: Árvores Binarias


Exercício de Estrutura de dados. Java Fila

Índice. Capítulo 2 Estrutura de Dados sequencial com armazenamento sequencial

Aula 10: Escalonamento da CPU

Estruturas de Dados Aula 9: Listas (parte 1) 05/04/2011

Gestão de Actas Escolares. Manual Utilizador. (Versão 4)

Arquivos Indexados por Chaves Secundárias. Vanessa Braganholo

PESQUISA OPERACIONAL -PROGRAMAÇÃO LINEAR. Prof. Angelo Augusto Frozza, M.Sc.

Expressões de sequencias

Programação de Computadores I. Linguagem C Função

Trabalho 3: Agenda de Tarefas

Programação Orientada a Objetos

Tabelas Hash. Aleardo Manacero Jr.

M =C J, fórmula do montante

Árvore Binária de Busca

Disciplina: Unidade III: Prof.: Período:

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

struct LISTA item quant

INF 1010 Estruturas de Dados Avançadas

OPERAÇÕES COM FRAÇÕES

1 Cálculo do valor à vista

Manual de Utilização. Ao acessar o endereço chegaremos a seguinte página de entrada: Tela de Abertura do Sistema

INFORMÁTICA PARA GESTÃO II Curso Superior de Gestão de Marketing

Correção dos Exercícios

Tipos de problemas de programação inteira (PI) Programação Inteira. Abordagem para solução de problemas de PI. Programação inteira

Roteiro. Mapeamento dos Modelos ER e EER. Processo de Projeto de Banco de Dados. BCC321 - Banco de Dados I. Ementa. Posicionamento

Transcrição:

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

Conteúdo Definição Operações Representações Contígua Encadeada Aplicação Exercícios 2 / 35

Lista Ordenada Definição Foi definida uma lista como uma estrutura linear, composta de um conjunto de n elementos x 1, x 2,..., x n chamados nós, organizados de forma a manter uma relação entre eles. Além das relações já apresentadas anteriormente, a posição dos itens em uma lista ordenada não é arbitraria. Os itens devem respeitar uma ordem total: Seja um conjunto de elementos Z Para todo par de elementos (i,j) ZxZ, tal que i j, vale exatamente uma das seguintes relações i < j ou j < i 3 / 35

Lista Ordenada Operações comuns: consultar o nó xk ; inserir um novo nó x k em uma lista ordenada; eliminar o nó x k ; Obs: Lembrando que uma lista é uma estrutura de dados dinâmica, isto é, o seu comprimento (= número de nós) pode ser alterado em tempo de execução. 4 / 35

Representação de Lista Ordenada Uma lista ordenada pode ser representada por: contiguidade dos nós; encadeamento dos nós. 5 / 35

Lista Ordenada Contígua 6 / 35

Lista Ordenada Contígua Usando a alocação contígua (ou sequencial), os nós da lista são alocados fisicamente em posições consecutivas da memória. Assim, é comum usar um vetor como meio de alocação de posições consecutivas, onde podem ser armazenados os nós de uma lista. Esquematicamente, uma lista contígua com n nós poderia ser armazenada em um vetor x com n elementos. Mas como lista é uma estrutura de dados dinâmica, pode ser necessário a utilização de mais de n nós. Desta forma, o mais usual é trabalhar com um vetor de max elementos, sendo max n. 7 / 35

Lista Ordenada Contígua Neste caso deve-se conhecer o comprimento n, isto é, conhecer o índice de x que contem o último nó da lista. Isto é, para n elementos na lista tem-se: ultimo = n - 1. 8 / 35

Lista Ordenada Contígua Exemplo de uma lista ordenada de valores inteiros usando a representação por contiguidade dos nós. Capacidade máxima: 12. Itens armazenados: 6. Vamos trabalhar com listas de valores reais, mas pode-se criar listas de qualquer tipo de dados (lista de aluno, lista de ponto, etc) desde que se defina um campo chave para a ordenação. 9 / 35

Lista Ordenada Contígua TAD ListaOrdCont para listas de inteiros. Construtor Destrutor Consulta / Atribui Insere na ordem Elimina o nó k 10 / 35

Lista Ordenada Contígua class ListaOrdCont public: ListaOrdCont(int tam); ListaOrdCont(); float get(float val); void insere(float val); void elimina(float val); void imprime(); // busca binaria // insere na ordem // elimina no private: int max; // capacidade maxima de elementos int ultimo; // indice do ultimo no da lista float *x; // vetor que armazena a lista int buscabinaria(float val); ; 11 / 35

Lista Ordenada Contígua Construtor Inicializa os dados. Aloca memória de forma dinâmica para o vetor que representa a lista. Destrutor: desaloca a memória alocada de forma dinâmica. ListaOrdCont::ListaOrdCont(int tam) max = tam; ultimo = -1; x = new float[max]; ListaOrdCont:: ListaOrdCont() delete [] x; 12 / 35

Lista Ordenada Contígua Como a lista está ordenada podemos usar um algoritmo de busca binária. int ListaOrdCont::get(float val) int k = buscabinaria(val); if(k >= 0 && k <= ultimo) return k; else cout << "Indice invalido!" << endl; exit(1); 13 / 35

Lista Ordenda Contígua Busca Binária: int ListaOrdCont::buscaBinaria(float val) int esq = 0; int dir = ultimo; while(esq <= dir) int meio = (esq + dir) / 2; if(val > x[meio]) esq = meio + 1; else if (val < x[meio]) dir = meio - 1; else return meio; return -1; 14 / 35

Lista Ordenada Contígua Para inserir um novo nó na posição correta k é preciso abrir espaço e deslocar os itens à frente do nó x k para direita. A lista deve estar ordenada antes e deve permanecer ordenada após a inserção. 15 / 35

Lista Ordenada Contígua void ListaOrdCont::insere(float val) int i; if(ultimo == (max-1)) cout << "Vetor Cheio!" << endl; exit(3); for(i = ultimo; i >= 0 && x[i] >= val; i--) x[i+1] = x[i]; x[i+1] = val; ultimo = ultimo + 1; 16 / 35

Lista Ordenada Contígua Para eliminar um novo nó na posição k é preciso fechar o seu espaço e deslocar os itens à frente do nó x k para esquerda. 17 / 35

Lista Ordenada Contígua void ListaOrdCont::elimina(float val) // busca indice int k = get(val); if (k >= 0 && k <= ultimo) // copia da dir. para esq. for(int i = k; i <= ultimo-1; i++) x[i] = x[i+1]; ultimo = ultimo - 1; 18 / 35

Lista Ordenada Contígua Complexidade Considere as operações: (i) inserir na lista ordenada; ou (ii) encontrar itens na lista; ou (iii) remover item da lista. Qual a complexidade das operações (i), (ii) e (iii)? 19 / 35

Listas Contíguas Exercício 1: desenvolva um programa que cria uma lista ordenada e a inicializa com valores inteiros aleatórios (use o TAD ListaOrdCont) com capacidade máxima 100. Escreva uma função que inverta o conteúdo da lista ordenada e determine o tempo de processamento do seu algoritmo. Escreva uma função que intercale o conteúdo de duas listas ordenadas. Qual o tempo de processamento do seu algoritmo? 20 / 35

Lista Ordenada Encadeada 21 / 35

Listas Encadeadas Lembrando que nessa estrutura de dados, um nó deve conter além de seu valor, um ponteiro para o nó seguinte, representando uma sequência dos nós da lista. Esquematicamente: Além disso, em uma lista simplesmente encadeada é necessário dispor de um ponteiro para o primeiro nó da lista. E o ponteiro do último nó de uma lista simplesmente encadeada sempre termina com o valor NULL. 22 / 35

Lista Simplesmente Encadeada Uma lista simplesmente encadeada consiste de dois objetos distintos: o nó; e a própria lista. Assim, é necessário definir dois TADs: No e ListaOrdEncad. A seguir são apresentados os TADs de uma lista ordenada simplesmente encadeada de valores inteiros. 23 / 35

Nó da Lista Simplesmente Encadeada class No public: No(); No(); int getinfo(); No* getprox(); void setinfo(int val); void setprox(no *p); private: int info; No *prox; ; // informacao // ponteiro para o proximo 24 / 35

Nó da Lista Simplesmente Encadeada No::No() No:: No() int No::getInfo() return info; No* No::getProx() return prox; void No::setInfo(int val) info = val; void No::setProx(No *p) prox = p; 25 / 35

Lista Ordenada Simplesmente Encadeada class ListaOrdEncad public: ListaOrdEncad(); ListaOrdEncad(); void insere(int val); bool busca(int val); void imprime(); private: No *primeiro; // ponteiro para o primeiro ; 26 / 35

Lista Ordenada Simplesmente Encadeada Construtor ListaOrdEncad::ListaOrdEncad() primeiro = NULL; Destrutor ListaOrdEncad:: ListaOrdEncad() No *p = primeiro; while(p!= NULL) No *t = p->getprox(); delete p; p = t; 27 / 35

Lista Ordenada Simplesmente Encadeada Insere na lista ordenada void ListaOrdEncad::insere(int val) No *p = new No(); No *ant = NULL, *atual = primeiro; p->setinfo(val); while(atual!= NULL && val >= atual->getinfo()) ant = atual; atual = atual->getprox(); if(ant == NULL) p->setprox(primeiro); primeiro = p; else ant->setprox(p); p->setprox(atual); 28 / 35

Lista Ordenada Simplesmente Encadeada Programa int main() ListaOrdEncad *lista = new ListaOrdEncad; int n; cin >> n; for(int i = 0; i < n; i++) int valor; cin >> valor; lista->insere(valor); cout << "Lista Ordenada: " << endl; lista->imprime(); return 0; ; 29 / 35

Lista Ordenada Simplesmente Encadeada Exercício 2: Desenvolva um programa que cria uma lista ordenada e a inicializa com valores inteiros aleatórios (use o TAD ListaOrdEncad). Exercício 3: Implemente uma função de busca para identificar se um elemento pertence à lista. Use o protótipo: bool ListaOrdEncad::busca(int val) A função deve retornar verdadeiro caso encontre o valor e falso caso contrário. 30 / 35

Comparação de Desempenho: Contígua x Encadeada Método Contígua Encadeada inserir O(n) O(n) encontrar O(log n) O(n) remover O(n) O(n) 31 / 35

Aplicação Exemplo Um polinômio de ordem n: n a i x i = a 0 + a 1 x + a 2 x 2 +... + a n x n, i=0 onde a n 0, pode ser representado por uma sequência de pares ordenados como: (a 0, 0), (a 1, 1), (a 2, 2),..., (a n, n). e cada sequência pode ser representada por uma lista. 32 / 35

Aplicação Exemplo Existem operações em polinômios cujo tempo de processamento depende da ordem dos termos. Por exemplo, vamos considerar adição de dois polinômios: (a 0 + a 1 x + a 2 x 2 ) + (b 3 x 3 + b 2 x 2 + b 1 x) = (a 0 ) + (a 1 + b 1 )x + (a 2 + b 2 )x 2 + (b 3 )x 3. para realizar a adição, todos os termos que envolvem x elevados a uma mesma potência devem ser agrupados. Podemos representar cada um dos polinômios como uma lista ordenada. 33 / 35

Exercícios 1. Implemente um programa para realizar a soma de dois polinômios representando-os através de listas ordenadas encadeadas a) Crie um novo TAD para representar um polinômio. Obs: Pense em como vai representar os termos. b) Implemente uma função que receba como parâmetros dois polinômios e retorna o polinômio resultante da soma dos termos em ordem. 34 / 35

Exercícios 2. Implemente um método que compute o valor de um polinômio para um dado valor de x. Dica: percorra todos os termos do polinômio e acumule o resultado. 3. Escreva um algoritmo para computar a k-ésima potência de um polinômio, onde k é um inteiro positivo. Qual o tempo de processamento do seu algoritmo? 35 / 35