Você está na página 1de 31

Estructuras de Dados II

Professor: MSc. Yurisbel Vega Ortiz

Agosto 2016
Apresentação da disciplina
Curso de ENGENHARIA DE INFORMÁTICA
 
Disciplina Estruturas de Dados II
Tema 1 Introdução à análise de algoritmos
Tema 2 Grafos
Tema 3 Matrizes Esparsas (Dispersas) e Tabelas Hash
Sistema de avaliação
1ª Prova Freq. 14-09-2016
2ª Prova Freq. 28-10-2016
Exame da 21-11-2016
Época Normal
Exames de 12-12-2016
Recurso
Tema # 1 Introdução à Análise de Algoritmos.

Conferência # 1 Introdução à Análise de Algoritmos


iterativos.
Objectivo
• Calcular a complexidade temporária de algoritmos
iterativos usando anotação asintótica.
Sumário
1.1. Introdução
1.2. Eficiência e complexidade
1.3. Cotas de complexidade
1.4. Regras para o cálculo da complexidade temporária
Bibliografia
• Técnicas de Diseño de Algoritmos. Rosa Guerequeta y Antonio
Vallecillo, Servicio de Publicaciones de la Universidad de
Málaga. 1998, ISBN: 84-7496-666-3, Segunda Edición: Mayo
2000
• Data Structures, Algorithms and Object-Oriented
Programming,Gregory L. Heileman, University of New Mexico
• Data Structures and Algoritms, A. V. Aho, J. Hopcroft, J. Ullman
• Manual de Lógica y Algoritmos, Dr. Alejandro Roxete, Msc.
Martha Delgado, Msc. Irene López, Lic. Ernesto Carbonell, CEIS,
CUJAE
• Algoritmos y Complejidad, DCC-UNS, 2001, Héctor Rodríguez
Figueredo
• Matemáticas discretas, Richard Johnsonbaugh, Volumen 1.
Um algoritmo é qualquer procedimento
computacional bem definido mediante um conjunto
de regras que dá solução a instâncias de um problema
(um conjunto específico de dados de entrada),que
produz um valor ou conjunto de valores como saída.
Deve cumprir com as características
• Finitud: Deve terminar ao cabo de um número
finito de passos ou operações.
• Definição: A cada passo do algoritmo deve de estar
definido com precisão.
• Entrada: Um algoritmo pode ter 0 ou mais
entradas.
• Saída: Um algoritmo deve ter uma ou mais saídas.
• Efectividade: A cada uma das operações que se
deve efectuar tem que ser o suficientemente básica
como pára que possam ser realizadas de forma
exata e numa quantidade finita de tempo.
Instância de um Algoritmo:
• Na soma de dois números inteiros, determinar a
soma de 85 e 14.
• Para saber se um número é primo, determinar se o
2 é um número.
Análise de algoritmos

Eficiência

Ferramentas medir custo (tempo e recursos)

Comparar algoritmos

Seleccionar o mais eficiente


Com respeito ao uso eficiente dos recursos, este se
costuma medir em função de dois parâmetros:

1. espaço, a memória que o algoritmo


utiliza (complexidade espacial).
2. tempo, o tempo que demora em se
executar (complexidade temporária).

É usual que para a análise dos algoritmos se


considere de maneira primária o tempo de execução
desta.
Complexidade temporária
A complexidade temporária (o tempo) de um
algoritmo depende de diversos factores, como
podem ser: os dados de entrada fornecidos, a
linguagem utilizada, a qualidade do código gerado
pelo compilador ou a eficiência do intérprete, a
natureza e rapidez das instruções de máquina do
processador que execute o programa e a
complexidade intrínseca do algoritmo.
Medida do tempo de execução
Existem dois possíveis estudos sobre o tempo de
execução de um algoritmo:

1. Um que proporcione uma medida real (a


posteriori).
2. Um que proporcione uma medida teórica (a
priori).
Priori
• O tempo de execução de um algoritmo vai ser uma
função que mede o número de operações
elementares (básicas) que realiza o algoritmo para
para um tamanho de entrada específico.
• Tempo no caso melhor: corresponde-se com o menor
dos tempos requerido para executar-se com a cada
uma das instâncias do problema.
• Tempo no caso pior: corresponde-se com o maior dos
tempos requeridos para executar-se com a cada uma
das instâncias do problema.
• Tempo no caso média: corresponde-se com a divisão
da soma dos tempos requeridos para executar-se a
cada uma das instâncias do problema entre o total das
instâncias.
Cotas de complexidade
Cota superior: Ao expressar a cota superior queremos
estudar as funções que no máximo crescem tão
rapidamente como outra. Conhecendo esta cota
poderemos assegurar que em nenhum caso o
algoritmo empregará um tempo maior que esta.

Cota inferior: Ao expressar a cota inferior queremos


estudar as funções que no máximo crescem tão
lentamente como outra. O conhecimento da cota
inferior garante que o algoritmo nunca empregará um
tempo inferior ao da cota.
Anotação asintótica
• Cota superior…… O …Ómicron

• Cota inferior…… Ω…Omega

• Cota exacta………Θ… Theta (também denominada zita ou


teta)
Propriedades de O
1.Para qualquer função f tem-se que f⊂O(f), uma
função é O grande dela mesma
2. f∈O(g) ⇒ O(f) ⊂ O(g)
3. O(f)=O(g)⇔ f∈O(g) ^ g∈O(f)
4. Si f∈O(g) ^ g∈O(h) ⇒ f∈O(h)
5. Si f∈O(g) ^ f∈O(h) ⇒ f∈O(min(g,h))
6.Regra da soma: Si f1∈O(g) ^ f2∈O(h) ⇒ f1
+f2∈O(max(g,h))
7. Regra do produto: Si f1∈O(g) ^ f2∈O(h) ⇒ f1
•f2∈O(g•h)
Regras para o cálculo da complexidade
temporária
• Regra 1: O tempo requerido para o acesso a um valor
é um valor constante, bem como o tempo para
realizar operações aritméticas elementares, como a
adição, substracción, multiplicação, divisão e para as
comparações é constante. O tempo para alojar o
resultado em memória também é constante, com um
valor de O(1).
• Exemplo: y = x;
y = x + 5;
• Regra 2: O tempo requerido para a execução de um
algoritmo de sequência linear é a “sumatoria” dos
tempos da cada instrução.
• Exemplo:
1. Ler(x);
2. quadrado = x * x;
3. Mostrar(quadrado);
• Regra 3: O tempo requerido para a execução de
uma instrução condicional if C then I1 else I2, é a
soma do tempo necessário para avaliar a expressão
mais o tempo máximo de execução dos blocos
associados aos ramos then e else.

T = T(C) + Máximo( T(I1), T(I2) )


• Regra 4: O tempo requerido para a execução de uma
instrução repetitiva while (C) do I, é a “soma” do
tempo necessário para a avaliação da expressão Mais
c o número de iterações multiplicado pelo tempo para
a instrução somado com o tempo necessário para a
avaliação da expressão pela quantidade de iterações.

• T = T(C) + iterações *T(C) + iterações *T(I)


Agrupando termos semelhantes obtemos :
• T = T(C) + (iterações)*(T(C)+T(I)).
• Regra 4a: O tempo requerido para a execução de
uma instrução repetitiva for( I1, C, I2) I3 é
equivalente ao tempo empregado em executar a
sequência de instruções seguintes :
I1;
while( C ) do
{
l3;
I2;
}
T = T(I1) + T(C) + (iterações)*(T(I3) + T(I2) + T(C)).
• Assim mesmo o tempo requerido para a execução
repetitiva do I while (C) é equivalente ao tempo
empregado em executar o bloco de instruções
seguinte :
I;
while( C ) do
I;
T = T(I) + T(C)+ (iterações)*(T(I)+T(C)).

• Em general de ter outras estruturas repetitivas se


têm de converter estas em equivalentes à estrutura
while e calcular seu tempo de execução.
• Regra 5: Bloco de sentenças. Aplica-se a regra da soma,
de forma que se calcula o tempo de execução tomando
o máximo dos tempos de execução da cada uma das
partes.

• Regra 6: Chamadas de função. Se uma determinada


função P tem um tempo de O(f(n)), com n à medida do
tamanho dos argumentos, qualquer função que chame a
P tem no chamada uma cota de O(f(n)). As atribuições
com diversas chaadas a funções devem de somar as
cotas do tempo de execução da cada chamada.
Exemplo 1
Ejemplo 2
Conclusões
• Os elementos que intervêm na eficiência de um
algoritmo têm uma natureza variada, e estão
determinados pelo próprio algoritmo, os dados de
entrada e o médio de cómputo sobre o qual se executa
o algoritmo.

• As cotas de complexidade são uma forma de expressar


a complexidade temporária como funções de n
(tamanho de entrada) que permitem comparar e
seleccionar algoritmos a priori.

Você também pode gostar