0% acharam este documento útil (0 voto)
467 visualizações748 páginas

Logica Programacao Python Slides

1. O documento descreve um curso de Lógica de Programação com Python. 2. Aborda conceitos de algoritmos, linguagens de programação, estruturas de dados e programação orientada a objetos utilizando a linguagem Python. 3. O curso é dividido em 12 módulos que vão desde introdução a algoritmos, linguagem Python, estruturas de dados, programação modular até tópicos avançados como recursividade, árvores e grafos.

Enviado por

Ronaldo Ramos
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
467 visualizações748 páginas

Logica Programacao Python Slides

1. O documento descreve um curso de Lógica de Programação com Python. 2. Aborda conceitos de algoritmos, linguagens de programação, estruturas de dados e programação orientada a objetos utilizando a linguagem Python. 3. O curso é dividido em 12 módulos que vão desde introdução a algoritmos, linguagem Python, estruturas de dados, programação modular até tópicos avançados como recursividade, árvores e grafos.

Enviado por

Ronaldo Ramos
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 748

Lgica

de Programao com
Python

Prof. Ronaldo Ramos


1. Algoritmos
a. Conceito
b. Caracters>cas
c. Formas Representa>vas
d. Mquina para Execuo de Algoritmos
e. Estruturas Algortmicas
(Sequncia, Deciso, Iterao)
f. Linguagem Algortmica
2. Linguagem para Algoritmos
a. Variveis, atribuio e expresses
b. Entradas e sadas (E/S) (I/O)
c. Seqncia de Instrues
d. Desvios condicionais (Decises)
e. Repe>es (Laos)
3. Linguagens de Programao
a. Codicao de algoritmos (Fonte x Objeto)
(Estrutura de um Programa Fonte/Objeto)
b. Tradutores (Interpretadores x Compiladores)
c. Portabilidade de Cdigo Fonte
d. Portabilidade de Cdigo Objeto
e. E na WEB?
f. O Mundo dos Scripts
( javascript, php, python etc etc)
4. Python
a. Usando o interpretador intera>vamente
b. Escrevendo scripts em arquivos textos
c. Variveis, expresses aritm>cas e lgicas
d. Desvios condicionais
e. Repe>es (Variantes, Contadores, Ranges)
f. Clusulas de controle de laos
g. Denindo funes em Python
(Argumentos e Funes Lambda)
5. Iterao e Recurso
a. Operaes repe>>vas
b. Gerao de Sries e Progresses
c. Funes itera>vas
(Fatorial, Fibonacci, Somatrio, etc)
d. Recursividade e Funes Recursivas
(Fatorial, Fibonacci, Ackerman, etc)
6. Estruturas de Dados
a. Listas em Python
b. Vetores e Matrizes
c. Pilhas em Python.
(Operaes append, push, pop, etc)
d. Tuplas, Sequencias, Conjuntos e Dicionrios
7. Programao Modular
a. Mdulos padro, compilados e pacotes
8. Entrada e Sada
a. Entradas e Sadas Formatadas
b. Operaes em arquivos
(Leitura, Gravao, Pesquisa)
9. Tratamento de Erros e Excees
a. Blocos de Tratamento de Excees
10. Pesquisa e Ordenamento
a. Pesquisa linear simples em listas
b. Pesquisa binria em listas ordenadas
c. Mtodos de Ordenamento
(Insero, Seleo, Bolha, Classicao Rpida)
d. Complexidade do Algoritmos
e. Comparao de performance de algoritmos
11. POO em Python
a. Classes e Objetos
b. Herana Simples e Ml>plas
c. Composio e Agregao
d. Relacionamento inter Classes/Objetos
12. Tpicos Adicionais
a. Recursividade avanada (Torres de Hani)
b. Listas encadeadas
c. Buer circular
d. rvores e Grafos
e. Busca em rvores e Grafos
f. Mtodos numricos (Clculo do Pi, Integrao
Numrica, Razes de Polinmios, etc)
g. Mul>-Threading e Programao Concorrente
h. Meta-heurs>cas
i. Busca na WEB
Vamos l .....

1. Introduo aos Algoritmos


1.a Denio de Algoritmos

Um algoritmo uma seqncia nita de instrues


bem denidas e no ambguas, cada uma das
quais pode ser executada mecanicamente num
perodo de tempo nito e com uma quan>dade
de esforo nita.

[Fonte: Wikipedia]
1.b Caracters>cas do Algoritmo
Finito
No ambguo
Capaz de receber, gerar e fornecer
informaes
Executvel
1.b Exemplos de algoritmos
Exemplo 1: Receita de Bolo
1. Providencie manteiga, ovos, massa, etc.
2. Misture os ingredientes
3. Despeje a mistura na frma de bolo
4. Leve a frma ao forno
5. Espere at car no ponto
6. Re>re a frma do forno
1.b Observaes
Que tempo Ficar no Ponto? Qual a quan>dade dos
ingredientes? Muito, pouco? O que signica muito ou pouco?
Quando acender ou apagar o forno? Misturar os ingredientes de
que forma?Qualquer pessoa executaria a receita da mesma
forma e obteria os mesmos resultados?

Concluso:

Uma receita gastronmica no um bom exemplo de algoritmo.


Portugus, Ingls, Francs etc so ambguos
Corriqueiramente a comunicao incompleta
1.b Exemplos (2)
Calcular a Media Aritm>ca
1. Receba dois nmeros, chame-os de A e B.
2. Calcule a media aritm>ca segundo a frmula
(a+b)/2 e represente o resultado por mdia
3. Mostre o valor representado por mdia
1.b Observaes (2)

Melhoria em relao ao algoritmo 1. (menor ambigidade)


Algoritmos so usados para que problemas possam ser
solucionados mecanicamente.
Portugus no uma boa linguagem para fazer algoritmos.
(Ambgua, prolixa, etc)
Para fazer algoritmos usam-se linguagens algortmicas
1.b - Exerccios
Exerccios:

Experimente descrever de forma precisa, detalhada, no


ambgua, tarefas simples do co>diano como:
Trocar um pneu
Trocar uma lmpada queimada
Escovar os dentes
Ler as horas em relgio com ponteiros (analgico)
Re>rar dinheiro em um caixa eletrnico

Nem tudo to simples quanto parece. No mesmo?


1.c Formas de Representao
Textual Grca
Receba
1.Leia A,B
2.Calcule
3.Escreva X X>Y

Y
1.c Smbolos Grcos
Entradas de dados

Clculos

Deciso

Sadas de dados

Operaes com bancos de dados


Incio e Fim
1.d Mquinas para Executar Algoritmos

Unidade de Lgica e
Aritm>ca

Unidade
Unidade De Controle Unidade
de
de Sada
Entrada

Programa Dados

Memria Principal
1.e Estruturas Bsicas
Estrutura Seqencial: Incio

Incio
Receba
Leia (Receba)
Calcule
Escreva
Fim Calcule

Escreva

Fim
1.e Estruturas Bsicas
Estrutura de Deciso: Incio

Incio
Receba
Leia (Receba)
Se <condicao> for verdade
faa isto Verdade
Seno Condio
faa aquilo
Escreva
Fim Falso
Escreva

Fim
1.e Estruturas Bsicas
Estrutura de Repe>o: Incio

Incio
Repita 10 vezes
Leia (Receba)
Repita 10 vezes
faa isso
Escreva Faa isto
Fim

Fim do
Repita

Fim
1.f Linguagem Algortmica
Portugol (Portugus Estruturado): Comandos e Instrues re>rados do Portugus.

Exemplos de Instrues:
Leia : Pra a execuo do algoritmo at que sejam fornecidos os dados especicados
na instruo. Os dados so guardados na lista de variveis.

Escreva: Envia dados especicados na forma de variveis para a unidade de sada


(Video/Impresso)

Ex:

Leia A
Escreva A

O Algoritmo acima recebe uma informao qualquer, representa esta informao


internamente pelo smbolo A (varivel) e Envia a mesma para a unidade de sada
(imprime no vdeo, por exemplo)
2. Linguagem para Algoritmos
A u>lizao do Portugol facilita a compreenso da construo de algoritmos
independente de qualquer linguagem de programao, no entanto , nada impede que
seja u>lizada uma linguagem de programao real para estudar lgica.

Voc no precisa aprender esperanto para depois aprender ingls ou francs. Voc
nem mesmo precisa falar bem portugus para aprender outra lngua ...

Aqui u>lizaremos uma linguagem simples sinta>camente para estudar lgica de


programao (Python)

V no site h|p://www.python.org/ faa o download do python para o OS


(Windows, Linux, Mac OS) que voc mais gosta, instale-o e vamos comear. A
instalao extremamente fcil e alguns Linux j o trazem instalado por default. Se
no conseguir, pea ajuda ;-).
2.a Variveis
Variveis so nomes que representam dados. Assemelham-se s variveis da lgebra.
Na pr>ca representam um endereo de memria e um >po de dado que est
guardado neste endereo.

Algumas linguagens so restri>vas com relao aos >pos de dados (Sistemas


fortemente >pados), outras no.

Os nomes de variveis devem comear com caracteres alfab>cos e podem ter


restries de tamanho.

Exemplos vlidos: A, a , _1, nome, x,y, xx, yy, _taxa, media

Exemplos invlidos: -1, 1nome, 234, *8, \9, /3, !3, ?2,
2.a Variveis - Atribuio
Uma operao de atribuio a associao de um valor (dado) a uma varivel. Usa-se
normalmente, no texto, o smbolo de igualdade para indicar a operao.

Ex: A = 2 , nome = Pedro, X = Y

Em Portugol costuma-se usar a seta esquerda para atribuio.

Ex. A 2 , nome Pedro, X Y

A Sintaxe (forma de uso) da atribuio pode ser:


<variavel> = <expresso>

Onde,

<expresso> pode ser um literal, outra varivel, expresso aritm+ca ou expresso


lgica

Obs: A varivel ca sempre no lado esquerdo e seguida imediatamente pelo


operador de atribuio.
2.a Variveis - literais
Um literal pode ser:

Um nmero inteiro : 0, 1, -987, 1024 , etc


Um nmero com ponto decimal (real ou oat) : -0.123, 5.67876, etc
Caracteres: A, B, c
Cadeias (seqencias) de caracteres: Maria da Penha, Joao do Pulo
Valores lgicos: True (Verdade), False (Falso)

OBS:
1. Em caracteres ou cadeias (Strings) usar sempre apstrofos ou aspas duplas
2.a Variveis Expresses aritm>cas
Uma expresso aritm>ca representa um clculo a ser realizado (frmula). Pode ser
composta de literais, variveis e operadores.

Ex.
Literais

2 + 3 + x * 3 4 / 2 + y
Operadores
Variveis
2.a Variveis Operadores Aritm>cos
Os principais operadores aritm>cos so:

+ Soma
- Subtrao
/ Diviso
* Mul>plicao

Os operadores mul>plicao e diviso tm prioridade em relao a soma e subtrao.


Pode-se usar parnteses para alterar a ordem (dentro do parntese tem prioridade).

Exerccio:
Qual o valor das expresses abaixo?

1 + 2 * 3
(1 + 2) * 3
6 / 3 - 1
6 / (3 1 )
2.a Variveis em Expresses
Qual o valor nal das variveis no algoritmo abaixo?

1. X = 2 + 3 * 4 / (2 + 2) 4
2. Y = X * X + 2
3. X = Y
4. Y = Y + 1

OBS:

1. Atribuio do >po Y = Y + 1 pode ser lida da seguinte forma: Considere o valor


atual de Y, some 1 e coloque o resultado na prpria varivel Y. Em lgebra poderia
ser representada da seguinte forma Yi+1 = Yi + 1 ou Y(T) = Y(T-1) + 1.
2. Quando dois operadores tem a mesma ordem de precedncia, a operao
executada da esquerda para a direita.
2.a Expresses Lgicas
Expresses cujo signicado (resultado do clculo) um valor de verdade: True
(Verdade) ou False (Falso). U>liza operadores lgicos e/ou relacionais

Literais Varivel

True and 3 > x


Operador Lgico Operador Relacional
2.a Operadores Lgicos
Os principais operadores lgicos so:

and -- e lgico. Conec>vo de conjuno lgica


or -- ou lgico. Conec>vo de disjuno
not -- negao inverso de valor lgico

Qual o valor nal das variveis abaixo?

X = True and False


Y = True or False
Z = True
W = not Z
2.a Tabelas de Verdade
A B A and B A or B Not A

True True True True False

True False False True False

False True False True True

False False False False True

True = Verdadeiro
False = Falso
2.a Operadores Relacionais
Os principais operadores relacionais so:

> - Maior do que


>= - Maior ou igual a
< - Menor do que
< = - Menor ou igual a
!= - Diferente de
== - Igual a
Qual o valor nal das variveis abaixo?

X = 2 == 3
Y = 2 < 3
Z = 2 > 3
W = 2 <= 3
K = 2 != 3
Q = K == W
2.a Hora de Pra>car
Ligar o Python, criar as variveis dos exemplos fornecidos. Mostrar seus valores. Usar o
Python como uma calculadora.
Aula 2 Seqncias e Desvios
2.b Entradas e Sadas
Normalmente em uma operao de entrada de dados, a execuo do algoritmo
(programa) interrompida at que determinadas informaes sejam fornecidas a
par>r de uma das unidades de entrada.

Em Portugol usa-se a instruo Leia para operaes de entrada.

A sintaxe seria : Leia < lista de variveis>

Ex. Leia a,b,c,..

Os dados so fornecidos na ordem com que as variveis esto colocadas na instruo


Leia

Em Python usa-se o comando input. Input uma funo que recupera dados e as
disponibiliza para uma varivel especicada.

Sintaxe:
<var> = input(Texto a ser apresentado)
2.b Entradas e Sadas
Ex:

Nome = input(Digite o nome do fucionario)


Valor=input(Digite o valor)

Experimente...
2.b Entradas e Saidas
Saidas de dados implica na impresso em vdeo, no envio de dados por portas de
comunicao, gravao em disco, etc.

No momento vamos permanecer u>lizando as saidas em vdeo. Mais tarde veremos as


outras formas.

Em portugol usa-se a instruo Escreva ou Imprima seguida da lista de variveis,


expresses ou literais a serem impressos.

Ex. Escreve Maria recebeu R$,salario, este mes

Resultado deste comando poderia ser : Maria recebeu R$ 500,00 este mes.

Em Python usa-se o print.

Sintaxe: print <expresso> # At a verso 2.5


print(<Expressao>) # A par>r da verso 3
2.c Algoritmos Simples
Calculando a mdias entre dois nmeros quaisquer.

Em portugol: Incio
Leia A,B
C (A+B)/2
Escreva C A,B

Em Python:
C=(A+B)/2
A = input(Digite um valor para A )
B = input(Digite um valor para B )
C = (A+B)/2
print C C

FIM
2.c Gravando os Fontes
Use o IDLE ou outro editor qualquer para gravar os fontes. (Nano por exemplo)
2.c Exerccios
Faa programas em Python para:

a) Calcular os trs primeiros ml>plos de um dado nmero


b) Calcular as razes de uma equao de segundo grau (Que tenha razes reais)
c) Calcular a rea de um crculo, retngulo, tringulo, etc
d) Calcular o valor lquido de um salrio dado, dadas tambm as alquotas dos
impostos sobre o valor bruto.
e) etc
2.c Funes Embu>das
Linguagens de programao costumam ter uma srie de funes embu>das para a
realizao de operaes matem>cas bsicas como clculos de seno, cosseno,
tangentes, logaritmos, raiz quadrada, potenciao, etc.

Python possui uma biblioteca de funes em um pacote chamado math. Para u>liz-lo
devemos usar a instruo import math e as seguintes funes estaro disponveis (entre
outras):

math.exp(x) Retorna o valor de ex


math.sqrt(x) Raiz quadrada de x
math.log10(x) Logaritmo base 10 de x
math.log(x) Logaritmo natural de x
math.pow(x,y) Valor de x elevado a y
math.sin(x), math.cos(x), math.tan(x) Seno, cosseno e tangente de x respec>vamente
math.pi Constante Pi = 3.141592...
math.e - Constante e = 2.718....

OBS: 1 Consultar a documentao ocial para a lista completa (h|p://docs.python.org)


2 O Python tambm trabalha com nmeros complexos. Ver exemplos no tutorial
2.c Mais Operadores
** - Operador de Exponenciao 2 ** 3 equivale a math.pow(2,3)
% - Operador resto da diviso. 4 % 2 tem como resultado zero.
2.d Desvios Condicionais
Desvio condicional a forma de permi>r a escolha de um entre ml>plos uxos de
execuo por parte da mquina.
O caso mais simples se d atravs do uso da instruo Se ou if(Ingls).

Sintaxe do se
Em portugol:

Se < condio>
ento
<instrues para o caso verdade>
seno
<instrues para o caso falso>
Fim-se
Em Python:
If <condio>:
<bloco de instrues para o caso verdade>
else:
<bloco de instrucoes para o caso falso>
2.d Desvios Aninhados
Faa algoritmos para:

Receber trs nmeros e selecionar o maior entre eles.


2.d Desvios Aninhados
Soluo:
Incio

A,B,C

Sim No
A>C A>B B>C

Sim No Sim No

A C B C

FIM
2.d Ml>plas Opes
Podemos u>lizar uma estrutura com ml>plos testes usando a estrutura se ... seno
se.
Em Portugol seria:

se <condio1>
ento
faa isto
senao se <condicao2>
faa isso
seno se <condio3>
faa aquilo outro
seno se <condicao4>
faa outra coisa
m-se
2.d Ml>plas Opes
Podemos u>lizar uma estrutura com ml>plos testes usando a estrutura se ... seno
se.
Em Python:

If <condio1>:
faa isto
elif <condicao2>:
faa isso
elif <condio3>:
faa aquilo outro
else:
faa quando todas as anteriores falharem
Aula 3 - Laos
Aula 3 - Laos

Blocos de comandos executados repe>damente .


2.e Laos Enquanto (While)
Um lao do >po enquanto faz com que um bloco de comandos seja executado
repe>damente enquanto uma determinada condio for verdadeira.

Em portugol:

Enquanto <Condio> faa


< bloco de comandos >
Fim-enquanto

Em Python:

While<condio>:
bloco de comandos
2.e Laos Enquanto (While)
Seja o programa abaixo para imprimir os nmeros de 0 a 1000:

X=0
While x<=1000:
print x
x = x +1

Seja o programa para imprimir os nmeros pares at um valor dado:

Limite = input(Digite um valor)


Contador = 0
While contador <=Limite:
print contador
contador = contador + 2
2.e Laos Enquanto (While)
Contador : Uma varivel que serve para contar sequencialmente os nmeros sendo
usada para teste de condio de permanncia no lao

Acumulador: Varivel que acumula os resultado de sucessivas operaes realizadas


u>lizando seu prprio valor

Ex. Seja o algoritmo para calcular a mdia de n nmeros fornecidos via teclado:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de nmeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico )
contador = contador + 1
acumulador = acumulador + numero
print A soma total dos nmeros fornecidos ,Acumulador

2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0 Passo 1 : Declara Contador


Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico )
contador = contador + 1
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Sada no Vdeo
Contador : 0
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0 Passo 2 : Declara Acumulador
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico )
contador = contador + 1
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 0
Acumulador: 0
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0 Passo 3:
Acumulador = 0 Solicita Valor
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico )
contador = contador + 1
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 0
Acumulador: 0 Digite a quan>dade de numeros a ser u>lizada
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0 Passo 3:
Acumulador = 0 Usurio digita valor
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico )
contador = contador + 1
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 0
Acumulador: 0 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade: Passo 4: Incio do lao
numero = input(Digite um valor numerico ) Condio verdadeira
contador = contador + 1 Contador (0) < quan>dade (3)
acumulador = acumulador + numero
print A soma total dos nmeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 0
Acumulador: 0 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico ) Passo 5: Solicita valor
contador = contador + 1 para numero
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 0
Acumulador: 0 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico ) Passo 5: Usurio
contador = contador + 1 Fornece Valor Numrico
acumulador = acumulador + numero (2)
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 0
Acumulador: 0 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 2
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico )
contador = contador + 1 Passo 6: contador incrementado
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 1
Acumulador: 0 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 2
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico )
contador = contador + 1 Passo 7: Acumulador
acumulador = acumulador + numero acrescido do valor de numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 1
Acumulador: 2 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 2
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade: Passo 8: Prxima Iterao do lao.
numero = input(Digite um valor numerico ) Condico ainda verdadeira
contador = contador + 1
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 1
Acumulador: 2 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 2
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico )
contador = contador + 1 Passo 9: Solicita valor para numero
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 1
Acumulador: 2 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 2 Digite um valor numerico
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico )
contador = contador + 1 Passo 9: Usurio digita valor (4)
acumulador = acumulador + numero
print A soma total dos nmeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 1
Acumulador: 2 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 4 Digite um valor numerico 4
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico )
contador = contador + 1 Passo 10: Contador incrementado
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 2
Acumulador: 2 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 4 Digite um valor numerico 4
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico ) Passo 11: Acumulador acrescido de
contador = contador + 1 numero
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 2
Acumulador: 6 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 4 Digite um valor numerico 4
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico ) Passo 12: Proxima Iterao
contador = contador + 1 Condio verdadeira
acumulador = acumulador + numero Contador (2) < quan>dade (3)
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 2
Acumulador: 6 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 4 Digite um valor numerico 4
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico ) Passo 13: Solicita dado
contador = contador + 1
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 2
Acumulador: 6 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 4 Digite um valor numerico 4
Digite um valor numerico
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico ) Passo 13: Usurio
contador = contador + 1 fornece dado
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 2
Acumulador: 6 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 6 Digite um valor numerico 4
Digite um valor numerico 6
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico )
contador = contador + 1 Passo 14: contador incrementado
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 3
Acumulador: 6 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 6 Digite um valor numerico 4
Digite um valor numerico 6
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico )
contador = contador + 1 Passo 15: Acumulador acrescido
acumulador = acumulador + numero de numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 3
Acumulador: 12 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 6 Digite um valor numerico 4
Digite um valor numerico 6
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade: Passo 16: Prxima Iterao
numero = input(Digite um valor numerico ) Condico falsa
contador = contador + 1 Contador (3) < quan>dade (3)
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 3
Acumulador: 12 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 6 Digite um valor numerico 4
Digite um valor numerico 6
2.e Laos Enquanto (While)
Vamos Execut-lo passo a passo:

Contador = 0
Acumulador = 0
Quan>dade = input(Digite a quan>dade de numeros a ser u>lizada)
while contador < quan>dade:
numero = input(Digite um valor numerico ) Passo 17: Saida de resultado no
contador = contador + 1 video
acumulador = acumulador + numero
print A soma total dos numeros fornecidos eh ,Acumulador

Variveis Sada no Vdeo


Contador : 3
Acumulador: 12 Digite a quan>dade de numeros a ser u>lizada 3
Quan>dade: 3 Digite um valor numerico 2
numero : 6 Digite um valor numerico 4
Digite um valor numerico 6
A soma total dos numeros fornecidos eh 12
2.e Laos Enquanto (While)
Resumo do algoritmo:

Entradas: 3,2,4,6

Sada: 12
2.e Laos Enquanto (While)
Alguns exerccios:

Modique o programa anterior para calcular a mdia aritm>ca dos nmeros


fornecidos
Faa um programa para vericar se um nmero primo
(N um valor qualquer)

Faa um programa para imprimir as seguintes sries:


a) 2,4,16, 256 ..............N
b) 0, 1,3,6,10,15 ......... N
c) 0,N,1,N-1,2,N-2........N,0
d) 1,1,2,3,5,8 ...............N

OBS: o item d a srie conhecida como srie de Fibonacci. Consulte a Wikipedia para
ver o histrico desta srie. A seguir veremos como implement-las.
2.e Nmeros primos
Lgica:

Dividir o nmero sucessivamente por 2,3,4 .... at sua metade (numero/2) e contar
quantas divises foram exatas. Caso nenhuma deu exata o nmero primo.

Soluo:

Programa11.py
2.e Gerando sries simples (1)
Lgica:

Fazer uma varivel mudar de valor gerando e imprimindo os nmeros da srie:


2,4,16, 256 ..............N

Detalhe: Os nmeros se sucedem pelo quadrado do anterior.

Soluo: Programa12.py
2.e Gerando sries simples (2)
Lgica:

Fazer uma varivel mudar de valor gerando e imprimindo os nmeros da srie:


0, 1,3,6,10,15 ......... N

Detalhe: Trata-se de uma PA com razo crescente.

Soluo: Programa13.py
2.e Gerando sries simples (3)
Lgica:

Fazer uma varivel mudar de valor gerando e imprimindo os nmeros da srie:


0,N,1,N-1,2,N-2........N,0

Detalhe: Uma srie com valores crescentes intercalados com valores decrescentes

Soluo: Programa14.py
2.e Gerando a srie de Fibonacci
Lgica:

Fazer uma varivel mudar de valor gerando e imprimindo os nmeros da srie:


1,1,2,3,5,.....N

Detalhe: Uma srie onde o prximo valor a soma dos dois anteriores

Soluo:
a) Programa15.py
b) Programa16.py
2.e Uma pequena pausa
Python possui um pacote chamado random que permite a gerao de nmeros
aleatrios. Uma forma de u>lizao bsica seria:
Import random
random.seed() # inicializa o gerador
random.randint(1,99) # gera um nmero aleatrio de 1 a 99

-----------------------------------------------------------------------------------------------------------------

Com o conhecimento acima desenvolva um jogo de adivinhao onde cada jogador


executa o jogo e ganha aquele que >ver feito menos tenta>vas em acertar o
nmero aleatrio gerado.

Soluo:
Programa17.py

No se iluda: Seu QI (Quociente de Inteligncia) inversamente proporcional ao


nmero de tenta>vas que voc faa.
2.e Um novo >po de varivel (Listas)
Uma lista uma seqncia de dados de um >po qualquer.

Exs.

A = [10, 12, 34, 45]


B = [Maria,Pedro,Paulo, Tiago]

Use o Python para criar e imprimir listas.

A varivel que representa a lista pode ser indexada para recuperar um elemento da
lista. O primeiro elemento possui ndice 0 e os seguintes variam com incremento
de 1
Ex.
A[0] 10, A[1] 12, A[2] 34, A[3] 45
B[0] Maria, etc.

print lista[X] : Escreve o elemento na posio X da lista lista


A[X]=<valor> : Atribui um valor posio X da lista A
B[Z]=B[W] Variveis indexadas podem ser usadas livremente em expresses
2.e Uma lista como um vetor
Um vetor uma grandeza normalmente representado pelos valores de suas
coordenadas no espao.

Um vetor no espao cartesiano pode ser representado pelas coordenadas (X,Y) ou (X


[1],X[2]) ou na notao do Python [X[0],X[1]]

Em um espao tridimensional o vetor seria [X[0],X[1],X[2]]

No espao n dimensional um vetor seria : [X[0],X[1], X[2] .....X[N-1]]

A diferena entre uma lista e um vetor em python tem a ver apenas com a forma como
voc olha para os dados.

Para criar a lista vazia:


X=[]
Ou preenchida
X= [<valores separados por virgulas>]
2.e Operaes com listas
append(x)
Adiciona um item ao m da lista; equivalente a a[len(a):] = [x].
extend(L)
Extende a lista adicionando no m todos os elementos da lista passada como
parmetro; equivalente a a[len(a):] = L.
insert(i, x)
Insere um item em uma posio especicada. O primeiro argumento o ndice do
elemento anterior ao que est para ser inserido, assim a.insert(0, x) insere no incio da
lista, e a.insert(len(a), x) equivalente a a.append(x).
remove(x)
Remove o primeiro item da lista cujo valor x. gerado um erro se este valor no
exis<r.
2.e Operaes com listas
pop([i ])
Remove o item na posio dada e o retorna. Se nenhum item for especicado, a.pop()
remove e retorna o l>mo item na lista. (Os colchetes ao redor de i indicam que o
parmetro opcional, no que voc deva digit-los naquela posio. Voc ver essa
notao com frequncia na Referncia da Biblioteca Python.)
index(x)
Retorna o ndice do primeiro item cujo valor igual ao argumento fornecido em x,
gerando erro se este valor no existe
count(x)
Retorna o nmero de vezes que o valor x aparece na lista.
sort()
Ordena os itens da lista sem gerar uma nova lista.
reverse()
Inverte a ordem dos elementos na lista sem gerar uma nova lista.

Um novo operador in (Pertence)


Sintaxe:
A in B
Retorna verdadeiro se A pertence a B
Aula 4 Introduo s Estruturas de Dados
2.e Matrizes
Matrizes so conjuntos de dados normalmente representados na forma de tabelas:

Ex.
3 2 3
4 5 6

Maria Pedro
Joana Paulo

A posio dos elementos iden>cada pelo numero da linha e da coluna em que se


localiza o elemento.
Uma matriz pode ser vista como uma lista composta. Onde cada linha ou cada coluna
seria uma sublista.
Declarar uma matriz em Python fcil:

A=[[3,2,3],[4,5,6]]
Ou
B=[[Maria,Pedro],[Joana,Paulo]]
2.e Matrizes de Matrizes?
Sem problemas:

Veja

X[0] = 1 2
3 4

X[1] = Pedro Paulo


Maria Joana

X=[[[1,2],[3,4]],[[Pedro,Paulo],[Maria,Joana]]]

Quem X[0][1][0] ?
2.e Exerccios com listas
Receba um vetor elemento por elemento do teclado e coloque em uma lista.
Selecione o maior e o menor elemento de um vetor
Calcule a mdia aritm>ca dos elementos de um vetor
Receba um vetor e inverta a ordem dos elementos (Sem usar a funo reverse)
Encontre a posio de um elemento em uma lista (Pesquisa Linear)
Selecione os elementos pares de um vetor
Selecione os elementos pares de um vetor e copie para o segundo vetor.
Crie um vetor com valores intercalados de dois outros vetores
2.e Exerccios com listas
Receba um vetor elemento por elemento do teclado e coloque em uma lista.

Dica: Os elementos so adicionados atravs da funo append()

Soluo: programa18.py
2.e Exerccios com listas
Selecione o maior e o menor elemento de um vetor

Dica: Usar duas variveis. Uma para guardar o maior valor e outra pra guardar o
menor. Inicialmente o primeiro elemento do vetor atribudo s mesmas. Em
seguida compara-se todos os elementos do vetor com estas variveis. Se o
elemento do vetor for menor que a varivel menor trocamos o valor de menor. A
mesma coisa para a varivel maior.

Soluo: programa19.py
2.e Exerccios com listas
Calcule a mdia aritm>ca dos elementos de um vetor

Dica: Somar todos os elementos do vetor atravs de um acumulador e em seguida


dividir pelo nmero de elementos do vetor.

Soluo: programa20.py
2.e Exerccios com listas
Receba um vetor e inverta a ordem dos elementos (Sem usar a funo reverse)

Dica: podemos inverter o vetor e depois imprimir ou simplesmente imprimir na


ordem inversa. Para isso usar uma varivel contadora decrescente.

Soluo: programa21.py
2.e Exerccios com listas
Encontre a posio de um elemento em uma lista (Pesquisa Linear)

Dica: Comparar todos os elementos do vetor usando um lao e guardar a posio em


que o elemento procurado foi encontrado

Soluo: programa22.py
2.e Exerccios com listas
Selecione os elementos pares de um vetor

Use um lao para acessar todos os elementos do vetor. Imprimir todos os que forem
pares

Soluo: programa23.py
2.e Exerccios com listas
Selecione os elementos pares de um vetor e copie para o segundo vetor.

Dica: Idn>co ao anterior. Apenas com o detalhe de adicionar o elemento par


encontrado a um outro vetor

Soluo: programa24.py
2.e Exerccios com listas
Crie um vetor com valores intercalados de dois outros vetores

Usar varveis ndices. Uma para cada vetor. Crie um lao para criar o terceiro
vetor e use os ndices de cada vetor para pegar os elementos deles e adicionar ao
terceiro

Soluo: programa25.py
2.e Composio de Laos
que acontece quando colocamos uma lao dentro de outro (Aninhados)?

Experimente:

# programa26
x = 0
while x < 10:
y=0
while y < 10 :
print x = ,x , y = ,y
y = y + 1
x = x + 1
# m do programa

Qual a sada?
Quantas vezes ele executou o comando print?
2.e Composio de Laos
Exerccios:

Faa um programa para imprimir a tabuada de mul>plicar

Soluo: Programa27.py

Simule um odmetro digital no vdeo com (por exemplo) segundos, minutos e horas

Soluo: programa28.py
2.e Gerando Sries com range()
Sintaxe:

range(inicio,m,passo)

Experimente.
2.e Lao for
Sintaxe:
Inicio
Em portugol:

para i = 1,n
<comandos> Enquanto/
m-para Para

Em Python:

For <var> in <lista> Calcule


<comandos>

Experimente.
for i in [0,1]: Fim
print i
2.e break, con>nue, else
O break, como no C, quebra o lao mais interno de um for ou while.
O con>nue, tambm emprestado do C, con>nua o prximo passo do lao mais
interno.
Laos podem ter uma clusula else, que executada sempre que o lao se encerra
por exausto da lista (no caso do for) ou quando a condio se torna falsa (no caso
do while), mas nunca quando o lao encerrado por um break. Isto exemplicado
no prximo exemplo que procura nmeros primos:

Ver programa29.py
2.e Pausa Concatenao
possvel somar valores alfanumricos:

a + b

nome = Paulo
sobrenome = Pedreira
Espaco =

str = nome + espaco + sobrenome

str = ?
2.f Funes denidas pelo usurio
Em portugol:

Denio:
Funo nome(lista de argumentos)
<comandos>
retorne <valor>

Fim-funcao

Chamada:
x = nome(valores)

Em Python

def nome(args):
<comandos>
[return <valor>] # opcional
2.f Funes denidas pelo usurio
Exemplo 1. Funo fatorial

fat(n) = 1 se n = 0
fat(n) = n* fat(n-1) para n > 0

Soluo

Programa30.py

Obs: Leia o tutorial ocial do python para ver as possveis formas de criao de funes
2.f Funes denidas pelo usurio
Faa alguns exerccios:

1. Dena uma funo que gere a srie de Fibonacci at determinado valor n


passado como argumento
2. Crie uma funo para fatorar um nmero inteiro
3. Crie funes para achar o mdc, mmc , etc de um nmero.
Detalhe : vc pode criar o seu prprio pacote de funes para uso posterior.
Fim da Aula 4
Aula 5 - Recurso
Funo Recursiva
Uma funo recursiva aquela que chama a si prpria:

def funcao_recursiva(arg):
#
# faz qualquer coisa
funcao_recursiva(arg2) # chama a si prpria

Algumas funes so, por denio, recursivas. Um exemplo a funo fatorial.

A funo fatorial denida como:

fat(o) 1
fat(n) n * fat (n-1)

Desta forma ela se torna mais fcil de implementar que a verso itera>va que
zemos. Programa31.py
1. O programa chama fat passando 3 como argumento fat(3)
1.1 Criada a instncia 1 da funo fat
1.2 A fat1 testa o valor de n < 0 (falso)
1.3 A fat1 testa se o valor de n == 0 (falso)
1.4 A fat1 mul>plica n pelo resultado de chamar fat(2)
1.4.1 Criada a instncia 2 da funo fat com n = 2
1.4.2 a fat2 testa se n < 0 (falso)
1.4.3 a fat2 testa se n == 0 (falso)
1.4.4 a fat2 pega seu n (2) e mul>plica por fat(1)
1.4.4.1 Criada a instncia 3 de fat
1.4.4.2 a fat3 testa se n(1) < 0 (falso)
1.4.4.3 a fat3 testa se n == 0 (falso)
1.4.4.4 a fat3 pega seu n (1) e mul>plica por fat( 0)
1.4.4.4.1 criada a instncia 4 de fat com n =0
1.4.4.4.2 a fat4 testa se n (0) menor que 0 (falso)
1.4.4.4.3 a fat4 testa se n == 0 (verdade) e retorna 1 (FIM)
1.4.4.5 a fat3 recebe o retorno da fat4 (1) e mul>plica por n (1)
1.4.4.6 a fat3 retorna 1 (FIM)
1.4.5 a fat2 recebe o retorno de fat3 (1) e mul>plica por n (2)
1.4.6 a fat2 retorna 2 (FIM)
1.5 A fat1 recebe o retorno de fat2 (2) e mul>plica por n (3) e retorna 6 (FIM)
2. O programa principal recebe o retorno de fat1 (6) e imprime
3. Fim
Funo Recursiva
Cuidado : preciso que a chamada recursiva evite de se tornar um lao innito.

Para isso a funo tem que conter casos base ou casos de parada.

No caso da funo fatorial o zero, ou seja, uma chamada a fat(0) retorna


imediatamente o valor 1 sem que se chame novamente a funo.

Exemplo2: Funo de Fibonacci.

Esta uma funo que j implementamos na forma itera>va cuja denio


recursiva. Ou seja:

b(1) 0 # casos bases


b(2) 1
b(n) b(n-1) + b(n-2)

Ver programa32.py
1. OBS: O programa16.py traz a verso itera>va. Quem roda mais rpido para 30
elementos por exemplo?
Pesquisa Binria
Exemplo 3 Pesquisa Binria um algoritmo conhecido usado para pesquisar um
valor em uma lista ordenada. Funciona da seguinte forma:

Seja uma lista ordenada lista. Chamemos de min e max os ndices mnimo e
mximo da lista onde a busca ser feita. Inicialmente, min = 0 e max = len(lista)-1

Para o caso base: min == max


Ento, ou o valor igual a lista [min] ou no est na lista
Para outros casos
Dividir o intervalo de busca em dois
Seja meio = (min+max)/2
Se o valor maior que lista [meio] ,
ento ele se encontra em
algum dos ndices entre meio+1 e max
Caso contrrio,
deve se encontrar em algum dos ndices min e meio.

Ver programa33.py
Pesquisa Binria Passo a Passo
Seja a Lista: [1,2,3,4,5,79,99,101]

Seja o valor de busca: 79

Passo 1 - Ao chamar a funo de pesquisa passe os valores min = 0 max = 7


Passo 2 - Como min ! = max calcula-se meio = 7/2 = 3
Passo 3 Verica se valor (79) > lista[meio] (4) . Como verdadeiro chama-se
recursivamente a funo passando (4,7)
Passo 4 Ao ser chamada a funo de pesquisa com min = 4 e max = 7 repete-se a
operao. Como min != max , calcula-se meio = 11/2 = 5 e valor no maior que
lista[5] (79) chama-se a funo passando (4,5).
Passo 5 - Repete-se tudo e chama-se a funo passando (5,5)
Passo 6 Ao ser chamada novamente verica que max = min = 5 retorna o 5 para
a funo principal.
Passo 7 Na funo principal verica-se se o valor (79) igual a lista[5] (79).
Sendo verdadeiro o algoritmo obteve sucesso e o valor procurado est na posio
5.
Pesquisa Binria Exerccio
Refaa o programa do Jogo (programa17.py). Desta vez verique com quantas
tenta>vas o computador acharia o nmero usando pesquisa binria e depois
compare com o nmero de tenta>vas que o jogador faz.

Se o jogador sempre acerta o mesmo nmero de vezes que o computador, ele est
cando esperto ;-)
Mais sobre listas ....
Seja uma lista A = [2,1,3,4,10,6,7,8,9]

A[:5] se refere aos elementos [2,1,3,4,10]

A[1:3] se refere aos elementos [1,3]

A[:4] se refere aos elementos [2,1,3,4]

B=[1,2]

C = [3,4]

D= B+C ([1,2,3,4])

isso a ...
Anlise combinatria(1)
Dadas duas variveis: A e B

Como permuto os valores de A e B.

Soluo C = A
A = B
B = C

Dadas duas listas A e B, A = [a1,a2,...an] e B = [b1,b2,...bn]. Onde len(A) = Len(B)

Como fao pra vericar se A pode ser ob>da por uma permutao dos elementos de
B?

Soluo: programa34.py
Anlise combinatria(2)
Dadas uma lista A = [a1,a2,a3,...,an]

Como fao para achar todas as permutaes de A???

Caso 1, se eu soubesse o tamanho de A : Programa35.py

Caso 2, como nem sempre se sabe o tamanho de A : Programa36.py


Anlise combinatria(3)
Estudando o programa 36.py

Passo 1: Digite a lista Entrada: [1,2] x = [1,2]


Passo 2: Saida Permutacoes([1,2]) # Chama a funo permutao (instncia 1)
Passo 15: Recebe o valor de permutacoes([1,2]) e subs>tui no print
print [[1,2],[2,1]]
Passo 16: imprime o resultado nal
Fim do programa
Anlise combinatria(3)
Funo permutao : Instncia 1
Passo 3: Recebe Lista = [1,2]
Passo 4: Testa len(lista) == 1 (falso)
Passo 5: primeiro = lista[0] = 1 ; resto = lista[1:] = [2]; resultado = []
Passo 6: Cria um iterador
For perm in permutacoes(resto) => chama a funcao permutacoes([2]) ( Instancia 2)
Passo 10: Recebe a lista [2] e subs>tui na expresso acima tendo como resultado
for perm in [2]
Passo 11: perm = [2]
Passo 12: cria lao for i in range(2) e entra no lao com i = 0
Passo 13: Adiciona ao resultado [perm[:0] + [primeiro] + perm[0:]] ou seja
resultado = [[]+[1]+[2]] = [[1,2]]
Passo 14 : Con>nua no lao com i = 1 e adiciona ao resultado
resultado = [[1,2]] + [perm[:1] + [primeiro]+ perm[1:]] = [[1,2]]+ [[2]+[1]+[]]
resultado = [[1,2],[2,1]]
Passo14: sai do lao e retorna resultado
Fechou a instncia 1
Anlise combinatria(3)
Funo permutao : Instncia 2
Passo 7:
Lista = [2]
Passo 8:
testa len(lista) == 1 (verdade)
Passo 9:
Retorna [2] para a instancia 1
Fechou a instncia 2
Fim da Aula 5

PAUSA .....................
Aula 6 Recurso 2 ( A Misso)
Anlise combinatria(4)
Refazendo o programa 36:

Passo1: input: recebe uma lista e a>bui a x. Ex x = [1,2,3]


Passo2: print: chama a funcao permutacoes([1,2,3]) para imprimir o resultado
(instncia 1 de permutacoes)
Passo25: recebe resultado e imprime [[1,2,3],[2,1,3],[2,3,1],[1,3,2],[3,1,2],[3,2,1]]


Anlise combinatria(4)
Instncia 1 de permutacoes
Passo3: recebe uma lista = x = [1,2,3]
Passo4: if: testa se o comprimento da lista um (falso)
Passo5: primeiro = lista[0] = 1; resto = lista[1:] = [2,3]; resultado = []
Passo6: for perm in permutacoes([2,3]) Chamada a permutacoes (instancia 2)
Passo 19: recebe a lista de permutacoes([2,3]) e subs>tui cando o lao:
for perm in ([[2,3],[3,2]]):
Passo20 para perm = [2,3] cria o lao i in range(len(perm) 2 + 1 = 3)
Passo21 para i = 0: calcula o resultado + = [perm[:0] + [primeiro] + [0:]]
= [[]+[1]+[2,3]] =[[1,2,3]]
Passo22 para i = 1 : calcula o resultado += [perm[:1] + [primeiro] + [1:]] =
[[1,2,3]] + [[2]+[1]+[3]] = [[1,2,3],[2,1,3]]
Passo23 para i = 2 calcula o resultado += [perm[:2] + [primeiro] + [2:]] =
[[1,2,3],[2,1,3]] + [[2,3]+[1]+[]] = [[1,2,3],[2,1,3],[2,3,1]]
Passo24: repete os passos 20 a 23 para perm = [3,2] gerando [1,3,2],[3,1,2],[3,2,1]
O Resultado ser portanto [[1,2,3],[2,1,3],[2,3,1],[1,3,2],[3,1,2],[3,2,1]]
Fechada a instncia 1
Anlise combinatria(4)
Instncia 2 de permutacoes
Passo7: recebe uma lista = x = [2,3]
Passo8: if: testa se o comprimento da lista um (falso)
Passo9: primeiro = lista[0] = 2; resto = lista[1:] = [3]; resultado = []
Passo10: for perm in permutacoes([3]) Chamada a permutacoes (instancia 3)
Passo14: recebe valor [[3]] e subs>tui na lista perm in [[3]]
Passo15: faz perm=[3] e cria lao i in range(len(perm) 1 + 1 = 2)
Passo16 : para i = 0 calcula o resultado += [perm[:0] +[primeiro]+perm[0:]]
resultado = [[]+[2]+[3]] = [[2,3]]
Passo17: para i = 1 calcula o resultado +=[perm[:1]+[primeiro]+perm[1:]]
resultado = [[2,3]] + [[3]+[2]+[]] = [[2,3],[3,2]]
Passo18: return: retorna o resultado [[2,3],[3,2]] para o principal
Fechou instncia 2
Anlise combinatria(4)
Instncia 3 de permutacoes
Passo11: recebe uma lista = x = [3]
Passo12: if: testa se o comprimento da lista um (verdade)
Passo13: return: retorna o valor [[3]] para a instncia 2
Fechada.


Anlise combinatria(4) - Moral
Dada a lista 1,2,3
Re>ra o primeiro elemento (1)
Gera as possveis permutaes dos restantes
Ex 2,3 e 3,2
Insere o primeiro em cada uma das posies do vetor em construo para cada
permutao:
Permutao A: 2,3
Pos. 0 : 1 2 3
Pos. 1 : 2 1 3
Pos. 2 : 2 3 1
Permutao B: 3,2
Pos. 0 : 1 3 2
Pos. 1 : 3 1 2
Pos. 2 : 3 1 1
Pergunta : como ele achou as permutaes do resto??? (2,3) e (3,2). Ora
simplesmente chamando a funo recursivamente passando o resto (2,3) que faz a
mesma coisa e retorna a lista e assim por diante ....
Anlise combinatria(5)
E itera>vamente? possvel???
Seja a lista: A = [1,2,3] o nmero de permutaes n! No caso 3! = 6
Observe a matriz de permutaes:
L0: 123 ou A[0] A[1] A[2]
L1: 132 A[0] A[2] A[1]
L2: 213 A[1] A[0] A[2]
L3: 232 A[1] A[2] A[0]
L4: 312 A[2] A[0] A[1]
L5: 321 A[2] A[1] A[0]

Para L=0 Pos = L div (n-1)! = 0 div 2! = 0 (diviso inteira)


Para L=1 Pos = 1 div 2! = 0
Para L=2 Pos = 2 div 2! = 1
Para L=3 Pos = 3 div 2! = 1
Para L=4 Pos = 4 div 2! = 2
Para L=5 Pos = 5 div 2! = 2.
Graas a diviso inteira e a escolha certa dos parmetro de calculo temos uma
funo que nos d o ndice do elemento em funo da linha. E para resto ...?
Anlise combinatria(5)
Para uma linha qualquer ex L=4
O Calculo da Pos 0 4 div 2! = 2
Ou seja L4: 3 1 2 ou A[2] A[1] A[0]

Seja a lista A = [1][ 2] (re>ramos o elemento da posio j calculada)


Podemos repe>r as operaes com n = 2 (novo tamanho). Observe que em uma
lista de tamanho 2 no poderia haver uma linha maior que 2! ento temos que
connar o ndice(L) da linha a um valor entre 0 e 2!. Fazemos isso >rando o resto da
diviso entre L e 2! ou seja entre L e n!

Aplicamos as mesmas formas usando L n(novos valores L e n)


Observe que o mesmo mtodo anterior se aplica. Para a primeira posio
L(L % n! <-> 4 % 2! = 0): Pos = L div n! = 0/1! = 0 : A[0] = 1

Agora s repe>r a operao com a lista que sobrou.

OBS: Para a linha 5 L(5 % 2! <-> 1): Pos = 1/1! = 1 : A[1] =0


Anlise combinatria(5)
Organizando o algoritmo

Receba a lista A de tamanho n


Crie um lao com varivel i na faixa(0 , fatorial(n))
faca L = i
faca uma copia da lista (A2 = A)
crie uma lista vazia temp = []
crie lao usando j na faixa(comprimento(A),0,-1) # de trs pra frente
calcule o denominador d = fatorial(j-1)
calcule a posio p = L / d (diviso inteira)
recalcule o L para a prxima coluna L = L % d
adicione A2[p] a temp -> temp.append(A2[p])
apague o elemento na posio p de A[2]
imprima o temp ou adicione a uma lista de resultados

Programa37.py
Anlise combinatria(5)
At agora s zemos permutaes. E as combinaes, arranjos, etc ???

Digamos uma lista de n elementos = [a1,a2,...an]

Os arranjos, ou seja, quantas e quais possveis formas de ordenamento eu terei


re>rando sempre um nmero xo m de elementos m < n?

Combinaes, ou seja, quantos grupos dis>ntos eu posso gerar a par>r de um


subconjunto da lista acima?

E se eu zer arranjos ou combinaes com repe>es? (A,A)(B,B) ... etc

Desaos para vc.....


Filas
Voc pode tambm u>lizar uma lista como uma la, onde o primeiro item
adicionado o primeiro a ser recuperado (pol>ca primeiro a entrar, primeiro a
sair (FIFO) ). Para adicionar um elemento ao m da la u>liza append(). Para
recuperar um elemento do incio da la use pop() com 0 no ndice.

Por exemplo:

>>>queue = ["Eric", "John", "Michael"]


>>>queue.append("Terry") # Terry arrives
>>>queue.append("Graham") # Graham arrives
>>>queue.pop(0)
Eric
>>> queue.pop(0)
John
>>> queue
[Michael, Terry, Graham]

Exerccio : Uma boa parte das linguagens no possui comandos para manipulao de listas.
Crie sua prpria implementao das funes append e pop.
Pilhas
Os mtodos de lista tornam muito fcil u>lizar listas como pilhas, onde o item
adicionado por l>mo o primeiro a ser recuperado (pol>ca l>mo a entrar,
primeiro a sair (LIFO) ) . Para adicionar um item ao topo da pilha, use append()
[push]. Para recuperar um item do topo da pilha use pop() sem nenhum ndice.

>>> stack = [3, 4, 5]


>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6

Exerccio: Implemente sua prpria verso de push e pop


Pense recursivamente! Torres de Hani.

Algoritmo:
1. Criar funo torre de Hani recebendo como argumentos numero de anis (n), uma
pilha preenchida representando a haste 1 origem e duas pilhas vazias (temp e
des@no ) representando as hastes 2 e 3
1.1 Dentro da funo vericar se o num de anis = 1 . Se for re>rar o anel (pop) da
pilha origem e colocar na des>no (push/append) e retorna.
1.2 Seno chamar a funo Hani (chamada recursiva) para colocar todos os
elementos at o n-1 na pilha temp na ordem correta e seguindo as regras.
1.3 colocar o n-esimo elemento na posio certa em des@no.
1.4 chamar a funo Hani (recursiva) para transferir os n-1 elementos que esto na
temp para a posio correta no des@no
Fim da Aula 6
Aula 7 - Ordenamento
Ordenamento
Seja uma lista A = [a1,a2,...,an] no ordenada.

Qual o procedimento para orden-la? Ou seja criar uma lista A= [a1,a2,...an] a


par>r de A onde ai+1 > ai para todo i em R?

Tente antes de prosseguirmos.

Veremos aqui 4 (+2) mtodos:

1. Seleo,
2. Insero,
3. Borbulhamento
4. Classicao Rpida (Quicksort)
5. Mergesort
6. Shellsort

E voc pesquisa outros .....


Ordenamento(1) - Seleo
Idia: Pesquisar na lista o menor elemento e trazer para a primeira posio. Repe>r
para a segunda, terceira, etc at chegar ao m da lista tendo a mesma ordenada.

Passo 1 : Dada a lista seleciona o menor nmero: Resultado = 1 na Posio 2

A = [ 7 , 3 , 1, 4, 5]

Posio a ser calculada Posio do menor elemento da lista


Ordenamento(1) - Seleo
Idia: Pesquisar na lista o menor elemento e trazer para a primeira posio. Repe>r
para a segunda, terceira, etc at chegar ao m da lista tendo a mesma ordenada.

Passo 2 : Troca os elementos das posies (0) e (2)

A = [ 1 , 3 , 7, 4, 5]

Posio a ser calculada Posio do menor elemento da lista


Ordenamento(1) - Seleo
Idia: Pesquisar na lista o menor elemento e trazer para a primeira posio. Repe>r
para a segunda, terceira, etc at chegar ao m da lista tendo a mesma ordenada.

Passo 3 : Atualizamos a posio a ser calculada e selecionamos o menor valor da lista


remanescente na posio 1 (3)
Posio do menor elemento da lista
remanescente

A = [ 1 , 3 , 7, 4, 5]

Posio a ser calculada


Ordenamento(1) - Seleo
Idia: Pesquisar na lista o menor elemento e trazer para a primeira posio. Repe>r
para a segunda, terceira, etc at chegar ao m da lista tendo a mesma ordenada.

Passo 4 : Mantemos o valor do elemento pois j est na posio correta!


Posio do menor elemento da lista
remanescente

A = [ 1 , 3 , 7, 4, 5]

Posio a ser calculada


Ordenamento(1) - Seleo
Idia: Pesquisar na lista o menor elemento e trazer para a primeira posio. Repe>r
para a segunda, terceira, etc at chegar ao m da lista tendo a mesma ordenada.

Passo 5 : Atualizamos a posio a ser calculada e selecionamos o menor valor da lista


remanescente. Encontrado na posio 3 (4)

Posio do menor elemento da lista


remanescente

A = [ 1 , 3 , 7, 4, 5]

Posio a ser calculada


Ordenamento(1) - Seleo
Idia: Pesquisar na lista o menor elemento e trazer para a primeira posio. Repe>r
para a segunda, terceira, etc at chegar ao m da lista tendo a mesma ordenada.

Passo 6 :Intercambiamos os valores da posio atual com a posio do menor


remanescente

Posio do menor elemento da lista


remanescente

A = [ 1 , 3 , 4, 7, 5]

Posio a ser calculada


Ordenamento(1) - Seleo
Idia: Pesquisar na lista o menor elemento e trazer para a primeira posio. Repe>r
para a segunda, terceira, etc at chegar ao m da lista tendo a mesma ordenada.

Passo 7 : Atualizamos a posio ser calculada e selecionamos o menor valor


remanescente

Posio do menor elemento da lista


remanescente

A = [ 1 , 3 , 4, 7, 5]

Posio a ser calculada


Ordenamento(1) - Seleo
Idia: Pesquisar na lista o menor elemento e trazer para a primeira posio. Repe>r
para a segunda, terceira, etc at chegar ao m da lista tendo a mesma ordenada.

Passo 8 : Intercambiamos os valores encontrados

Posio do menor elemento da lista


remanescente

A = [ 1 , 3 , 4, 5, 7]

Posio a ser calculada


Ordenamento(1) - Seleo
Idia: Pesquisar na lista o menor elemento e trazer para a primeira posio. Repe>r
para a segunda, terceira, etc at chegar ao m da lista tendo a mesma ordenada.

Passo 9 : Operao nalizada. A Lista est ordenada

Posio do menor elemento da lista


remanescente

A = [ 1 , 3 , 4, 5, 7]

Ver: Programa39.py
Posio a ser calculada
Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 1 : Posiciona a posio a ser calculada (chave) e verica se o primeiro elemento


est em ordem com relao ao mesmo. No caso falso (7>3)

Elemento a vericar se est na


ordem correta

A = [ 7, 3 , 1, 4, 5]

Posio a ser
calculada (chave)
Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 2 : Insere (copia) elemento zero (7) na posio da chave

Elemento a vericar se est na


ordem correta

A = [ 7, 7 , 1, 4, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 3 : Insere (copia) o valor da chave na posio 0

Elemento a vericar se est na


ordem correta

A = [ 3, 7 , 1, 4, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 4 : Atualiza a posio da chave Guarda chave = 1 e verica se o elemento a


esquerda menor (falso) (7>1)

Elemento a vericar se est na


ordem correta

A = [ 3, 7 , 1, 4, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 5 : Desloca (copia) o valor anterior uma posio frente

Elemento a vericar se est na


ordem correta

A = [ 3, 7, 7, 4, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 6 : Verica se o elemento mais a esquerda menor que chave (1) (falso)

Elemento a vericar se est na


ordem correta

A = [ 3, 7, 7, 4, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 7 : Desloca (copia o elemento para frente)

Elemento a vericar se est na


ordem correta

A = [ 3, 3, 7, 4, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 8 : Copia o valor da chave para o incio

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 7, 4, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 9 : Atualiza chave (chave = 4)

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 7, 4, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 10 : Verica se o elemento a esquerda maior que chave (verdade)

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 7, 4, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 11 : Desloca (copia) elemento analisado para a direita

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 7, 7, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 12 : Verica se elemento mais a esquerda maior que chave (FALSO)

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 7, 7, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 13: Insere (copia) chave na posio direita do valor analisado

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 7, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 14: Atualiza a posio da chave (chave = 5)

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 7, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 15: Verica se o elemento a esquerda maior que chave. (verdade)

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 7, 5]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 16: Desloca (copia) o elemento analisado para a direita

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 7, 7]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 17: Desloca (copia) o elemento analisado para a direita

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 7, 7]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 18: Verica se o elemento mais a esquerda maior que chave (falso)

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 7, 7]

Posio a ser calculada


Ordenamento(2) - Insero
Idia: Atravessar a lista da esquerda para a direita mantendo o lado esquerdo
ordenado.

Passo 19: Insere a chave direita da posio em anlise e m do trabalho.

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 5, 7]

Programa40.py
Posio a ser calculada
Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 1: Comparar os dois primeiros elementos

Elemento a vericar se est na


ordem correta

A = [ 7, 3, 1, 4, 5]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 2: Como esto fora de ordem permut-los

Elemento a vericar se est na


ordem correta

A = [ 3, 7, 1, 4, 5]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 3: Comparar os dois prximos

Elemento a vericar se est na


ordem correta

A = [ 3, 7, 1, 4, 5]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 4: Permut-los (Esto fora de ordem)

Elemento a vericar se est na


ordem correta

A = [ 3, 1, 7, 4, 5]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 5: Comparar os dois prximos

Elemento a vericar se est na


ordem correta

A = [ 3, 1, 7, 4, 5]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 6: Permut-los

Elemento a vericar se est na


ordem correta

A = [ 3, 1, 4, 7, 5]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 7 : Comparar os dois prximos

Elemento a vericar se est na


ordem correta

A = [ 3, 1, 4, 7, 5]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 8 : Permut-los

Elemento a vericar se est na


ordem correta

A = [ 3, 1, 4, 5, 7]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 9 : Como foram feitas vrias permutaes nessa passagem, reiniciar comparando
os dois primeiros elementos.

Elemento a vericar se est na


ordem correta

A = [ 3, 1, 4, 5, 7]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 10 : Permutar

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 5, 7]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 11 : Comparar dois prximos

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 5, 7]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 12 : Comparar dois prximos

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 5, 7]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 13 : Comparar dois prximos

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 5, 7]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 14 : Como foi feita uma permutao, reiniciar comparando os dois primeiros (Nova
passada)

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 5, 7]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 15 : Comparar os dois prximos

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 5, 7]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 16 : Comparar os dois prximos

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 5, 7]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 17 : Comparar os dois prximos

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 5, 7]

Posio a ser calculada


Ordenamento(3) - Borbulhamento
Idia: Comparar os elementos dois a dois. Se es>verem fora de ordem, orden-los.
Repe>r at que no haja mais elementos a permutar.

Passo 18 : Como nenhuma permutao foi feita, encerrar.

Elemento a vericar se est na


ordem correta

A = [ 1, 3, 4, 5, 7]

Posio a ser calculada


Programa41.py
Ordenamento(4) - Quicksort
Idia:Dividir a lista ao meio passar todos os elementos menores que o meio para a
esquerda e todos os maiores para a direita. Chamar a funo recursivamente para a
lista direita, depois para a esquerda e em seguida concatenar as duas. O caso
bsico= lista vazia.

Passo 1 : Calcular a posio do meio para n = 5 meio = 2 Elemento = 4

A = [ 7, 4, 3, 1, 5]
Ordenamento(4) - Quicksort
Idia:Dividir a lista ao meio passar todos os elementos menores que o meio para a
esquerda e todos os maiores para a direita. Chamar a funo recursivamente para a
lista direita, depois para a esquerda e em seguida concatenar as duas. O caso
bsico= lista vazia.

Passo 2 : Criar lista Esquerda L e Direita R

A = [ 7, 4, 3, 1, 5]

L = [] R = [ ]
Ordenamento(4) - Quicksort
Idia:Dividir a lista ao meio passar todos os elementos menores que o meio para a
esquerda e todos os maiores para a direita. Chamar a funo recursivamente para a
lista direita, depois para a esquerda e em seguida concatenar as duas. O caso
bsico= lista vazia.

Passo 3 : Preencher a lista Esquerda com valores menores que 4 re>rados de A

A = [ 7, 4, 3, 1, 5]

L = [3,1] R = [ ]
Ordenamento(4) - Quicksort
Idia:Dividir a lista ao meio passar todos os elementos menores que o meio para a
esquerda e todos os maiores para a direita. Chamar a funo recursivamente para a
lista direita, depois para a esquerda e em seguida concatenar as duas. O caso
bsico= lista vazia.

Passo 4 : Preencher a lista Direita com valores maiores que 4 re>rados de A

A = [ 7, 4, 3, 1, 5]

L = [3,1] R = [7,5]
Ordenamento(4) - Quicksort
Idia:Dividir a lista ao meio passar todos os elementos menores que o meio para a
esquerda e todos os maiores para a direita. Chamar a funo recursivamente para a
lista direita, depois para a esquerda e em seguida concatenar as duas. O caso
bsico= lista vazia.

Passo 5 : A soluo L+ [4] + R

A = L + [4] + R = [ 1, 3, 4, 5, 7]

Viu como a recurso simplica as coisas?? Programa42.py


Ordenamento(4) - Quicksort

Data source: rst N words of Charles Dicken's life work.


Machine: Dell 2.2GHz PC with 1GB memory
Ordenamento(5) - Mergesort
Idia:Semelhante ao quicksort com a diferena que no faz o par>cionamento, ou
seja, apenas divide a lista ao meio, ordena com mergesort (recursiva) as duas
sublistas geradas e intercala os resultados gerados para compor a soluo nal.

A sua vez de implementar ....

L = [7, 4] R = [3,1,5]
L = [4, 7] R = [1,3,5]

A = L (intercalao ordenada) R = [1 (R) , 3(R) , 4(L), 5(R), 7(L) ]


Ordenamento(6) - Shellsort
Idia: Dada uma lista [10,2,3,4,5,6,7,0,-1,-2,8,9,11,15,65,43,32,11,2,0]
Agrupa-se a lista na forma de uma matriz de (digamos) 7 colunas

10 2 3 4 5 6 7
0 -1 -2 8 9 11 15
65 43 32 11 2 0 50

A Seguir ordenamos as colunas

0 -1 -2 4 2 0 7
10 2 3 8 5 6 15
74 43 32 11 9 11 50

Em seguida diminumos sucessivamente o numero de colunas e ordenamos at


chegar a uma coluna onde o algoritmo termina. Para se ordenar as colunas
pode-se usar a insero ou o borbulhamento.

Mais um exerccio para vc .....


Ordenamento(7) - Outros

Shakersort Borbulhamento bidirecional. Tambm chamado cocktail sort.


Heapsort Usa um Heap como estrutura de dados para realizar a classicao
Mul>ple Heapsort Variante do Heapsort
Quicksort com triplo par>cionamento Variante do Quicksort.
Combsort Melhorias no bubble e quicksort
Gnome sort Variao da insero

Outros:

Odd-Even Sort, Flashsort, Introsort, Library sort, Pa>ence sor>ng ,Tree sort (binary
tree sort), Strand sort, Bead sort, Bucket sort, Burstsort, Coun>ng sort, Pigeonhole
sort, Postman sort, Radix sort, Smoothsort, Bitonic sorter, Pancake sor>ng,
Topological sort, Samplesort .....
Exerccio
Um exerccio simples para desopilar:

Dadas duas listas no ordenadas A e B, faa um programa para criar uma lista C
ordenando e intercalando as duas listas (A e B) na forma itera>va.
Anlise de Algoritmos
Obje>vo: Determinar quanto de espao (memria) ser necessria para execuo de
um algoritmo e quanto tempo o mesmo levar para ser executado.

Mtricas normalmente relacionadas ao tamanho da entrada:


Complexidade de Tempo: Nmero de passos do algoritmo
Complexidade de Espao: Nmero de unidades de memria

Es>ma>vas:
Notaes Big O, Omega, Big Omega, Theta,etc

Exs: O Nmero de passos executados em uma pesquisa binria proporcional ao


logaritmo do comprimento da lista de entrada. Na notao Big O. Dizemos
que sua complexidade de tempo O(log(n)).

Vejamos a complexidade dos algoritmos aqui estudados.


Anlise de Algoritmos

Um algoritmo estvel se ele mantm a ordem dos elementos repe>dos na entrada.


Exerccio de Fixao
Implemente o seguinte algoritmo:

1. Crie trs ou mais funes uma para cada >po de mtodo de ordenamento que vc deseja
testar. (Ex. Bolha, quick, shell)
2. Repita para i = 100, 500, 1000,1500,2000,3000,4000,5000,10000,20000,50000,100000
2.1 Gere uma srie de lista de nmeros aleatrios de tamanho i
2.2 Ordene a srie chamando as funes denidas no passo 1
2.3 Guarde os tempos usados para cada operao de ordenamento
5. Crie uma tabela conforme modelo abaixo:
N Metodo A Metodo B Metodo C Metodo D
101 t11 t12 t13 t14
500 t21 t22 t23 t24
......

Onde txx so os tempos levados em cada operao


6. Fim

OBS: Com os dados ob>dos acima gere um grco no openoce


Fim da Aula 7
Aula 8 Programao Orientada a Objetos
Aula 8 POO - Classes
Poo Programao Orientada a Objetos. O programa executado em/por objetos.

Objeto - En>dade que possui atributos (variveis internas ) e mtodos (funes


internas)

Classe Descrio abstrata de um grupo de objetos. Um objeto uma instncia de


uma classe. Para se criar um objeto, primeiro se dene a sua classe.

Ex. Criando uma classe em Python

class NomeDaClasse:
<declarao-1>
.
.
.
<declarao-N>
Aula 8 POO - Objetos
Criando (instanciando) objetos:

<objeto> = nome_da_classe()

Ex. class Triangulo:


c1 = 0
c2 = 0
def h(t): # o mtodo ( funo) deve ter pelo menos um argumento
return math.sqrt(t.c1**2 +t.c2**2)
# m da classe
t = Triangulo()
t.c1 = input("Digite o tamanho do cateto 1 ")
t.c2 = input("Digite o tamanho do cateto 2 ")
print "hipotenusa ",t.h()

O Primeiro argumento das funes o prprio objeto. (self ou auto)


Programa43.py
Aula 8 POO - Construtores
Mtodo especial usado na instanciao de um objeto. (programa44.py)

Ex.
import math
import os
os.system("clear")
class Triangulo:
c1=0
c2=0
Construtor da classe
def __init__(self):
self.c1 = input("Digite o tamanho do cateto 1 ")
self.c2 = input("Digite o tamanho do cateto 2 ")
def h(self): # a funcao deve ter pelo menos um argumento
return math.sqrt(t.c1**2 +t.c2**2)
# m da classe
Chama o construtor e cria instncia
t = Triangulo()
print "hipotenusa ",t.h()
Aula 8 POO - Herana
Uma classe pode herdar atributos e mtodos de uma (herana simples) ou mais
classes (herana ml>pla). A sintaxe :

class ClasseDerivada(Base1, Base2, Base3):


<statement-1>
.
.
.
<statement-N>
Aula 8 POO Herana- Exemplo
Programa45.py

import math
import os
os.system("clear")
class Triangulo:
area = 0
>po=" "
def __init__(self):
print "Criada a classe Base
Aula 8 POO Herana- Exemplo
class TrianguloRetangulo(Triangulo):
l1 = 0
l2 = 0
def __init__(self):
Triangulo.__init__(self)
print "Criando a classe derivada"
self.l1 = input("Qual o valor do lado 1 ")
self.l2 = input("Qual o valor do lado 2 ")
self.area = self.l1 * self.l2 / 2.0
print "Area = ",self.area

# m da classe
# inicio do programa principal
t = Triangulo()
tr = TrianguloRetangulo()
Aula 8 POO Polimorsmo
Deciso em tempo de execuo de qual mtodo a chamar em uma hierrquica. Na
pr>ca semelhante a >pagem dinmica. (O python concebido assim)

# chamada polimorca
t = tr
print "Hipotenusa (Usando t) ",t.h()
print "Hipotenusa (Usando tr) ",tr.h()
t.l1 = 1000
print "l1 em t ", t.l1
print "l1 em tr ", tr.l1
Aula 8 POO Sobrecarga de Mtodos
Consiste na existncia de mtodos diferentes com o mesmo nome. A chamada denida
pela assinatura do mtodo. (Tipos e quan>dades dos argumentos).

Python dispensa a sobrecarga de mtodos usando argumentos exveis.

a) Parmetros com valores default

def ask_ok(prompt, retries=4, complaint=Yes or no, please!):

b) Parmetros na forma chave=valor

def parrot(voltage, state=a s>, ac>on=voom, type=Norwegian Blue):


parrot(ac>on = VOOOOOM, voltage = 1000000)

c) Listas de argumentos arbitrria


def f(*lista)
X = f(1,2,3,4,5,6)
Lista = (1,2,3,4,5,6)
Aula 8 POO Sobrecarga de Operadores

Consiste em estender a funcionalidade de operadores como + - etc. para outros


>pos de dados que no sejam os originalmente aceitos pelos mesmos. Veja o exemplo
abaixo:
class Racional:
def __init__(self, divisor, dividendo):
self.divisor = divisor
self.dividendo = dividendo

def __str__(self):
return str(self.divisor) + '/' + str(self.dividendo)

def __mul__(self, outro):


divisor = self.divisor*outro.divisor
dividendo = self.dividendo*outro.dividendo
return Racional(divisor, dividendo)
Aula 8 POO Sobrecarga de Operadores

O uso da classe racional seria:

a = Racional(1,2)
b = Racional(3,4)
c = a*b
print c

Programa46.py
Aula 8 POO Sobrecarga de Operadores

Operadores a sobrecarregar:

__add__: Adio.
__sub__: Sutrao.
__mul__: Mul>plicao.
__div__: Diviso.
__mod__: Resto da diviso.
__pos__: Iden>dade.
__neg__: Nega>vo.
__abs__: Absoluto.

Ver documentao para mais informaes.


Aula 8 POO Composio / Agregao
Uma classe python pode ser denida dentro de outra e conseqentemente seus objetos
estabelecem a relao de composio. Relao forte.

Ex.
class universidade:
x,y ,z , etc
class depto:
jhsdkhd

# m da classe

Na relao de composio uma classe possui uma varivel referenciando um objeto de


outra classe. Uma relao mais fraca.
class depto
p = Professor()
# m da classe
Exerccios de Fixao

Crie uma classe chamada de Ordenadora com os atributos bsicos para uma tarefa de
ordenamento. A seguir crie classes lhas que implementem os diversos mtodos de
ordenamento que estudamos na aula passada.
Registros
Registros so conjuntos de dados >picamente usados para guardar dados em bancos
de dados onde cada linha da tabela um registro. Algumas linguagens como o pascal
(record) ou C (struct) possuem este >po denido.

Em Python podemos usar classes sem mtodos ou mesmo listas ou tuplas de acordo
com o uso que faremos deles.

Lembrando :
lista = [1,2,3,4]
tupla = 1,2,3,4
Ambas so acessadas com ndices, mas com u>lizaes e possibilidades diferentes.

Class registro:
nome=
idade = 0
peso = 0
Registros
Vamos ento criar um banco de dados de alunos do IFET-Ce. Colocando em uma lista
os nomes, endereos e e-mails.

Idia:

Criar uma classe alunos, criar uma lista vazia para adicionar os alunos, perguntar a
quan>dade de alunos a cadastrar criar um programa para cadastrar ou mostrar a lista
de alunos.

Uma melhora: criar um menu de entrada para que o usurio escolha o que deseja
fazer.
Registros
Denindo a classe.

class Aluno:
def __init__(self, nome,endereco,email):
self.nome = nome
self.endereco = endereco
self.email = email
def __str__(self):
return "\nAluno: "+self.nome+"\nEnd: "+self.endereco+"\ne-mail:"+self.e$
# m da classe
Registros
Nosso menu do programa.
# inicio do programa
lista = []
while True:
os.system("clear")
print "Escolha uma opo abaixo:"
print "<1> Cadastrar um Aluno"
print "<2> Listar os Alunos "
print "<3> Sair do Programa"
escolha = raw_input("Digite sua escolha e pressione <enter> ")
if escolha == "1:
os.system("clear")
nome = raw_input("Digite o nome do aluno ")
end = raw_input("Digite o endereco do aluno ")
mail = raw_input("Digite o e-mail do aluno ")
obj = Aluno(nome,end,mail)
lista.append(obj)
Registros
Nosso menu do programa. - Con>nuao

elif escolha == "2:


for i in lista:
print i
raw_input("Digite enter para con>nuar)
elif escolha == "3":
break
print "Fim

Programa47.py
2 Probleminhas
Existem linguagens que no tem o >po lista como o Python

a) Em C,Java,Pascal,etc os vetores no so vistos como listas de tamanho varivel.

b) As vezes pode ser complicado inserir um registro (objeto) como elemento de um


vetor. *

Uma soluo para a criao de bancos de dados como estes que zemos seria u>lizar
listas encadeadas.

Vamos ver ....

* Em python basta usar o append(obj)


Listas Encadeadas
Idia:

Um conjunto de registros, alm de conterem seus dados normais, possuem tambm


referncias para outros registros.

Ex.

class Aluno:
proximo = ""
def __init__(self, nome="",endereco="",email=""):
self.nome = nome
self.endereco = endereco
self.email = email
def __str__(self):
return "\nAluno: "+self.nome+"\nEnd: "+self.endereco+"\ne-mail:"+self.e$
# m da classe
Listas Encadeadas
Criando algumas variveis de trabalho:

primeiro = Aluno() # Pode isso? Cad os argumentos?


atual = primeiro
ul>mo = primeiro

Qual a u>lidade destas varveis?


Listas Encadeadas (Simples)

obj1 Primeiro

Nome, End, Tel


Proximo = <obj2>

obj2
Nome, End, Tel
Atual
Proximo = <obj3>

obj3
Nome, End, Tel
Proximo =
l>mo
Listas Encadeadas (Simples)
Inserindo elementos na lista:

if escolha == "1":
os.system("clear")
nome = raw_input("Digite o nome do aluno ")
end = raw_input("Digite o endereco do aluno ")
mail = raw_input("Digite o e-mail do aluno ")
obj = Aluno(nome,end,mail)
if primeiro.nome == "":
primeiro = obj
ul>mo = primeiro
else:
ul>mo.proximo = obj
ul>mo = ul>mo.proximo
Listas Encadeadas (Simples)
Imprimindo a lista inteira:

elif escolha == "2":


atual = primeiro
while True:
print atual
if atual.proximo == "":
break
else:
atual = atual.proximo
raw_input("Tecle enter para con>nuar ")

Programa48.py
Listas Encadeadas Exerccio
Pesquisa Linear na Lista.

Dado um nome (pedro por exemplo) encontrar seu endereo.

Programa49.py

E se ....

Eu quiser ordenar a lista? Qual o mtodo mais rpido? (Exerccio Proposto)


Sempre em Frente....
Ligando o m de uma lista ao incio da outra: Lista circular.
Lista circular com tamanho xo: buer circular. *

obj1
Proximo = <obj2>
obj2
Proximo = <obj3>

obj3
Proximo = <obj2>

A vc de tentar .....

* Muito usados em transmisses mul@mdia


Duplo encadeamento
Ligando o m de uma lista ao incio da outra: Lista circular.
Lista circular com tamanho xo: buer circular. *

obj1
Anterior =
obj2
Prximo = <obj2>
Anterior=<obj1>
Prximo = <obj3>
obj3
Anterior=<obj2>
Prximo = <obj2>
A vc de tentar .....
Fim da Aula 8
Aula 9 Estruturas de Dados Avanadas
Aula 9 Estruturas de Dados Avanadas
Probleminhas com listas ligadas:

-Demora em encontrar um elemento especco (Soluo ordenar?)

Problema com lista ordenada:

-Demora na insero de novos elementos (Encontrar a posio, abrir espao e inserir o


elemento

Detalhe: uma lista encadeada no permite acesso direto a um elemento mesmo que
seja ordenada.

Algum ajuda ?.....

Novas estruturas de dados.


rvores
Raiz
Nvel 0

N Pai
Nvel 1

Nvel 2 Folhas
N Filho

Caracters>ca : Apenas um caminho do n raiz para qualquer outro. Caso existam


mais caminhos trata-se de um grafo.
Exemplo de Grafo

Uma rvore um >po especial de grafo.


rvores Binrias
50

30 90

20 40 85 99

Quando os ns tem no mximo dois lhos trata-se de uma rvore binria ou rvore
de pesquisa binria. (binary search tree).
Os dados so associados aos ns e os ns esquerdos tem valores menores que os
pais e os direitos so superiores.
Dependendo da ordem como os ns so visitados eles listam os dados naturalmente
ordenados.
rvores Binrias

Para trabalhar com rvore binrias.

Passo 1: Representar os ns.

class Noh: #denio da classe N


dado,esquerdo,direito = 0,None,None
def __init__(self, dado):
self.esquerdo = None
self.direito = None
self.dado = dado
def __str__(self):
return "{",str(dado),"}"

# m da classe Noh
rvores Binrias

Para trabalhar com rvore binrias.

Passo 2: A rvore (Esqueleto)


class ArvoreBinaria: # Denio da classe rvore
def __init__(self):
def criaNoh(self, dado): # cria um novo noh e o retorna
def insere(self, raiz, dado): # insere um novo dado
def apaga(self,raiz,dado):
def pesquisa(self, raiz, valor): # Pesquisa um valor na rvore
def menorValor(self, raiz): # entra no ramo esquerdo e procura o menor valor
def profundidadeMaxima(self, raiz):
def tamanho(self, raiz):
def imprimirArvore(self, raiz): # imprime a rvore
def imprimeNohs(self,raiz):

rvores Binrias

Para trabalhar com rvore binrias.

Passo 3: Mtodo de inicializao da classe


class ArvoreBinaria: # Denio da classe rvore
def __init__(self):
self.raiz = None
def criaNoh(self, dado): # cria um novo noh e o retorna
return Noh(dado)
rvores Binrias

Passo 4: Denindo a funo de pesquisa

Valor a procurar=37
50
37<50

30 90

>30
20 40 85 99

<40

37 44

37==37
rvores Binrias

Passo 4: Denindo a funo de pesquisa

def pesquisa(self, raiz, valor): # Pesquisa um valor na rvore


if raiz == None:
return 0
else:
if valor == raiz.dado:
return 1
else:
if valor < raiz.dado:
return self.pesquisa(raiz.esquerdo, valor)
else:
return self.pesquisa(raiz.direito, valor)
rvores Binrias

Passo 5: Inserindo um Valor especco (cria n)

Valor a inserir =37


50
37<50

30 90

>30

20 40 85 99

<40 -> Inserir a esquerda


rvores Binrias

Passo 5: Inserindo um Valor especco (cria n)

Valor a inserir =37


50
37<50

30 90

>30

20 40 85 99

37

Inserido no lado esquerdo


rvores Binrias

Passo 6: Deslocamento atravs da rvore (Para impresso, por exemplo)

Caso1 : Deslocamento ordenado( -> Em Ordem <- ). O algoritmo bsico :


-Chamar a si prprio para visitar a rvore a par>r do ramo esquerdo
-Visitar o n atual (e imprimir, talvez)
-Chamar a si prpria para visitar a rvore a par>r do ramos direito
Caso base: parar quando o n for nulo (None)

def imprimirArvore(self, raiz): # imprime a rvore


if raiz == None:
pass # nao faz nada
else:
self.imprimirArvore(raiz.esquerdo)
print "{",raiz.dado,"}",
self.imprimirArvore(raiz.direito)
rvores Binrias

Passo 7: Imprimindo a rvore na ordem inversa

Basta comear a impresso pelo lado direito

def imprimeArvoreInver>da(self, raiz): # imprime a rvore inver>da


if raiz == None:
pass
else:
self.imprimeArvoreInver>da(raiz.direito)
print "{",raiz.dado,"}",
self.imprimeArvoreInver>da(raiz.esquerdo)

rvores Binrias

Passo 8 : Mostrando a topologia da rede . Imprimindo os ns

def imprimeNohs(self,raiz):
if raiz == None: return
a = raiz.dado
if raiz.esquerdo != None:
b = raiz.esquerdo.dado
else:
b = None
if raiz.direito != None:
c = raiz.direito.dado
else:
c = None
print "{",a,"[",b,",",c,"]","}",
self.imprimeNohs(raiz.esquerdo) Programa50.py
self.imprimeNohs(raiz.direito)
rvores Binrias

Passo 9: Visitando a rvore em pr-ordem x ps-ordem (Aplicaes)

Pr-Ordem:
1. Visitar o n
2. Visitar recursivamente os ns do lado esquerdo
3. Visitar recursivamente os ns do lado direito

Ps-Ordem
1. Visitar recursivamente os ns do lado esquerdo
2. Visitar recursivamente os ns do lado direito
3. Visitar os ns
rvores Binrias

Imagine uma rvore representando uma expresso algbrica conforme abaixo

Expresso A * ( B+ C)
*
Visitando a rvore podemos ter:

A +

B C
Em-ordem:
A * (B + C) : interxada (parenteses por sua conta)
Pr-ordem
*A+BC : pr-xada (Nunca precisa de parnteses)
Ps-Ordem
ABC+*: ps-xada (Facilita o uso de pilhas para armazenar rvores)
rvores Binrias

Passo 10: Encontrando o mnimo e o mximo em uma rvore:

Caminho para 50 Caminho para


o mnimo o mximo

30 90

20 40 85 99

37 44
rvores Binrias

Passo 10: Encontrando o mnimo e o mximo em uma rvore:

def menorValor(self, raiz): # entra no ramo esquerdo e procura o menor valor


while(raiz.esquerdo != None):
raiz = raiz.esquerdo
return raiz.dado
rvores Binrias

Passo 11: Deletando ns

Trs casos a considerar:

1. O n a ser apagado uma folha (No tem lhos)


2. O n tem um lho
3. O n tem dois lhos

Os dois primeiros casos so mais simples, o segundo mais complexo.


rvores Binrias

Passo 11: Deletando ns

Caso 1: O n uma folha 50

30 90

20 40 85 99

37 44
rvores Binrias
Passo 11: Deletando ns

Caso 1: Removemos a conexo e o sistema se encarrega de apagar a memria


50

esquerdo = None
30 90

20 40 85 99

Obs: Se a sua linguagem


no possui coleta de lixo ser
44
37
preciso destruir
explicitamente o objeto

Programa51.py
rvores Binrias

Passo 11: Deletando ns

Caso 2: O n tem um lho 50

30 90

20 40 85 99

44
rvores Binrias

Passo 11: Deletando ns

Caso 2: O n tem um lho 50

Programa52.py
30 90

20 85 99
44

40
rvores Binrias

Passo 11: Deletando ns

Caso 3: O n tem dois lhos 50

30 90

20 40 85 99

37 44
rvores Binrias

Passo 11: Deletando ns

SOLUO ERRADA 50

30 90

40

20 85 99

37 44
rvores Binrias
Passo 11: Deletando ns
Seguir pela direita e no primeiro n mudar
Soluo: Subs>tuir o n por seu sucessor
a esquerda e prosseguir at o n que no
tenha lhos a esquerda. ele.
50

30 90

20 40 85 99

37 44
rvores Binrias
Passo 11: Deletando ns
Soluo: Subs>tuir o n por seu sucessor

50

30
37 90

20 40 85 99

44
rvores Binrias
Passo 11: Deletando ns
Caso par>cular: O sucessor est direita (No possui lhos esquerda)

Desloca a sub-rvore
50
inteira

30 90

20 40 99

37 44
rvores Binrias
Passo 11: Deletando ns
Funo Sucessor:
def sucessor(self,noh):
paiSucessor = noh
sucessor = noh
atual = noh.direito
while atual != None:
paiSucessor = sucessor
sucessor = atual
atual = atual.esquerdo
if sucessor != noh.direito: # refazendo as conexes
paiSucessor.esquerdo = sucessor.direito
sucessor.direito = noh.direito
return sucessor
rvores Binrias
Passo 11: Deletando ns
Finalizando a funo apagar
Programa53.py

else:
suc = sucessor(atual)
if atual == raiz:
raiz = suc
elif ehFilhoEsquerdo:
nohPai.esquerdo = suc
else:
nohPai.direito = suc
suc.esquerdo = atual.esquerdo # sucessor no tem lho a esquerda
return True
rvores Binrias
Representando como um Vetor. Esquerdo(i) = 2* i + 1 Direito(i) = 2 * 1 + 2 Pai(i) (i-1)/2

Exerccio : Converter da forma hierrquica para a forma vetorial.


rvores Binrias
Ecincia : Operaes normais na ordem O(log N)
Diculdade de trabalho com valores no preenchidos.
Tratar valore duplicados. Nos exemplos so inseridos no lado direito.
rvores Binrias - Exerccios
1. A par>r do programa desenvolvido aqui, desenvolva um caso especial de rvore
binrio que recebe caracteres e operadores aritm>cos (+,-,*,etc). Os caracteres
devem car nas folhas e os simbolos nos ns intermedirios.
2. Pesquise na internet o conceito de codicao Human e implemente-o
Fim da Aula 9
Aula 10 rvores Vermelho-Pretas (Red Black Trees)
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Principal problema com rvores binrias:

-Quando os dados so preenchidos na forma j ordenada ou inversamente ordenada


ela se torna uma lista ligada simples (desbalanceada) com complexidades de O(N).

30

50

85

90
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Soluo: balancear a rvore na insero. Cada n deve possuir aproximadamente o


mesmo nmero de descendentes dos dois lados.

Como?: Usar um conjunto de regras que constroem o que cou conhecido como
rvore vermelho-pretas ou rubro-negras (como queira).

Regras:

1. Os ns so coloridos (Vermelho ou Preto) (Se vc no gostar pode usar amarelo-


azul, verde-rosa, etc).
2. A raiz sempre preta.
3. Se um n vermelho, seu lho preto(O contrrio no vlido)
4. Todos os caminhos at as folhas ou um lho nulo (None) devem ter o mesmo
nmero de ns pretos (Comprimento de pretos)

S aceita insero de novos elementos na rvore se as regras acima forem sa>sfeitas.


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

E quando a regra violada:


1. Trocar as cores dos ns.
2. Fazer rotaes. Todos os caminhos at as folhas
possuem dois ns pretos (ok)
Raiz Preta (ok)

Vermelhos sem lhos (folhas) (ok)

OBS: Ao se seguir as regras, a rvore man>da naturalmente balanceada.


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Inserindo elementos. Passo a Passo.

Passo 1 : criarArvore(50)
Ns so inseridos em vermelho.
No muda comprimento de
pretos, diminuindo a chance de
ter problemas em seqncia.
Passo 2 : inserirNoh(75)

Passo 3 : inserirNoh(25)
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Passo 3 : inserirNoh(25)

Primeiro Problema:

Passo 4 : inserirNoh(35): 35

Posio = Filho Direito do 25.


Cor = Vermelho:
Resultado: Viola regra 3
Soluo (1) : Mudar a cor do n 25 Mudar o comprimento de preto Mudar a
cor do 75 tb.
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)
Passo 4 : inserirNoh(35):

Posio = Filho Direito do 25.


Cor = Vermelho:
Resultado: Viola regra 3
Soluo (1) : Mudar a cor do n 25 Mudar o comprimento de preto Mudar a
cor do 75 tb.

Passo 4 : inserirNoh(35):

Soluo(2): Rotao
Obs: A cor do 25 deve mudar para Preto.
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Passo 4 : inserirNoh(35):

Soluo(2): Rotao
Obs: A cor do 25 deve mudar para Preto.

Finalmente podemos inserir o 35 sem violar as regras.


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Limitando o desbalanceamento:

Imagine a rvore ao lado.

Inserir um elemento lho do 35:

Se for vermelho viola a regra 3


Se for preto viola a regra 4
Se mudar a cor do 35 tambm violamos a regra 4
.....

Concluso: As regras RBT (Red-Black-Tree) impedem rvores com dois ou mais nveis
de desbalanceamento.
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

DESAFIO: Vc conseguiria balancear a rvore abaixo?


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Filhos nulos (Null / Nil / None) : Aqueles lhos que o n deveria ter, mas no tem.
Complementar ao lho direito ou esquerdo.

Comprimento de pretos 1

Filhos Nulos

Comprimento de pretos 2

A rvore acima fere a regra 4.


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Detalhes sobre rotaes:

Rotao direita: o n (topo) deve ter lha esquerda


Rotao esquerda: o n (topo) deve ter lho direita

Obje>vos:

Levantar alguns ns e rebaixar outros de forma a balancear a rvore


Assegurar que as caracters>cas de rvores binrias no foram violadas
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Detalhes sobre rotaes:

Considere a rvore abaixo.

Neto de fora Neto de dentro

Qual seria o resultado de rotacionar o 25 (topo 50) direita? O Filho direito do 25


passar a ser 50, mas 37 no pode ser lho esquerdo. A soluo ento
reconectar o 37 a outro n
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Detalhes sobre rotaes:

Considere a rvore abaixo.

37 agora lho de 50.


Tornou-se >o de sua posio anterior

N crossover! (Neto de dentro)


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

E quando temos sub-rvores inteiras: Rotao direita do 50 (topo)

Observe o
deslocamento da sub-
rvore
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Inserindo ns.

Seja X um n especco,
Seja P o n pai de,
Seja G o n av de X.

Roteiro.

1. Descer na rvore procurando o ponto de insero


2. Se vc encontrar um n preto seguido de dois ns vermelhos. Troque as cores do
lho com o pai (Flip).
3. Se o ip provocar uma seqncia de vermelhos (viola regra 3) faa uma simples
ou dupla rotao em P dependendo se o X neto interno ou externo1
4. Insira o n. Aps a insero houver quebra de regras: rotacione.

1 Veremos mais na frente como faz-las.


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Antes de Inserir: Descer na rvore procurando o ponto de insero e realizar Flips no


caminho

Antes Depois

Esta mudana no afeta o comprimento de pretos, mas pode induzir a uma


seqncia de vermelhos
Se esta operao for realizada com a raiz, esta preserva a cor preta.
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Aps a insero as regras podem estar violadas. As posies de insero em relao


ao pai e av so:

G G G
G

P P P
P

X X X
X
Neto de Fora Neto de Dentro Neto de Dentro Neto de Fora
(Filho Esquerdo) (Filho Direito) (Filho Esquerdo) (Filho Direito)
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Trs principais possibilidades com relao s cores:

G
G G

P
P P

X X
X
a) P preto b) P vermelho X est fora. c) P vermelho X est dentro.
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Caso 1 : P preto.

Caminho Livre. Nenhum conito vermelho-vermelho e nem h


mudana na profundidade de pretos. Podemos inserir nosso n G
(sempre vermelho)

a) P preto
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Caso 2: P vermelho e X um neto de fora. Precisamos de uma rotao simples e


algumas mudanas de cores.

Imagine a rvore gerada na seqncia de inseres: 50-25-75-12-6. Nosso n de


insero o 6

O que fazer?
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Caso 2: P vermelho e X um neto de fora. Precisamos de uma rotao simples e


algumas mudanas de cores.

Passo 1: Trocar a cor do av.


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Caso 2: P vermelho e X um neto de fora. Precisamos de uma rotao simples e


algumas mudanas de cores.

Passo 2: Trocar a cor do pai.


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Caso 2: P vermelho e X um neto de fora. Precisamos de uma rotao simples e


algumas mudanas de cores.

Passo 3: Rotacionar com o avo no topo na direo que levante o 6 (Direita)

A rvore agora est RB Correta e melhor


balanceada
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Caso 3 P vermelho e X neto de dentro

Vamos necessitar de duas rotaes e algumas mudanas de cores.

Considere a rvore abaixo como resultado da insero da seqncia: 50-25-75-12-18


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Caso 3 P vermelho e X neto de dentro

Passo 1: Trocar a cor do av


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Caso 3 P vermelho e X neto de dentro

Passo 2: Trocar a cor do n inserido


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Caso 3 P vermelho e X neto de dentro

Passo 3: Realizar primeira rotao colocando o neto de dentro na posio de neto de


fora. (Topo 12 )

Agora estamos na situao idn>ca ao caso 2.


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Caso 3 P vermelho e X neto de dentro

Passo 4: Realizar a segunda rotao direita usando 18 como topo

A rvore est correta e melhor balanceada.


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

E as rotaes antes da insero?


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

1. Aps intercmbio de cores (ip) durante a localizao


pode haver violao da regra 3 (vermelho-vermelho).

2. As possibilidades so idn>cas s estudadas. O n


causador do conito pode ser um neto dentro ou fora.
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Neto de Fora. Ao inserir o l>mo n (3) na rvore abaixo


necessrio trocar as cores (ips) que a deixariam invlida.

Vermelhos em
seqncia

Soluo: 2 trocas de cores e uma rotao


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Passo 1 : Trocar a cor do av


(Ignorar por enquanto que a raiz deve ser preta )
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Passo 2 : Trocar a cor do pai


(Ignorar por enquanto que a raiz deve ser preta )
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Passo 3 : Rotacionar de forma a levantar o n causador do


problema

Bem melhor.
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Neto de Dentro. A rvore 50-25-75-12-37-31-43 caria da


seguinte forma antes de inserir o 28 (por exemplo)

Vermelhos em
seqncia

Soluo: 2 trocas de cores e duas rotaes


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Passo 1: Trocar a cor do av (50).


(ignorar raiz preta por um momento)
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Passo 2: Trocar a cor do prprio n (37).


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Passo 3: Girar (topo no pai 25) de forma a levantar o lho


(37)
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Passo 4: Girar (topo na raiz 50) de forma a levantar o neto


(37)

rvore balanceada.
Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Agora podemos inserir o 28 aps ip na raiz


Aula 10 rvores Vermelho-Pretas (Rubro-Negras?)

Consideraes adicionais:

a) Informao adicional na literatura


b) Deleo complexa, mas pode ser subdividida
c) Busca, seleo, insero em O(log2N)
d) Mais eciente que as rvores AVL.

Ver Programa54.py

OBS: As rvores AVL fazem balanceamento a par>r da medida dos comprimentos dos
ramos. Caso haja uma diferena superior a um so feitas rotaes para balancear
novamente a rvore. AVL = (Adelson, Velskii e Landis. Criadores)
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python)

-Listas (operaes bsicas)


>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print a.count(333), a.count(66.25), a.count(x)
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python)

Listas como Pilhas

>>> stack = [3, 4, 5]


>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python)

Listas como Filas

>>> queue = ["Eric", "John", "Michael"]


>>> queue.append("Terry") # Terry arrives
>>> queue.append("Graham") # Graham arrives
>>> queue.pop(0)
Eric
>>> queue.pop(0)
John
>>> queue
[Michael, Terry, Graham]
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python)

Ferramentas para Programao Funcional:

Existem trs funes internas que so muito teis sobre listas: lter(), map(), e reduce().

>>> def f(x): return x % 2 != 0 and x % 3 != 0


...
>>> lter(f, range(2, 25))

[5, 7, 11, 13, 17, 19, 23]


Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python)

Ferramentas para Programao Funcional:

Existem trs funes internas que so muito teis sobre listas: lter(), map(), e reduce().

def cube(x): return x*x*x

>>> map(cube, range(1, 11))

[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

>>> seq = range(8)


>>> def add(x, y): return x+y
...
>>> map(add, seq, seq)
[0, 2, 4, 6, 8, 10, 12, 14]
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python)

Ferramentas para Programao Funcional:

Existem trs funes internas que so muito teis sobre listas: lter(), map(), e reduce().

>>> def add(x,y): return x+y


...
>>> reduce(add, range(1, 11))
55
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python)

Gerao Autom@ca de Listas

>>> freshfruit = [ banana, loganberry , passion fruit ]


>>> [weapon.strip() for weapon in freshfruit]
[banana, loganberry, passion fruit]
>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]
>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x < 2]
[]
>>> [[x,x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python)

Apagando Elementos de Listas

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]


>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python)

Uma tupla consiste em uma sequncia imutvel de valores separados por vrgulas

>>> t = 12345, 54321, hello!


>>> t[0]
12345
>>> t
(12345, 54321, hello!)
>>> # Tuplas podem ser aninhadas:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, hello!), (1, 2, 3, 4, 5))
>>> empty = ()
>>> singleton = hello, # <-- observe a vrgula extra
>>> len(empty)
0
>>> len(singleton)
1
>>> singleton
(hello,)
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python)

Uma tupla consiste em uma sequncia imutvel de valores separados por vrgulas

Empacotamento:

t = 12345, 54321, hello!

Desempacotamento:

>>> x, y, z = t
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python):
Conjuntos
>>> basket = [apple, orange, apple, pear, orange, banana]
>>> fruits = set(basket) # create a set without duplicates
>>> fruits
set([orange, pear, apple, banana])
>>> orange in fruits # fast membership tes>ng
True
>>> crabgrass in fruits
False
>>> a = set(abracadabra)
>>> b = set(alacazam)
>>> a # unique le|ers in a
set([a, r, b, c, d])
>>> a - b # le|ers in a but not in b
set([r, d, b])
>>> a | b # le|ers in either a or b
set([a, c, r, d, b, m, z, l])
>>> a & b # le|ers in both a and b
set([a, c])
>>> a ^ b # le|ers in a or b but not both
set([r, d, b, m, z, l])
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python):
Dicionrios:

>>> tel = {jack: 4098, sape: 4139}


>>> tel[guido] = 4127
>>> tel
{sape: 4139, guido: 4127, jack: 4098}
>>> tel[jack]
4098
>>> del tel[sape]
>>> tel[irv] = 4127
>>> tel
{guido: 4127, irv: 4127, jack: 4098}
>>> tel.keys()
[guido, irv, jack]
>>> tel.has_key(guido)
True
>>> guido in tel
True
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python):
Dicionrios:

>>> dict([(sape, 4139), (guido, 4127), (jack, 4098)])


{sape: 4139, jack: 4098, guido: 4127}
>>> dict([(x, x**2) for x in (2, 4, 6)]) # use a list comprehension
{2: 4, 4: 16, 6: 36}
Aula 10 PAUSA Avanando no Python
Estruturas de Dados Built-In (Vem incorporado ao Python):
Dicionrios:

>>> dict([(sape, 4139), (guido, 4127), (jack, 4098)])


{sape: 4139, jack: 4098, guido: 4127}

>>> dict([(x, x**2) for x in (2, 4, 6)]) # use a list comprehension


{2: 4, 4: 16, 6: 36}
FIM DA AULA 10
11. Mdulos E/S e Arquivos em Python
11. Mdulos E/S e Arquivos em Python

Tcnicas de Lao Usando Dicionrios

Ao percorrer um dicionrio com um lao, a chave e o valor correspondente podem ser


ob>dos simultaneamente com o mtodo iteritems().

>>> knights = {gallahad: the pure, robin: the brave}


>>> for k, v in knights.iteritems():
... print k, v
...
gallahad the pure
robin the brave
11. Mdulos E/S e Arquivos em Python

Enumerate

Ao percorrer uma sequncia qualquer, o ndice da posio atual e o valor


correspondente podem ser ob>dos simultaneamente usando a funo enumerate().

>>> for i, v in enumerate([>c, tac, toe]):


... print i, v
...
0 >c
1 tac
2 toee
11. Mdulos E/S e Arquivos em Python

ZIP

Para percorrer duas ou mais sequncias simultaneamente com o lao, os items podem
ser agrupados com a funo zip().

>>> ques>ons = [name, quest, favorite color]


>>> answers = [lancelot, the holy grail, blue]
>>> for q, a in zip(ques>ons, answers):
... print What is your %s? It is %s. % (q, a)
...
What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.
11. Mdulos E/S e Arquivos em Python

reversed

Para percorrer uma sequncia em ordem reversa, chame a funo reversed() com a
sequncia na ordem
original.
>>> for i in reversed(xrange(1,10,2)):
... print i
...
9
7 xrange uma funo semelhante ao range,
5 mas que no gera a lista e sim um objeto
3 gerador da mesma o que a torna
1 ligeiramente mais eciente que o range()
11. Mdulos E/S e Arquivos em Python

sorted

Para percorrer uma sequncia de maneira ordenada, use a funo sorted(), que
retorna uma lista ordenada com os items, mantendo o original inalterado.

>>> basket = [apple, orange, apple, pear, orange, banana]


>>> for f in sorted(set(basket)):
... print f
...
apple
banana
orange
pear
11. Mdulos E/S e Arquivos em Python

Mdulos

Um mdulo um arquivo contendo denies e comandos Python.

nome do arquivo recebe o suxo .py.

Dentro de um mdulo, seu nome (uma string) est disponvel na varivel global
__name__.

Programa55.py
11. Mdulos E/S e Arquivos em Python

Mdulos Compilados

Um fator que agiliza a carga de programas curtos que u>lizam muitos mdulos padro
a existncia de um arquivo com extenso .pyc no mesmo diretrio do fonte .py.

arquivo .pyc contm uma verso byte-compilada do fonte .py. A data de


modicao de .py armazenada dentro do .pyc, e vericada automa>camente
antes da u>lizao do l>mo. Se no conferir, o arquivo .pyc existente re-compilado
a par>r do .py mais atual.
Na presena das formas compiladas (.pyc e.pyo) de um script, no h necessidade
da presena da forma textual(.py). Isto >l na hora de se distribuir bibliotecas
Python dicultando pr>cas de engenharia reversa.
O mdulo compileall pode criar arquivos .pyc (ou .pyo quando usado -O) para
todos os mdulos em um dado diretrio.

Mais Informaes: Tutorial Python


11. Mdulos E/S e Arquivos em Python

dir

A funo interna dir() u>lizada para se descobrir que nomes so denidos por um
mdulo. Ela retorna uma lista ordenada de strings:

Ex.

Import math
dir(math)

Mais Informaes: Tutorial Python


11. Mdulos E/S e Arquivos em Python

Pacotes

Pacotes so uma maneira de estruturar espaos de nomes para mdulos u>lizando a


sintaxe de separao por ponto. Como exemplo, o mdulo A.B designa um sub-
mdulo chamado B num pacote denominado A.

O uso de pacotes permite aos autores de grupos de mdulos (como NumPy ou PIL)
no terem que se preocupar com coliso entre os nomes de seus mdulos e os nomes
de mdulos de outros autores.

Mais Informaes: Tutorial Python


11. Mdulos E/S e Arquivos em Python

Pacotes

Sound/ Top-level package


__ init__.py Ini>alize the sound package
Formats/ Subpackage for le format conversions
__init__.py
wavread.py
wavwrite.py
airead.py
aiwrite.py
auread.py
auwrite.py
...
Eects/ Subpackage for sound eects
__init__.py
echo.py
surround.py
reverse.py
...
Filters/ Subpackage for lters
__init__.py
equalizer.py
vocoder.py
karaoke.py
11. Mdulos E/S e Arquivos em Python

Pacotes

O arquivo __init__.py pode ser vazio ou podem conter algo do >po:

__all__ = ["echo", "surround", "reverse"]

Onde dene as funes importadas ao usar o comando from pacote import *

Mais informaes no Tutorial Python


11. Mdulos E/S e Arquivos em Python

Entradas e Sadas (E/S) - Formatao da Sada

>>> s = Hello, world.


>>> str(s)
Hello, world.
>>> repr(s)
"Hello, world."
>>> str(0.1)
0.1
>>> repr(0.1)
0.10000000000000001
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = The value of x is + repr(x) + , and y is + repr(y) + ...
>>> print s
The value of x is 32.5, and y is 40000
11. Mdulos E/S e Arquivos em Python

Entradas e Sadas (E/S) - Formatao da Sada

>>> # The repr() of a string adds string quotes and backslashes:


... hello = hello, world\n

>>> hellos = repr(hello)

>>> print hellos


hello, world\n

>>> # The argument to repr() may be any Python object:


... repr((x, y, (spam, eggs)))
"(32.5, 40000, (spam, eggs))"
11. Mdulos E/S e Arquivos em Python

Entradas e Sadas (E/S) - Formatao da Sada


A seguir, duas maneiras de se escrever uma tabela de quadrados e cubos:
>>> for x in range(1, 11):
... print repr(x).rjust(2), repr(x*x).rjust(3), # Observe a vrgula nal na linha anterior
... print repr(x*x*x).rjust(4)
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
11. Mdulos E/S e Arquivos em Python

Entradas e Sadas (E/S) - Formatao da Sada

>>> for x in range(1,11):


... print %2d %3d %4d % (x, x*x, x*x*x)
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
11. Mdulos E/S e Arquivos em Python

Entradas e Sadas (E/S) - Formatao da Sada

Existe ainda o mtodo zll() que preenche uma string numrica com zeros esquerda.
Ele entende sinais posi>vos e nega>vos.

>>> 12.zll(5)
00012
>>> -3.14.zll(7)
-003.14
>>> 3.14159265359.zll(5)
3.14159265359
11. Mdulos E/S e Arquivos em Python

Entradas e Sadas (E/S) - Formatao da Sada

Um exemplo de uso do operador %:

>>> import math


>>> print The value of PI is approximately %5.3f. % math.pi
The value of PI is approximately 3.142.
11. Mdulos E/S e Arquivos em Python

Entradas e Sadas (E/S) - Formatao da Sada

Se h mais do que um formato, ento o argumento direita deve ser uma tupla com
os valores de formatao.
Exemplo:
>>> table = {Sjoerd: 4127, Jack: 4098, Dcab: 7678}
>>> for name, phone in table.items():
... print %-10s ==> %10d % (name, phone)
...
Jack ==> 4098
Dcab ==> 7678
Sjoerd ==> 4127
11. Mdulos E/S e Arquivos em Python

Entradas e Sadas (E/S) - Formatao da Sada

Se voc possuir uma string de formatao muito longa, seria bom referenciar as
variveis de formatao por nome, ao invs de por posio. Isso pode ser ob<do
passando um dicionrio como argumento direita e prexando campos na string de
formatao com %(name)format. Veja o exermplo:

>>> table = {Sjoerd: 4127, Jack: 4098, Dcab: 8637678}


>>> print Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d % table
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
11. Mdulos E/S e Arquivos em Python

A funo open() retorna um objeto de arquivo, e frequentemente usada com dois


argumentos: open(lename, mode).

>>> f=open(/tmp/workle, w)
>>> print f
<open le /tmp/workle, mode w at 80a0960>

O parmetro mode pode assumir valor r quando o arquivo ser s de leitura, w


quando for s de escrita (se o arquivo j exis>r seu contedo prvio ser apagado), e
a para abrir o arquivo para adio; qualquer escrita ser adicionada ao nal do
arquivo. A opo r+ abre o arquivo tanto para leitura como para escrita. O parmetro
mode opcional, em caso de omisso ser assumido r.
11. Mdulos E/S e Arquivos em Python

A funo open() retorna um objeto de arquivo, e frequentemente usada com dois


argumentos: open(lename, mode).

>>> f=open(/tmp/workle, w)
>>> print f
<open le /tmp/workle, mode w at 80a0960>

No Windows e no Macintosh, b adicionado a string de modo indica que o arquivo


ser aberto no formato binrio. Sendo assim, existem os modos compostos : rb, wb,
e r+b. O Windows faz dis>no entre arquivos texto e binrios: os caracteres
terminadores de linha em arquivos texto so levemente alterados em leituras e
escritas. Essa mudana por-trs-do-pano >l em arquivos texto ASCII, mas ir
corromper um arquivo binrio como no caso de arquivos JPEG ou EXE. Seja muito
cuidadoso em usar o modo binrio ao manipular tais arquivos.
11. Mdulos E/S e Arquivos em Python
read

Para ler o contedo de um arquivo chame f.read(size), que l um punhado de dados


retornando-os como string. O argumento numrico size opcional. Quando size for
omi<do ou nega<vo, todo o contedo do arquivo ser lido e retornado. problema seu
se o contedo do arquivo o dobro da memria disponvel na mquina. Caso
contrrio, no mximo size bytes sero lidos e retornados. Se o m do arquivo for
a<ngido, f.read() ir
retornar uma string vazia ().

>>> f.read()
Esse todo o contedo do arquivo.\n
>>> f.read()

11. Mdulos E/S e Arquivos em Python
Readline

f.readline() l uma nica linha do arquivo. O caracter de retorno de linha (\n) deixado
ao nal da string, s sendo omi>do na l>ma linha do arquivo se ele j no es>ver
presente l. Isso elimina a ambiguidade no valor de retorno. Se f.readline() retornar
uma string vazia, ento o arquivo acabou.
Linhas em branco so representadas por \n: uma string contendo unicamente o
terminador de linha.

>>> f.readline()
Essa a primeira linha do arquivo.\n

>>> f.readline()
Segunda linha do arquivo\n

>>> f.readline()

11. Mdulos E/S e Arquivos em Python
Readlines

f.readlines() retorna uma lista contendo todas as linhas do arquivo. Se for fornecido o
parmetro opcional sizehint, ser lida a quan<dade especicada de bytes e mais o
suciente para completar uma linha.

Frequentemente, esta operao u>lizada para ler arquivos muito grandes sem ter
que ler todo o arquivo para a memria de uma s vez. Apenas linhas completas sero
retornadas.

>>> f.readlines()
[Essa a primeira linha do arquivo.\n, Segunda linha do arquivo\n]
11. Mdulos E/S e Arquivos em Python
Readlines

fUma maneira alterna>va de ler linhas do arquivo usando um lao diretamente com
o objeto arquivo. mais eciente, rpido e resulta em cdigo mais simples:

>>> for line in f:


print line,

Esta a primeira linha do arquivo.


Segunda linha do arquivo.
11. Mdulos E/S e Arquivos em Python
Write()

f.write(string) escreve o contedo da string para o arquivo, retornando None.


>>> f.write(Isso um teste.\n)

Ao escrever algo que no seja uma string, necessrio convert-lo antes:


>>> value = (a resposta, 42)
>>> s = str(value)
>>> f.write(s)
11. Mdulos E/S e Arquivos em Python
tell(), seek(),

f.tell() retorna um inteiro que indica a posio corrente de leitura ou escrita no


arquivo, medida em bytes desde o incio do arquivo. Para mudar a posio u>lize
f.seek(oset, from_what).
A nova posio computada pela soma do oset a um ponto de referncia, que por
sua vez denido pelo argumento from_what. O argumento from_what pode assumir
o valor 0 para indicar o incio do arquivo, 1 para indicar a posio corrente
e 2 para indicar o m do arquivo. Este parmetro pode ser omi>do, quando
assumido o valor default 0.

>>> f = open(/tmp/workle, r+)


>>> f.write(0123456789abcdef)
>>> f.seek(5) # Vai para o sexto byte
>>> f.read(1)
5
>>> f.seek(-3, 2) # Vai para o terceiro byte antes do m
>>> f.read(1)
d
11. Mdulos E/S e Arquivos em Python
close

Quando acabar de u>lizar o arquivo, chame f.close() para fech-lo e liberar recursos.
Qualquer tenta>va de acesso ao arquivo depois dele ter sido fechado implicar em
falha.

>>> f.close()
>>> f.read()

Traceback (most recent call last):


File "<stdin>", line 1, in ?
ValueError: I/O opera>on on closed le
11. Mdulos E/S e Arquivos em Python
Mdulo pickle

Strings podem ser facilmente escritas e lidas de um arquivo. Nmeros exigem um


pouco mais de esforo, uma vez que o mtodo read() s trabalha com strings.
Portanto, pode ser u>lizada a funo int(), que recebe uma string 123 e a converte
para o respec>vo valor inteiro. Entretanto, quando estruturas de dados mais
complexas (listas, dicionrios, instncias de classe,etc) esto envolvidas, o processo
se torna mais complicado.
11. Mdulos E/S e Arquivos em Python
Mdulo pickle

Para que no seja necessrio que usurios estejam constantemente escrevendo e


depurando cdigo que torna estruturas de dados persistentes, Python oferece o
mdulo padro pickle.
Este mdulo permite que pra>camente qualquer objeto Python (at mesmo cdigo!)
seja conver>do para uma representao string. Este processo denominado pickling.

E unpickling o processo reverso de reconstruir o objeto a par<r de sua representao


string. Enquanto es>ver representado como uma string, o objeto pode ser
armazenado em arquivo, transferido pela rede, etc.
Se voc possui um objeto qualquer x, e um objeto arquivo f que foi aberto para
escrita, a maneira mais simples de u>lizar este mdulo :
pickle.dump(x, f)
Para desfazer, se f for agora um objeto de arquivo pronto para leitura:
x = pickle.load(f)

Programa56.py programa57.py
11. Mdulos E/S e Arquivos em Python
Mdulo pickle

Para que no seja necessrio que usurios estejam constantemente escrevendo e


depurando cdigo que torna estruturas de dados persistentes, Python oferece o
mdulo padro pickle.
Este mdulo permite que pra>camente qualquer objeto Python (at mesmo cdigo!)
seja conver>do para uma representao string. Este processo denominado pickling.

E unpickling o processo reverso de reconstruir o objeto a par<r de sua representao


string. Enquanto es>ver representado como uma string, o objeto pode ser
armazenado em arquivo, transferido pela rede, etc.
Se voc possui um objeto qualquer x, e um objeto arquivo f que foi aberto para
escrita, a maneira mais simples de u>lizar este mdulo :
pickle.dump(x, f)
Para desfazer, se f for agora um objeto de arquivo pronto para leitura:
x = pickle.load(f)

Programa56.py programa57.py
Exerccios Propostos

1. Use uma lista ligada ou uma rvore binria para gravar um banco de dados
qualquer em seu computador. Os dados devem ser gravados e recuperados em
arquivos.

2. Leia sobre Bancos de Dados relacionais na Internet e use dicionrios para guardar
tabelas relacionais. Aprenda como inserir dados nesta tabela e como realizar
pesquisasa. Lembrando que estes dados devem ser gravados permanentemente
em arquivos.

3. Estude uma forma de esconder mensagens em uma imagem ( jpeg, gif, etc, ou
outro >po de arquivo e implemente em Python.
FIM DA AULA 11
AULA 12 Excees
AULA 12 Excees

Erros durante a execuo do programa


que normalmente interrompem a sua
sequncia natural.
AULA 12 Excees

Diviso por Zero

>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
AULA 12 Excees

Varivel Inexistente

>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name spam is not dened
AULA 12 Excees

Impossvel Concatenar Tipos Diferentes


>>> 2 + 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: cannot concatenate str and int objects

As excees podem ser tratadas evitando que o


programa seja interrompido de forma que se tente
contornar a situao de erro.
AULA 12 Excees

As excees podem ser tratadas evitando


que o programa seja interrompido de
forma que se tente contornar a situao
de erro.
AULA 12 Excees
Construo try except.

>>> while True:


... try:
... x = int(raw_input("Entre com um nmero: "))
... break
... except ValueError:
... print "Opa! Esse nmero no vlido. Tente de novo...
AULA 12 Excees
Construo try except. Primeiro a clusula Try
executada!
>>> while True:
... try:
... x = int(raw_input("Entre com um nmero: "))
... break
... except ValueError:
... print "Opa! Esse nmero no vlido. Tente de novo...
AULA 12 Excees
Construo try except.

>>> while True:


... try:
... x = int(raw_input("Entre com um nmero: "))
... break
... except ValueError:
... print "Opa! Esse nmero no vlido. Tente de novo...

Se no ocorrer exceo a
clusula except ignorada.
AULA 12 Excees
Construo try except.

>>> while True:


... try:
... x = int(raw_input("Entre com um nmero: "))

Se ocorrer exceo em um comando da
clusula Try, os comandos
... break remanescentes so ignorados.
except ValueError:
... print "Opa! Esse nmero no vlido. Tente de novo...
AULA 12 Excees
Construo try except.
>>> while True:
... try:
... x = int(raw_input("Entre com um nmero: "))
... Break
Se o >po da exceo ocorrida >ver sido
previsto junto a alguma palavra-reservada
except, ento essa clusula ser
executada. O m da clusula tambm
termina a execuo do try.
except ValueError:
... print "Opa! Esse nmero no vlido. Tente de novo...
AULA 12 Excees
Construo try except.
>>>
Try:
while True:
... try:
... x = int(raw_input("Entre com um nmero: "))
... Break
except ValueError:
... print "Opa! Esse nmero no vlido. Tente de novo...
except Excep>on:
Se a exceo ocorrida no foi prevista em
nenhum tratador except da construo try
em que ocorreu, ento ela entregue a
uma construo try mais externa.
AULA 12 Excees
Construo try except.
>>>
Try:
while True:
... try:
... x = int(raw_input("Entre com um nmero: "))
... Break
except ValueError:
... print "Opa! Esse nmero no vlido. Tente de novo...
except Excep>on Se no exis>r nenhum tratador previsto
para tal exceo (chamada unhandled
excep<on), a execuo encerra com uma
mensagem de erro.
AULA 12 Excees
Try pode ter ml>plos excepts.
import sys
try:
Argumentos passados ao tratamento da
f = open(myle.txt) exceo.
s = f.readline()
i = int(s.strip())
except IOError, (errno, strerror):
print "I/O error(%s): %s" % (errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0] re-levanta a exceo
raise desconhecida
AULA 12 Excees
Clusula else (opcional) >l para um cdigo que precisa ser
executado se nenhuma exceo foi levantada.
Argumentos passados
for arg in sys.argv[1:]: pelo S.O.
try:
f = open(arg, r)
except IOError:
print cannot open, arg
else:
print arg, has, len(f.readlines()), lines
f.close()
AULA 12 Excees
>>> try:
... raise Excep>on(spam, eggs)
A clusula except pode especicar
... except Excep>on, inst:
uma varivel depois do nome (ou
...
da tupla de nomes) exceo
Funo t ype retorna o >po da varivel

print type(inst) # Instncia da exceo


... print inst.args # Argumentos armazenados em .args
Acesso aos dados via args
... print inst # __str__ permite a impresso direta dos argumentos
... x, y = inst # __ge>tem__ permite o desempacotamento dos argumentos
... print x =, x
... print y =, y
<type instance> A varivel ser uma instncia com
(spam, eggs) argumentos acessveis atravs do
(spam, eggs) __str__ e __ge>tem__
x = spam
y = eggs
AULA 12 Excees
>>> def this_fails():
... x = 1/0 Tratadores de exceo so capazes
... de capturar excees que tenham
sido levantadas no interior de
funes invocadas na clusula try.
>>> try:
... this_fails()
except ZeroDivisionError, detail:
... print Handling run->me error:, detail
...
AULA 12 Excees

Levantando Excees

>>> raise NameError, HiThere A palavra-reservada raise permite


Traceback (most recent call last):
File "<stdin>", line 1, in ?
ao programador forar a
NameError: HiThere ocorrncia de um determinado
>po de exceo.
AULA 12 Excees
Levantando Excees
>>> try:
... raise NameError, HiThere
... except NameError:
... print An excep>on ew by! Caso voc precise determinar se
... raise uma exceo foi levantada ou
... no, mas no quer manipular o
An excep>on ew by! erro, uma forma simples de raise
Traceback (most recent call last): permite que voc levante-a
File "<stdin>", line 2, in ? novamente.
NameError: HiThere
AULA 12 Excees
Excees Denidas pelo Usurio
Programas podem denir novos
>>> class MyError(Excep>on):
... def __init__(self, value):
>pos de excees, atravs da
... self.value = value criao de uma nova classe.
... def __str__(self): Devem ser subclasses da classe
... return repr(self.value)
>>> try:
Excep>on, direta ou
... raise MyError(2*2) indiretamente:
except MyError, e:
... print My excep>on occurred, value:, e.value
My excep>on occurred, value: 4
>>> raise MyError, oops!
Traceback (most recent call last):
File "<stdin>", line 1, in ?
__main__.MyError: oops!
AULA 12 Excees

>>> try:
... raise KeyboardInterrupt A construo try possui outra
... nally: clusula opcional, cuja nalidade
... print Goodbye permi>r a implementao de
... aes de limpeza,
Goodbye, world! que sempre devem ser executadas
Traceback (most recent call last): independentemente da
File "<stdin>", line 2, ? ocorrncia de excees
KeyboardInterrupt

Programa59.py
AULA 12 Excees Disparadas
Asser>onError

Disparada na falha do comand assert. (u>lizado para insero de informaes de


debug)

A|ributeError

Disparada quando uma referncia a um atributo ou atribuio falha.

EOFError

Disparada quando uma funo de entrada (input() ou raw_input() ) encontra o m


do arquivo sem ter lido qualquer dado.
AULA 12 Excees Disparadas
Floa>ngPointError

Disparada na falha de operaes de ponto utuante.

GeneratorExit

Disparada quando o mtodo close de um generator chamado


(Tecnicamente no um erro)

IOError

Disparada devido a falha de operao de E/S (arquivo n no


encontrado, disco cheio, etc)
AULA 12 Excees Disparadas
ImportError

Disparada quando um comando import falha em encontrar a


denio do mdulo ou o nome que est sendo importado.

IndexError

Disparada quando um ndice est fora dos limites.

KeyError

Disparada quando uma chave de dicionrio no encontrada.


AULA 12 Excees Disparadas
KeyboardInterrupt

Disparada quando o usurio interrompe a execuo (Control-C


ou Delete)

MemoryError

Disparada quando uma operao a>nge seu limite de memria

NameError

Disparada quando um nome global ou local no encontrado.


AULA 12 Excees Disparadas
NotImplementedError

Disparada por mtodos abstratos que requisitam que as classes


derivadas sejam implementadas.

OSError

Disparada quando uma funo recebe erros do sistema.

OverowError

Disparada quando o resultado de uma operao aritm>ca


muito grande para ser representado.
AULA 12 Excees Disparadas
ReferenceError

Disparada quando um proxy tenta acessar um atributo j


apagado da memria. (Ver mdulo weakref)

Run>meError

Disparada quando um erro ocorrido no se classica em


nenhuma categoria.

StopItera>on
Disparada por um mtodo next() de um iterador para sinalizar
que no h mais valores adicionais.
AULA 12 Excees Disparadas
SyntaxError

Disparada quando o parser (analisador do fonte) encontra um


erro de sintaxe.

SystemError

Disparada quando o interpretador encontra um erro interno.

SystemExit

Disparada automa>camente pela funo sys.exit()


AULA 12 Excees Disparadas
TypeError

Disparada quando uma operao ou uma funo aplicadaa um


objeto de um >po errado. (mul>plicar strings por exemplo)

UnboundLocalError

Referencia feita a uma varivel local sem valor associado

UnicodeError

Disparada quando um erro de codicao ou decodicao


Unicode ocorre. Suas descendentes so: UnicodeEncodeError,
UnicodeDecodeError, UnicodeTranslateError
AULA 12 Excees Disparadas
ValueError

Disparada quando uma operao ou funo recebe um


argumento que tem o >po certo, mas um valor incorreto.

VMSError

Disparada quando um erro especco o VMS ocorre.

WindowsError

Disparada na presena de erros especcos do Windows


AULA 12 Excees Disparadas
ZeroDivisionError

Disparada quando o denominador de uma diviso ou de um


mdulo (resto de diviso) zero

Warning

Serve de classe base para todos os Warnings (Advertncias)

UserWarning

Classe base para warnings gerados pelo cdigo do usurio


AULA 12 Excees Disparadas
Depreca>onWarning

Classe base para advertncias (warnings) sobre funcionalidades


obsoletas da linguagem.

PendingDepreca>onWarning

Classe base para advertncias acerca de funcionalidades que


sero descon>nuadas no futuro (obsoletas)

SyntaxWarning

Classe base para advertncias acerca da sintaxe dbia


AULA 12 Excees Disparadas
Run>meWarning
Classe base para advertncias acerca do comportamento dbio
em tempo de execuo
FutureWarning
Classe base para advertncias acerca de construes que
mudaro de signicado no futuro.
ImportWarning
Classe base para advertncias acerca de erros em importao de
mdulos
UnicodeWarning
Classe base para advertncias relacionadas ao Unicode.
AULA 12 Pausa
Geradores: Funes com memria.

Uma funo normal:

def f():
< Instrues >
return <Valor> # Valor retornado uma s vez.

x = f() # valor retornado para x e apagado
AULA 12 Pausa
Geradores: Funes com memria.

Um gerador:

def f():
< Instrues >
yield <Valor> # Valor retornado e dados so preservados

x = f() # a varivel x associada a funo

y = x.next() # os dados gerados so retornados a medida que a


funo next() chamada explicitamente ou implicitamente.
AULA 12 Pausa
Um gerador:

def f(i=0,limite=0):
while i <= limite:
i += 1
yield i # Valor retornado no meio de um lao
# Isto signica que a prxima chamada a next()
# con>nuar o lao

x = f(0,10) # a varivel x associada a funo
y = x.next()
k = f(1,10) Um gerador retorna um iterador.

for z in k: print z
AULA 12 Curiosidade

Clculo do Pi
h|p://pt.wikipedia.org/wiki/Pi#M.C3.A9todos_de_c.C3.A1lculo

Mtodo Clssico

Mtodo Estas>co

Mtodos das Sries Innitas

Mtodos numricos (aproximaes sucessivas)


AULA 12 Curiosidade
Mtodo Clssico

= comprimento da circunferncia ( permetro do polgono) / dimetro


para n (num de lados) innito. Da temos:
AULA 12 Curiosidade
Mtodo Estas>co
Dado o conjunto de pontos aleatoriamente
Colocado no quarto de circulo.

(4 * Pontos Incritos)/total

Explicao: Imagine que cada ponto seja


um dardo lanado contra o quarto de circulo
a probabilidade de cair dentro proporcional
as razes das reas que por sua vez dependem do

AULA 12 Curiosidade

Mtodo Srie Innita de Leibnitz

Programa62.py Programa63.py
AULA 12 Curiosidade
Transformao de van Wijngaarden

Programa64.py
AULA 12 Curiosidade

Valor de Pi
3.141592653589793238462643383279502884197169399375105820974944592307816
40628620899862803482534211706798214808651328230664709384460955058223172
53594081284811174502841027019385211055596446229489549303819644288109756
65933446128475648233786783165271201909145648566923460348610454326648213
39360726024914127372458700660631558817488152092096282925409171536436789
2590360011330530548820466521384146951941511609...
Fim da Aula 12
Aula 13 rvores 2-3-4
rvore Binria:

Um n contm uma informao bsica


(1 item de dado) e pode ter at dois lhos.
rvore Mul@vias (mul>way tree):

Admite mais de um >po de dado e mais de


dois caminhos (lhos).
rvore 2-3-4 (Mul>vias de Ordem 4)
Um n com trs itens Cada n possui de 1
de dados possui 4 50 70 95 a trs itens de
lhos dados.

30 35 55 78 100 105

As folhas sempre esto no mesmo nvel nal e podem conter


at 3 itens de dados.
rvore 2-3-4 (Mul>vias de Ordem 4)

Um n com um item de
dado possui dois lhos 50

30 50

Um n com dois itens


de dados possui 50 70
trs lhos

30 35 55 78
rvore 2-3-4 (Mul>vias de Ordem 4)

No admite ns vazios

No admite ns com
um s lho

50

40
13. rvores 2-3-4

Exemplo de rvore 2-3-4. Fonte: Lafore, Robert Data Structures and Algorithms in Java
13. rvores 2-3-4
Organizao da rvore:
13. rvores 2-3-4
Pesquisando em uma rvore 2-3-4:
Similar pesquisa binria. Inicia com a raiz. Selecionar o link que leva a soluo
repe>ndo a operao recursivamente at encontrar o valor.
64

>50

60 < 64 <70
13. rvores 2-3-4
Inserindo em uma rvore 2-3-4:
.

Novos dados so inseridos sempre nas


folhas que se localizam no l>mo ramo da
rvore.
13. rvores 2-3-4
Inserindo em uma rvore 2-3-4:
Se o dado fosse inserido em um n com lhos, isto implicaria na mudana do nmero
de lhos do mesmo para manter a regra de que o nmero de lhos igual ao nmero
de dados + 1
13. rvores 2-3-4
Inserindo em uma rvore 2-3-4:

No caso mais simples o dado inserido em ns no completamente preenchido


13. rvores 2-3-4
Inserindo em espaos vazios

Caso haja um n completo anterior ao ponto de insero este dever ser dividido.
exatamente o processo de diviso que mantm a rvore balanceada. Ns so divididos
no caminho de busca do ponto de insero.
13. rvores 2-3-4
Diviso de um n no-raiz

Considerando os dados A,B,C de um n no raiz a ser


dividido.

A B C
13. rvores 2-3-4

Diviso de um n no-raiz

a)Cria-se um n irmo do que est sendo dividido e


colocado sua direita

A B C
13. rvores 2-3-4

Diviso de um n no-raiz

b) O C movido para o este n

A B C
13. rvores 2-3-4

Diviso de um n no-raiz

c) O B movido para o pai do n sendo dividido

A C
13. rvores 2-3-4

Diviso de um n no-raiz

d) O A permanece onde estava.

A C
13. rvores 2-3-4

Diviso de um n no-raiz
e) Os dois lhos direita so desconectados do n a ser
dividido e conectados no n novo.

A C
13. rvores 2-3-4
Diviso de um n no-raiz
13. rvores 2-3-4
Diviso de um n no-raiz

Esse processo deve ser repe>do para cada n totalmente preenchido onde seja
necessrio inserir dados
13. rvores 2-3-4
Diviso da raiz
Cria-se um novo n raiz que ser o pai da an>ga raiz que ser
dividida
Cria-se outro n que ser irmo do n a ser dividido
O C movido para o irmo recm-criado
O B movido para a nova raiz
O A permanece
Os dois ns mais direita so desconectados do n em
processo de diviso e reconectados ao n direito recm-criado.
13. rvores 2-3-4
Diviso da raiz
13. rvores 2-3-4
Diviso da raiz
13. rvores 2-3-4
Quadro Geral

a) Insero normal b) Nova insero com diviso da raiz c) Insero normal


d) Insero com diviso de folha e) Insero com diviso de folha
13. rvores 2-3-4
Quadro Geral

f) Insero com diviso de folha g) Resultado da insero

Programa65.py
13. rvores 2-3-4
Relao com rvores
Vermelho-Pretas
13. rvores 2-3-4
Ecincia.

Tempo de busca :

Aproximadamente equivalente as arvores vermelho-pretas (O(Log(N))

Aplicaes em armazenamento externo


13. rvores 2-3-4
Exerccios:

1. Pesquise na literatura outras rvores semelhantes (B-Trees por exemplo) e suas


relaes
2. Verique as aplicaes em armazenamento externo. Como estas rvores podem
ser usadas para acesso e gravao de dados em discos
3. Faa um programa para selecionar o menor ou maior elemento de uma rvore
234
4. Modique o programa dado para imprimir a rvore na forma (em-ordem)
ordenada
Fim da Aula 13
Aula 14 Tabelas Hash
14. Tabelas Hash

Uma estrutura de dados cujo tempo de busca /


insero da ordem O(1).

(No importa do tamanho)


14. Tabelas Hash

Muito bom para ser verdade?


14. Tabelas Hash

So fceis de programar ...


14. Tabelas Hash
... , mas tem desvantagens:

so baseadas em matrizes (arrays) diceis de serem


expandidas dinamicamente na maioria das linguagens
o programador precisa ter uma boa idia do tamanho
do conjunto de dados a armazenar ou estar preparado
para redimension-la quando necessrio
no h uma boa maneira de visitar os valores em
forma ordenada
14. Tabelas Hash
porm ....

Se voc conhece o tamanho dos dados e no se


interessa em visit-los de forma ordenada, tabelas hash
so incomparavelmente melhor que outros mtodos.
14. Tabelas Hash

Que hashing?!!

Transformao de valores numricos ou


alfanumricos (chaves) em ndices. Estes ndices so
usados para armazenar ou recuperar informaes.
A funo que faz isso chamada funo hash.
14. Tabelas Hash
Aplicao 1 : Dicionrio de Ingls.

Palavra[1] = a

Palavra[n] = zyzzvya
14. Tabelas Hash
Convertendo palavras em nmeros.

Palavras[43 ] = CATS
14. Tabelas Hash
Ento calculamos os ndices:
a Palavra[1]
.....
.....
..... Palavra[50000]
zzzzzzzzzzzzzz

Redundncias no clculo do Hash:

was = 23 + 1 + 19 = 43
>n = 20 + 9 + 14 = 43
give = 7 + 9 + 22 + 5 = 43
tend = 20 + 5 + 14 + 4 = 43
moan = 13 +15+1+14 = 43
>ck = 20+9+3+11 = 43
14. Tabelas Hash
Colocando pesos nas posies:

Notao posicional

3456 = 3 * 1000 + 4 * 100 + 5 * 10 + 6 * 1

3456 = 3 * 103 + 4 * 102 + 5 * 101 + 6 * 100

Usando a mesma estratgia:

was = 23 *272 + 1 *271+ 19*270 = 16813


>n = 20 *272 + 9*271 + 14*270 = 14827
give = 7 *273+ 9*272 + 22*271 + 5*270 = 144941
tend = 20 *273+ 5*272 + 14*271 + 4*270 = 397687
moan = 13 *273+15*272+1*271+14*270 = 404636
>ck = 20*273+9*272+3*271+11*270 = 400313
14. Tabelas Hash
Colocando pesos nas posies:

Problema: Os valores comeam a car muito grandes.

zzzzzzzzzz por exemplo seria :

26*279+ 26*278+ 26*277+ 26*276+ 26*275+ 26*274+ 26*273+ 26*272+ 26*271+ 26*270

A matriz para guardar esse dicionrio deveria ter mais do que 279 ( > 7000000000000)
posies (ndices)

Muitas destas posies seriam reservadas para strings que no formam palavras. Ex.
aaaa, bbbbbb, ccccccc, abababa, etc
14. Tabelas Hash
Connando valores

0
1 0
2 1
3 2
4 3
5 4
6
7

199 Usar o mdulo (resto da diviso)


200 Qualquer Nmero % 5 ter como resultado
um valor de 0 a 4
201
14. Tabelas Hash
Problema: No h mais garan@as que dois elementos dis@ntos usem o mesmo
ndice.(Coliso)

Blablabla
desmys>fy meliora>on
...

Duas solues
-Endereamento aberto (open addressing)
-Encadeamento separado (separate chaining)
14. Tabelas Hash
Endereamento Aberto
Quando um item no pode ser colocado na posio calculada, outro
posio localizada para o mesmo.

Posio original
Blablabla
desmys>fy meliora>on
...

Posio Livre
14. Tabelas Hash
Endereamento Aberto

Busca linear (Linear Probing)


Busca quadrtrica (Quadra>c Probing)
Duplo Hashing (double hashing)
14. Tabelas Hash
Busca Linear: (Insero)
Posio original
Blablabla
desmys>fy meliora>on
...

Procura Posio Livre


seqencialmente
uma posio vazia
14. Tabelas Hash
Busca Linear: (Busca) Procura meliora>on na
posio do hash.

Blablabla
desmys>fy
Procura seqencialmente
blablabla nas prximas posies
blublublu
Meliora>on

Tritritr Busca Bem


Sucedida
14. Tabelas Hash
Busca Linear: (Busca) Procura meliora>on na
posio do hash.

Blablabla
desmys>fy
Procura seqencialmente
blablabla
nas prximas posies
blublublu

Tritritr Busca mal


sucedida.
14. Tabelas Hash
Busca Linear: (Deleo) Procura meliora>on na
posio do hash.

Blablabla
desmys>fy
Procura seqencialmente
blablabla
nas prximas posies
blublublu
(DELETED)

Tritritr Encontra e
Marca como
Deletado
14. Tabelas Hash
Recomendaes
- Algumas Implementaes no aceitam deleo.
- A deleo deve ser usada eventualmente pois reduz
a ecincia das tabelas hash.
- Normalmente no se deve admi>r valores duplicados
- Deve-se dimensionar a tabela hash como do dobro
da previso do tamanho e no se usar mais que 2/3 de
seu tamanho.

Programa66.py
14. Tabelas Hash
Quadra@c Probing (Explorao Quadr@ca)

desmys>fy
A insero por meio de Blasber
explorao linear tende a Blabluk
criar clusters longos.
Tregs
Bristols
14. Tabelas Hash
Quadra@c Probing (Explorao Quadr@ca)

desmys>fy
Itens que deveriam estar
Blasber
no meio do cluster fazem-
no crescer mais e mais Blabluk
rpido Tregs
Bristols
14. Tabelas Hash
Quadra@c Probing (Explorao Quadr@ca)

FATOR DE CARGA
desmys>fy
Blasber
Nmero de itens
Blabluk
Tregs
Bristols
Tamanho da Matriz
14. Tabelas Hash
Quadra@c Probing (Explorao Quadr@ca)

desmys>fy
Clusters tendem a ser formar
Blasber
mesmo quando o fator de carga
baixo. Blabluk
Tregs
Bristols
14. Tabelas Hash
Quadra@c Probing (Explorao Quadr@ca)

Explorao quadr>ca tende a desmys>fy


evitar a formao de grandes Blasber
clusters. Blabluk
Tregs
Bristols
14. Tabelas Hash
Quadra@c Probing (Explorao Quadr@ca)

Faz-se isso evitando o desmys>fy


preenchimento sequencial (linear) Blasber
das clulas. Blabluk
Tregs
Bristols
14. Tabelas Hash
Quadra@c Probing (Explorao Quadr@ca)
Explorao Linear
Posio de Insero (hash) = x
Prximas posies
x+1, x + 2, x + 3, ....

Explorao Quadr>ca
Posio de Insero (hash) = x
Prximas posies
x+12, x + 22, x + 32, ....
14. Tabelas Hash
Explorao Procura meliora>on na
Quadr@ca (Busca) posio do hash.

Blablabla
desmys>fy
1 Procura quadra>camente
blablabla
4 nas prximas posies

9 Tritritr

Meliora>on
Busca Bem
Sucedida
14. Tabelas Hash
Explorao Procura meliora>on na
Quadr@ca (Busca) posio do hash.

Blablabla
desmys>fy
1 Procura quadra>camente
blablabla
4 nas prximas posies

9 Tritritr

Busca mal
Sucedida
14. Tabelas Hash
Quadra@c Probing (Explorao Quadr@ca)

Problema:

Todos os dados com o mesmo hash seguiro a mesma sequncia e


formaro o que se chama cluster secundrio (No connuo).
14. Tabelas Hash
Duplo Hashing

Evita clusters primrios e secundrios. Fazendo um hash pela


segunda vez com uma diferente funo hash.
14. Tabelas Hash
Caracters@cas da Funo Hash Secundria
No deve ser igual a funo de hash primria
No deve nunca ter sada zero

Funo que funciona:


Tamanho do deslocamento = constante (chave % constante)

Constante um nmero primo menor que o


tamanho da matriz.
Programa67.py
14. Tabelas Hash
Porque Um nmero Primo?
Imagine que o tamanho da matriz seja 20.
Para uma constante 5 e um Hash incial 0 a lista de clulas
consultadas ser:
0 5 10 15 0 5 10 15 .............. Repe>damente.

A mesma lista com tamanho 17 seria:


0 5 10 15 3 8 13 1 6 11 ........ Sem repe>r
14. Tabelas Hash
Duplo Hashing

Escolha freqente para endereamento aberto!

Programa67.py
14. Tabelas Hash
Encadeamento Separado (Separate Chaining)
Listas ligadas.

0 440 375

1 210 1040 370

2 98 34

3 VAZIO

4 21 18 13

5 VAZIO
14. Tabelas Hash
Encadeamento Separado (Separate Chaining)
Fator de carga pode ser maior que 1.

Desempenho cai com aumento de itens nas listas.

Duplicados so permi>dos

Tamanho primo no obrigatrio em todos os casos

Insero e deleo normalmente feita nas listas


Fim da Aula 14
15. Heaps
15. Heaps

Heap uma rea de memria usada para


alocao dinmica de dados em linguagens
como C++ e Java.
15. Heaps

uma rvore binria com as seguintes


caracters>cas:
15. Heaps

a) Completa. Todas as linhas preenchidas com


exceo da l>ma.

Completa Incompleta
15. Heaps
b) Normalmente implementada como uma matriz
0 100
1 100
90
2 80 0
3 30
90 80
4 60
1 2
5 50
6 70 30 60 50 70
7 20 3 4 5 6
8 10
20 10 40 55
9 40
7 8 9 10
10 55
15. Heaps

c) Todos os ns devem estar de acordo com a


Condio de Heap: As chaves de cada n
devem ser maior ou igual a de seus lhos.
15. Heaps

Heap uma representao conceitual de uma


matriz cujos elementos so manipulados segundo
este modelo.
15. Heaps

Heap uma representao conceitual de uma


matriz cujos elementos so manipulados segundo
este modelo.
15. Heaps

Dicil atravessar um heap na ordem (in order)


porque o heap no ordenado, entretanto o
caminho da raiz at as folhas descendente.
15. Heaps

A raiz possui o maior valor.


15. Heaps

>l para a implementao de las de prioridades.


(Usadas em diversas aplicaes, por exemplo em
escalonamento (Scheduling))
15. Heaps

>l para a implementao de las de prioridades.


(Usadas em diversas aplicaes, por exemplo em
escalonamento (Scheduling))
15. Heaps

..., mas no permite a busca rpida de um


elemento pois no d informaes sobre que
caminho seguir na busca. Isto signica que temos
que visitar a rvore inteira na busca de um
elemento. O(n)
15. Heaps

Pra que usar?


15. Heaps

Heaps permitem a rpida eliminao do maior


valor e rpida insero de novos elementos.

(Ideal para las de prioridades)


15. Heaps

Como remover o maior elemento?


0 100
Maior elemento = ma>z[0]
1 90
2 80
3 30
Abordagem 1: 4 60
Deslocar a lista D pra fazer
inteira pra cima 5 50 mais rpido?
6 70
7 20
8 10
9 40
10 55
15. Heaps

Como remover o maior elemento?


0 100
Maior elemento = ma>z[0]
1 90
2 80
3 30
Abordagem 1: 4 60
Deslocar a lista D pra fazer
inteira pra cima 5 50 mais rpido?
6 70
7 20
8 10
9 40
10 55
15. Heaps

Como remover o maior elemento?


N a ser removido.
95

51
82

70 37 10
63

43 27 55 34 30 l@mo N
15. Heaps

Como remover o maior elemento?

30

51
82 Permuta

70 37 10
63

43 27 55 34
15. Heaps

Como remover o maior elemento?

82

51
30
Permuta

70 37 10
63

43 27 55 34
15. Heaps

Como remover o maior elemento?

82

51
70

30 37 10
63 Permuta

43 27 55 34
15. Heaps

Como remover o maior elemento?

82

51
70

55 37 10
63

43 27 30 34
Fim do processo com
apenas 4 permutaes.
15. Heaps

Como inserir um elemento?

82

51
70

55 37 10
63

43 27 30 34
95 A ser inserido.
15. Heaps

Como inserir um elemento?

82

51
70

55 37 10
63
Permuta

43 27 30 34 95
15. Heaps

Como inserir um elemento?

82

51
70 Permuta

55 95 10
63

43 27 30 34 37
15. Heaps

Como inserir um elemento?

82

Permuta 95
70

55 51 10
63

43 27 30 34 37
15. Heaps

Como inserir um elemento?

95

82
70

55 51 10
63

43 27 30 34 37

Insero concluda.
15. Heaps

Permutaes e Permutaes.

A
Permuta Cpias A
Cpia
TEMP
Permuta B A Cpia B
Cpia

Permuta C
Cpia C
3 Permutaes = 9 Cpias Cpia A
D
D
Idem com 5 Cpias
15. Heaps

Relembrando Detalhes
0 100
90 100
1
2 80 0
3 30
90 80
4 60
50 1 2
5
6 70 30 60 50 70
7 20 3 4 5 6
8 10
20 10 40 55
9 40
7 8 9 10
10 55

Dado um n cuja posio x na matriz, qual a posio do pai,


do lho direito e do lho esquerdo?
15. Heaps

Relembrando Detalhes
0 100
1 90 Repostas:
2 80
3 30 pai = ( x-1 ) /2
4 60 Filho esquerdo = 2 * x + 1
5 50 Filho direito = 2 * x + 2
6 70
7 20
8 10
9 40
10 55
15. Heaps

Abrindo o cdigo
Inserindo dados

def inserir(self,chave):
if self.tamanhoAtual == self.tamanhoMaximo:
return False
novoNoh = Noh(chave)
self.matrizHeap[self.tamanhoAtual] = novoNoh
self.borbulhaAcima(self.tamanhoAtual)
self.tamanhoAtual +=1
return True
15. Heaps

Abrindo o cdigo
Borbulhamento pra cima
def borbulhaAcima(self, indice):
pai = (indice-1)/2
base = self.matrizHeap[indice]
while indice > 0 and self.matrizHeap[pai].obtemChave() <
base.obtemChave():
self.matrizHeap[indice] = self.matrizHeap[pai]
indice = pai
pai = (pai -1 )/2
self.matrizHeap[indice] = base
15. Heaps

Abrindo o cdigo
Remover Raiz
def removerMaior(self):
raiz = self.matrizHeap[0]
self.tamanhoAtual -= 1
self.matrizHeap[0]= self.matrizHeap[self.tamanhoAtual]
self.borbulhaAbaixo(0)
return raiz
15. Heaps
Borbulhamento Abaixo
def borbulhaAbaixo(self,indice):
topo = self.matrizHeap[indice]
while indice < self.tamanhoAtual/2:
lhoEsquerdo = 2 * indice +1
lhoDireito = lhoEsquerdo + 1
if lhoDireito < self.tamanhoAtual and
self.matrizHeap[lhoEsquerdo].obtemChave()
< self.matrizHeap[lhoDireito].obtemChave():
lhoMaior = lhoDireito
else:
lhoMaior = lhoEsquerdo
if topo.obtemChave() >= self.matrizHeap[lhoMaior].obtemChave(): break
self.matrizHeap[indice] = self.matrizHeap[lhoMaior]
indice = lhoMaior
self.matrizHeap[indice]= topo
15. Heaps

Abrindo o cdigo
Trocando o valor de um elemento
def troca(self,indice,novoValor):
if indice < 0 or indice >= self.tamanhoAtual: return False
valorAn>go = self.matrizHeap[indice].obtemChave()
self.matrizHeap[indice].atribuiChave(novoValor)
if valorAn>go < novoValor:
self.borbulhaAcima(indice)
else:
self.borbulhaAbaixo(indice)
return True
15. Heaps

Abrindo o cdigo

Programa69.py
15. Heaps

Expandindo o Heap

Linguagens como C ou Java podem apresentar


problemas na expanso da matriz caso seja
necessria. Voc teria que construir uma
estrtura que permi>sse o crescimento ou usar
novos >pos (Vector em Java)
15. Heaps

Expandindo o Heap

O Tipo lista em Python (que usado para criar


matrizes) dinmico, naturalmente expansvel
com o append. Portanto, pode ser expandido
naturalmente
15. Heaps

Expandindo o Heap

Voc pode reescrever o programa aqui


mostrado de forma a usar melhor os recursos
do Python sem limitar o tamanho da matriz do
heap.
15. Heaps

HeapSort

Mtodo simples e eciente de ordenamento.


15. Heaps

HeapSort

Idia Bsica:

a) Inserir os elementos em um Heap


b) Remover os elementos a par>r da raiz um a um.
15. Heaps

HeapSort

for j in range(tamanho):
heap.inserir( matrizBruta[j] )
for j in range(tamanho):
matrizOrdenada[j] = heap.remover()
15. Heaps

Ecincia do HeapSort

Operao Insert: O(log(N))


Operao remove: O(log(N))

A funo HeapSort trabalha N vezes ou seja O


(N*Log(N))
15. Heaps

Melhorando o Borbulhamento na Insero.

Idia:
Ao invs de inserir e borbulhar cada elemento, inserimos o
elemento em uma posio qualquer e borbulhamos tudo de uma
vez.

Ganho:

Reduo do tempo (N/2 aplicaes do borbulhamento abaixo na


insero)
15. Heaps

Melhorando o borbulhamento na Insero.


Idia: Sub-heaps corretos ajudam a compor heaps corretos.
95

82
70

55 51 10
63

43 27 30 34
15. Heaps

Por onde comear?


Idia: No necessrio aplicar o borbulhamento abaixo nas
folhas. 95

82
70

55 51 10
63

43 27 30 34
15. Heaps

Por onde comear?


Idia: No necessrio aplicar o borbulhamento abaixo nas
folhas. 95

82
70

55 51 10
63

INICIAR em N/2 - 1
43 27 30 34
11/2 - 1 = 4
15. Heaps

Nova funo
A nova ro@na de borbulhamento abaixo seria algo do @po:

I = N/2 1
while (I>=0):
heap.borbulhaAbaixo(I)
I -= 1
15. Heaps

Forma recursiva
A nova ro@na de borbulhamento abaixo seria algo do @po:

def organizaHeap(indice):
if indice > N/2 - 1:
return # nada a fazer
organizaHeap(indice*2 + 2)
organizaHeap(indice*2 + 1)
borbulhaAbaixo(indice)

Obs: Menos eciente que o lao simples.


15. Heaps

Usando matriz nica

Na forma atual usamos uma matriz para o heap (inserindo


elementos ) e outra matriz com os elementos re@rados do heap
de forma ordenada.

possvel economizar memria???


15. Heaps

Usando matriz nica

Dado um heap.

50 50
30 30
40 40
10 10
20 20
15. Heaps

A re>rada de um elemento (50) cria um vazio.

Dado um heap.

40 40
30 30
20 20
10 10
---
15. Heaps

Que pode ser preenchido com o elemento re>rado

Dado um heap.

40 Heap 40
30 30
20 20
10 10
50
Matriz Ordenada
15. Heaps

Da mesma forma para o prximo elemento.

Dado um heap.

30 Heap 30
10 10
20 20
--
50
Matriz Ordenada
15. Heaps

Que igualmente preenchido.

Dado um heap.

30 Heap 30
10 10
20 20
40
50
Matriz Ordenada
15. Heaps

Repe>ndo

Dado um heap.

20 Heap 20
10 10
--
40
50
Matriz Ordenada
15. Heaps

Repe>ndo

Dado um heap.

20 Heap 20
10 10
30
40
50
Matriz Ordenada
15. Heaps

Finalizando ...

Dado um heap.

10 Heap 10
--
30
40
50
Matriz Ordenada
15. Heaps

Finalizando ...

Dado um heap.

10 Heap 10
20
30
40
50
Matriz Ordenada
15. Heaps

Finalizando ...

Construmos uma matriz ordenada.

10
20
30 Matriz Ordenada
40
50

Programa70.py
15. Heaps

Resumindo...
Um heap uma estrutura de dados abstrata (EDA) normalmente u>lizada para representar
las com prioridades.

Uma la de prioridades uma estrutura de dados que ofercem mtodos de rpida


insero ou remoo do menor ou maior item.

Um heap permite remoo do maior item e insero em O(N*logN).

Maior item sempre a raiz.

O heap no permite a visita ordenada aos dados, a localizao de uma chave especca ou
deleo.
15. Heaps

Resumindo...
Um heap normalmente implementado como uma matriz representando uma rvore
binria completa.
Os ns possuem chaves menores que seus pais e maiores que seus lhos.
Os itens so inseridos no nal da matriz e borbulhados para cima.
Quando um elemento re>rado da raiz o l>mo elemento colocado a e deslocado
(borbulhado) para baixo at sua posio correta.
A prioridade de um elemento pode mudar, mudando a sua chave. Ao mudar para maior o
item borbulhado para cima, do contrrio para baixo.
Heapsort um algoritmo de ordenamento eciente. O(N*logN)
A idia bsica do heapsort a insero e re>rada de elementos de um heap
O heapsort ca mais eciente se a formao do heap feita aps a insero de todos os
itens em posies aleatrias.
Uma mesma matriz pode servir para armazenar o heap e gerar a lista ordenada.
15. Heaps

Fim da aula 15
16. Grafos
16. Grafos

As estruturas de dados estudadas at aqui tem


uma arquitetura voltada para facilitar certas
operaes a serem executadas sobre as mesmas.

Uma rvore binria por exemplo cons>tuda de forma a facilitar a procura e insero
de elementos
16. Grafos

Grafos so estruturas voltadas a solues de


problemas do mundo real.
16. Grafos
Um grafo composto de segmentos e vr>ces
(ns).

Ns

Segmentos
16. Grafos
Grafo representando regio metropolitana de
fortaleza.
Fortaleza
BR020
CE040
Euzbio
BR116 Aquiraz
CE065
Caucaia CE060

Itai>nga
Maranguape CE060
Maracana
Pacatuba
16. Grafos

Adjacncia

A
B

Dois ns (vr>ces) so adjacentes se esto ligados


por um segmento de reta (Eixos).
16. Grafos

Adjacncia

A
B

Dois ns (vr>ces) so adjacentes se esto ligados


por um segmento de reta (Eixos).
16. Grafos

Caminho (path)

A
B
ABC =

Seqncia de eixos (segmentos) entre dois pontos.


16. Grafos

Grafo Conectado

Conectado No Conectado
A
B

D
C

Existe pelo menos um caminho de um n para


qualquer outro.
16. Grafos

Grafo Direcionado

A
B

D
C

Os arcos (segmentos) expressam uma direo


16. Grafos

Grafo com Pesos

A 60
B
10
40 30
D
C

Podem ser usados nmeros sobre os arcos (pesos).


16. Grafos

Histria: Leonard Euller e as Pontes de Knisberg


16. Grafos

Histria: Leonard Euller e as Pontes de Knigsberg


Teorema de Euller: Somente pode haver dois
vr>ces com nmero mpares de conexes
C (o de chegada e o de par>da)

A D

B
16. Grafos

Como representar no computador.

Vr>ces pode ser representados:

A)Como nmeros: 1,2,3,....N


B)Como objetos da classe Vr>ce
16. Grafos

Exemplo de classe Vr>ce

class Ver>ce:
def __init__(self,rotulo):
self.rotulo = rotulo # por exemplo A
self.visitado = False
def visitado(self):
self.visitado = True

16. Grafos

Representando os Arcos

Matriz de Adjacncias
Lista de Adjacncias

16. Grafos

Matriz Adjacncias
16. Grafos

Lista de Adjacncias
16. Grafos

Adicionando um vr>ce ao lao:

nVer>ces += 1
listaVer>ces[nVer>ces] = Ver>ce(A);
16. Grafos

Adicionando um arco ao lao:

Inserindo um arco entre os vr>ces 1 e 3


usando matriz de adjacncias:

adjMat[1][3] = 1
adjMat[3][1] = 1
16. Grafos

Adicionando um arco ao lao:

Inserindo um arco entre os vr>ces 1 e 3


usando Lista de adjacncias:

adjlista[1].append(3)
adjlista[3].append(1)
16. Grafos

Procurando caminhos em um grafo

Fortaleza
BR020
CE040
CE065 Euzbio Aquiraz
BR116
Caucaia CE060

Itai>nga
Maranguape CE060
Maracana Pacatuba
16. Grafos

Busca em Grafos

Visitar os vr>ces seguindo uma estratgia


especca.
16. Grafos

Estratgias

Busca em Profundidade (Depth First Search)


Busca em Largura (Breadth First Search)
16. Grafos

Busca em Profundidade

B C D E

F G

H I
16. Grafos

Busca em Profundidade

Seqncia 1. A

Iniciamos com o primeiro


n. Visitamos e vericamos Usar uma pilha para relembrar
se a meta. os ns visitados.
16. Grafos

Busca em Profundidade

Seqncia 1. A

Marcamos como visitado Usar uma pilha para relembrar


os ns visitados.
16. Grafos

Busca em Profundidade

Seqncia 1.

Colocamos na Pilha Usar uma pilha para relembrar


os ns visitados.
16. Grafos

Busca em Profundidade

Seqncia 2 B

P r o c u r a m o s u m n
adjacente no visitado Usar uma pilha para relembrar
os ns visitados.
16. Grafos

Busca em Profundidade

Seqncia 2 B

Marcamos. Usar uma pilha para relembrar


os ns visitados.
16. Grafos

Busca em Profundidade

Seqncia 2

B A

Coloque-o na pilha. Usar uma pilha para relembrar


os ns visitados.
16. Grafos

Busca em Profundidade

F
F B A

Repete-se a seqncia 2 Usar uma pilha para relembrar


os ns visitados.
16. Grafos

Busca em Profundidade

H
H F B A

Novamente! Usar uma pilha para relembrar


os ns visitados.
16. Grafos

Busca em Profundidade

H F B A

Novamente???
No mais possvel. Usar uma pilha para relembrar
os ns visitados.
16. Grafos

Busca em Profundidade

Seqncia 3 H

F B A

Re>rar um elemento da
pilha. Usar uma pilha para relembrar
os ns visitados.
16. Grafos

Busca em Profundidade

Seqncia 3 H

F B A

Tentar pegar o prximo


elemento adjacente no
visitado. Se exis>r refaz Usar uma pilha para relembrar
os ns visitados.
seqncia 2 seno con>nua.
16. Grafos

Busca em Profundidade

F
Seqncia 3

B A

o caso. Re>rar mais um


elemento Usar uma pilha para relembrar
os ns visitados.
16. Grafos

Busca em Profundidade

Seqncia 3

B A

Tentar pegar o prximo


elemento adjacente no
visitado. Se exis>r refaz Usar uma pilha para relembrar
os ns visitados.
seqncia 2 seno con>nua.
16. Grafos

Busca em Profundidade

B
Seqncia 3

o caso. Re>rar mais um


elemento Usar uma pilha para relembrar
os ns visitados.
16. Grafos

Busca em Profundidade

Seqncia 3

Tentar pegar o prximo


elemento adjacente no
visitado. Se exis>r refaz Usar uma pilha para relembrar
os ns visitados.
seqncia 2 seno con>nua.
16. Grafos

Busca em Profundidade

C
Seqncia 3
C
C A

Existe. Repe>r Seqncia 2 Usar uma pilha para relembrar


os ns visitados.
16. Grafos

Busca em Profundidade

Seqncia 3
C

No existe adjacente a C.
Re>r-lo Usar uma pilha para relembrar
os ns visitados.
16. Grafos

Busca em Profundidade

G
Seqncia 3
G
G D A

Encontrado outro adjacente


a D Usar uma pilha para relembrar
os ns visitados.
16. Grafos

Busca em Profundidade

I
Seqncia 3
I
G D A

Encontrado outro adjacente


a G Usar uma pilha para relembrar
os ns visitados.
16. Grafos

Busca em Profundidade

I G D A

I no tem adjacentes no
visitados Usar uma pilha para relembrar
os ns visitados.
16. Grafos

Busca em Profundidade

I G D A

Re>rar os elementos at
q u e u m d e l e s t e n h a Usar uma pilha para relembrar
adjacentes no visitados os ns visitados.
16. Grafos

Busca em Profundidade

Se no existem mais, a
b u s c a t e r m i n o u ( S e m Usar uma pilha para relembrar
Sucesso). os ns visitados.
16. Grafos
Operao Pilha
Testa A (visita A) A
Testa B AB
Testa F ABF
Testa H ABFH
Remove H ABF
O Contedo da pilha indica
Remove F AB o caminho do incio da
Remove B A busca at o n sendo
Testa C AC examinado. Caso a busca
Remove C A t e r m i n e a , a p i l h a
Testa D AD representa o caminho!!!
... ADG,ADGI,ADG,AD,A,AE,A
Remove A
16. Grafos

Questo chave

Usa-se a matriz de adjacncias para descobrir qual o elemento


adjacente ainda no visitado (testado).
16. Grafos

Questo chave

def obtemAdjacenteNaoVisitado(ver>ce):
for j in range(numVer>ces):
if matrizAdj[ver>ce][j] == 1 and listaVer>ces[j].visitado == False:
return j
return -1

Fim da Aula 16

Apenas uma pausa .......


17- Busca em Grafos. Con>nuao ...
17. Busca em Grafos

Busca em Largura

B C D E

F G

H I
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 1. A Entrada Sada

Iniciamos com o primeiro


n. Visitamos e vericamos Usar uma lista para inserir os
se a meta. ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.
A B
Seqncia 1. Entrada Sada
B
B

Geramos o primeiro n
a d j a c e n t e . Te s t a m o s
(Visitamos). Marcamos. Usar uma lista para inserir os
ns a serem visitados
Inserimos na Fila.
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.
A C
Seqncia 1. Entrada Sada
C
C B

Geramos o prximo n
a d j a c e n t e . Te s t a m o s
(Visitamos). Marcamos. Usar uma lista para inserir os
ns a serem visitados
Inserimos na Fila.
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.
A D
Seqncia 1. Entrada Sada
D
D C B

Geramos o prximo n
a d j a c e n t e . Te s t a m o s
(Visitamos). Marcamos. Usar uma lista para inserir os
ns a serem visitados
Inserimos na Fila.
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.
A E
Seqncia 1. Entrada Sada
E
E D C B

Geramos o prximo n
a d j a c e n t e . Te s t a m o s
(Visitamos). Marcamos. Usar uma lista para inserir os
ns a serem visitados
Inserimos na Fila.
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 2. B Entrada Sada

E D C B

Quando no exis>rem mais


a d j a c e n t e s . R e > r a r o Usar uma lista para inserir os
prximo elemento da Fila. ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Sequencia 1 (de novo) B F Entrada Sada


F
F E D C

Gerar os ns adjacentes
deste n. Visitar (testar) e Usar uma lista para inserir os
colocar na Fila. ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 2 (de novo) Entrada Sada


C
F E D C

N o s e n d o p o s s v e l
con>nuar. Remove-se o Usar uma lista para inserir os
prximo da la. ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 1 (de novo) Entrada Sada


C ?
F E D

L o c a l i z a - s e o s n s
adjacentes ao re>rado. Se Usar uma lista para inserir os
possvel ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 2 (de novo) Entrada Sada


D
F E D

No exis>ndo, remove-se o
prximo. Usar uma lista para inserir os
ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 1 (de novo) Entrada Sada


D G
G G F E

Localizam-se os vr>ces
adjacentes.... Usar uma lista para inserir os
ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 2 (de novo) Entrada Sada


E

G F E

No sendo possvel, re>ra-


se o prximo .... Usar uma lista para inserir os
ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 1 (de novo) Entrada Sada


E ?
G F

Gera adjacente.... Usar uma lista para inserir os


ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 2 (de novo) Entrada Sada


F

G F

No exis>ndo .... Usar uma lista para inserir os


ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 1 (de novo) Entrada Sada


F H
H
H G

Gera adjacente... Usar uma lista para inserir os


ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 2 (de novo) Entrada Sada


G
H G

Re>ra prximo .... Usar uma lista para inserir os


ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 1 (de novo) Entrada Sada


G I
I I H

Verica adjacentes .... Usar uma lista para inserir os


ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 2 (de novo) Entrada Sada


H
I H

Re>ra prximo. Usar uma lista para inserir os


ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 1 (de novo) Entrada Sada


H ?
I

Procura Adjacncias ... Usar uma lista para inserir os


ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 2 (de novo) Entrada Sada


I
I

Remove o prximo ... Usar uma lista para inserir os


ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Seqncia 1 (de novo) Entrada Sada


I

Procura adjacentes .... Usar uma lista para inserir os


ns a serem visitados
17. Busca em Grafos
Idia Central: Usar uma Lista como estrutura
auxiliar.

Entrada Sada

Fim da busca .... Usar uma lista para inserir os


ns a serem visitados
17. Busca em Grafos
Operao Fila
Testa A (visita A)
Testa B B
Testa C BC
Testa D BCD
Testa E BCDE
Remove B CDE O Contedo da la indica o
Testa F CDEF
conjunto de ns testados,
porm no totalmente
Remove C DEF
expandidos (Com adjacentes
Remove D EF
a explorar).
Testa G EFG
... FG, G , GH , H , HI, I
Remove I
17. Busca em Grafos

Outra vista do grafo:


I

B A E

F
C
H
17. Busca em Grafos
rvore Geradora Mnima (AGM)
(Minimum Spanning Tree)

A menor rvore que conecta todos os vr>ces de


um grafo.
A A

B C B C

D E D E
17. Busca em Grafos
rvore Geradora Mnima (AGM)
(Minimum Spanning Tree)

Dado um nmero de vr>ces (V) o nmero de


eixos (E) = V -1

A A

B C B C

D E D E
17. Busca em Grafos
rvore Geradora Mnima (AGM)
(Minimum Spanning Tree)

Para sua determinao pode-se usar tanto a busca


em largura como em profundidade.

A A

B C B C

D E D E
17. Busca em Grafos
rvore Geradora Mnima (AGM)

Observando o caminho de uma busca em


profundidade ao passar por todos os ns
exatamente o caminho de uma AGM.
17. Busca em Grafos
rvore Geradora Mnima (AGM)

Caso 1
A A

B C B C

D E D E

OBS: O Caminha da AGM no nico


17. Busca em Grafos
rvore Geradora Mnima (AGM)

Caso 2 ?
A A

B C B C

D E D E
17. Busca em Grafos
rvore Geradora Mnima (AGM)

Caso 2
A A

B C B C

D E D E
17. Busca em Grafos
Ordenamento Topolgico
Lgica de Linguagem de Linguagem de
Programao Programao I Programao II

Sistemas Redes de Programao


Operacionais Computadores Para WEB

Exemplo de Grafo mostrando


Bancos de
disciplinas pr-requisitos de
Dados
um curso
17. Busca em Grafos
Grafos Direcionados

Matriz de Adjacncias

B C

Listas de Adjacncias

A: B
B: C
C:
17. Busca em Grafos
Grafos Direcionados

Adicionando Arcos ao Grafo No Direcionado

A def adicionaArco(self,inicio,m):
self.matrizAdjacencias[inicio][m] = 1
self.matrizAdjacencias[m][inicio] = 1

B C
Adicionando Arcos ao Grafo Direcionado
def adicionaArco(self,inicio,m):
self.matrizAdjacencias[inicio][m] = 1
17. Busca em Grafos
Grafos Direcionados

A D
Qual a ordem topolgica??

E G H

B C F
17. Busca em Grafos
Grafos Direcionados

A D
Qual a ordem topolgica??

E G H

BAEDGCFH
B C F
Fim da Aula 17

Apenas uma pausa .......


Aula 18. Grafos com Pesos
18. Grafos com Pesos
Conec>vidade em Grafos Direcionados

At onde posso chegar a


B
par>r de A,B,C,D ou E?
D

A
E

C
18. Grafos com Pesos
Algoritmo de Warshall

Modica-se a matriz de adjacncias construindo um


fecho transi>vo. Esta estrutura permite a vericar
instantaneamente O(1) se um vr>ce dado pode ser
alcanado a par>r de outro.
18. Grafos com Pesos
Algoritmo de Warshall

Idia bsica: Se vc pode chegar a B a par>r de A e a C a


par>r de B, ento voc pode chegar a C a par>r de A
(Transi>vidade)
18. Grafos com Pesos
Algoritmo de Warshall

Dado o Grafo Abaixo:

B A B C D E
A 0 0 1 0 0
D
B 1 0 0 0 1
A C 0 0 0 0 0
E
D 0 0 0 0 1
C E 0 0 1 0 0
18. Grafos com Pesos
Algoritmo de Warshall

Inicia-se pela linha A Arco de A a C


A B C D E
A 0 0 1 0 0
B 1 0 0 0 1
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 1 0 0
18. Grafos com Pesos
Algoritmo de Warshall
Se soubssemos da existncia
de um caminho de X para A
ento haveria caminho de X a Arco de A a C
C.
A B C D E
A 0 0 1 0 0
B 1 0 0 0 1
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 1 0 0
18. Grafos com Pesos
Algoritmo de Warshall
Na coluna A achamos todos
os vr>ces que tem arco Arco de A a C
chegando em A
A B C D E
A 0 0 1 0 0
B 1 0 0 0 1
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 1 0 0
18. Grafos com Pesos
Algoritmo de Warshall
No caso apenas o B est
ligado ao A. Arco de A a C
A B C D E
A 0 0 1 0 0
B 1 0 0 0 1
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 1 0 0
18. Grafos com Pesos
Algoritmo de Warshall
Por transi>vidade colocamos
o 1 indicando que h Arco de A a C
caminho de B a C.
A B C D E
A 0 0 1 0 0
B 1 0 1 0 1
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 1 0 0
18. Grafos com Pesos
Algoritmo de Warshall
Examinando a segunda linha.
Porm ningum ligado a B
B ligado a A.

A B C D E
A 0 0 1 0 0
B 1 0 1 0 1
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 1 0 0
18. Grafos com Pesos
Algoritmo de Warshall
Examinando a terceira linha.
C no ligado a ningum.

A B C D E
A 0 0 1 0 0
B 1 0 1 0 1
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 1 0 0
18. Grafos com Pesos
Algoritmo de Warshall
Examinando a quarta linha.
Porm ningum ligado a D
D ligado ao E.

A B C D E
A 0 0 1 0 0
B 1 0 1 0 1
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 1 0 0
18. Grafos com Pesos
Algoritmo de Warshall
B e D so ligados ao E,
Examinando a l>ma linha. E p o r t a n t o t a m b m s o
ligado ao C. ligados a C

A B C D E
A 0 0 1 0 0
B 1 0 1 0 1
C 0 0 0 0 0
D 0 0 1 0 1
E 0 0 1 0 0
18. Grafos com Pesos
Algoritmo de Warshall

Fecho Transi>vo.

B A B C D E
A 0 0 1 0 0
D
B 1 0 1 0 1
A C 0 0 0 0 0
E
D 0 0 1 0 1
C E 0 0 1 0 0
18. Grafos com Pesos
Algoritmo de Warshall

matrizAdj[inicio][m] == 1 ? Programa76.py

B A B C D E
A 0 0 1 0 0
D
B 1 0 1 0 1
A C 0 0 0 0 0
E
D 0 0 1 0 1
C E 0 0 1 0 0
18. Grafos com Pesos
Distncias Rodovirias
Fortaleza
Caucaia 16 (BR020)
27 (CE040)
25 (CE065)
Euzbio Aquiraz
08 (CE040)
21 (ANEL VIARIO)
30 (ANEL VIARIO)

10 (CE065) Maracana 33 (BR116)

17 (CE060) Itai>nga
Maranguape

20 (Rua Henrique Silva) 12 (CE350)

Pacatuba
18. Grafos com Pesos
Link de Fibra >ca Cinturo Digital
Fortaleza (B) Euzbio (C)

Aquiraz (F)

Caucaia (A)

Maracana (D) Itai>nga (E)


18. Grafos com Pesos
Link de Fibra >ca Cinturo Digital
Fortaleza (B) Euzbio (C)

Aquiraz (F)

Caucaia (A)
Caminhos
muito longos
Maracana (D) Itai>nga (E)
18. Grafos com Pesos
Link de Fibra >ca Cinturo Digital
Fortaleza (B) Euzbio (C)

Aquiraz (F)

Caucaia (A)

Maracana (D) Itai>nga (E)


18. Grafos com Pesos
Link de Fibra >ca Cinturo Digital
Fortaleza (B) Euzbio (C)
10

6 6
7 Aquiraz(F)
7 5
8
Caucaia (A)
4 7

Maracana (D) 12 Itai>nga (E)

Custos em milhes de reais.


18. Grafos com Pesos
Iniciando o processo. Comeando em Caucaia.
Lista de Arcos Visitados em Ordem de Custo
Fortaleza (B)

AD

E s t u d a n d o o t ra j e t o C a u c a i a
Maracana, es>ma-se o custo em 4
Caucaia (A) milhes.
4

Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Iniciando o processo. Comeando em Caucaia.
Lista de Arcos Visitados em Ordem de Custo
Fortaleza (B)

AD AB
6

E s t u d a n d o o t ra j e t o C a u c a i a
Caucaia (A) Fortaleza, es>ma-se o custo em 6
4
milhes.
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Iniciando o processo. Comeando em Caucaia.
Fortaleza (B) Temos inicialmente duas
1 opes. A de menor custo
6 far parte da AGM?
Cidade Hipot>ca H
Qualquer caminho de
Tabela de Custos menor custo conter
A-D-H-B : 6 (AD) ou (DA)
Caucaia (A)
1 A-B-H-D : 8
4
B-A-D-H : 11
Maracana (D) B-H-D-A : 6

Conhecido Desconhecido
Custos em milhes de reais.
18. Grafos com Pesos
Iniciando o processo. Comeando em Caucaia.
Lista de Arcos Visitados em Ordem de Custo
Fortaleza (B)

AB
6

AD faz parte da rvore geradora


Caucaia (A)
4 mnima. Remove-se da lista

Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Con>nuando ....
Lista de Arcos Visitados em Ordem de Custo
Fortaleza (B)

AB DB DC DE
6

7 Euzbio (C)
8
Caucaia (A)
4

12 Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Con>nuando ....
Lista de Arcos Visitados em Ordem de Custo
Fortaleza (B) AB

DB DC DE
6

7 A regra sempre pegar o de


8 menor custo da lista.
Caucaia (A) Euzbio (C)
4

12 Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Con>nuando ....
Lista de Arcos Visitados em Ordem de Custo
Fortaleza (B)
DB
DC DE
6

Estando D conectada, DB sai


8 da lista.
Caucaia (A) Euzbio (C)
4

12 Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Con>nuando ....
Lista: BE DC BC DE
Fortaleza (B)
10

6 Euzbio (C)
7
Prximo elemento de menor
8 custo
Caucaia (A)
4

12 Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Con>nuando ....
Lista: DC BC DE
Fortaleza (B)
10
BE
6 Euzbio (C)
7

8 Remove BE da lista.
Caucaia (A)
4

12 Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Con>nuando ....
Lista: DC BC
Fortaleza (B)
10

DE
6 Euzbio (C)
7
Remove da lista DE pois D
8 j est ligada rede de
Caucaia (A) bra.
4

Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Prximo ....
EC BC
Lista: EF DC
Fortaleza (B)
10

6 Euzbio (C)
7 Aquiraz (F)
5
8
Caucaia (A)
4 7

Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Prximo ....
EC BC
Lista: EF DC
Fortaleza (B)
10
N o v a m e n t e o
6 Euzbio (C) menor.
7 Aquiraz (F)
5
8
Caucaia (A)
4 7

Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Prximo ....
BC
Lista: EF DC
Fortaleza (B)
10
N o v a m e n t e o
6 Euzbio (C) menor.
7 Aquiraz (F)
5
8
Caucaia (A)
4 7

Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Prximo ....
Lista: EF
Fortaleza (B)
Elimina cidades
6 Euzbio (C) conectadas.
7 Aquiraz (F)
5

Caucaia (A)
4 7

Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Prximo ....
Lista: EF
Fortaleza (B)
Elimina cidades
6 Euzbio (C) conectadas.
7 Aquiraz (F)
5

Caucaia (A)
4 7

Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Finalizando....
Lista: CF EF
Fortaleza (B)
D u a s l > m a s
6
6 Euzbio (C) opes.
7
5
Aquiraz (F)

Caucaia (A)
4 7

Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Finalizando....
Lista: EF
Fortaleza (B)
E s c o l h a d a
6
6 Euzbio (C) menor.
7
5 Aquiraz (F)

Caucaia (A)
4 7

Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Finalizando....
Lista:
Fortaleza (B)
E l i m i n a
6
6 Euzbio (C) conectadas.
7
5 Aquiraz (F)

Caucaia (A)
4

Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Fim da construo da AGM....
Euzbio (C)
Fortaleza (B)

6 6
7
5 Aquiraz (F)

Caucaia (A)
4

Itai>nga (E)
Maracana (D)

Custos em milhes de reais.


18. Grafos com Pesos
Questo chave.

Usamos uma lista ordenada por prioridades (menor custo) para


conter todos o vr>ces a serem analisados. Na pr>ca pode-se
usar um heap para ganhar ecincia no processo.
18. Grafos com Pesos
Resumo do algoritmo
I n t r o d u z a o Repita o seguinte
vr>ce de incio enquanto for
na rvore. possvel

Encontre todos os vr>ces que so


vizinho do l>mo adicionado e ainda
no esto na rvore. Ponha-os na lista
de prioridades

Re>re o arco de menor custo da lista


de prioridades adicionando-o e o seu
vr>ce correspondente na rvore
18. Grafos com Pesos
Arcos extras .....

Aps a seleo do prximo vr>ce, precisamos lidar com o arcos


que levam a vr>ces j conectados (Cidades j visitadas). Se no
forem re>rados podem levar a ciclos ou a permanncia de arcos
extras na AGM (Errada).
18. Grafos com Pesos
Arcos extras .....
R e c m I n s e r i d o n a A introduo do arco AB na rvore
rvore deve implicar na remoo do BD da
lista
6

A remover da lista
7

4
18. Grafos com Pesos
Arcos extras .....

Remoo de Duplicados na Lista.

Arcos na lista de prioridade que levem ao mesmo des>no devem


ser removidos permanecendo apenas o de menor custo.

Programa77.py
18. Grafos Direcionados com Pesos
O Problema do menor (melhor) caminho.
Fortaleza (B) Euzbio (C)
R$ 60

R$ 50
R$ 50

R$ 90 R$ 40
R$ 80
Caucaia (A) R$ 20

R$ 70
Maracana (D) Itai>nga (E)
18. Algoritmo de Dijkstra
Algoritmo do menor caminho (1959)
11/05/1930 - Roterdam Holanda
6 /08/2002 - Nuenen Holanda

Ins>tuies

Mathema>sch Centrum
Eindhoven University of Technology
The University of Texas at Aus>n

Menor (melhor) caminho de um vr>ce a todos os


outros em um grafo.
18. Grafos Direcionados com Pesos
Questo. Qual o menor custo para ir de Caucaia
(A) at qualquer outra cidade?
De\Para (B) Fortaleza (C) Eusbio (D) Maracana (E) Itai@nga

(A) Caucaia

Na estao de Caucaia sabemos que custa R$ 50,00 para Fortaleza e R$ 80,00 para
Maracana
18. Grafos Direcionados com Pesos
Questo. Qual o menor custo para ir de Caucaia
(A) at qualquer outra cidade?
De\Para (B) Fortaleza (C) Eusbio (D) Maracana (E) Itai@nga

(A) Caucaia (1) R$ 50,00 ??? R$ 80,00 ????

Prximo passo:???

Regra: Deslocar-se pelo caminho de menor custo


18. Grafos Direcionados com Pesos
Situao at o momento
Regio Visitada R$ 110
Fortaleza (B) Euzbio (C)
(Vr>ces a rvore) R$ 60

R$ 50 Regio Conhecida
(Vr>ces a serem
R$ 90 analisados e colocados
na arvore)
R$ 80 Regio Desconhecida
Caucaia (A)

Maracana (D) Itai>nga (E)


18. Grafos Direcionados com Pesos
Questo. Qual o menor custo para ir de Caucaia
(A) at qualquer outra cidade?
De\Para (B) Fortaleza (C) Eusbio (D) Maracana (E) Itai@nga

(A) Caucaia (1) R$ 50,00 ??? R$ 80,00 ????

(A) Caucaia (2) R$50,00 (Via A)* R$110,00(ViaB) R$80,00 (Via A) ???

Prximo passo:???

Regra: Deslocar-se pelo caminho de menor custo

* Marcada como visitada


18. Grafos Direcionados com Pesos
Questo. Qual o menor custo para ir de Caucaia
(A) at qualquer outra cidade?
De\Para (B) Fortaleza (C) Eusbio (D) Maracana (E) Itai@nga

(A) Caucaia (1) R$ 50,00 ??? R$ 80,00 ????

(A) Caucaia (2) R$50,00 (Via A)* R$110,00(Via B) R$80,00 (Via A) ???

Prximo passo:Visitar D (menor custo)

Regra: Deslocar-se pelo caminho de menor custo

* Marcada como visitada


18. Grafos Direcionados com Pesos
Situao at o momento
Fortaleza (B) Euzbio (C)
R$ 60

R$ 50

R$ 90 R$ 20
R$ 100
R$ 80
Caucaia (A)
R$ 70

Maracana (D) Itai>nga (E)


R$ 150
18. Grafos Direcionados com Pesos
Questo. Qual o menor custo para ir de Caucaia
(A) at qualquer outra cidade?
De\Para (B) Fortaleza (C) Eusbio (D) Maracana (E) Itai@nga

(A) Caucaia (1) R$ 50,00 ??? R$ 80,00 ????

(A) Caucaia (2) R$50,00 (Via A)* R$110,00(Via B) R$80,00 (Via A)* ????

(A) Caucaia (3) R$50,00 (Via A)* R$100,00(Via D) R$80,00 (Via A)* R$ 150,00 (Via D)

Regra: Deslocar-se pelo caminho de menor custo

* Marcada como visitada


18. Grafos Direcionados com Pesos
Situao at o momento
Fortaleza (B) Euzbio (C)
R$ 60

R$ 50

R$ 90 R$ 20
R$ 100
R$ 80
Caucaia (A)
R$ 70

Maracana (D) Itai>nga (E)


R$ 150
18. Grafos Direcionados com Pesos
Questo. Qual o menor custo para ir de Caucaia
(A) at qualquer outra cidade?
De\Para (B) Fortaleza (C) Eusbio (D) Maracana (E) Itai@nga

(A) Caucaia (1) R$ 50,00 ??? R$ 80,00 ????

(A) Caucaia (2) R$50,00 (Via A)* R$110,00(Via B) R$80,00 (Via A)* ????

(A) Caucaia (3) R$50,00 (Via A)* R$100,00(Via D) R$80,00 (Via A)* R$ 150,00 (Via D)

Regra: Deslocar-se pelo caminho de menor custo

* Marcada como visitada


18. Grafos Direcionados com Pesos
Situao at o momento
Fortaleza (B) Euzbio (C)
R$ 60

R$ 50

R$ 90 R$ 20 R$ 140
R$ 40
R$ 80
Caucaia (A)
R$ 70

Maracana (D) Itai>nga (E)


R$ 150
18. Grafos Direcionados com Pesos
Questo. Qual o menor custo para ir de Caucaia
(A) at qualquer outra cidade?
De\Para (B) Fortaleza (C) Eusbio (D) Maracana (E) Itai@nga

(A) Caucaia (1) R$ 50,00 ??? R$ 80,00 ????

(A) Caucaia (2) R$50,00 (Via A)* R$110,00(Via B) R$80,00 (Via A)* ????

(A) Caucaia (3) R$50,00 (Via A)* R$100,00(Via D) R$80,00 (Via A)* R$ 150,00 (Via D)

(A) Caucaia (4) R$50,00 (Via A)* RS100,00(Via D)* R$80,00 (Via A)* R$ 140,00 (Via C)

Regra: Deslocar-se pelo caminho de menor custo

* Marcada como visitada


18. Grafos Direcionados com Pesos
Situao at o momento
Fortaleza (B) Euzbio (C)
R$ 60

R$ 50

R$ 90 R$ 20 R$ 140
R$ 40
R$ 80
Caucaia (A)
R$ 70

Maracana (D) Itai>nga (E)


R$ 150
18. Grafos Direcionados com Pesos
Questo. Qual o menor custo para ir de Caucaia
(A) at qualquer outra cidade?
De\Para (B) Fortaleza (C) Eusbio (D) Maracana (E) Itai@nga

(A) Caucaia (1) R$ 50,00 ??? R$ 80,00 ????

(A) Caucaia (2) R$50,00 (Via A)* R$110,00(Via B) R$80,00 (Via A)* ????

(A) Caucaia (3) R$50,00 (Via A)* R$100,00(Via D) R$80,00 (Via A)* R$ 150,00 (Via D)

(A) Caucaia (4) R$50,00 (Via A)* RS100,00(Via D)* R$80,00 (Via A)* R$140,00 (Via C)*

Regra: Deslocar-se pelo caminho de menor custo

* Marcada como visitada


18. Grafos Direcionados com Pesos

Ainda no acabou.....

E se eu quiser construir uma matriz contendo as


menores distncias de todos os vr>ces entre si?

Soluo1 : Poderamos rodar o algoritmo de


Dijkstra n vezes mudando o ponto de origem e
des>no. ;-)
18. Grafos Direcionados com Pesos

Ainda no acabou.....

Soluo2 : Algoritmo de Floyd


(Robert Floyd, 1962)
18. Grafos Direcionados com Pesos

Ainda no acabou.....

A R$ 70 B De\Para (A) (B) (C) (D)


(A)

(B) 70 10
R$ 30 R$ 10
(C) 30

(D) 20

R$ 20
C D
18. Grafos Direcionados com Pesos

Idn>co os algoritmo de Warshall.

De\Para (A) (B) (C) (D)


(A)

(B) 70 10

(C) 30

(D) 50 20

C->A (30) e D->C (20) ento D->A (50)


18. Grafos Direcionados com Pesos

Idn>co os algoritmo de Warshall.

De\Para (A) (B) (C) (D)


(A)

(B) 60 10

(C) 30

(D) 50 20

D->A (50) e B->D (10) ento B->A (60)


18. Grafos Direcionados com Pesos

Idn>co os algoritmo de Warshall.

De\Para (A) (B) (C) (D)


(A)

(B) 60 30 10

(C) 30

(D) 50 20

D->C (20) e B->D (10) ento B->C (30)


18. Grafos Direcionados com Pesos

Idn>co os algoritmo de Warshall.

De\Para (A) (B) (C) (D)


(A)

(B) 60 30 10

(C) 30

(D) 50 20

Desta vez a implementao sua. (Exercite)


Fim da Aula 18
19. U>lizao de ED/Ordenamento
19. Busca Avanada: Heurs>cas
19. Programao Concorrente em Py
(Threads)
19. U>lizao de ED/Ordenamento

1.EDs de propsito geral: Matrizes (vetores), listas ligadas,


rvores, tabelas hash.
2.EDs especializadas: pilhas, las, las de prioridades, grafos
3.Ordenamento: Insero, shellsort, quicksort, mergesort,
heapsort
4.Grafos: matriz de adjacncias, listas de adjacncias
5.Armazenamento externo: armazenamento seqencial,
arquivos indexados, B-Trees, Hashing
19. U>lizao de ED/Ordenamento

Usadas para armazenamento geral como


registros em um banco de dados. So elas:
matrizes, listas ligadas, rvores e tabelas hash.
19. U>lizao de ED/Ordenamento
Conjunto SIM NO
Tamanho Lista Ligada
Incio de Dados
previsvel
pequeno
NO SIM
SIM Pesquisa e
Busca mais SIM Matriz
insero
Tabela Hash muito
importante Ordenada
que insero.
rpida.

NO NO
rvore de SIM Garan>a de
Matriz no
pesquisa aleatoriedade
nas chaves Ordenada
binria

NO

rvore
Balanceada
19.2 EDs de Propsito Geral
ED Busca Insero Deleo Atravessar

Matriz O(N) O(1) O(N) -


Matriz Ordenada O(log(N)) O(N) O(N) O(N)
Lista ligada O(N) O(1) O(N) -
Lista ligada ordenada O(N) O(N) O(N) O(N)
rvore binria (Mdia) O(log(N)) O(log(N)) O(log(N)) O(N)

rvore binria (Pior caso) O(N) O(N) O(N) O(N)

Tabela hash O(1) O(1) O(1) -


19.2 Eds Especializadas

Normalmente atrelada a um algoritmo que


requer explicitamente este >po de estrutura.
Por exemplo busca em profundidade em
grafos requer uma pilha, enquanto busca em
largura requer uma la.
19.2 Eds Especializadas

Pilhas, las e listas com prioridades so >pos de


dados abstratos normalmente implementados
u>lizando matrizes, listas ligadas ou heaps.
19.2 Eds Especializadas

Normalmente estas estruturas apresentam uma


interface que permite a insero e/ou deleo
de um elemento.
19.2 Eds Especializadas

Estes itens so:


Em pilhas: O l>mo elemento inserido
Em las: O primeiro elemento inserido
Prioridades: O elemento com a maior
prioridade.
19.2 Eds Especializadas
ED Busca Insero Comentrio

Pilha O(1) O(1) Apaga o l>mo item inserido


(Matriz ou lista ligada)
Fila O(1) O(1) Apaga o item mais an>go
(Matriz ou lista ligada)
Fila com prioridades O(N) O(1) Apaga o item com a mais alta
(Matriz Ordenada) prioridade
Fila com prioridades O(log(N)) O(log(N)) Apaga o item com a mais alta
(Heap) prioridade
19.3 Ordenamento
Mtodo Mdia Pior caso Memria Extra

Bolha O(N2) O(N2) No


Seleo O(N2) O(N2) No
Insero O(N2) O(N2) No
Shellsort O(N3/2) O(N3/2) No
Quicksort (N*LogN) O(N2) No
Mergesort (N*LogN) (N*LogN) Sim
Heapsort (N*LogN) (N*LogN) No
19.4 Grafos (Modelam o mundo real)
Mtodo Mdia Obs

Busca em Profundidade/ O(V2) V = Nmero de vr>ces. Usando matriz


Largura de adjacncias
Idem O(V + E ) E = Nmero de eixos. Representao na
forma de listas de adjacncias
AGM O(V2) V = Nmero de vr>ces. Usando matriz
de adjacncias
Idem O((V+E )logV ) E = Nmero de eixos. Representao na
forma de listas de adjacncias
19.5 Armazenamento Externo
NO
Velocidade Pesquisa
Incio
importante? Sequencial

SIM
NO
Velocidade
cr>ca B-Trees

SIM

Dispe-se de SIM
Hashing
espao extra para
armazenamento? Externo

NO

Arquivos
Indexados
19. Problemas Intratveis (Insolveis)
O Caixeiro Viajante: Percorrer todas as cidades e
voltar ao ponto de origem minimizando o
percurso.
Fortaleza (B) Euzbio (C)

......... Aquiraz (F)

Caucaia (A)

Maracana (D) Itai>nga (E)


19. Problemas Intratveis (Insolveis)

Quantos caminhos eu posso trilhar (Devo


examinar) para 6 cidades?
(A) (B) (D) (E) (C) (F) 6 opes pra comear
X
5 remanescentes para cada
(B) (D) (E) (C) (F)
X
4 remanescentes nvel 2
(D) (E) (C) (F) X
3 Remanescentes nvel 3
(E) (C) (F) X
2 Remanescentes nvel 4
(C) (F) X
1 Remanescente nvel 5
(F) =720 (6!)
19. Problemas Intratveis (Insolveis)

Uma pequena tabela:

N N!

6 720
10 3.628.800
20 2,43 x 1018
30 2,65 x 1032
40 8,15 x 1047
50 3,04 x 1064
19. Problemas Intratveis (Insolveis)

NP - Completo

NP = Non Determinis>c Polinomial Time

Tempo Polinomial No Determins>co.


19. Heurs>cas

Nem sempre sabemos a distncia exata do ponto


de chegada.

(B) (C) (D) (E) (F)


f(B) = 10 f(C)=15 f(D)=5 f(E)=6 f(F)=8

Desenvolve-se uma funo aproxima>va (ou no) que nos d uma es>ma>va da
distncia do n atual ao des>no.O Algoritmo que sempre escolhe a melhor
opo chamado de algoritmo guloso e esta busca chamada de busca gulosa.
19. Heurs>cas

A* (Peter Hart, Nils Nilsson, e Bertram Raphael, 1968)

(B) (C)
f(B) = 10 (D) (E) (F)
f(C)=15
g(B) = 5 g(C) = 6
h(B) = 15 h(B) = 21

A* encontra um caminho >mo usando uma funo heurs>ca que soma o


caminhos j percorrido mais a es>ma>va de distncia at a meta.
g(n) a distncia percorrida e f(n) a es>ma>va at a meta. h(n) = f(n) + g(n)
19. Heurs>cas

Prximo Curso: Inteligncia Ar>cial

Soluo de Problemas por meio de busca. Jogos. Metaheurs>cas. etc etc....


19. Programao Concorrente

Programa A
Parte 1
<instrues 1>

Parte 2
<instrues 2>
Parte 3
<Instrues 3>
19. Programao Concorrente

Threads

Linha de execuo uma forma de um processo dividir a si


mesmo em duas ou mais tarefas que podem ser executadas
simultaneamente.

Em hardwares com ml>plas CPUs ou mul>-cores as linhas de


execuo(Threads) podem ser realizadas realmente de forma
simultnea.
19. Programao Concorrente

Threads em Python

Implementadas atravs do mdulo thread.py ou

atravs do mdulo threading.py.


19. Programao Concorrente

Threads em Python. Usando thread

Passo 1

Import thread
19. Programao Concorrente

Threads em Python Usando thread

Passo 2

# denir uma funo qualquer com seus argumentos


def funcaoLinhaExecucaoSeparada(nome,contador,temp):
....
....
....
....
19. Programao Concorrente

Threads em Python Usando thread

Passo 3

#Em algum lugar do corpo do programa principal chamar a funo


# thread.start_new_thread(<funcao>,<argumentos>)

thread.start_new_thread(funcaoLinhaExecucaoSeparada, ("Linha 1 ", 5, 1))

Programa79.py
19. Programao Concorrente

Condies de corrida (Race Condi>ons)


# Seja uma varivel x
x = 2

# Seja uma linha A # Seja uma linha B


def linhaA(): def linhaB():
... ...
x = x+3 x = 2*x

Qual o valor nal de X???? 2, 4, 5, 10, 7,


Programa80.py
19. Programao Concorrente

Threads em Python Usando threading

Semelhante a API Java

# denir uma sub classe para a classe threading.Thread


class X(threading.Thread):

....
....
....
19. Programao Concorrente

Threads em Python Usando threading

No construtor da classe deve-se chamar o da classe pai.

def __init__(self, ....):


threading.Thread.__init__(self)
....
....
....
19. Programao Concorrente

Threads em Python Usando threading

Dene-se o mtodo run que ser executado na chamada da


funo start()
def run(self, ....):
.
....
....
....
19. Programao Concorrente

Threads em Python Usando threading

Em algum lugar do programa cria-se um objeto da classe X.

obj = X()
....
....
....
19. Programao Concorrente

Threads em Python Usando threading

Chama-se o mtodo start do objeto. Como resultado a funo


run do objeto ser executada.
obj.start()
....
....
....

Programa82.py
19. Programao Concorrente

Projetos Cliente Servidor em Python

Cliente A: Servidor
.......... Thread A

Cliente B: Thread B
...........
19. Programao Concorrente

Projetos Cliente Servidor em Python

import socket
Cliente A: # create Internet TCP socket 16
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
Socket s.connect((host, port))

s.send(k)
Resposta = s.recv(n)
s.close()
19. Programao Concorrente

Projetos Cliente Servidor em Python

Import thread
Servidor Import socket

Socket Loop de espera


While 1:
recebe do socket e chama as funes de tratamento
Thread
Nas funes.
Cria um thread para cada cliente
19. Programao Concorrente

O desao seu.
Fim da Aula 19
20. Programao Grca em Python
20. Programao Grca em Python

Usando o Tkinter

Biblioteca de funcionalidades grcas baseada em Tcl/Tk.


Acompanha as distribuies Python
20. Programao Grca em Python

Usando o Tkinter

Import Tkinter
Tkinter._test()
from Tkinter import *
root = Tk()
root.mainloop()
20. Programao Grca em Python

Componentes de um programa grco.

Funes de tratamento de eventos (Event handlers)


Funo de desenho da interface
Loop principal (event loop)
20. Programao Grca em Python

Exemplo com programa de texto.

Programa83.py
20. Programao Grca em Python

Objetos grcos de trabalho.

widgets

Containers

Canvas Frames
20. Programao Grca em Python

Criando um Frame

Frame a ser Frame Mestre


criado

minhaCesta = Frame(pai)
20. Programao Grca em Python

Gerenciadores de Geometria

Pack Grid Place


20. Programao Grca em Python

Passos de um programa mnimo.

Cria Raiz from Tkinter import *


Importa Tkinter
raiz = Tk()

Aciona cesta = Frame(Raiz)


gerenciador de Principal Frame
layout cesta.pack()

raiz.mainloop()
Loop principal
20. Programao Grca em Python

E os widgets?

Dene
propriedades botao = Bu|on(cesta)
do widget Criar widget
botao[text]= Ola rapaziada
botao[background]= blue
Aciona
gerenciador de botao.pack()
layout
raiz.mainloop()
Loop principal
Programa84.py
20. Programao Grca em Python
Aplicao Classe ou Classe aplicao?

from Tkinter import *


class MinhaAplicacao:
def __init__(self, meuPai):
self.minhaCesta = Frame(meuPai)
self. minhaCesta.pack()
self.botao1 = Bu|on(self. minhaCesta)
self. botao1["text"]= Alo rapaziada!"
self. botao1.pack()
raiz= Tk()
minhapp = MinhaAplicacao(raiz)
raiz.mainloop()

Programa85.py
20. Programao Grca em Python
Ml>plos botes e formas de manipul-los.

class Aplicacao:
def __init__(self, pai):
self.cesta = Frame(pai)
self.cesta.pack()
self.botao1 = Buaon(self.cesta)
self.botao1["text"] = "Alo rapaziada!"
self.botao1.pack()
self.botao1.pack(side=LEFT)

self.botao2 = Buaon(self.cesta)
self.botao2.congure(text="texto bobo qualquer")
self.botao2.pack()
self.botao2.pack(side=LEFT)
Programa86.py
20. Programao Grca em Python
Ml>plos botes e formas de manipul-los.

self.botao3 = Buaon(self.cesta)
self.botao3.congure(text="Vai entrar nessa?")
self.botao3.pack()
self.botao3.pack(side=LEFT)
self.botao4 = Buaon(self.cesta,text="Adeus!")
self.botao4.pack()
self.botao4.pack(side=LEFT)

raiz = Tk()
ap = Aplicacao(raiz)
raiz.mainloop()

Programa86.py
20. Programao Grca em Python
Bindings: Conectando eventos a funes.

Event Listener

widget.bind(<nome_do_<po_de_evento>, <funo_que_encaminha_eventos>)

Programa87.py
20. Programao Grca em Python
Eventos do Teclado

Etapas:
1. Obter o foco para o widget que vai tratar o evento
2. Criar um event biding entre o evento sobre aquele widget e uma funo especca

OBS: A funo focus_force() ajusta o foco para o widget que a chama.

Programa89.py
20. Programao Grca em Python
Lista de Eventos

<Bu|on-1>, <B1-Mo>on>, <Bu|onRelease-1>, <Double-Bu|on-1>, <Enter>, <Leave>,


<Return> <Key> a<Shi-Up> <Congure>



20. Programao Grca em Python
Command Binding

self.bu|on1 = Bu|on(self.myContainer1,command=self.bu|on1Click)

Vantagem: Trata eventos como o Bu|onPress e Bu|on Release e permite o uso da barra
De espao da mesma forma que o enter no programa anterior.

Programa90.py
20. Programao Grca em Python
Que widgets?

Bu|on, Canvas, Checkbu|on, Entry , Frame, Label, LabelFrame , Listbox , Menu,


Menubu|on, Message , Op>onMenu ,PanedWindow , Radiobu|on , Scale , Scrollbar,
Spinbox, Text, Toplevel

Existem extenses na Web.

Você também pode gostar

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy