Buscar

Análise de Algoritmos - Aula 07 (Guilherme)

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 35 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 35 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 35 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Roteiro da Aula 7
1 Problemas, Algoritmos e Cotas
2 Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
3 Cotas Inferiores
Linear
Super-linear
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Problemas, Algoritmos e Cotas
Cota superior: O(s(n))
Cota inferior: Ω(ℓ(n))
Algoritmo A1
fA1 (n)
Algoritmo A2
fA2 (n)
Algoritmo A3
fA3 (n)
Problema P1
Cota superior: fA1 (n) = O(s1(n))
Cota inferior: fA1 (n) = Ω(ℓ1(n))
Cota superior: fA2 (n) = O(s2(n))
Cota inferior: fA2 (n) = Ω(ℓ2(n))
Cota superior: fA3 (n) = O(s3(n))
Cota inferior: fA3 (n) = Ω(ℓ3(n))
Em que tempo e´ poss´ıvel resolver?
Qual e´ o tempo m´ınimo poss´ıvel para resolver?
O que significa tudo isso?
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Ordenac¸a˜o
• Entrada: um vetor v de n elementos;
• Sa´ıda: o vetor v ordenado: i < j ⇒ v[i] ≤ v[j].
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Ordenac¸a˜o
• Entrada: um vetor v de n elementos;
• Sa´ıda: o vetor v ordenado: i < j ⇒ v[i] ≤ v[j].
Da definic¸a˜o de um problema,
sempre extra´ımos um algoritmo forc¸a bruta!
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Forc¸a Bruta
int v[N];
...
forcaBrutaSort( int *v ){
int i,flag = 1;
while( flag ){
flag = 0;
proximaPermutacao( v );
for( i = 0; i < N-1; i++ )
if (v[i] > v[i+1]) flag = 1;
}
}
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Forc¸a Bruta
int v[N];
...
forcaBrutaSort( int *v ){
int i,flag = 1;
while( flag ){
flag = 0;
proximaPermutacao( v );
for( i = 0; i < N-1; i++ )
if (v[i] > v[i+1]) flag = 1;
}
}
fforcaBrutaSort(n) = Θ(n · n!)
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Bubble Sort
int v[N];
...
bubbleSort( int *v ){
int i,flag = 1;
while( flag ){
flag = 0;
for( i = 0; i < N-1; i++ )
if (v[i] > v[i+1]){
swap( &v[i], &v[i+1] );
flag = 1;
}
}
}
fbubbleSort(n) = n
2 − n
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Bubble Sort
int v[N];
...
bubbleSort( int *v ){
int i,flag = 1;
while( flag ){
flag = 0;
for( i = 0; i < N-1; i++ )
if (v[i] > v[i+1]){
swap( &v[i], &v[i+1] );
flag = 1;
}
}
}
fbubbleSort(n) = n
2 − n
fbubbleSort(n) = Θ(n
2)
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
O que temos ate´ agora?
bubbleSort
Cota inferior: fforcaBrutaSort(n) = Ω(n · n!)
Cota superior: fbubbleSort(n) = O(n
2)
Cota inferior: fbubbleSort(n) = Ω(n
2)
Cota superior: fforcaBrutaSort(n) = O(n · n!)
forcaBrutaSort
fbubbleSort(n)
Cota superior: O(n2)
Cota inferior: ?
Ordenac¸a˜o
Em que tempo e´ poss´ıvel resolver?
Qual e´ o tempo m´ınimo poss´ıvel para resolver?
fforcaBrutaSort(n)
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Quick Sort
V : 5 3 2 6 4 1 3 7
• Particionar o vetor V [1, n] em dois vetores: V [1, q] e
V [q + 1, n], tal que:
Qualquer elemento de V [1, q] e´ menor ou igual a qualquer
elemento de V [q + 1, n];
• A partic¸a˜o e´ feita em torno de um pivot (escolhemos o
valor de V [1]);
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Quick Sort
int v[N];
...
quickSort( int *v, p, r ){
int q;
if ( p < r ) {
q = particiona( v, p, r );
quickSort( v, p, q );
quickSort( v, q+1, r );
}
}
• Qual e´ o custo de quickSort( v, 1, n )?
• Quanto custa particiona( v, 1, n )?
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Quick Sort
int v[N];
...
quickSort( int *v, p, r ){
int q;
if ( p < r ) {
q = particiona( v, p, r );
quickSort( v, p, q );
quickSort( v, q+1, r );
}
}
• Qual e´ o custo de quickSort( v, 1, n )?
• Quanto custa particiona( v, 1, n )?
T (n) = n + T (q) + T (n− q)
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Quick Sort
• Qual e´ o pior caso?
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Quick Sort
• Qual e´ o pior caso?
• q = p, quer dizer, o pivot particiona V em dois vetores de
tamanho 1 e n− 1;
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Quick Sort
• Qual e´ o pior caso?
• q = p, quer dizer, o pivot particiona V em dois vetores de
tamanho 1 e n− 1;
• com isso, temos, T (n) = n + T (1) + T (n− 1), com
T (1) = 0;
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Quick Sort
• Qual e´ o pior caso?
• q = p, quer dizer, o pivot particiona V em dois vetores de
tamanho 1 e n− 1;
• com isso, temos, T (n) = n + T (1) + T (n− 1), com
T (1) = 0;
Mas sabemos que:
T (n) = T (n− 1) + n, T (1) = 0
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Quick Sort
• Qual e´ o pior caso?
• q = p, quer dizer, o pivot particiona V em dois vetores de
tamanho 1 e n− 1;
• com isso, temos, T (n) = n + T (1) + T (n− 1), com
T (1) = 0;
Mas sabemos que:
T (n) = T (n− 1) + n, T (1) = 0
fquickSort(n) = Θ(n
2)
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
O que temos ate´ agora?
Cota inferior: fforcaBrutaSort(n) = Ω(n · n!)
Cota superior: fforcaBrutaSort(n) = O(n · n!)
forcaBrutaSort
Cota superior: O(n2)
Cota inferior: ?
Ordenac¸a˜o
Em que tempo e´ poss´ıvel resolver?
Qual e´ o tempo m´ınimo poss´ıvel para resolver?
fforcaBrutaSort(n)
bubbleSort
Cota superior: fbubbleSort(n) = O(n
2)
Cota inferior: fbubbleSort(n) = Ω(n
2)
fbubbleSort(n)quickSort
Cota superior: fquickSort(n) = O(n
2)
Cota inferior: fquickSort(n) = Ω(n
2)
fquickSort(n)
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Merge Sort
V : 5 3 2 6 4 1 3 7
• Dividir o vetor V [1, n] em dois vetores de tamanho igual:
V [1, n
2
] e V [n
2
, n];
• Ordenar, recursivamente, os dois vetores de tamanho n
2
;
• Fazer o merge dos dois vetores;
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Merge Sort
int v[N];
...
mergeSort( int *v, p, r ){
if ( p < r ) {
q = floor((p+r)/2);
mergeSort( v, p, q );
mergeSort( v, q+1, r );
merge( v, p, q, r );
}
}
• Qual e´ o custo de mergeSort( v, 1, n )?
• Quanto custa merge( v, 1, n/2, n )?
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
Merge Sort
int v[N];
...
mergeSort( int *v, p, r ){
if ( p < r ) {
q = floor((p+r)/2);
mergeSort( v, p, q );
mergeSort( v, q+1, r );
merge( v, p, q, r );
}
}
• Qual e´ o custo de mergeSort( v, 1, n )?
• Quanto custa merge( v, 1, n/2, n )?
T (n) = 2T (n
2
) + n, T (1) = 1
fmergeSort(n) = Θ(n log n)
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Forc¸a Bruta
Bubble Sort
Quick Sort
Merge Sort
Cotas
Inferiores
O que temos ate´ agora?
Cota inferior: fforcaBrutaSort(n) = Ω(n · n!)
Cota superior: fforcaBrutaSort(n) = O(n · n!)
forcaBrutaSort
Cota superior: O(n logn)
Cota inferior: ?
Ordenac¸a˜o
Qual e´ o tempo m´ınimo poss´ıvel para resolver?
fforcaBrutaSort(n)
bubbleSort
Cota superior: fbubbleSort(n) = O(n
2)
Cota inferior: fbubbleSort(n) = Ω(n
2)
fbubbleSort(n)
quickSort
Cota superior: fquickSort(n) = O(n
2)
Cota inferior: fquickSort(n) = Ω(n
2)
fquickSort(n)
mergeSort
Cota superior: fmergeSort(n) = O(n logn)
Cota inferior: fmergeSort(n) = Ω(n log n)
fmergeSort(n)
Em que tempo e´ poss´ıvel resolver?
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
Cotas Inferiores
• Vamos simplificar admitindo apenas entradas de tamanho
par.
E´ poss´ıvel um algoritmo que ordene corretamente
um vetor v[n] usando menos do que
n
2
comparac¸o˜es?
• Suponha que exista o tal algoritmo: alg( int *v )
Mas a´ı temos uma contradic¸a˜o!
alg( int *v ) e´ necessariamente errado!
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
Cotas Inferiores
Portanto Ω(n) e´ uma cota inferior
para o problema da ordenac¸a˜o
pois mostramos que a func¸a˜o de custo de tempo de pior caso
de qualquer algoritmo para ordenar n nu´meros
sera´ Ω(n)
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
O que temos ate´ agora?
Cota inferior: fforcaBrutaSort(n) = Ω(n · n!)
Cota superior: fforcaBrutaSort(n) = O(n · n!)
forcaBrutaSort
Cota superior: O(n logn)
Cota inferior: Ω(n)
Ordenac¸a˜o
Qual e´ o tempo m´ınimo poss´ıvel para resolver?
fforcaBrutaSort(n)
bubbleSort
Cota superior: fbubbleSort(n) = O(n
2)
Cota inferior: fbubbleSort(n) = Ω(n
2)
fbubbleSort(n)
quickSort
Cota superior: fquickSort(n) = O(n
2)
Cota inferior: fquickSort(n) = Ω(n
2)
fquickSort(n)
mergeSort
Cota superior: fmergeSort(n) = O(n logn)
Cota inferior: fmergeSort(n) = Ω(n log n)
fmergeSort(n)
Em que tempo e´ poss´ıvel resolver?
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
Cota Inferior para Ordenac¸a˜o
int v[N];
...
bubbleSort( int *v ){
int i,flag = 1;
while( flag ){
flag = 0;
for( i = 0; i < N-1; i++ )
if (v[i] > v[i+1]){
swap( &v[i], &v[i+1] );
flag = 1;
}
}
}
Vamos desenhar uma a´rvore para [5, 3, 9] e [1, 4, 7]
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
Cota Inferior para Ordenac¸a˜o
• Qualquer algoritmo que resolva o problema da ordenac¸a˜o
usando comparac¸o˜es pode ser representado como uma
a´rvore de decisa˜o bina´ria;
• Cada no´ da a´rvore corresponde a` uma comparac¸a˜o ≤.
Dependendo do resultado, o algoritmo vai seguir um de
dois caminhos, gerando assim a a´rvore;
• Note enta˜o que o pior caso em nu´mero de comparac¸o˜es
sera´ a altura da a´rvore, o tamanho do maior caminho
entre a raiz e uma folha.
Mas, a´ı, da´ para concluir algo interessante...
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
A´rvore de Execuc¸a˜o
4 3 9 8 134
3 841 9
≤
≤ ≤
≤ ≤
≤ ≤
≤ ≤
34
Qual e´ o nu´mero m´ınimo de folhas nessa a´rvore?
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
Cota Inferior para Ordenac¸a˜o
• A a´rvore tem que ter pelo menos n! folhas, pois se estiver
faltando uma permutac¸a˜o sequer, podemos mostrar que o
algoritmo esta´ errado!
Como mostrar isso?
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
Cota Inferior para Ordenac¸a˜o
• A a´rvore tem que ter pelo menos n! folhas, pois se estiver
faltando uma permutac¸a˜o sequer, podemos mostrar que o
algoritmo esta´ errado!
Como mostrar isso?
Se a permutac¸a˜o [v3, v1, v6, v5, v4, v2] na˜o estiver na a´rvore,
veja que a resposta para a entrada [5, 31, 2, 30, 11, 6]
sera´ necessariamente errada!
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
Cota Inferior para Ordenac¸a˜o
• Qual e´ a altura m´ınima para uma a´rvore com n! folhas?
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
Cota Inferior para Ordenac¸a˜o
• Qual e´ a altura m´ınima para uma a´rvore com n! folhas?
• ... e´ log n!
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
Cota Inferior para Ordenac¸a˜o
• Qual e´ a altura m´ınima para uma a´rvore com n! folhas?
• ... e´ log n!
• mas isso ja´ vimos que e´ Θ(n log n)
Portanto, Ω(n log n) e´ cota inferior para ordenac¸a˜o
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
Ordenac¸a˜o
Cota inferior: fforcaBrutaSort(n) = Ω(n · n!)
Cota superior: fforcaBrutaSort(n) = O(n · n!)
forcaBrutaSort
Cota superior: O(n logn)
Cota inferior: Ω(n log n)
fforcaBrutaSort(n)
bubbleSort
Cota superior: fbubbleSort(n) = O(n
2)
Cota inferior: fbubbleSort(n) = Ω(n
2)
fbubbleSort(n)
quickSort
Cota superior: fquickSort(n) = O(n
2)
Cota inferior: fquickSort(n) = Ω(n
2)
fquickSort(n)mergeSort
Cota superior: fmergeSort(n) = O(n logn)
Cota inferior: fmergeSort(n) = Ω(n logn)
fmergeSort(n)
Em que tempo e´ poss´ıvel resolver?
Tempo m´ınimo poss´ıvel para resolver?
Ordenac¸a˜o
Ana´lise de
Algoritmos
113859
Aula 7
Roteiro
Problemas,
Algoritmos e
Cotas
Ordenac¸a˜o
Cotas
Inferiores
Linear
Super-linear
Algoritmo O´timo
Algoritmo O´timo
Dados um problema P e um algoritmo A para P , dizemos que
A e´ o´timo, se fA = O(f(n)) e Ω(f(n)) e´ cota inferior para P ;
onde fA e´ a func¸a˜o de custo de tempo de pior caso de A.
Quer dizer, se A na˜o custa mais do que o custo m´ınimo.
	Roteiro
	Problemas, Algoritmos e Cotas
	Ordenação
	Força Bruta
	Bubble Sort
	Quick Sort
	Merge Sort
	Cotas Inferiores
	Linear
	Super-linear

Outros materiais