Buscar

Algoritmos e Estruturas de dados para Engenharia Elétrica - Poli - P3 2015

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 8 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 8 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

Prévia do material em texto

GABARITO
PCS3110 - Algoritmos e Estrutura de Dados para Engenharia Elétrica Prova 3 - 24/11/2015
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
Utilize caneta azul ou preta para marcar as caixas e preencha a caixa totalmente
para correta interpretação. Exemplo: �. Não use �.
1
Anna
2
Fábio
3
Anarosa
4
Romero
Marque as caixas ao lado para formar o seu número USP e escreva seu nome
abaixo.
Nome (completo):
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
[2,6 pontos] Questão 1
O algoritmo de Bellman-Ford é um algoritmo de grafo que usa programação dinâmica para, dado um vértice de
partida v, encontrar o menor caminho entre v e todos os demais vértices de um grafo orientado ponderado.
O algoritmo retorna TRUE se não há ciclo negativo, ou seja, um ciclo cuja soma dos pesos das arestas é negativa.
Neste caso, Bellman-Ford apresenta a solução correta para grafos com arestas de peso negativo.
Bellman-Ford (G, s)
1 Seja d[1...|G.V|] um novo arranjo
// d armazena na posição i a distância de s ao vertice vi
2 Seja pred[1...|G.V|] um novo arranjo
// pred armazena na posição i o predecessor de vi no menor caminho de s a vi
3 for each v ∈ G.V
4 d[v] = ∞
5 pred[v] = NIL
6 d[s] = 0
7 for i = 1 to |G.V|-1
// para cada i são criados caminhos com, no máximo, i arestas
8 for each (u,v) ∈ G.E
9 if d[v] > d[u] + G.Adjacencia[u,v]
10 d[v] = d[u] + G.Adjacencia[u,v] // seleciona a menor distância
11 pred[v] = u // atualiza o predecessor no menor caminho
12 for each (u,v) ∈ G.E
13 if d[v] > d[u] + G.Adjacencia[u,v]
14 return FALSE
15 return TRUE
GABARITO
(a) [1,0 ponto] Para o grafo da figura (a) simule Bellman-Ford, colocando na tabela 2 os valores de d[v] e
pred[v] para cada i do laço da linha 7. Para o laço da linha 8, considere a ordem de arestas da tabela 1. Ao
final da simulação, escreva dentro de cada vértice v do grafo da figura (b) o valor de d[v] e hachure as arestas
que representam o menor caminho de s a v.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Para uso do professor:
0 1 2 4 8
Tabela 1
(u,v) (s,v1) (s,v3) (v1, v2) (v1, v3) (v1, v4) (v2, v1) (v3, v2) (v3, v4) (v4, s) (v4, v2)
G.Adjacencia[u,v] 6 7 5 8 -4 -2 -3 9 2 7
Tabela 2
i d[1]/pred[v1] d[2]/pred[v2] d[3]/pred[v3] d[4]/pred[v4]
1 6/s ∞ 7/s ∞
2 6/s 4/v3 7/s 2/v1
3 2/v2 4/v3 7/s 2/v1
4 2/v2 4/v3 7/s -2/v1
(b) [0,5 ponto] O algoritmo Bellman-Ford adota uma abordagem top-down ou bottom-up de programação dinâ-
mica? Por que?
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Para uso do professor:
0 1 2 4 5
Ele usa abordagem bottom-up porque parte do cálculo da solução ótima para subproblemas menores que depois
são combinadas na obtenção do problema geral.
(c) [0,5 pontos] Quem são as subestruturas ótimas do problema tratado pelo Bellman-Ford?
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Para uso do professor:
0 1 2 4 5
Elas estão caracterizadas pelo caminho mínimo de s a todo v ∈ V, começando por caminhos de tamanho 1 até
finalizar com caminhos de tamanho n-1.
GABARITO
(d) [0,6 pontos] Analise a complexidade de Bellman-Ford.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Para uso do professor:
0 1 2 4 6
Bellman-Ford (G, s)
1 Seja d[1...|G.V|] um novo arranjo
2 Seja pred[1...|G.V|] um novo arranjo
3 for each v ∈ G.V
4 d[v] = ∞
5 pred[v] = NIL
6 d[s] = 0
7 for i = 1 to |G.V|-1
8 for each (u,v) ∈ G.E
9 if d[v] > d[u] + G.Adjacencia[u,v]
10 d[v] = d[u] + G.Adjacencia[u,v]
11 pred[v] = u
12 for each (u,v) ∈ G.E
13 if d[v] > d[u] + G.Adjacencia[u,v]
14 return FALSE
15 return TRUE
Custo de execução
1 1
2 1
3 |G.V|+1
4 |G.V|
5 |G.V|
6 1
7 |G.V|+1
8 |G.V|*(|G.E|+1)
9 |G.V|*|G.E|
10 irrelevante para cálculo assintótico
11 irrelevante para cálculo assintótico
12 |G.E|+1
13 |G.E|
14 irrelevante para cálculo assintótico
15 1
Complexidade de Bellman-Ford: Para efeito do cálculo de T (|G.V |, |G.E|), associamos custo 1 às linhas 1, 2,
6 e 15. A linha 3 é executada |G.V|+1 vezes, linhas 4 e 5 |G.V| vezes cada. O laço da linha 7 é executado
|G.V|+1 vezes e o laço aninhado a ele (linha 8) |G.V|*(|G.E|+1) vezes. A linha 9 é executada |G.V|*|G.E|
vezes e execução das linhas 10 e 11 dependem da condição verificada em 9. Para efeito do cálculo assintótico é
irrelevante incluí-las. Linha 12 é executada |G.E|+1 vezes, linha 13 |G.E| vezes, linha 14 depende da condição
verificada em 13, mas também é irrelevante para o cálculo. Assim,
T (|G.V |, |G.E|) = 4 + |G.V |+ 1 + 2∗ |G.V |+ |G.V |+ 1 + |G.V | ∗ (|G.E|+ 1) + |G.V | ∗ |G.E|+ |G.E|+ 1 + |G.E| =
= 7 + 5|G.V |+ 2|G.E|+ 2|G.V ||G.E| = Θ(|G.V ||G.E|)
[2,6 pontos] Questão 2
Considere os algoritmos a seguir, desenvolvidos por um novato mas que funcionam.
Alg1 (a,b,c) // obs: c ≥ 1
1 if c == 1
2 return a
3 else
4 return Alg1(a,b,c-1)+Alg1x(a,b,c)
Alg1aux (a,b,c) // obs: c ≥ 1
1 if c == 1
2 return a
3 else
4 return b * Alg1aux(a,b,c-1)
Alg2 (a,b,c) // obs: c ≥ 1
1 s == a
2 if c > 1
3 for i = 2 to c
4 p == a
5 for j = 2 to i
6 p = p * b
7 s = s + p
8 return a
GABARITO
(a) [1,0 ponto] O que fazem os algoritmos? Apresente uma explicação dissertativa ou uma fórmula matemática.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Para uso do professor:
0 1 2 4 8
Alg1: Devolve a soma dos primeiros c termos de uma PG de termo inicial a e razão b
Alg1aux: Devolve o termo na posição c de uma PG de termo inicial a e razão b
Alg2: Devolve a soma dos primeiros c termos de uma PG de termo inicial a e razão b
(b) [1,6 ponto] Determine a notação θ para os algoritmos Alg1 e Alg2, apresentando o cálculo efetuado (não será
considerada na avaliação deste item uma resposta sem a apresentação do cálculo).
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Para uso do professor:
0 1 2 4 8 16
GABARITO
Teste 1 O problema da mochila (knapsack problem) é assim definido: dado um conjunto S de n objetos, cada
objeto i com um benefício bi e um peso wi (número inteiro), o objetivo consiste em encontrar um subconjunto T ⊆ S
que maximize
∑
i∈T bi, sujeito a
∑
i∈T wi ≤W , onde W é o máximo peso permitido na mochila. Este problema pode
ser resolvido por Programação Dinâmica com a seguinte relação de recorrência:
B[k,w] =
{
B[k − 1, w] se w < wk,
max{B[k − 1, w], bk +B[k − 1, w − wk]} caso contrário, (1)
sendo B[k,w] o benefício total máximo obtido usando um subconjunto de Sk; Sk = {1, 2, 3, . . . , k}, o conjunto
dos k primeiros objetos, S0 = ∅ e B[0, w] = 0 para w ≤ W , w = {0, 1, 2, 3, . . . ,W}. São fornecidos o peso
máximo W permitido na mochila e o conjunto S = {(i, bi, wi)}, i = 1, 2, . . . n, de n objetos com benefícios bi e
pesos wi. A solução desejada é então B[n,W ] e um respectivo T que satisfaça as restrições do problema. Para
S = {(1, 25, 7), (2, 15, 2), (3, 20, 3), (4, 36, 6)} e W = 10, assinale a alternativa que indica o maior benefíciototal conse-
guido por PD e quais seriam os objetos que iriam para a mochila nesta solução.
A
Máximo
∑
i∈T bi = 45, com T = {1, 3}
B
Máximo
∑
i∈T bi = 61, com T = {1 ,4}
C
Máximo
∑
i∈T bi = 35, com T = {2 ,4}
D
Máximo
∑
i∈T bi = 56, com T = {3, 4}
E
Máximo
∑
i∈T bi = 51, com T = {2, 4}
Teste 2 Você deve encontrar os 103 (mil) itens mais baratos a partir de uma lista de itens não ordenados contendo
107 itens diferentes. Dois esquemas de solução são oferecidos:
1. Esquema A: consiste de um único passo, que é repetir mil vezes a busca sequencial.
2. Esquema B: consiste de três passos: (i) converter a lista em um vetor; (ii) ordenar o vetor com o Mergesort e
(iii) recuperar os mil itens mais baratos.
Assinale a alternativa que indique os tempos TA e TB nos piores casos e o esquema mais eficiente. Observe que a
busca sequencial tem complexidade linear, assim como também é linear a complexidade de transformar uma lista em
um vetor. A complexidade do Mergesort é Θ(n log2 n). Despreze a complexidade do terceiro passo do Esquema B (e
respectiva contribuição no cálculo de TB). Ainda, assuma que: (i) a busca sequencial de 1 (um) item em uma lista
não ordenada de 100 (cem) itens leva 0,1 milissegundos (ms), (ii) a conversão de 100 (cem) itens de lista em vetor
também leva 0,1 ms e que (iii) a ordenação de 100 (cem) itens usando o Mergesort também leva 0,1 ms. Lembre-se
que logb(x
p) = p.logb(x).
A TA = 10 segundos, TB = 10
7
segundos, A é a melhor opção.
B TA = 10 segundos, TB = 35 segundos, A é a melhor opção.
C TA = 10
4
segundos, TB = 10 segundos, B é a melhor opção.
D TA = 10
4
segundos, TB = 45 segundos, B é a melhor opção.
E TA = 10
7
milissegundos, TB = 10
7
milissegundos, ambas são igualmente boas opções.
GABARITO
Teste 3 Considere o seguinte Max-heap: [8, 7, 4, 6, 5, 2, 3, 1]. Qual é o heap resultante após a função
Extrair-Maior ser chamada duas vezes?
Extrair-Maior (A)
1 if A.heap-size < 1
2 erro �underflow do heap�
3 maior = A[1]
4 A[1] = A[A.heap-size]
5 A.heap-size = A.heap-size - 1
6 Max-Heapify(A, 1)
7 return maior
Max-Heapify (A, i)
1 esq = Filho-Esquerda(i)
2 dir = Filho-Direita(i)
3 if esq <= A.heap-size and A[esq] > A[i]
4 maior = esq
5 else maior = i
6 if dir <= A.heap-size and A[dir] > A[maior]
7 maior = dir
8 if maior != i
9 temp = A[i]
10 A[i] = A[maior]
11 A[maior] = temp
12 Max-Heapify(A, maior)
A
[6, 4, 5, 2, 1, 3]
B
[6, 5, 4, 3, 1, 2]
C
[6, 3, 4, 1, 5, 2]
D
[4, 6, 5, 2, 3, 1]
E
[6, 5, 4, 1, 3, 2]
Teste 4 Um restaurante deseja criar um sistema para controlar os pedidos de pratos para a cozinha. Os pedidos
que foram feitos antes devem ter maior prioridade, porém dependendo do tipo do pedido ele pode ter uma prioridade
diferente. Pedidos de entrega (delivery) devem ter prioridade mais baixa que pedidos feitos no salão do restaurante.
No caso de pedidos no salão, entradas (saladas, porções, etc.) devem ter prioridade mais alta que pratos principais.
Um Engenheiro decidiu implementar essa lógica usando uma fila de prioridade e usando como chave a data/hora
do pedido incrementada por um valor não negativo, o qual é definido pelo tipo do pedido. Assinale a alternativa
incorreta sobre a solução desse problema:
A
Uma entrada pedida no salão pode estar atrás de uma entrega na fila de prioridade.
B
Um pedido pode ser tirado da fila de prioridade mesmo que a chave seja maior que a data/hora atual.
C
Um exemplo válido de cálculo da chave é fazer o pedido de entrega ter sua data/hora incrementada de 5 minutos,
o pedido de prato principal feito no salão de 2 minutos e o pedido de entrada feito no salão não ter incremento.
D
A fila de prioridade deverá usar um Min-Heap.
E
Deve-se impedir que pedidos fiquem com a mesma prioridade, já que o algoritmo de fila de prioridade não aceita
que a heap tenha valores iguais como chave.
GABARITO
Teste 5 Considere a seguinte chamada inicial do algoritmo dado a seguir: Quicksort(A, 1, 12) com A = [13, 19, 9,
5, 3, 8, 7, 4, 21, 2, 10, 6]. Assinale a alternativa que indique o estado correto do vetor A após a terceira (3a.) execução
do passo 2 do algoritmo Quicksort.
Partition (A, inicio, fim)
1 pivo = A[fim]
2 i = inicio - 1
3 for j = inicio to fim - 1
4 if A[j] <= pivo
5 i = i + 1
6 temp = A[i]
7 A[i] = A[j]
8 A[j] = temp
9 A[fim] = A[i + 1]
10 A[i + 1] = pivo
11 return i + 1
Quicksort (A, inicio, fim)
1 if inicio < fim
2 pivo = Partition(A, inicio, fim)
3 Quicksort(A, inicio, pivo � 1)
4 Quicksort(A, pivo + 1, fim)
A
A = [2, 3, 4, 5, 6, 8, 7, 9, 13, 10, 19, 21]
B
A = [2, 3, 4, 5, 6, 8, 7, 9, 21, 13, 10, 19]
C
Nenhuma das outras alternativas está correta.
D
A = [5, 3, 4, 2, 6, 9, 8, 7, 10, 13, 19, 21]
E
A = [2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 19, 21]
Teste 6 Deseja-se criar uma versão do algoritmo de inserção (Insertion-Sort) que evita a comparação i > 0 no
while interno (ou seja, usando uma sentinela). Para isso criou-se o seguinte código:
Insertion-Sort (A)
1 Arruma-Arranjo(A)
2 for j = 3 to A.tamanho
3 chave = A[j]
4 i = j - 1
5 while A[i] > chave
6 A[i + 1] = A[i] //shift de A[i]
7 i = i - 1
8 A[i + 1] = chave
O que a função Arruma-Arranjo deve fazer para que esse algoritmo funcione e sem alterar o tamanho do arranjo A?
A
Trocar o menor elemento do arranjo com o elemento da primeira posição.
B
Substituir o último elemento do arranjo por ∞.
C
Trocar o maior elemento do arranjo com o elemento da primeira posição.
D
Substituir o primeiro elemento do arranjo por -∞.
E
Trocar o maior elemento do arranjo com o elemento da última posição.
GABARITO
Teste 7 Como as lacunas das linhas 1 e 10 do algoritmo Selection-Sort-Recursivo abaixo devem ser preenchidas
para que se tenha uma versão recursiva do algoritmo de ordenação por seleção que ordena em ordem crescente?
A
1 indice <= A.tamanho
10 indice - 1
B
1 indice >= 1
10 indice + 1
C
1 indice >= A.tamanho
10 menor + 1
D
1 indice <= 1
10 indice - 1
E
1 indice >= A.tamanho
10 indice + 1
Selection-Sort-Recursivo (A, indice)
1 if
2 return
3 menor = indice
4 for j = indice + 1 to A.tamanho
5 if A[j] < A[menor]
6 menor = j
7 temporario = A[menor]
8 A[menor] = A[indice]
9 A[indice] = temporario
10 Selection-Sort-Recursivo(A, )
Teste 8 Assinale a alternativa que representa a complexidade assintótica do algoritmo de Prim simplificado, dado
a seguir, sabendo que o passo 4 tem complexidade linear no pior caso, a operação de união tem custo constante e
|G.V |= n.
Prim (G)
1 T = ∅
2 B = {v} //sendo v um nó arbitrário de G.V
3 while B 6= G.V
4 determine (u,v) de menor comprimento tal que u ∈ {G. V - B} e v ∈ B
5 T = T ∪ {(u,v)}
6 B = B ∪ {u}
A Θ(n2)
B Θ(n)
C Θ(log2 n)
D
Nenhuma das outras alternativas está correta.
E Θ(n log2 n)

Outros materiais