Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
com Listas
1
Análise de Algoritmos (revisão)
2
Análise de Algoritmos com Listas
◼ Objetivo:
◼ Comparar a performance das duas listas: baseada em
arranjo e encadeada)
◼ Para isto, será usado o algoritmo de simplificação de
polígonos (http://www.inf.pucrs.br/~flash/alpro2/aulas/07-
listaenc/)
◼ Características do algoritmo: muitas operações de
remoção
◼ Qual é a implementação aparentemente mais indicada?
3
Análise de Algoritmos com Listas
◼ Tabela da contagem dos tempos
Análise do algoritmo de simplificação de polígonos
Lista encadeada/Get Arranjo/Get
Todos $ 2.183,00 $ 4.733,00
"1/2" $ 1.518.137.548,00 $ 2.857.564,00
"1/4" $ 1.707.838.967,00 $ 3.503.393,00
"1/8" $ 1.731.525.973,00 $ 3.665.758,00
◼ Tempo para “Todos” é menor na lista encadeada.
◼ Não há remoção de pontos, e o método add da
implementação baseada em arranjo precisa
redimensionar o arranjo de tempos em tempos
◼ Tempo para (1/2, 1/4 e 1/8) é menor na lista
baseada em arranjo
◼ Método get x Método remove
4
Análise de Algoritmos com Listas
public class ListSimpleLinked<E> implements ListTAD<E> {
private class Node<T> {...}
private Node<E> head;
private Node<E> tail;
private Node<E> current;
private int count;
public ListSimpleLinked() {
head = null; tail = null;
current = null; count = 0;
}
public void reset() {
current = head;
}
public E next() {
E obj = null;
if (current != null) { obj = current.element;
current = current.next;
return obj; }
return null;
} ...
10
5
Análise de Algoritmos com Listas
private ListTAD<Ponto> simplifyResetNext(ListTAD<Ponto> nova, int totalPontos){
while (nova.size() > totalPontos) {
double menorD = 10000; int pos = 1;
Ponto menorImp = null;
nova.reset();
Ponto prev = nova.next();
Ponto atual = nova.next();
Ponto next = nova.next();
while (next != null) {
double l1 = atual.distancia(prev);
double l2 = atual.distancia(next);
double l3 = prev.distancia(next);
double d = l1 + l2 - l3;
if (d < menorD) { menorD = d;
menorImp = atual; }
prev = atual; atual = next; next = nova.next();
}
nova.remove(menorImp);
}
return nova; ◼ Solução com reset e next
}
11
12
6
Análise de Algoritmos com Listas
◼ Conclusões
◼ Importante:
◼ Considerar todas as operações que serão feitas com a lista na
solução do problema
◼ De acordo com as operações, definir a estrutura de dados e o
algoritmo mais adequado
◼ Para pensar:
◼ Existe alguma forma de melhorar mais a performance do
algoritmo?
◼ Se a aplicação exigir alto desempenho, pode-se considerar a
opção de trabalhar diretamente com a implementação da lista
encadeada
13