1
Estrutura de Dados e Algoritmos
(www.ic.uff.br/~boeres/ed.html)
Tópicos
! Introdução/Revisão
! Algoritmos, Noções de Complexidade ! Listas, Pilhas e Filas
! Tabelas Hash
! Árvores (binárias, AVL, B, etc) ! Heap: lista de prioridades
2
Estrutura de Dados e Algoritmos
(www.ic.uff.br/~boeres/ed.html)
Bibliografia:
! J. Szwarcfiter e L. Markeson, Estrutura de Dados e
Algoritmos , Editora LTC.
! Cormen, Leiserson and Rivest, Introduction to Algorithms ,
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
4
Introdução
!
Cadastro de Pessoal de uma Empresa
! Modelo Abstrato
-
simplificação ! 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, ...
! Abstraem-se dados irrelevantes:
5
Introdução
!
Resolução de um problema
! escolher uma abstração da realidade ! o que é relevante para 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
7
Introdução
!
Como representar dados?
! depende da ferramenta usada na solução ! não é uma tarefa muito trivial
! não existe uma única solução ! não existe receita
! a solução de um problema no computador é um
modelo
! a construção do modelo transcende diversos níveis
8
Introdução
! A decisão é influenciada pelo problema
! As outras são dependentes da ferramenta
tecnologia que se emprega
! Programador: focaliza o problema
! decisões de nível mais baixo - projetistas do
equipamento computacional
! ferramentas que permitam ao programador se
9
Algoritmo
! Um processo sistemático para a resolução de
problemas
! dois aspectos básicos no estudo de algoritmos
➨ correção e análise
! correção: exatidão do método empregado ! análise: obtenção de parâmetros que
permitam verificar a eficiência do algoritmo (execução e memória ocupada)
10
Algoritmo
! 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
11
Algoritmo
! Tipo Abstrato de dados: exemplo
! estrutura do tipo aluno
struct aluno{ int matricula; int nome; char outras_info[1024]; } ! operação: procura_aluno_matricula ( aluno.matricula )
12
Algoritmo
! Um algoritmo é projetado em termos de Tipos
Abstratos de Dados
! Para implementá-lo em uma Linguagem de
programação:
! como representá-lo nesta linguagem?
! tipos e Operações suportadas pelo computador. ! na sua representação emprega-se Estruturas de
13
Algoritmos e
Estruturas de Dados
!Resolução de um Problema
! Algoritmo ! representação do comportamento ! Estrutura de Dados ! representação da informação14
Algoritmos e
Estruturas de Dados
! No processo de construção de programas: ➫ formulação do algoritmo
➫ definição de estruturas de dados
15
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:
16
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
17
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
18
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
19
Algoritmo
! Deve utilizar Estruturas Básicas de controle
! formas naturais de pensar e adequadas à
construção de algoritmos inteligíveis
20
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
21
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
22
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
23
Apresentação dos Algoritmos
! formato livre com comandos das linguagens
estruturadas
! estrutura de blocos ! identação
! funções
24
Processamento de um Programa
If (a>b) {
printf ( “A é maior”) } else { printf (“B é maior”) } Tradutor: Compilador + Linkeditor A é maior
25
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
26
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 computadores tradicionais:
1. Obter a próxima instrução (PC) 2. Incrementar o PC
3. Decodificar a instrução 4. Executar a instrução
27
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
! Essa tradução é feita em vários passos
! Compilador ! Linkeditor ! Loader
28
Compilação
! Logicamente, a tradução pode ser dividida em 2
grandes partes:
! análise do programa fonte (dados de
entrada)
29
Síntese do programa objeto
! A saída da fase anterior consiste basicamente
de
! programas quase executáveis (*.o)
! podem fazer referências a dados externos ou
outros programas
! Linkedição: une diversos *.o em um programa
30
Programa
If (a>b) {
printf ( “A é maior”) } else { printf (“B é maior”) } compilação If (a>b) {
printf ( “A é maior”) } else { printf (“B é maior”) } If (a>b) {
printf ( “A é maior”) } else { printf (“B é maior”) } pgm1.c compilação compilação pgm2.c pgm3.c pgm1.o pgm2.0 pgm3.0 linkedição programa.exe
31
Síntese do programa objeto
!
Linkedição
! um procedimento para finalizar a resolução
de referências
! programas podem ser traduzidos
separadamente
32
Visão Geral de um Programa
!
O Problema
➫ Imprimir uma mensagem mostrando o que
está sendo somado
➫ Calcular a soma de três números ➫ Imprimir o resultado
33
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?
34
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
35
Modelo de um Programa
! Este é um modelo seguido pelos programas
! Um programa tem que ser capaz de armazenar
sua entrada em algum lugar
36
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
37
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
38
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
39
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
40
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
41
Identificadores
! Elemento básico da Linguagem ! Identificadores dão nomes a:
! Variáveis
42
Identificadores
!
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
43
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
44
Tipo de Dados
! Na matemática, variáveis são classificadas de
acordo com algumas características importantes
! Existe distinção clara entre
! variáveis reais, complexas e lógicas
! valores individuais e conjunto de valores ! funções
45
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
46
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
47
Tipo de Dados
! A um 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
48
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
49
Definição de Variáveis
!
int X1
!
float A, B;
50
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)
! marcada com o tipo de valores que ela pode
conter (equivale a um tamanho e forma de representação)
! X1: é o nome do local de memória que só pode
conter variáveis do tipo inteiro
51
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;
52
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;
53
Expressões
!
Operadores Lógicos
! dentro das relações lógicas, usaremos
conectivos lógicos usuais
! E (&&) ! OU (||)
! NEGAÇÃO (!)
!
Conectivos relacionais
54
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. : ||
55
Comentários
! Uma anotacão
! Servem para ajudar a explicar a codificação ! Seu programa deve ser compreendido por
qualquer outro programador
! /* ………COMENTÁRIO ………..*/
56
Comentários
! Devem ser utilizados com liberalidade em
todo o programa
! Devem explicar seu algoritmo
! Estão relacionados com a solução do
problema
57
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
58
Operações Especiais do “C”
!Incrementando 1:
! i++; ! ++i; !Decrementando 1:
! i--; ! --i;59
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
60
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:
61
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;
62
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;
63
Instruções Condicionais
! if (NaoAguentaCalor) { if (JanelaNaoAbre) { FiqueForaDaCozinha; } } else { LavePratos;}64
Comandos Básicos do C
! <condição> é qualquer expressão cujo
resultado é um valor booleano
! onde está relacionado um bloco de
comandos (limitados por { / }) pode ser usado um único comando
! bloco: como um novo comando / extensão
65
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 é
66
Comandos Básicos do C
!
Repetição
enquanto <condição> faça C1;
C2; C3; C4;
67
Comandos Básicos do C
!Repetição - “C”
while ( <condição> ) {
C1; C2; C3; C4;}
68
Comandos Básicos do C
!Repetição
faça C1; C2; C3; C4; enquanto <condição>;69
Comandos Básicos do C
!Repetição “C “
do { C1; C2; C3; C4; } while (<condição>);70
Comandos Básicos do C
!
Repetição
for (i=0; i<N; i++) { C1;
C2; C3; C4; };
71
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
72
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
73
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 :=, +, -, *, /
74
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
75
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’;
76
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]