Você está na página 1de 6

1a Lista de Exerccios

Estrutura de Dados I
Entrega no dia .... (veja no Blackboard)
LCD Gonalves
23 de fevereiro de 2015

Sumrio
1 Regras para a entrega

2 Exercises (a lista)
2.1 Contagem de instrues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 big-O e T(n) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Medio prtica de tempos de execuo . . . . . . . . . . . . . . . . . . . . . .

4
4
5
7

SUMRIO

1 Regras para a entrega

1 Regras para a entrega


1. Os exerccios que no necessitam de rodar numa mquina:
so manuscritos (feitos mo).
devem vir com o enunciado com a numerao que aparece na lista (no precisa
ser manuscrito);
devem estar na mesma sequncia do enunciado na lista.
a resposta deve vir aps cada um dos enunciados.
com alternativas devem ser entregues com a resoluo/justicativa e no apenas
com a alternativa marcada.
podem ser resolvidos com o mtodo a sua escolha, exceto quando indicado ao
contrrio.
devem estar todos num mesmo pdf: a digitalizao pode ser feita com celular ou
assemelhado. O resultado nal deve ser legvel.
devem conter o nome dos integrantes na primeira pgina de resoluo (escrevam
os nomes antes de digitalizar).
2. Os exerccios que necessitam de rodar numa mquina (cdigos):
organizados em pastas com nomes ExercicioE01, ExercicioA4232, etc.
apenas os arquivos .java com o nome classe identicando qual exerccio (dentro
da pasta)
todo o cdigo deve conter os nomes completos e RGMs dos integrantes
os cdigos devem estar indentados (nem leio caso no estejam)
3. Todos os exerccios
entrega apenas das partes no resolvidas
devem ter os nomes completos e RGMs dos integrantes dos grupos num arquivo
.txt separado na raiz do zip. Destaque o menor RGM;
Devem estar contidos em um nico zip: 1 pdf para os exercicios manuscritos,
alm dos restantes, cada um em uma pasta;
4. Regras gerais de orientao
grupos de 2 a 4 integrantes
tamanho mximo do zip = 3MBytes.
Listas iguais, notas iguais. (iguais a 0, caso voc no tenha entendido)
Listas sem nenhum capricho, sem comentrios.
Listas com resolues que s quem fez entende (se entende), sem comentrios.
Bom portugus nas justicativas.
um grupo mantm os mesmos integrantes durante todo o curso
o integrante de um grupo pertence apenas quele grupo. No caso de integrantes
promscuos, 0 para os grupos (promscuos) envolvidos.

Para esta lista, entregar


Todos os exerccios da Seo 2.1 resolvidos
Seja n o nmero do integrante com o menor RGM do grupo (incluindo-se dgitos de
controle e ans se for o caso).
Se n for par, entregar apenas os exerccios pares das Sees 2.2 e 2.3 (Ex: E2.32
um exercicio par)
Se n for mpar, entregar apenas os exerccios mpares das Sees 2.2 e 2.3 (Ex:
E2.11 um exercicio mpar)
2

SUMRIO

2 Exercises (a lista)

2 Exercises (a lista)

g) int k = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
for (int p = 1; p <= n; p++)
k = k + 1;

2.1 Contagem de instrues


E. 2.1 Dado n, quanto vale k aps a execuo
dos trechos de cdigo abaixo?

E. 2.2 [null] Para os cdigos abaixo, quantas vezes a instruo x = x + 1 executada?

a) int k = 0;
for (int i = 1; i <= 4; i++)
k = k + 1;

a) for (iPos = 0; iPos < 4; iPos ++)


x = x + 1;

b) int k = 0;
for (int i = 0; i <= 4; i++)
k = k + 1;

1
2

c) int k = 0;
for (int i = 1; i < 4; i++)
k = k + 1;

b) for (i = 0; i < n; i++) {


for (j = 1; j < n; j++) {
for (k = 0; k < n; k++) {
x = x + 1;
}
}
}

d) int k = 0;
for (int i = 0; i < 4; i++)
k = k + 1;

E. 2.3 [null] No convencido que voc tenha entendido, suponha o pseudocdigo abaixo e faa as
seguintes tarefas:

e) int k = 0;
for (int i = 1; i <= n; i++)
k = k + 1;

int k
while
k
i
}

1
2
3

R: Exemplo de resposta aceitvel:


Se n < 1, o loop no executado e k vale 0 ao nal.
Se n 1,
Para n = 1
Linha 1: k = 0
Linha 2: i = 1, i n
Linha 3: k = k + 1 (k = 1)
Linha 2: i++(i = 2), i no n, m do loop
k vale 1
Para n = 2
Linha 1: k = 0
Linha 2: i = 1, i n
Linha 3: k = k + 1 (k = 1)
Linha 2: i++(i = 2), i n
Linha 3: k = k + 1 (k = 2)
Linha 2: i++(i = 3), i no n, m do loop
k vale 2
E assim por diante. De modo geral, para todo o n 1, k
vale n ao nal do loop.
Outro exemplo de resposta aceitvel:
Se n < 1, o loop no executado e k vale 0 ao nal.
Se n 1, o loop executado n vezes (i=1, 2, 3, . . . n).
somado 1 a k a cada iterao e isso feito n vezes. Logo k vale
n ao nal do loop se n 1.

1
2
3
4
5
6
7

= 0, i = n;
(i > 0) {
= k + 1;
= i / 2;

a) Suponha n=1. Quanto vale k ao nal do


loop? (apresente o teste de mesa)
b) Suponha n=2. Quanto vale k ao nal do
loop? (apresente o teste de mesa)
c) Suponha n=4. Quanto vale k ao nal do
loop? (apresente o teste de mesa)
d) Suponha n=8. Quanto vale k ao nal do
loop? (apresente o teste de mesa)
e) Suponha n=2t . Quanto vale k ao nal do
loop?
f) Compare os resultados com log2 (n) e apresente uma concluso.
E. 2.4 [null] No convencido que voc tenha entendido, suponha o pseudocdigo abaixo e faa as
seguintes tarefas:
int k
while
k
i
}

Ou faa o teste de mesa conforme aprendeu.


f) int k = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
k = k + 1;

= 0, i = n;
(i > 0) {
= k + 1;
= i / 10;

a) Suponha n=1. Quanto vale k ao nal do


loop? (apresente o teste de mesa)

SUMRIO

2.2

big-O e T(n)

Note que o nmero de iteraes em power1(


n) e em power1(n) no dependem de x (como j
exemplicado acima).
Varie n como n = 1, 2, 4, 8, 16, . . . , 1024 e
apresente tanto os cdigos como a sada do programa na forma de uma tabela [n, o resultado da
contagem e lg(n)]. Pode ser usado o System.out
.printf(), caso deseje.

b) Suponha n=10. Quanto vale k ao nal do


loop? (apresente o teste de mesa)
c) Suponha n=100. Quanto vale k ao nal do
loop? (apresente o teste de mesa)
d) Suponha n=1000. Quanto vale k ao nal do
loop? (apresente o teste de mesa)
e) Suponha n=10t . Quanto vale k ao nal do
loop?
f) Compare os resultados com log10 (n) e
apresente uma concluso.

2.2 big-O e T(n)

E. 2.5 ``Concluiu-se'' em aula que power1()

E. 2.6 (UFOP)[null] O que signica dizer que


uma funo g(n) O[f(n)]?

float power1(float x, int n) {


float p = 1.0f;
for ( ; n > 0; n--) {
p *= x;
}
return p;
}

E. 2.7 Em muitos fruns encontra-se a seguinte


resposta para encontrar o menor valor num array
de tamanho n: ordena-se o array com o Quicksort e toma-se o primeiro elemento do array ordenado. Argumente que esse um mau algoritmo
em termos de O() se comparado simples busca
linear.

e power2()

E. 2.8 A partir dos T(n) abaixo, indique o big O


com apenas um termo. O limite deve ser rme
a) T (n) = 10n + 5

float power2(float x, int n) {


float p = 1.0f;
for ( ; n > 0; n /= 2) {
if (n % 2 != 0)
p *= x;
x *= x;
}
return p;
}

R: T(n) = O(n)

b)
c)
d)
e)

possuam complexidades O(n) e O(lg n), respectivamente. Vamos estimar T(n) para os dois mtodos.
Modique os cdigos de tal maneira que cada
um deles retorne o nmero de multiplicaes efetuadas ao invs do valor da potncia, um dado n.
Por exemplo,

T (n) = 3n2 + 4n + 1
T (n) = 4
T (n) = 3n3 + 4n2 + 1
T (n) = 3n log(n)+4n+1 ( log(n) sempre
menor que n mas sempre maior que algo
apenas constante para n grande)
R: T (n) = O[n log(n)]

f) T (n) = 3n2 log(n)+4n2 +10000000000000


E. 2.9 Indique(justicando) qual o big-O correspondente a

a) for (iPos = 0; iPos < 4; iPos ++)


k = k + iPos;
/* float */ int contPower1(/* float x, */ int n) {
int cont = 0;
// float p = 1.0f;
for ( ; n > 0; n--) {
cont ++;
// p *= x;
b)
}
// Comea da posio 0 at a n.
return cont;
// p;
for (i = 0; i < n; i++) {
}
. . . // nenhum for ou estrutura de repetio
for (j = 1; j < n; j++) {
. . . // nenhum for ou estrutura de repetio
A contagem deve ser feita atravs de
for (k = 0; k < n; k++) {
. . . // nenhum for ou estrutura de
um cdigo (simples) que chame mtorepetio
dos intcontPower1(n) (j feito acima) e
}
}
intcontPower2(n).
A contagem deve ser
}

feita substituindo-se a multiplicao por um


incremento num contador, apropriadamente
colocado (como j exemplicado acima).

SUMRIO

2.2

E. 2.10 (UFOP)[*] Indique se as armativas a


seguir so verdadeiras ou falsas e justique a sua
resposta:
a) 2n+1 = O(2n )
b) 22n = O(2n )
c) melhor um algoritmo que requer 2n passos do que um que requer 10n5 passos.
d) Se f (n) = O[u(n)] e g(n) = O[v(n)] ento
f (n) + g(n) = O[u(n) + v(n)]
e) Se f (n) = O[u(n)] e g(n) = O[v(n)] ento
f (n) g(n) = O[u(n)v(n)]

A mquina 100 vezes mais rpida consegue resolver um problema de tamanho 250 no mesmo tempo que a mais lenta resolve um de 25. (Note que T(n) o mesmo para as duas mquinas. Claro que uma mquina 100 vezes mais rpida consegue
resolver 100 problemas de tamanho 25 no mesmo tempo.)

E. 2.15 (Adaptado de UFOP)[null] Implemente


a operaes de soma (opcionalmente, de multiplicao) de duas matrizes quadradas de ordem n.
Explique qual a ordem de complexidade dessas
dessa operao (opcionalmente, da de multiplicao).

E. 2.11 (UFOP)[null] Suponha um algoritmo A


e um algoritmo B com funes de complexidade
de tempo

E. 2.16 (Adaptado de UFOP)[null] Implemente


a operaes de soma (opcionalmente, de multiplicao) de duas matrizes m n. Explique qual
a ordem de complexidade dessa operao (opcionalmente, da de multiplicao).

TA (n) = n2 n + 549 e TB (n) = 49n + 49,


respectivamente. Determine quais so os valores
de n pertencentes ao conjunto dos nmeros naturais para os quais A leva menos tempo para executar do que B.

E. 2.17 (UFOP)[**] Considere que voc tenha


um problema de tamanho n para resolver e duas
opes de algoritmos. Uma delas quadrtica
tanto no pior caso quanto no melhor caso. J a
segunda linear no melhor caso e cbica no pior
caso. Considerando que o melhor caso ocorre
90% das vezes que voc executa o programa enquanto o pior caso ocorre apenas 10% das vezes,
qual algoritmo voc escolheria? Justique a sua
resposta em funo do tamanho n da entrada.

E. 2.12 [null] Dois algoritmos A e B possuem


TA (n) = 14 n3 e TB (n) = 2 n, com n sendo
um inteiro positivo. Para quais valores de n um
algoritmo mais rpido que o outro? Resolva algebricamente.
E. 2.13 [null] (ENADE) Considere 2 algoritmos
A e B com tempos 8n2 e n3 . Qual o maior valor
de n para qual o algoritmo B mais eciente que
o algoritmo A?
E. 2.14 [*] (POSCOMP) Um algoritmo roda
em tempo T (n) = 2n2 . Em um certo computador, num tempo fsico t, o algoritmo resolve
um problema de tamanho 25. Imagine agora que
voc tem disponvel um computador 100 vezes
mais rpido. Qual o tamanho de problema que o
mesmo algoritmo resolve usando o computador
mais rpido para o mesmo tempo t?
R: Seja o certo computador a mquina A e o 100 vezes mais
rpido a mquina B. O tempo real (fsico) na mquina A T(n)
vezes o tempo de 1 instruo nessa mquina (iA). Com a mesma
notao para a mquina B, ca
tA (n) = iA 2 n

e tB (n) = iB 2 n

Como B 100 vezes mais rpida, iB = iA /100. A mquina A


resolve um problema de tamanho 25 em tempo t: t = iA 2252 .
Para o mesmo tempo t, a mquina B resolve um problema de
tamanho n tal que
2

t = iB 2 n iA 2 25 = iB 2 n


iA 2 25 = 
iA /100 2 n
2

big-O e T(n)

n = 100 25 = (10 25) n = 250

SUMRIO

2.3 Medio prtica de tempos de execuo

E. 2.18 (Adaptado de UFOP)[*] A Busca de Padres um problema clssico em cincia da computao e aplicado em reas diversas como pesquisa gentica, editorao de textos, buscas na internet,
etc. Basicamente, ele consiste em encontrar as ocorrncias de um padro p de tamanho m em um texto
t de tamanho n. Por exemplo, no texto t="PROVA DE EDI" o padro p="OVA" encontrado na posio 2 enquanto o padro p="OVO" no encontrado. A metodologia mais simples para determinar
de um padro est presente usar fora bruta, conforme mostrado no pseudocdigo abaixo
// Pesquisa o padrao p na string t
int find(String p, String t) {
int n = t.length (), m = p.length ();
for (int i = 0; i < n m + 1 ; i++) {
int k = i,
j = 0;
while ( (j <= m) && ( t.charAt(k) == p.charAt(j) ) {
j++;
k++;
}
if (j > m)
return i;
}
return -1;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

a) Para entender como funciona o algoritmo, apresente o teste de mesa para t="PROVA DE EDI" e
p="OVA".
b) Em funo de n e m, qual a complexidade de pior caso? Considere apenas o nmero de
comparaes de caracteres efetuadas. Justique.
c) Em funo de n e m, qual a complexidade de melhor caso? Considere apenas o nmero de
comparaes de caracteres efetuadas. Justique.
Nota: a.charAt(k) retorna o caracter da posio k de a. Nas strings, como nos arrays, a indexao
comea a partir do 0.
E. 2.19 Mesmo enunciado do exerccio anterior. ...

2.3 Medio prtica de tempos de execuo


E. 2.20 (Aritmtica inteira) Quanto tempo a mquina leva para calcular uma adio ? E uma multiplicao, uma diviso e um mod?
No d para medir, na prtica, 1 operao porque ela leva na faixa de ns e o StopWatch mede no
mnimo 1 s. Portanto, so necessrias no mnimo cerca de 1000 operaes para que o cronmetro
desenvolvido mea alguma coisa. No mnimo: porque 1000 operaes devem fornecer cerca de 1
dgito no resultado nal e esse dgito no preciso.
Use a classe StopWatch fornecida e mea o tempo entre n operaes (n=1000, 10000 somas, por
exemplo, ou mais, dependendo da velocidade da CPU). Escolha dois nmeros fornecidos pelo usurio
(ou dois nmeros aleatrios). A partir do tempo das n operaes, determine o tempo de 1 operao
entre inteiros, para as 4 mencionadas.
E. 2.21 Repita o exerccio anterior para nmeros em ponto utuante (reais: double ou oat).