AULA 14 ESTRUTURA DE DADOS

Documentos relacionados
AULA 12 ESTRUTURA DE DADOS

AULA 13 ESTRUTURA DE DADOS

AULA 11 ESTRUTURA DE DADOS

AULA 03 ESTRUTURA DE DADOS

AULA 05 ESTRUTURA DE DADOS

Matrizes Esparsas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Matrizes Esparsas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Aplicações de listas e outras estruturas. SCC-502 Algoritmos e Estruturas de Dados I

A regra de acesso aos dados de uma fila é a seguinte: O primeiro elemento que entra (na fila) é o primeiro que sai (FIFO first in, first out).

SCC Algoritmos e Estruturas de Dados I

Algoritmos e Estruturas de dados

ANHANGUERA ESTRUTURA DE DADOS AULA 04 MATRIZES, LISTAS E ALOCAÇÃO DINÂMICA. Prof. Thomás da Costa

Listas e matrizes esparsas. SCC122 Estruturas de Dados

Lista Ligada de Produtos parte 2 Data Máxima de Entrega: 17/11/2018

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 4: Listas Estáticas e Dinâmicas

Métodos Computacionais. Tipos Estruturados

Listas Lineares Ordenadas

Programação: Vetores

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Métodos Computacionais. Listas Encadeadas

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

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

Listas Lineares. Livro Projeto de Algoritmos Nívio Ziviani Capítulo 3 Seção 3.1

BCC202 - Estrutura de Dados I

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

Aplicações de listas e outras estruturas

AULA 6. Conceitos. Melhores momentos. Conceitos. Conceitos. Conceitos. Conceitos

Aplicações de listas e outras estruturas. SCC-502 Algoritmos e Estruturas de Dados I

Introdução a Programação. Listas Encadeadas

Estruturas de Dados Aula 12: Outras Implementações de Listas 18/04/2011

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

Listas Lineares. continuando...

Fontes Bibliográficas. Listas Circulares. Função Imprime

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Linguagens de Programação Conceitos e Técnicas. Amarrações Prof. Tiago Alves de Oliveira

Introdução à Programação

Matrizes Esparsas. atribuição (M, i, j, v) (i, j) IND. v nulo. v não nulo v nulo v não nulo. há espaço. não há espaço. retira substitui nada

Programação Estruturada Prof. Rodrigo Hausen Agregados de Dados Heterogêneos (structs)

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

12. Filas Interface do tipo fila

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

SCC122 Estruturas de Dados. Listas Generalizadas e Polinômios

REVISÃO DE PILHAS E FILAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

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

Aplicações de listas e outras estruturas

Estrutura de Dados (DPADF 0056)

Questão 1: O histograma deve ser: [0, 1, 4, 2, 0, 3, 0,, 0, 2] Exemplo: Para a matriz

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais:

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

Instituto de C. Filas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

Tipos Abstratos de Dados. Estrutura de Dados

Tema da aula Introdução ao paradigma de programação: Orientado a Objetos

Módulo 8 Tipos Estruturados

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

Estruturas de Dados Aula 11: TAD Pilha

Introdução a Programação. Tipos Estruturados de Dados

Carlos Eduardo Batista. Centro de Informática - UFPB

INF 1620 P3-25/11/05 Questão 1 Nome:

Linguagem de Programação III

ponteiros INF Programação I Prof. Roberto Azevedo

GRAFOS E DIGRAFOS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

Computação 2. Aula 2. Profª. Fabiany Vetores e Matrizes

INF 1620 P4-13/12/01 Questão 1 Nome:

Módulo 10 Listas Encadeadas

Estruturas de Dados. Módulo 12 - Filas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Referências. Programação de Computadores II. Cap. 6 Matrizes. Tópicos. Alocação Estática versus Dinâmica. Alocação Estática versus Dinâmica

Filas. Prof. Túlio Toffolo BCC202 Aula 12 Algoritmos e Estruturas de Dados I

11a. Aula Ponteiros e Vetores

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas

Estruturas de Dados Aula 16: Árvores com Número Variável 13/06/2011

ANHANGUERA ESTRUTURA DE DADOS AULA 06 LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS. Prof. Thomás da Costa

Linguagens de Programação Conceitos e Técnicas. Amarrações

Listas e matrizes esparsas Orthogonal List Representation (Listas Cruzadas) 21/10/2010

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Listas Encadeadas. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Listas (Parte 1) Túlio Toffolo BCC202 Aula 09 Algoritmos e Estruturas de Dados I

Instituto de C. Linguagem C: Listas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

Algoritmos e Estruturas de Dados II IEC013

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas. SCC-502 Algoritmos e Estruturas de Dados I

Ponteiros. Baseado nos slides do Prof. Mauro.

Aplicações de listas Outras estruturas

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Linguagem C: Listas Encadeadas

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

8. Tipos estruturados

Linguagem C Variáveis Indexadas ( vetores e Matrizes) Lógica de Programação

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

Transcrição:

AULA 14 ESTRUTURA DE DADOS Matriz esparsa Norton T. Roman & Luciano A. Digiampietri

Matriz Uma matriz bidimensional é um conjunto de elementos (ou tabela) composta por m linhas e n colunas.

Matriz Uma matriz bidimensional é um conjunto de elementos (ou tabela) composta por m linhas e n colunas. - Em computação utilizamos matrizes para representar diferentes tipos de dados (dados numéricos, imagens, etc.)

Matriz esparsa

Matriz esparsa É uma matriz na qual a grande maioria de seus elementos possui um valor padrão (por exemplo zero) ou são nulos ou faltantes.

Matriz esparsa É uma matriz na qual a grande maioria de seus elementos possui um valor padrão (por exemplo zero) ou são nulos ou faltantes. - Por exemplo, uma matriz que representa o contorno de uma imagem em preto e branco

Matriz esparsa É uma matriz na qual a grande maioria de seus elementos possui um valor padrão (por exemplo zero) ou são nulos ou faltantes. - Por exemplo, uma matriz que representa o contorno de uma imagem em preto e branco - Seria um desperdício gastar m x n posições de memória sendo que apenas uma pequena parcela dos elementos tem valor diferente de zero

Matriz esparsa Para evitar o desperdício de memória (e eventualmente de processamento) criamos uma estrutura específica para gerenciar matrizes esparsas.

Matriz esparsa Para evitar o desperdício de memória (e eventualmente de processamento) criamos uma estrutura específica para gerenciar matrizes esparsas. - Só serão alocados elementos com valor diferente de zero e alguma estrutura adicional de controle.

Matriz esparsa - implementação

Matriz esparsa - implementação Cada linha da matriz será representada por uma lista ligada que só conterá elementos com valores diferentes de zero;

Matriz esparsa - implementação Cada linha da matriz será representada por uma lista ligada que só conterá elementos com valores diferentes de zero; Teremos um arranjo de listas ligadas.

Matriz esparsa - implementação Temos uma matriz com muitos zeros.

Matriz esparsa - implementação Queremos armazenar apenas os valores diferentes de zero.

Matriz esparsa - implementação Queremos armazenar apenas os valores diferentes de zero.

Matriz esparsa - implementação Criaremos listas de elementos diferentes de zero.

Matriz esparsa - implementação Cada elemento apontará para seu vizinho e saberá sua coluna.

Modelagem #include <stdio.h> #include <malloc.h> typedef struct tempno { float valor; int coluna; struct tempno* prox; NO; typedef NO* PONT; typedef struct { PONT* A; int linhas; int colunas; MATRIZ;

Modelagem #include <stdio.h> #include <malloc.h> typedef struct tempno { float valor; int coluna; struct tempno* prox; NO; typedef NO* PONT; typedef struct { PONT* A; int linhas; int colunas; MATRIZ;

Modelagem #include <stdio.h> #include <malloc.h> typedef struct tempno { float valor; int coluna; struct tempno* prox; NO; typedef NO* PONT; typedef struct { PONT* A; int linhas; int colunas; MATRIZ;

Modelagem #include <stdio.h> #include <malloc.h> typedef struct tempno { float valor; int coluna; struct tempno* prox; NO; typedef NO* PONT; typedef struct { PONT* A; int linhas; int colunas; MATRIZ;

Modelagem

Modelagem

Funções de gerenciamento Implementaremos funções para: Inicializar a matriz ( new matriz[m][n] ) Atribuir um valor (matriz[x][y] = valor) Acessar valor (valor = matriz[x][y])

Inicialização Para inicializar nossa matriz esparsa, nós precisamos:

Inicialização Para inicializar nossa matriz esparsa, nós precisamos: Acertar o valor dos campos linhas e colunas (isto é, a ordem da matriz passada pelo usuário).

Inicialização Para inicializar nossa matriz esparsa, nós precisamos: Acertar o valor dos campos linhas e colunas (isto é, a ordem da matriz passada pelo usuário). Precisamos também criar o arranjo de listas ligadas e iniciar cada posição do arranjo com o valor NULL (indicando que cada lista está vazia).

Inicialização void inicializarmatriz(matriz* m, int lin, int col) { int i; m->linhas = lin; m->colunas = col; m->a = (PONT*) malloc(lin*sizeof(pont)); for (i=0;i<lin;i++) m->a[i] = NULL;

Inicialização void inicializarmatriz(matriz* m, int lin, int col) { int i; m->linhas = lin; m->colunas = col; m->a = (PONT*) malloc(lin*sizeof(pont)); for (i=0;i<lin;i++) m->a[i] = NULL;

Inicialização void inicializarmatriz(matriz* m, int lin, int col) { int i; m->linhas = lin; m->colunas = col; m->a = (PONT*) malloc(lin*sizeof(pont)); for (i=0;i<lin;i++) m->a[i] = NULL;

Inicialização void inicializarmatriz(matriz* m, int lin, int col) { int i; m->linhas = lin; m->colunas = col; m->a = (PONT*) malloc(lin*sizeof(pont)); for (i=0;i<lin;i++) m->a[i] = NULL;

Inicialização void inicializarmatriz(matriz* m, int lin, int col) { int i; m->linhas = lin; m->colunas = col; m->a = (PONT*) malloc(lin*sizeof(pont)); for (i=0;i<lin;i++) m->a[i] = NULL;

Atribuir valor O usuário nos passa: o endereço da matriz, a linha, a coluna e o valor a ser colocado na respectiva posição da matriz:

Atribuir valor O usuário nos passa: o endereço da matriz, a linha, a coluna e o valor a ser colocado na respectiva posição da matriz: Se não houver nenhum nó na posição e o valor for diferente de zero temos que inserir um novo nó na respectiva lista ligada.

Atribuir valor O usuário nos passa: o endereço da matriz, a linha, a coluna e o valor a ser colocado na respectiva posição da matriz: Se não houver nenhum nó na posição e o valor for diferente de zero temos que inserir um novo nó na respectiva lista ligada. Se já existir um nó na posição e o valor for diferente de zero temos que substituir o valor do nó.

Atribuir valor O usuário nos passa: o endereço da matriz, a linha, a coluna e o valor a ser colocado na respectiva posição da matriz: Se não houver nenhum nó na posição e o valor for diferente de zero temos que inserir um novo nó na respectiva lista ligada. Se já existir um nó na posição e o valor for diferente de zero temos que substituir o valor do nó. Se já existir um nó na posição e o valor for igual a zero temos que excluir o nó de sua lista.

Atribuir valor - busca bool AtribuiMatriz(MATRIZ* m,int lin, int col, float val) {

Atribuir valor - busca bool AtribuiMatriz(MATRIZ* m,int lin, int col, float val) { if (lin<0 lin >= m->linhas col<0 col >= m->colunas) return false;

Atribuir valor - busca bool AtribuiMatriz(MATRIZ* m,int lin, int col, float val) { if (lin<0 lin >= m->linhas col<0 col >= m->colunas) return false; PONT ant = NULL; PONT atual = m->a[lin];

Atribuir valor - busca bool AtribuiMatriz(MATRIZ* m,int lin, int col, float val) { if (lin<0 lin >= m->linhas col<0 col >= m->colunas) return false; PONT ant = NULL; PONT atual = m->a[lin]; while (atual!= NULL && atual->coluna<col) { ant = atual; atual = atual->prox;

Atribuir valor - nó existe if (atual!= NULL && atual->coluna == col) {

Atribuir valor - nó existe if (atual!= NULL && atual->coluna == col) { if (val == 0) {

Atribuir valor - nó existe if (atual!= NULL && atual->coluna == col) { if (val == 0) { free(atual);

Atribuir valor - nó existe if (atual!= NULL && atual->coluna == col) { if (val == 0) { if (ant==null) m->a[lin] = atual->prox; free(atual);

Atribuir valor - nó existe if (atual!= NULL && atual->coluna == col) { if (val == 0) { if (ant==null) m->a[lin] = atual->prox; else ant->prox = atual->prox; free(atual);

Atribuir valor - nó existe if (atual!= NULL && atual->coluna == col) { if (val == 0) { if (ant==null) m->a[lin] = atual->prox; else ant->prox = atual->prox; free(atual); else atual->valor = val;

Atribuir valor - nó não existe else if (val!= 0) {

Atribuir valor - nó não existe else if (val!= 0) { PONT novo = (PONT) malloc(sizeof(no));

Atribuir valor - nó não existe else if (val!= 0) { PONT novo = (PONT) malloc(sizeof(no)); novo->coluna = col; novo->valor = val;

Atribuir valor - nó não existe else if (val!= 0) { PONT novo = (PONT) malloc(sizeof(no)); novo->coluna = col; novo->valor = val; novo->prox = atual;

Atribuir valor - nó não existe else if (val!= 0) { PONT novo = (PONT) malloc(sizeof(no)); novo->coluna = col; novo->valor = val; novo->prox = atual; if (ant == NULL) m->a[lin] = novo;

Atribuir valor - nó não existe else if (val!= 0) { PONT novo = (PONT) malloc(sizeof(no)); novo->coluna = col; novo->valor = val; novo->prox = atual; if (ant == NULL) m->a[lin] = novo; else ant->prox = novo;

Atribuir valor - nó não existe else if (val!= 0) { PONT novo = (PONT) malloc(sizeof(no)); novo->coluna = col; novo->valor = val; novo->prox = atual; if (ant == NULL) m->a[lin] = novo; else ant->prox = novo; return true;

Acessar valor O usuário nos passa: o endereço da matriz, a linha e a coluna e a função deve retornar o valor da respectiva posição:

Acessar valor O usuário nos passa: o endereço da matriz, a linha e a coluna e a função deve retornar o valor da respectiva posição: Se não houver um nó na posição então retornar zero;

Acessar valor O usuário nos passa: o endereço da matriz, a linha e a coluna e a função deve retornar o valor da respectiva posição: Se não houver um nó na posição então retornar zero; Caso contrário, retornar o valor do nó.

Acessar valor float ValorMatriz(MATRIZ* m, int lin, int col) {

Acessar valor float ValorMatriz(MATRIZ* m, int lin, int col) { if (lin<0 lin>=m->linhas col<0 col >= m->colunas) return 0;

Acessar valor float ValorMatriz(MATRIZ* m, int lin, int col) { if (lin<0 lin>=m->linhas col<0 col >= m->colunas) return 0; PONT atual = m->a[lin]; while (atual!= NULL && atual->coluna < col) atual = atual->prox;

Acessar valor float ValorMatriz(MATRIZ* m, int lin, int col) { if (lin<0 lin>=m->linhas col<0 col >= m->colunas) return 0; PONT atual = m->a[lin]; while (atual!= NULL && atual->coluna < col) atual = atual->prox; if (atual!=null && atual->coluna == col) return atual->valor;

Acessar valor float ValorMatriz(MATRIZ* m, int lin, int col) { if (lin<0 lin>=m->linhas col<0 col >= m->colunas) return 0; PONT atual = m->a[lin]; while (atual!= NULL && atual->coluna < col) atual = atual->prox; if (atual!=null && atual->coluna == col) return atual->valor; return 0;

AULA 14 ESTRUTURA DE DADOS Matriz esparsa Norton T. Roman & Luciano A. Digiampietri