Você está na página 1de 71

ALGORITMOS E Prof.

Raul Sidnei

PROGRAMAÇÃO Wazlawick
10. ESTRUTURAS
DE DADOS
DERIVADAS
 Pilhas
 Filas
 Simulação Discreta com Filas
 Matrizes
PILHAS
 LIFO (Last In First Out)
 pilha.append(elemento) -> “empilha”
 elemento = pilha.pop() -> “desempilha”
JOGO “BATALHA DE CARTAS”
 Dividir para conquistar:
 Criar uma representação para o baralho de cartas.
 Embaralhar as cartas.
 Dividir as cartas entre os jogadores.
 Simular as jogadas.
 Determinar o vencedor.
CRIAÇÃO DE UM BARALHO
SIMPLIFICADO
FUNÇÃO QUE EMBARALHA
UMA LISTA:
DISTRIBUIÇÃO DAS CARTAS
INICIALIZAÇÃO DAS PILHAS
“GANHAS” DE CADA JOGADOR E
DA PILHA DA “MESA”
CADA JOGADOR FAZ UM
DESCARTE POR JOGADA
VERIFICAÇÃO DO
GANHADOR (SE HOUVE)
SE HOUVE UM GANHADOR, ELE
RECEBE TODAS AS CARTAS DA
MESA
AO FINAL DE TODAS AS JOGADAS,
VERIFICAR SE SOBRARAM CARTAS NA
MESA E DÁ-LAS AO ÚLTIMO GANHADOR
VERIFICAR QUEM GANHOU O
JOGO
PROGRAMA COMPLETO 1/2
PROGRAMA COMPLETO 2/2
FILAS
 FIFO (First In First Out)
 fila.append(elemento) -> “entra na fila”
 elemento = fila.pop(0) -> “sai da fila”
FILA DE ATENDIMENTO
 Comandos:
 "c" – indica a chegada de um novo paciente. Neste caso o sistema pede o
nome do paciente para inserir no final da fila.
 "a" – indica que o primeiro paciente da fila pode ser atendido. Neste caso o
primeiro da fila é retirado dela e seu nome exibido para que o atendente
possa chamá-lo.
EXEMPLO
1. Inicialmente a fila está vazia: [].
2. "c" – "João". A fila consiste em ['João'].
3. "c" – "Maria". A fila consiste em ['João', 'Maria'].
4. "c" – "Pedro". A fila consiste em ['João', 'Maria', 'Pedro'].
5. "a". O sistema imprime "João" e a fila consiste em ['Maria', 'Pedro'].
6. "c" – "Alberto". A fila consiste em ['Maria', 'Pedro', 'Alberto'].
7. "a". O sistema imprime "Maria" e a fila consiste em ['Pedro',
'Alberto'].
8. "a". O sistema imprime "Pedro" e a fila consiste em ['Alberto'].
9. "a". O sistema imprime "Alberto" e a fila fica vazia [].
PRIMEIRA VERSÃO
USUÁRIO MAL
COMPORTADO...
1. Inicialmente a fila está vazia: [].
2. "c" – "João". A fila consiste em ['João'].
3. "c" – "Maria". A fila consiste em ['João', 'Maria'].
4. "a". O sistema imprime "João" e a fila consiste em ['Maria'].
5. "a". O sistema imprime "Maria" e a fila fica vazia [].
6. "a". O sistema faz o que?
VERIFICANDO SE TEM
ALGUÉM NA FILA

Equivale a if len(fila) != 0:
TECLE “P” PARA PARAR
SIMULAÇÃO DISCRETA COM
FILAS
 Exemplo: um supermercado deseja otimizar o número de caixas abertos
de forma que o tempo de espera do cliente em média seja o menor
possível, mas que também não haja muito tempo de ociosidade entre os
funcionários dos caixas.
ESTRATÉGIA
 Um "while" mais externo vai primeiramente simular o mercado com
apenas 1 caixa aberto e medir os tempos de espera e ociosidade; depois
testará com 2 caixas abertos, com 3 e assim por diante.

 Deixaremos a cargo do usuário decidir quando parar. Para isso, o


"while" ficará condicionado a uma entrada do usuário que digitará "s"
para simular com um caixa a mais do que na última vez e qualquer outra
entrada para parar a simulação.
ESTRATÉGIA
 Haverá uma fila para cada caixa.

 Cada cliente é representado por uma lista com:


 o número de itens que ele tem para passar no caixa
 o número de instantes que ele esperou na fila

 Exemplo de fila de um caixa:


 [[45, 107], [3, 59], [18, 12]]
A CADA INSTANTE, A
PROBABILIDADE DE UM NOVO
CLIENTE SURGIR É DE 5%

O número de itens dele é um aleatório entre 1 e 100 e seu tempo de espera total
é zero.
O CLIENTE ESCOLHE A
MENOR FILA
CADA CAIXA PROCEDE A UM
ATENDIMENTO
ACABOU O ATEDIMENTO?
INCREMENTA TEMPO DE CAIXA
OCIOSO, SE FOR O CASO
NO FINAL, CALCULA
OCIOSIDADE E ESPERA TOTAL
PROGRAMA COMPLETO 1/2
PROGRAMA COMPLETO 2/2
EXEMPLO DE RESULTADO
O PROGRAMA É UM EXEMPLO DE
QUE A COMPLEXIDADE PRECISA
SER ADMINISTRADA
 Complexidade ciclomática:
 1 pelo fluxo principal
 +1 para cada if, elif, for, while e assert no programa
 +1 para cada and e or nas condições compostas
1

4
5

6
7
8

10
11

12
14 13

15

16
TESTABILIDADE
 Algoritmos com complexidade ciclomática abaixo de 10 são
considerados fáceis de testar.
 Com complexidade entre 10 e 20 são considerados de médio risco para
o teste, ou seja, a probabilidade de não conseguirmos fazer testes
adequados aumenta.
 Com complexidade entre 20 e 50 eles são considerados de alto risco.
 Com complexidade acima de 50 são considerados não testáveis.

 Assim, nosso algoritmo já alcançou médio risco nesta escala.


ABORDAGENS PARA MELHORAR
UM PROGRAMA MUITO LONGO
COMO ESSE
 Decomposição funcional (tem limitações)
 Programação orientada a objetos (é a abordagem correntemente mais
usada)
MATRIZES
 Em Python, matrizes podem ser representadas como listas de listas.

[[2, 3], [4, 5]] =


CONVENÇÃO
 minha_matriz[linha][coluna]
INICIALIZANDO UMA MATRIZ
20X20 COM ZEROS
EXEMPLO: SISTEMA DE
RESERVAS EM UM TEATRO
VERIFICANDO SE SE TRATA
MESMO DE UMA MATRIZ
VERIFICANDO SE TODOS OS
ELEMENTOS SÃO BOOLEANOS
MATRIZ IMPLEMENTADA
COMO DICIONÁRIO
DICIONÁRIO COM POSIÇÕES
NÃO NUMÉRICAS (TABELA)
VERIFICANDO A LOTAÇÃO
(MATRIZ COMO LISTA DE
LISTAS)
VERIFICANDO A LOTAÇÃO
(MATRIZ COMO DICIONÁRIO

Esta versão considera que algumas posições do dicionário


podem conter “False”
VERIFICANDO A LOTAÇÃO
(MATRIZ COMO DICIONÁRIO)

Esta versão considera que todas as posições definidas no


dicionário são “True”
MATRIZ ESPARSA
 Se a matriz for muito grande e com relativamente poucos elementos
definidos, é recomendada a implementação com dicionário.
TÓPICOS ABORDADOS NESTE
CAPÍTULO

Você também pode gostar