ESTRUTURA DE DADOS
Cristina Boeres
Estrutura de Dados
Tópicos Principais
! Tipo Abstrato de Dado (TAD)
! Noções inicias de algoritmos e complexidade
! Listas, Pilhas e Filas (sequencial e encadeada)
! Listas ordenadas
! Heap: lista de prioridades
! Árvores binárias (de busca) e balanceadas
! Hash
! Grafos
2
Estrutura de Dados
Bibliografia:
! J. Szwarcfiter e L. Markeson, Estrutura de Dados e Algoritmos , Editora LTC.
! Cormen, Leiserson and Rivest, Introduction to Algorithms , MIT Press.
Informações da disciplina
! (www.ic.uff.br/~boeres/ed.html)
3
Introdução
! Implementação de uma Aplicação
! representa uma abstração da realidade
! consiste de um conjunto selecionado de dados relacionados com o problema a ser resolvido
! deste conjunto, é possível a obtenção dos resultados esperados
4
Introdução
Modelo Abstrato
! Cadastro de Pessoal de uma Empresa ! Empregado - conjunto de dados
! os que são relevantes para o empregador e para os procedimentos contábeis da empresa
! identificação, salário, dependentes, ..... ! abstraímos dos dados irrelevantes
! cor do cabelo, estatura, peso
5
Introdução
Resolução de um problema
! escolher uma abstração da realidade
! o que é relevante para resolver o problema
! informação ! um conjunto de dados
! comportamento ! um conjunto de operações
a forma como se representa informação e suas operações estão intimamente ligadas
6
Introdução
Dados Relevantes em um Problema
! escolher um conjunto de dados
! uma representação possível da situação real
! orientada às características do problema
! os dados precisam ser representados
! a etapa seguinte é a escolha de uma forma de representação
7
Algoritmo
! Um processo sistemático para a resolução de problemas
! Computa uma saída (o resultado do problema) a partir de uma entrada
! durante o processo, manipula dados gerados a partir de sua entrada
! dados dispostos e manipulados de forma homogênea: Tipo Abstrato de dados
! um conjunto de dados + operações que podem ser executadas sobre esses dados
8
Tipo Abstrato de Dados
! Variável ! armazena um dado que pode ser operado ao longo da execução
do algoritmo ! É uma abstração, que tem associado alguns atributos:
! nome ! endereço: local de memória ! valor: o que está armazenado em um determinado momento ! duração: tempo durante a execução do algoritmo em que a variável
está ativa (alocada) ! escopo: a variável está visível para uma série de regiões do
programa (local ou global). ! tipo: qual conjunto de valores pode ser associado e
consequentemente, o conjunto de operações pode ser definido ! tamanho: tamanho do espaço de memória que armazena os valores
da variável
9
Tipo Abstrato de Dados
! int ! é um tipo abstrato de dados ! o programador abstrai de todos os detalhes dos atributos
! estrutura aluno struct aluno{
int matricula; int nome; char outras_info[1024];
}
! operação:
procura_aluno_matricula ( aluno.matricula );
10
Algoritmo e Estrutura de Dados
! Um algoritmo é projetado em termos de Tipos Abstratos de Dados
! Para implementá-lo em uma linguagem de programação: ! temos que saber como representar os tipos na linguagem ! quais são as operações suportadas pelo computador
na sua representação emprega-se Estruturas de Dados
11
Algoritmos e Estruturas de Dados
! Resolução de um Problema
! Algoritmo
! representação do comportamento
! Estrutura de Dados
! representação da informação
12
Algoritmos e Estruturas de Dados
! No processo de construção de programas:
➫ formulação do algoritmo ➫ definição de estruturas de dados
estão intimamente ligadas
13
Algoritmos e Estruturas de Dados
! Decisões sobre estruturas de dados não podem ser tomadas sem conhecimento dos algoritmos aplicados e vice-versa
! Num algoritmo vamos distinguir dois aspectos complementares:
! estático e dinâmico
14
Estrutura de Dados
! Como a informação é organizada , como será manipulada e como será utilizada
! estudo envolve dois objetivos complementares:
! Identificar e desenvolver entidades matemáticas e operações
! Determinar que classes de problemas podem ser resolvidas usando essas entidades e operações
15
Algoritmo
! Um texto contendo comandos (instruções) ! devem ser executados na ordem especificada
! corresponde a representação concreta e tem caráter estático
! esse texto nos interessa pelos efeitos que causa decorrentes de sua execução dado um conjunto de valores iniciais
! execução: evento dinâmico " evolui no tempo
16
Algoritmo
! Uma dificuldade na concepção e no entendimento de algoritmos é o relacionamento dos aspectos estático e dinâmico
! como entender as estruturas dinâmicas das possíveis execuções do algoritmo a partir da estrutura estática
17
Algoritmo
! Através da utilização de Estruturas Básicas de controle
! formas naturais de pensar e adequadas à construção de algoritmos inteligíveis. Por exemplo:
! SE ( ......... ) ENTÃO {..........} SENÃO { ........}
18
Algoritmo
! Estado de um dado sistema é o conjunto de propriedades desse sistema que são relevantes na situação considerada ! conjunto de valores de variáveis de um programa
! Ação - evento que ocorre num período de tempo finito estabelecendo um efeito desejado e bem definido ! ação: o interesse é decorrente do efeito produzido ! execução de uma operação
19
Algoritmo
! Em todo evento pode-se reconhecer um padrão de comportamento, fazendo-se abstração de diferentes estados iniciais e efeitos
! cada vez que o padrão de comportamento é seguido, o evento ocorre
! seu efeito é totalmente determinado pelo padrão de comportamento e pelo estado inicial
20
Algoritmo
! É a descrição de um padrão de comportamento, em termos de um repertório bem definido e finito de ações primitivas, que podem ser executadas
! possui um caráter imperativo
! uma ação no algoritmo: um comando
! é uma norma executável para estabelecer um certo efeito desejado
21
Apresentação dos Algoritmos
! formato livre com comandos das linguagens estruturadas
! estrutura de blocos
! indentação
! funções
! Linguagem C-like
22
Processamento de um Programa 23
If (a>b) { printf ( “A é maior”) } else { printf (“B é maior”) }
Tradutor: Compilador + Linkeditor
A é maior
Processamento de Linguagens
! Linguagens de Programação: são projetadas em função da facilidade na construção e confiabilidade dos programas
! Como executar em arquiteturas diferentes?
! Duas alternativas: ! Interpretação ! Tradução
24
Interpretação
1) Obter o próximo comando do programa 2) Determinar que ações devem ser executadas 3) Executar essas ações
! Esta seqüência é bastante semelhante àquela executada por processadores tradicionais: ① Obter a próxima instrução (PC) ② Incrementar o PC ③ Decodificar a instrução ④ Executar a instrução
25
Tradução
! Programas escritos em LP de alto nível são traduzidos para versões equivalentes em linguagem de máquina antes de serem executados
26
meuprog.c tradução meuprog.exe
Tradução
! Essa tradução pode ser dita ser realizada nos passos
! Compilação
! Linkedição
! Loader (carga)
27
Compilação
! Pode ser dividida em 2 grandes partes:
! análise do programa fonte (dados de entrada)
! síntese do programa objeto executável
! cada arquivo do programa fonte deve ser compilado separadamente, e um arquivo objeto é gerado
28
meuprog.c compilação meuprog.obj
Síntese do programa objeto
! A saída da compilação
! programas quase executáveis (*.obj)
! podem fazer referências a dados externos ou outros programas
! Linkedição: une diversos *.obj em um programa executável pronto para rodar
29
Programa executável (aplicação) 30
If (a>b) { printf ( “A é maior”) } else { printf (“B é maior”) }
If (a>b) { printf ( “A é maior”) } else { printf (“B é maior”) }
pgm1.c
pgm2.c
pgm3.c
pgm1.o
pgm2.0
pgm3.0
linkedição programa.exe
compilação
compilação
compilação
Programa executável (aplicação)
! Linkedição
! um procedimento para finalizar a resolução de referências
! programas podem ser traduzidos separadamente
! ou utiliza-se uma biblioteca
31
Visão Geral de um Programa
! O Problema: calcular a soma de três números
➫ requisita a entrada dos números a serem somados
➫ Calcular a soma de três números
➫ Imprimir o resultado
32
Visão Geral de um Programa
! Este programa não faz muita coisa
! Como seleciona os números a somar?
! Não imprime nenhuma mensagem explicativa?
! Que tipos de números soma?
33
Visão Geral de um Programa
➫ Definindo melhor o problema
➫ Exibir para o usuário o que faz o programa
➫ Exibir o que espera como entrada
➫ Pedir os três valores (A, B,C) e armazenar
➫ Somar A + B + C e guardar em SOMA
➫ Exibir o valor SOMA ao usuário
34
Modelo de um Programa
! Este é um modelo seguido pelos programas
! Um programa tem que ser capaz de armazenar sua entrada em algum lugar
35
Entrada Processa a Entrada Saída
Modelo de um Programa
! Para executar um programa:
36
meuprog.exe
disco
MP CPU
Modelo de um Programa
! o executável contém:
37
meuprog.exe
! comandos em linguagem que a CPU entende
! espaço para armazenar os dados: variáveis e constantes
! as estrutura de dados
Modelo de um Programa
! Entradas são armazenadas para serem processadas e gerar uma saída útil e desejada
! Dados são armazenados em variáveis
! posições de memória com um nome que podem conter dados
! as variáveis podem conter tipos diferentes de dados
38
Variáveis e Tipos de Dados
! Variáveis podem conter valores diferentes durante a execução do programa
! os valores são consistentes com o tipo da variável
! Alguns valores não devem ser alterados durante a execução
! Constantes
39
Variáveis e Tipos de Dados
! Dados em variáveis ou constantes podem ser de diferentes tipos
! inteiros ( curtos / longos)
! reais - ponto flutuante ! precisão simples ou dupla
! caracteres isolados
! string de caracteres
40
Variáveis
! Variável é algo que se altera
! Dados armazenados em uma variável podem se modificar
! Em um programa
! definir uma variável significa reservar uma memória para armazenar seus valores
41
Variáveis
! Deve-se atribuir às variáveis nomes que o ajudem a lembrar a finalidade de cada uma delas
! Nomes mais longos tornam seu programa mais claro
! outros podem ter que revisar seu código
! pode ser necessário revisar o programa daqui a 6 meses
42
Nomes
! Elemento básico da Linguagem
! Identificadores dão nomes a:
! Variáveis
! Trechos de Programa
43
Nomes
! C- Padrão ANSI: nomes de variáveis, funções, rótulos == identificadores
! Tamanho
! 1 a diversos caracteres: pelo menos os 61ºs são válidos
! 1o. caracter
! letra ou sublinhado
! letras maiúsculas e minúsculas são tratadas diferentemente
44
Blocos
! um conjunto de comandos com uma função bem definida
! serve para definir os limites onde as variáveis declaradas em seu interior são conhecidas
! Variáveis locais a blocos e globais a blocos
! Blocos podem possuir um nome: sub-programas (funções no C) ou não
! são delimitados por { }
45
Tipo de Dados
! Existe distinção entre
! variáveis reais, complexas e lógicas
! valores individuais e conjunto de valores
! funções
46
Tipo de Dados
! Esta noção de classificação é muito importante
! Cada constante, variável, expressão ou função é de um certo tipo
! refere-se ao conjunto de valores que pode assumir
47
Tipo de Dados
! Em programas (em geral), não é possível deduzir o tipo da variável a partir do seu contexto
! é necessário explicitar o tipo de cada variável
! a cada tipo de dados está associada uma representação na computador
! é necessário conhecer o tipo de dados para saber qual a sua representação
48
Tipo de Dados
! A cada tipo de dados está associado: ! uma representação
! o tamanho de células de memória para armazenar esta representação
! a área de memória onde ficará o valor da variável tem que ter dimensões compatíveis com a sua representação
! conjunto de valores que variáveis de um dado tipo podem assumir
49
Tipo de Dados
! As operações exigem argumentos de um dado tipo e produzem resultados do mesmo tipo
! É importante para o compilador saber o tipo de cada variável antes de empregá-la em uma operação
50
Definição de Variáveis
! int X1
! float A, B;
! char Nome;
51
Definição de Variáveis
! A semântica da declaração de uma variável corresponde a ! criação de locais na memória rotulados com o
nome da variável (identificador) ! o tipo de valores que ela pode conter
! tamanho e forma de representação ! No exemplo:
! X1: é o nome do local de memória que só pode conter variáveis do tipo inteiro
! A e B só podem conter variáveis do tipo real
52
Compatibilidade de Tipos
! É importante observar que: ! o resultado da expressão do lado direito de um comando de
atribuição deve ser coerente com o tipo declarado para a variável do lado esquerdo
! a = b+c;
b e c float então a deve ser float
53
Expressões
! forma linearizada usada na matemática ! Operadores Aritméticos
! +, -, *, / ! 3/2 = 1 (divisão de inteiros)
! Precedência: da matemática ! uso de parênteses ! a = b+c * (x*y-5); ! a = a+2; ! mod : resto da divisão inteira
54
Expressões
! Operadores Lógicos ! E (&&)
! OU (||) ! NEGAÇÃO (!)
! Conectivos relacionais ! >, <, >=, <=, ==, !=
55
Expressões
! Prioridades para operações mistas ! 1o. : parênteses e funções ! 2o. : expressões aritméticas
* , / + , - (binários)
! 3o. : comparações
>, >=, <, <=, ==, != ! 4o. : ! ! 5o. : &&
! 6o. : ||
56
Comentários
! Uma anotacão ! Servem para ajudar a explicar a codificação ! Seu programa deve ser compreendido por qualquer
outro programador
! /* ………COMENTÁRIO ………..*/
! // …… comentário até o fim da linha
57
Comentários
! Devem ser utilizados com liberalidade em todo o programa
! Devem explicar seu algoritmo
! Estão relacionados com a solução do problema
! Não devem ser óbvios
58
Atribuição
! Atribuição
! designam valores a uma variável
! A = B; /* Faz A = B */
! /* Este é um comentário óbvio - desnecessário */
! os valores atribuídos a uma variável devem ser compatíveis com seu tipo
! Sintáxe: identificador = valor ;
59
Operações Especiais do “C”
! Incrementando 1:
! i++;
! ++i;
! Decrementando 1:
! i--;
! --i;
60
Fluxo de Controle
! o que deve ser executado: processo dinâmico
! determina em cada passo da execução, qual o próximo comando a ser executado
! a ordem de execução das ações é a chave para entender o funcionamento do algoritmo ! depende dos dados de entrada
61
Estruturas Básicas de Controle
! Um algoritmo deve ser determinístico: ! dada as mesmas condições iniciais deve produzir a final da
execução os mesmos resultados
! só estamos interessados em algoritmos que terminam em um tempo finito
! Programas: ! uma certa espécie de algoritmos
62
Estruturas Básicas de Controle
! Seqüenciamento: ! Separa um comando do outro e determina a
execução em seqüência dos comandos ! estrutura de controle mais simples: seqüência
simples ➫ traz a cesta com batatas; ➫ traz a panela do armário; ➫ coloca o avental; ➫ descasca batatas; ➫ devolve a cesta;
63
Estruturas Básicas de Controle
! condicional: se .... então ➫ traz a cesta com batatas; ➫ traz a panela do armário; ➫ se roupa é clara então coloca avental; ➫ descasca batatas; ➫ devolve a cesta;
➫ if ( condição) {...} else {...}
64
Instruções Condicionais
! if (NaoAguentaCalor) { if (JanelaNaoAbre) { FiqueForaDaCozinha; } } else { LavePratos;}
65
Comandos Básicos do C
! <condição> é qualquer expressão cujo resultado é um valor booleano
! está relacionado um bloco de comandos (limitados por { / }) pode ser usado um único comando
! bloco: como um novo comando / extensão da linguagem
66
Comandos Básicos do C
! Repetição ! quando um conjunto de ações é executado repetidamente
enquanto uma determinada condição permanece válida
! condição é uma expressão cujo resultado é um valor lógico
67
Comandos Básicos do C
! Repetição
enquanto <condição> faça
C1;
C2;
C3;
C4;
fim enquanto;
68
Comandos Básicos do C
! Repetição - “C” while ( <condição> ) {
C1; C2;
C3; C4;
}
69
Comandos Básicos do C
! Repetição
faça
C1;
C2;
C3;
C4;
enquanto <condição>;
70
Comandos Básicos do C
! Repetição “C “
do {
C1;
C2;
C3;
C4;
} while (<condição>);
71
Comandos Básicos do C
! Repetição
for (i=0; i<N; i++) {
C1;
C2;
C3;
C4;
};
72
Comandos Básicos do C
! Repetição ! while(condição) {……...}
! se já da primeira vez a condição for falsa, os comandos não são executados nenhuma vez
! do {……} while (condição) ! se da primeira vez a condição for falsa, os comandos são
executados uma vez
! Enquanto a condição for verdadeira os comandos são executados, quando for falsa, o comando é abandonado
73
Tipos de Dados Simples Inteiros
! Qualquer valor do conjunto dos números inteiros ! inteiros curtos - int - 4 bytes
! inteiros longos - long - 8 bytes
! operações
! =
! +, -, *, /(divisão de inteiros)
! mod
74
Reais
! Também chamados de ponto flutuante ! Qualquer valor do conjunto dos números
reais ! estão limitados no número de dígitos decimais - float ou
double
! sua representação: mantissa e expoente
! operações :=, +, -, *, /
75
Usando Tipos
! Se tenho que definir uma variável para conter idades, que tipo usar? ! inteiros, e curtos são suficientes
! É função do: ! conjunto de valores que a variável pode assumir
! da precisão que se deseja no resultado de operações
76
Caracteres
! É qualquer caracter isolado representado no computador ! letras e números são caracteres
! caracteres especiais - &, %
! caracteres especiais e não visíveis - ESC, CR, LF,…
! ocupam 1 byte - ASCII
! char a = ‘A’;
77
Strings de Caracteres
! Um número arbitrário de ocorrências de caracteres ! deixa em aberto o número de ocorrências
! não possui uma representação direta no C
! char a[50]
! #define nome ”Maria”
78
Exercício - algoritmo
! Descreva um algoritmo que compute o somatório de 1 até N, sendo N o número de entrada
! Descreva um que compute a potência xi, onde i varia de 1 até N, sendo x e N, números de entrada
79
Exercício – cálculo da média final ! Considere uma disciplina que adota o seguinte critério de
aprovação: alunos fazem duas provas, P1 e P2, sendo obtida a média M = (P1+P2)/2. Se a média for maior ou igual a 5.0, e nenhuma das notas for inferior a 3.0, o aluno passa direto (tendo média final MF igual a M). Caso contrário, o aluno faz uma terceira prova P3 e a MF é calculada considerando a terceira nota: ! se P3 for maior ou igual a 3.0, MF = (P3+max(P1,P2))/2 ! caso contrário, MF = (M + P3)/2
! Escreva um programa que leia inicialmente as notas do aluno fornecidas via teclado. Se as notas não forem suficientes para o aluno passar direto, será pedido a nota da P3. Em seguida, o programa deve ter como saída a mensagem “Aprovado” ou “Reprovado”, de acordo com o critério descrito, mostrado ao lado a MF calculada.
80