algoritmos e estruturas de dados - ipb.ptreis.quarteu/aed2005/pdfs/acetatos/acetatos_paulo... ·...
TRANSCRIPT
1
Estruturas de
A lgoritmos e
Dados Caderno de acetatos da disciplina de
Algoritmos e Estruturas de Dados
Ano lectivo: 2004/2005
Versão: 0.1
Cursos: Informática de Gestão
Docente: Paulo Matos
Email: [email protected]
Reis Quarteu
Email: [email protected]
2
Estruturas de
A lgoritmos e
Dados Apresentação da Disciplina
Objectivos
� Aperfeiçoar e dar a conhecer novas metodologias de programação, reforçando os
conhecimentos até aqui adquiridos em programação;
� Dotar os alunos da experiência necessária à implementação de programas de
qualidade, com capacidade de desenvolverem e adaptarem as mais correctas
estruturas e algoritmos, na resolução dos mais diversos problemas.
3
Estruturas de
A lgoritmos e
Dados Apresentação da Disciplina
Tópicos
� Métodos de avaliação da qualidade do software
� Representação algorítmica
� Estruturas de dados dinâmicas e lineares
� Estruturas de dados dinâmicas não lineares
� Algoritmos de ordenação e pesquisa
4
Estruturas de
A lgoritmos e
Dados Sistema de avaliação para 2004/2005
Mini-trabalhos práticos (3 por aluno) 30%
Trabalho final 30%
Prova escrita 40%
Nota mínima às três componentes de 7.5 valores em 20.
5
Estruturas de
A lgoritmos e
Dados Bibliografia
Sebenta de Algoritmos e Estruturas de Dados
Paulo Matos
Algorithmics in C++, Sedgewick
Addison-Wesley Publishing Company
Programação em C++ - Algoritmos e Estruturas de Dados
Pimenta Rodrigues, …
FCA
6
Estruturas de
A lgoritmos e
Dados Programa de Algoritmos e Estruturas de Dados
Introdução
Noção de Algoritmo
Eficiência algorítmica
Representação das estruturas de dados x Eficiência algorítmica
Especificação de uma linguagem algorítmica
Representação algorítmica
Representação das estruturas de dados
Do algoritmo ao programa, boas e más técnicas de programação
7
Estruturas de
A lgoritmos e
Dados Programa de Algoritmos e Estruturas de Dados
Estruturas de Dados Lineares
Listas ligadas simples (revisões)
Listas duplamente ligadas
Stack’s
Queue’s
Tabelas de Hash
8
Estruturas de
A lgoritmos e
Dados Programa de Algoritmos e Estruturas de Dados
Estruturas de Dados Não Lineares
Árvores Genéricas
Árvores Binárias
Árvores Binárias de Pesquisa
Árvores Binárias de Pesquisa Balanceadas
Heaps
Grafos
9
Estruturas de
A lgoritmos e
Dados Horas de Atendimento
Paulo Matos
Email: [email protected]
Gabinete 92
Segundas-Feiras das 11:00 às 13:00
Quartas-Feiras das 9:00 às 11:00
Reis Quarteu
Email: [email protected]
Gabinete 37
Quartas-Feiras: das 14:00 às 16:00
Quintas-Feiras: das 10:00 às 12:00
10
Estruturas de
A lgoritmos e
Dados Notas e Avisos
� Os alunos devem requisitar no centro de comunicações da ESTiG uma conta para
poderem trabalhar durante as aulas práticas.
� Cada aluno deve comparecer às aulas práticas do turno que lhe foi atribuído pela
secretaria académica.
� Os alunos devem, sempre que necessário, recorrer ao apoio dos docentes
utilizando para tal as horas de atendimento disponíveis, ou colocando as questões
por email.
11
Estruturas de
A lgoritmos e
Dados Introdução
Noção de Algoritmo
Um algoritmo consiste numa sequência de operações bem definidas e sem
ambiguidades, que descreve uma solução exequível computacionalmente, de um
problema, independentemente da linguagem de programação a utilizar.
A implementação prática de um algoritmo pode variar com a linguagem a utilizar e de
programador para programador, no entanto para um mesmo estado inicial e conjunto
de dados de entrada (definidos como instância inicial do problema) deve produzir
sempre a mesma solução.
12
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica
Uma forma de avaliar um algoritmo consiste em determinar o esforço computacional
do mesmo, através do qual se pode comparar a eficiência entre algoritmos.
O esforço computacional é obtido através da Ordem de Complexidade do algoritmo,
que é definida da seguinte forma:
Um algoritmo tem como Ordem de Complexidade O(f(n)), quando o número de
operações primitivas executadas para obter a solução para a instância do problema,
cujo tamanho é n, não exceder uma constante vezes f(n), para um n suficientemente
grande.
13
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica
Seja g(n) a função que determina o tempo de execução das primitivas de um algoritmo,
pode-se então definir f(n) como a função que resulta de:
n'n,f(n)K*g(n) ≥∀≤
Onde K e n' são duas quaisquer constantes que satisfaçam a condição anterior.
NOTA: n' permite salvaguardar a condição para problemas de dimensão reduzida.
14
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica - Exemplo
Pretende-se avaliar a ordem de complexidade da solução fornecida, para a resolução de
um problema de ordenação de uma sequência de n números, por comparações
sucessivas.
15
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica - Exemplo
Problema de tamanho 3:
SE seq.get( 1 ) > seq.get( 2 ) ENTÃO
seq.swap( 1, 2)
FIMSE
SE seq.get( 2 ) > seq.get( 3 ) ENTÃO
swap(seq, 2, 3)
FIMSE
SE seq.get( 1) > seq.get( 2) ENTÃO
seq.swap( 1, 2)
FIMSE
16
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica - Exemplo
Problema de dimensão n:
PARA i � n ATÉ 2 DE –1 EM –1 FAZER
PARA j � 1 ATÉ i-1 FAZER
SE seq.get( j ) > seq.get( j+1) ENTÃO
seq.swap( j, j+1)
FIMSE
FIMPARA
FIMPARA
17
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica - Exemplo
De onde se obtêm os seguintes valores de g(n):
n 2 3 4 5 ...
g(n) 1 1+2 1+2+3 1+2+3+4 ...
18
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica - Exemplo
É possível converter a série num somatório, que por sua vez pode ser convertido numa
equação em ordem a n:
2)1n(*n
*n
1ii*)n(g
−=∑
== ττ
Em que τ representa o tempo de execução por ciclo. O seu valor é no entanto
irrelevante para os restantes cálculos, uma vez que pode ser absorvido pela constante
K, pelo que é eliminado.
19
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica - Exemplo
Para determinar a ordem do algoritmo é necessário encontrar um f(n) tal que:
)n(f*K)n(g ≤
Propondo f(n) = n2, obtém-se a seguinte inequação:
2n*K2
)1n(*n ≤−
de onde é possível concluir que, para valores de K ≥ 0.5, a inequação é sempre
verdadeira (n = 2,3,4,...). Pelo que o f(n) proposto garante sempre que K* f(n) é um
majorante de g(n).
20
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica - Exemplo
Diz-se assim que a ordem do algoritmo é:
)n(O))n(f(O 2=Ou seja, no pior dos casos a ordem de complexidade do algoritmo é quadrática.
21
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica - Exemplo
No entanto uma análise mais atenta permite concluir que a solução proposta é
determinística, isto é, para um sequência de tamanho n demora sempre o mesmo tempo
a executar, independentemente desta já estar, ou não, ordenada (ou parcialmente
ordenada). Pelo que o tempo é dado pela equação:
2)1n(*n
*n
1ii*)n(g
−=∑
== ττ
22
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica - Exemplo
Poder-se-á então perguntar o porquê de utilizar a Ordem de Complexidade como
forma de avaliação de algoritmos. A resposta é simples, é que apesar de muitos
algoritmos serem determinísticos, muitos outros há em que tal não acontece e é para
estes últimos que esta forma de avaliação é útil, uma vez que permite obter uma
função que serve de majorante para o tempo de execução.
23
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica - Exemplo
Valores típicos para a ordem de complexidade são:
� Constante O(1)
� Logarítmica O(log n)
� Linear O(n)
� n log n O(n log n)
� Quadrática O(n2)
� Cúbica O(n3)
� Exponencial O(2n)
24
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica
� A ordem de complexidade apenas permite comparar algoritmos de ordens
distintas. Caso contrário é necessário ter em conta a soma dos tempos de execução
das instruções primitivas e eventualmente uma análise detalhada da estratégia de
cada um dos algoritmos.
� Nem sempre um algoritmo de ordem elevada (n3, 2n) é um mau algoritmo.
Exemplos são alguns dos algoritmos utilizados na resolução de problemas NP-
Completos.
� Por vezes, ocorre que um algoritmo de ordem elevada se revele na prática bastante
eficiente, o que normalmente se deve a heurísticas que permitem “desprezar”
grande parte do espaço de soluções, tornando a sua eficiência comparável à um
algoritmo de ordem inferior.
25
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica
� A Ordem de Complexidade é uma medida a priori, ou seja, permite antever a
eficiência da implementação prática do algoritmo.
� Existem outras medidas para avaliar a qualidade de uma solução e que se aplicam
a posteriori, ou seja, medem o tempo que a implementação do algoritmo leva a
executar. A este tipo de estratégia designa-se por bench marketing.
� Ocorre, por vezes, que o domínio dos valores de entrada de um algoritmo é muito
grande e diversificado, não sendo possível medir a eficiência da solução para
todas as hipóteses de entrada. Torna-se então necessário escolher um sub-domínio
representativo que permita avaliar a qualidade da solução.
26
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica - Exercícios
a) O seguinte algoritmo descreve uma solução utilizada na pesquisa de um elemento
numa sequência. Determine a ordem de complexidade para: o corpo principal do
algoritmo, a função Pesquisar(...) e o conjunto das duas.
ALGORITMO Pesquisa numa sequência
VARIÁVEL i, val, n, x , : INTEIRO
VARIÁVEL lista : seq(INTEIRO)
INÍCIO
ESCREVER(“Qual o tamanho da sequência?”)
LER(n)
PARA i � 1 ATÉ n FAZER
lista.set( LER(), i)
FIMPARA
ESCREVER(“Valor a pesquisar?”)
LER(val)
x � Pesquisar( lista, n, val)
ESCREVER(O valor encontra-se na posição “, x)
FIM ALGORITMO
27
Estruturas de
A lgoritmos e
Dados Introdução
Eficiência algorítmica - Exercícios
PROCEDIMENTO Pesquisar
(lista : seq(INTEIRO), n, val : INTEIRO) : INTEIRO
VARIÁVEL meio, x : INTEIRO
INÍCIO
SE n = 1 ENTÃO
SE lista.get( n) = val ENTÃO
RETORNAR 1
SENÃO
RETORNAR 0
FIMSE
FIMSE
meio � n/2 + n MOD 2
x � Pesquisar(lista<1...meio>, meio, val)
SE x ENTÃO
RETORNAR x
FIMSE
RETORNAR
(meio + Pesquisar(lista<meio+1....n>, n-meio, val))
FIM
28
Estruturas de
A lgoritmos e
Dados Introdução
Representação das estruturas de dados x Eficiência algorítmica
Na representação algorítmica as estruturas de dados são normalmente apresentadas
como entidades abstractas, principalmente no caso das estruturas mais complexas
como por exemplo: as sequências, conjuntos, stack’s, etc.
A implementação do algoritmo passa por escolher as estruturas de dados que melhor se
adequam à execução do mesmo, pois depende destas grande parte da eficiência da
implementação final, pode-se mesmo afirmar que existe uma dependência directa entre
a eficiência e as estruturas de dados utilizadas. Para exemplificar esta dependência,
apresenta-se o seguinte caso:
29
Estruturas de
A lgoritmos e
Dados Introdução
Representação das estruturas de dados x Eficiência algorítmica
Os alunos da Escola Superior de Tecnologia e Gestão do Instituto Politécnico de
Bragança inscrevem-se pela ordem de chegada. Existe um programa responsável por
armazenar a informação referente a cada aluno numa base de dados pela ordem pela
qual estes se inscrevem. Esse programa é ainda responsável por fornecer uma lista
ordenada dos alunos pelo número mecanográfico.
Solução:
� Utilizar um algoritmo de ordenação, tipo o do exemplo anterior (2
)1n(*n)n(g
−= );
� Ou manter um lista indexada.
30
Estruturas de
A lgoritmos e
Dados Introdução
Representação das estruturas de dados x Eficiência algorítmica
� A segunda solução não necessita de qualquer tipo de procedimento uma vez que
os elementos já se encontram ordenados. Apenas é necessário garantir que os
índices são actualizados, o que se consegue através de um processo de inserção
ordenada, percorrendo a sequência de índices à procura da posição a ocupar pelo
novo aluno.
� No pior dos casos, esta solução percorre os n-1 elementos da lista, pelo que se
trata de uma rotina de ordem linear O(n). No entanto como este procedimento é
executado para cada um dos n alunos, perfaz um total n x n (no pior dos casos),
correspondendo assim a uma solução de ordem de complexidade quadrática.
31
Estruturas de
A lgoritmos e
Dados Introdução
Representação das estruturas de dados x Eficiência algorítmica
A segunda solução necessita ainda de uma sequência de índices, a qual como é obvio
ocupa espaço em memória. No caso se utilize uma lista ligada simples para
implementar a sequência de índices, é necessário por cada aluno mais:
1 apontador (4 bytes) + 1 inteiro (4 bytes) = 8 bytes.
32
Estruturas de
A lgoritmos e
Dados Introdução
Representação das estruturas de dados x Eficiência algorítmica
A seguinte tabela apresenta os valores comparativos entre as duas soluções:
n (Alunos) 100 1000 10000
1ª Solução Espaço 0 0 0
Tempo 4950 4995E2 49995E3
2ª Solução Espaço 800 bytes 8 Kbytes 80 Kbytes
Tempo 1E4 1E6 1E8
A partir da tabela poder-se-ia concluir que a primeira solução é a melhor, uma vez que é
da mesma ordem que a segunda, mas não necessita da lista de índices permitindo assim
economizar o espaço por esta ocupado.
33
Estruturas de
A lgoritmos e
Dados Introdução
Representação das estruturas de dados x Eficiência algorítmica
No entanto uma análise mais detalhada permite ver que apesar de o primeiro algoritmo
demorar exactamente 2
)1n(*n*
−τ , o segundo fica muito aquém desse valor. É que no
pior dos casos, que é inserir os alunos por ordem crescente da chave de ordenação, a
segunda solução, ao inserir um aluno na sequência de índices, tem que percorrer
apenas o número total de elementos existentes na sequência e não n. O que perfaz para
o total dos alunos a seguinte soma:
Ordem do aluno 1º 2º 3º 4º ... nº
Nº ciclos/aluno = 0 + 1 + 2 + 3 + ... + (n-1)
Total = 2
)1n(*n −
34
Estruturas de
A lgoritmos e
Dados Introdução
Representação das estruturas de dados x Eficiência algorítmica
O que parecia inicialmente uma solução pior, é na realidade muito mais eficiente, uma
vez que, no pior dos casos, demora tanto quanto a primeira solução. Mas como é muito
pouco provável que os alunos se inscrevam exactamente pela ordem crescente do
número mecanográfico, acaba por acontecer que o tempo total de execução seja na
realidade bastante inferior.
Para um cálculo mais aproximado, é legítimo considerar que em média o número de
elementos da sequência a percorrer até se encontre a posição onde inserir o novo
índice é de metade, o que perfaz um tempo total de 4
)1(* −nn .
35
Estruturas de
A lgoritmos e
Dados Introdução
Representação das estruturas de dados x Eficiência algorítmica
O seguinte quadro mostra o tempo de execução e o espaço ocupado por ambas as
soluções, onde se pode verificar que para valores de n suficientemente elevados, a
primeira solução possui uma performance bastante inferior à segunda.
n (Alunos) 100 1000 10000
1ª Solução Espaço 0 0 0
Tempo 4950 4995E2 49995E3
2ª Solução Espaço 800 bytes 8 Kbytes 80 Kbytes
Tempo 2475 2497.5E2 24997.5E3
36
Estruturas de
A lgoritmos e
Dados Notação algorítmica
MAIÚSCULAS e a negrito Palavras reservadas
[...] Partes opcionais da gramática
El ���� Er Expressão do lado esquerdo (El) deriva na frase
do lado direito (Er)
“ “ Símbolos reservados dentro da sintaxe
a | b Expressão opcional entre a e b
expressão_exemplo� PROCEDIMENTO /PROC nome
37
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Algoritmo � ALGORITMO nome
[Declaração_variáveis]
[Declaração_de_constantes]
[INÍCIO]
Sequência_de_instruções
FIM .
38
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Declaração_variáveis � VARIÁVEL/VAR lista_variáveis “ :” tipo_variável
[Declaração_variáveis] .
lista_variáveis � variável [“,” lista_variáveis] .
tipo_variável � INTEIRO /INT | REAL | ...
Declaração_constantes� CONSTANTE/CONST lista_atribuição_constantes .
lista_atribuição_constantes � nome_constante “����” valor
[“,” lista_atribuição_constantes] .
39
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Sequência_de_instruções � instrução [Sequência_de_instruções] .
instrução � instrução_simples |
instrução_Se |
instrução_Enq |
instrução_Rep |
instrução_Para .
40
Estruturas de
A lgoritmos e
Dados Notação algorítmica
instrução_simples � SKIP |
ABORT [mensagem] |
Atribuição |
Invocação_de_procedimentos |
RETORNAR /RET [ expressão ] |
descrição_informal .
descrição_informal � “ [“ texto “ ]” |
// texto .
41
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Atribuição � Variável “����” expressão
Invocação_de_procedimentos� nome função “(“ lista_valores “)”
instrução_Se � SE expressãoENTÃO
Sequência_de_instruções
[ SENÃO Sequência_de_instruções]
FIMSE .
42
Estruturas de
A lgoritmos e
Dados Notação algorítmica
instrução_Enq � ENQUANTO /ENQ expressão FAZER
Sequência_de_instruções
FENQ
instrução_Rep � REPETIR /REP
Sequência_de_instruções
ATÉ expressão .
instrução_Para � PARA variável “����” expressão_sequencial FAZER
Sequência_de_instruções
FPARA .
43
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Definição_de_funções � PROCEDIMENTO/PROC nome
“(“ [ lista_parâmetros] “ )” [“ :” tipo de retorno]
[Declaração_variáveis]
[Declaração_de_constantes]
INÍCIO
Sequência_de_instruções
FIM .
44
Estruturas de
A lgoritmos e
Dados Notação algorítmica
lista_parâmetros � [IN :| OUT:| INOUT :] parâmetro “:” tipo_de_parâmetro
[ “,” lista_parâmetros]
ALGORITMO Ordenar lista
VARIÁVEL i, j, n, : INTEIRO
VARIÁVEL lista : seq(INTEIRO)
INÍCIO
LER(n)
PARA i � 1 ATÉ n FAZER
PARA j � 1 ATÉ n-2
SE lista.get(j) > lista.get(j+1) ENTÃO
lista.swap(j, j+1)
FIMSE
FPARA
FPARA
FIM
45
Estruturas de
A lgoritmos e
Dados
Notação algorítmica
Conjunto (Set)
Estrutura abstracta que permite guardar um conjunto de elementos do mesmo tipo sem
existirem duplicados. Não existe qualquer noção de ordenação ou organização.
VARIÁVEL conjA : Set(INTEIROS)
A H
CP
Z
46
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Conjunto (Set)
new: � Set(DATA) //Cria, inicializa e devolve umconjunto vazio
free: Set(DATA) � ∅ //Destrói o conjunto
φ: � Set(DATA) //Conjunto vazio
∪: Set(DATA) x Set(DATA) � Set(DATA) //União de conjuntos
∩: Set(DATA) x Set(DATA) � Set(DATA) //Intersecção de conjuntos
\: Set(DATA) x Set(DATA) � Set(DATA) //Diferença de conjuntos
∈: Set(DATA) x DATA � Bool //Se o elemento do tipo DATApertence ao Set(DATA)
⊂: Set(DATA) x Set(DATA) � Bool //Se Set(DATA) ⊂ Set(DATA)
⊃: Set(DATA) x Set(DATA) � Bool //Se Set(DATA) ⊃ Set(DATA)
47
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Sequências (Seq)
Estrutura abstracta que permite guardar um conjunto de elementos do mesmo tipo,
com possibilidade de existirem duplicados. Os elementos encontram-se organizados
sequencialmente e associados a um índice.
VARIÁVEL seqA : Seq(INTEIROS)
C Z H P A I
1 2 3 4 5 6
48
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Sequências (Seq)
new: � Seq(DATA) //Cria uma sequência vazia
free: Seq(DATA) � ∅ //Destroi a sequência
<>: � Seq(DATA) //Devolve a sequência vazia
<_._>: Seq(DATA) x DATA � Seq(DATA) //Acrescenta DATA à sequência
∧: Seq(DATA) x Seq(DATA) � Seq(DATA) //Concatenação de sequências
head: Seq(DATA) � DATA //Devolve o elemento do topo
tail: Seq(DATA) � Seq(DATA) //Devolve a cauda da sequência
get: Seq(DATA) x I � DATA //Devolve o elemento da
posição indicada pelo índice I
set: Seq(DATA) x DATA x I � Seq(DATA) //Insere DATA na posição indicada pelo índice I
swap: Seq(DATA) x I 1 x I 2 � Seq(DATA) //Troca o elemento da posiçãoI 1
com o da posição I 2
49
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Produtos cartesianos (tuplos, records, structs)
Forma de representação abstracta de estruturas com vários tipos de dados num mesmo
elemento.
Nome tuplo = A x B x C x ...
VARIÁVEL tvar : Nome tuplo
Exemplo:
Arvbin = raiz x esq x dir
raiz : DATA
esq, dir : Arvbin
50
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Produtos cartesianos (tuplos, records, structs)
raiz: Arvbin � DATA // Devolve o valor de raiz
getEsq: Arvbin � Arvbin // Devolve o valor de esq
setEsq: Arvbin1 x Arvbin2 � Arvbin // Atribui Arvbin2 a esq
getDir: Arvbin � Arvbin // Devolve o valor de dir
setDir: Arvbin1 x Arvbin2 � Arvbin // Atribui Arvbin2 a dir
mkarvbin: DATA x Arvbin x Arvbin � Arvbin // Cria uma ArvBin
51
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Stack (Pilha)
Estrutura abstracta que permite guardar um conjunto de elementos do mesmo tipo e
cujo funcionamento obedece a uma organização do tipo LIFO (Last In Firts Out).
VARIÁVEL stackA : Stack(INTEIROS)
push pop
52
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Stack (Pilha)
new: � Stack(DATA) //Cria uma stack vazia
free: Stack(DATA) � ∅ //Destroi a stack
top: Stack(DATA) � DATA //Devolve o elemento do topo
push: Stack(DATA) x DATA � Stack(DATA) //Coloca o elemento do tipo DATAno topo da stack
pop: INOUT: Stack(DATA) � DATA //Retira o elemento que está no
topo
53
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Queue (Fila)
Estrutura abstracta que permite guardar um conjunto de elementos do mesmo tipo e
cujo funcionamento obedece a uma organização do tipo FIFO (First In Firts Out).
VAR queueA : Queue(INTEIROS)
QInsertQRemove
54
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Queue (Fila)
new: � Queue(DATA) //Cria uma queue vazia
free: Queue(DATA) � ∅ //Destroi a queue
front: Queue(DATA) � DATA //Retorna o elemento da frente
insert: Queue(DATA) x DATA � Queue(DATA) //Coloca DATA na queue
remove: INOUT: Queue(DATA) � DATA //Retira o elemento da frente
55
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Sacolas (Bags)
new: � Bag(DATA) //Cria uma sacola vazia
free: Bag(DATA) � ∅ //Destroi a sacola
φ: � Bag(DATA) //Devolve a sacola vazia
add: Bag(DATA) x DATA � Bag(DATA) //Acrescenta DATA à sacola
remove: Bag(DATA) x DATA � Bag(DATA) //Remove DATA da sacola
count: Bag(DATA) x DATA � INTEIRO //Conta quantos DATA há na sacola
size: Bag(DATA) � INTEIRO //Dá o tamanho da sacola
∧: Bag(DATA) x Bag(DATA) � Bag(DATA) //Concatenação de sacolas
∈: Bag(DATA) x DATA � BOOL //Indica se DATA existe na
sacola
56
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Dicionários (Dictionary)
new: � Dictionary(KEY,DATA)
free: Dictionary(KEY,DATA) � ∅
φ: � Dictionary(KEY,DATA)
add: Dictionary(KEY,DATA) x KEY x DATA � BOOL
remove: Dictionary(KEY,DATA) x KEY � BOOL
size: Dictionary(KEY,DATA) � INTEIRO
get: Dictionary(KEY,DATA) x KEY � DATA
set: Dictionary(KEY,DATA) x KEY x DATA � BOOL
has: Dictionary(KEY,DATA) x KEY � BOOL
57
Estruturas de
A lgoritmos e
Dados Notação algorítmica
Dicionários com 2 Chaves (TwoKeysDict)
new: � TwoKeysDict(KEY1,KEY2,DATA)
free: TwoKeysDict(KEY1,KEY2,DATA) � ∅
φ: � TwoKeysDict(KEY1,KEY2,DATA)
add: TwoKeysDict(KEY1,KEY2,DATA) x KEY1 x KEY2 x DAT A � BOOL
remove: TwoKeysDict(KEY1,KEY2,DATA) x KEY1 x KEY � BOOL
size: TwoKeysDict(KEY1,KEY2,DATA) � INTEIRO
count: TwoKeysDict(KEY1,KEY2,DATA) x KEY1 � INTEIRO
get: TwoKeysDict(KEY1,KEY2,DATA) x KEY1 x KEY2 � DATA
set: TwoKeysDict(KEY1,KEY2,DATA) x KEY1 x KEY2 x DAT A � BOOL
has: TwoKeysDict(KEY1,KEY2,DATA) x KEY1 x KEY2 � BOOL
58
Estruturas de
A lgoritmos e
Dados Do algoritmo ao programa
Algoritmo
ALGORITMO Ordenar sequênciaVAR i, j, n : INTVAR lista : Seq(INT)INÍCIO
LER(n)// Preencher sequênciaPARA i <- n-1 ATÉ 1 SALTO -1 FAZER
PARA j <- 1 ATÉ i FAZERSE lista.get(j)>lista.get(j+1) ENTÃO
lista.swap(j,j+1)FSE
FPARAFPARA
FIM
59
Estruturas de
A lgoritmos e
Dados Do algoritmo ao programa
Programa
void swap(int lista[],int i, int j){int t = lista[i];lista[i] = lista[j];lista[j] = t;
}
void main(){const int NELEM = 10;int lista[NELEM], n;cout << "N. elementos da sequencia?\n";cin >> n;
// Preenchimento de listafor (int i = n - 1; i > 0; i--)
for (int j = 0; j < i; j++)if (lista[j] > lista[j + 1])
swap(lista, j, j + 1);}
60
Estruturas de
A lgoritmos e
Dados Truques e Dicas
Simplificação Algébrica de Expressões
i + 0 = 0 + i = i - 0 = i
0 - i = -i
i * 1 = 1 * i = i / 1 = i
i * 0 = 0 * i = 0
- ( - i ) = i
i + ( -j) = i - j
b v T = T v b = T
b v F = F v b = b
f << 0 = f >> 0 = f
f << w = f >> w = f , Se bitlen(f)=w/n, n ∈ N
i ^ 2 = i * i
2 * i = i + i
i * 5 => t1 = i << 2;
t2 = t1 + i;
i * 7 => t1 = i << 3;
t2 = t1 – i;
61
Truques e Dicas
Propriedade distributiva dos operadores
( i - j ) + ( i - j ) + ( i - j ) + ( i - j ) = 4 * i - 4 * j = 4 * ( i -j )
Expressões equivalentes
Read(i)
j � i +1
k � i
l � k +1
Propagação de constantes
a � 3
b � 4 * a b � 12
62
Truques e Dicas
Propagação de cópias
x � y
r � x * 4 +2 r � y * 4 + 2
s � y+5*x s � y + 5 * y s � 6*y
Eliminação de expressões comuns
p � i*4
x � a + i*4 x � a + p
y � (i*4)/3 y � p/3
63
Truques e Dicas
Colocar expressões comuns em evidência
SE a > 0 ENTÃO SE a > 0 ENTÃO
a � a-1 a � a-1
b � a-c SENÃO
SENÃO a � a+1
a � a+1 FIMSE
b <- a-c b <- a-c
FIMSE
64
Truques e Dicas
Remoção de expressões constantes de dentro de ciclos
ENQ b > 0 FAZER c � x + z
c � x + z ENQ b > 0 FAZER
... ...
[Não ocorre qualquer atribuição de x ou z dentro do ciclo]
FENQ FENQ
65
Truques e Dicas
Reordenação do encadeamento de estruturas
PARA i � 1 ATÉ 100 FAZER SE x > 0 ENTÃO
SE x > 0 ENTÃO PARA i � 1 ATÉ 100 FAZER
a( i ) � a ( i) +1 a( i ) � a ( i) +1
SENÃO FPARA
a( i ) � a ( i) –1 SENÃO
FIMSE PARA i � 1 ATÉ 100 FAZER
FPARA a( i ) � a ( i) –1
FPARA
FIMSE