projeto algortimo

116
Projeto e Análise de Algoritmos Prof. Reinaldo 1

Upload: shlim-shade

Post on 24-Jul-2015

543 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Projeto algortimo

Projeto e Análise de Algoritmos

Prof. Reinaldo

1

Page 2: Projeto algortimo

EmentaConceitos básicos: motivação e solução de problemas, critérios de análise, correção e eficiência. Análise de Algoritmos; tempo de processamento e operações elementares, complexidade de pior caso, comparação de algoritmos. Análise de Crescimento de Funções. Recorrências e Funções Geradoras. Análise Probabilística e Análise Amortizada. Algoritmos e estruturas de dados para problemas em grafos. Técnicas de construção de algoritmos (gulosos, programação dinâmica, divisão e conquista). Teoria da complexidade: as classes P, NP, Np-completo. Hierarquia em complexidade computacional. Algoritmos heurísticos, busca heurística, algoritmos heurísticos X algoritmos exatos. 2

Page 3: Projeto algortimo

REFERÊNCIAS

BÁSICAASCENDIO, Ana Fernanda Gomes. Estruturas de dados:

algoritmos, análise da complexidade e implementação em JAVA e C/C++. São Paulo:Person Prentice Hall, 2010.

DROZDEK, Adam. Estrutura de dados e algoritmo em C++. São Paulo: Pioneira Thomson Learing, 2002.

ZIVIANI, Nívio.Projeto de Algoritmos com Implementações em Java e C++.São Paulo: Pioneira Thomson Learing, 2006.

3

Page 4: Projeto algortimo

CONTEÚDO PROGRAMÁTICO

UNIDADE 1 – FUNDAMENTOS TEÓRICOS SOBRE ANÁLISE DE ALGORTIMOS. CH TOTAL: 12

Introdução à disciplina, apresentar definições importantes da área de estudo denominada para análise de algoritmos. Embasamento teórico e uma visão geral das perspectivas, na área de computação.

4

Page 5: Projeto algortimo

CONTEÚDO PROGRAMÁTICO

5

Ch Teo

ChPra

ChPra Ped

Visão geral da disciplina projeto e análise de algoritmos.

01

Objetivo da disciplina projeto e análise de algoritmos.

01

Resolver algoritmos e estrutura de dados em Java. 04Definir tipos de dados, tipos abstratos de dados, medida do tempo de execução de um programa.

02

Compreender comportamento assintótico de funções, classes de comportamento assintótico e técnicas de análise de algoritmos em Java.

01 03

Page 6: Projeto algortimo

Algoritmos, Estruturas de Dados eProgramas

Os algoritmos fazem parte do dia-a-dia das pessoas.Um algoritmo pode ser visto como uma sequência de ações executáveis para a obtenção de uma solução para um determinado tipo de problema.

6

Page 7: Projeto algortimo

Algoritmo

• Segundo Cormen (2002), um algoritmo é qualquer procedimento computacional bem definido que toma algum valor ou conjunto de valores como entrada e produz algum valor ou conjunto de valores como a saída

7

Page 8: Projeto algortimo

Algoritmo

•Segundo Dijkstra, um algoritmo corresponde a

uma descrição de um padrão de comportamento,

expresso em termos de um conjunto finito de

ações.

8

Page 9: Projeto algortimo

• Definir tipos de dados, tipos abstratos de dados, medida do tempo de execução de um programa.

9

CONTEÚDO PROGRAMÁTICO

Page 10: Projeto algortimo

Algoritmos

• Os algoritmos são utilizados para resolver diversos tipos de problemas, por exemplo:– Comércio Eletrônico;– Instruções para o uso de medicamentos;– Indicações de como montar um aparelho;– Entre outros.

10

Page 11: Projeto algortimo

Estrutura de Dados• Quando os dados obtidos na entrada do

algoritmo são dispostos e manipulados de forma homogênea no processo de computação de sua saída, trata-se de tipo abstrato de dados.

• Uma estrutura de dados é um meio para armazenar e organizar dados com o objetivo de facilitar o acesso e as modificações (Cormen, 2002).

11

Page 12: Projeto algortimo

Estrutura de Dados

Todos os problemas a serem resolvidos por algoritmos possuem dados. Estes são armazenados em estruturas, escolhidas de acordo com as operações que podem ser realizadas sobre elas e com o custo de cada uma dessas operações.

12

Page 13: Projeto algortimo

Estrutura de Dados

Estruturas de dados e algoritmos estão intimamente ligados:

– não se pode estudar estruturas de dados sem considerar os algoritmos associados a elas,– assim como a escolha dos algoritmos em geral depende da representação e da estrutura dos dados.

13

Page 14: Projeto algortimo

Estrutura de Dados

Para resolver um problema é necessário

escolher uma abstração da realidade, em

geral mediante a definição de um conjunto

de dados que representa a situação real.

14

Page 15: Projeto algortimo

Programas

• Programar é basicamente estruturar dados e construir algoritmos.

• Programas são formulações concretas de algoritmos abstratos, baseados em representações e estruturas específicas de dados.

• Programas representam uma classe especial de algoritmos capazes de serem seguidos por computadores.

15

Page 16: Projeto algortimo

Tipos de dados•Caracteriza o conjunto de valores a que uma

constante pertence, ou que podem ser

assumidos por uma variável ou expressão, ou

que podem ser gerados por uma função.

•Tipos simples de dados são grupos de

valores indivisíveis (como os tipos básicos int,

float, double e char).16

Page 17: Projeto algortimo

Análise de AlgoritmoEnvolve dois tipos de problemas distintos (Knusth, apud Ziviani, 1971):

• análise de um algoritmo particular: calcular o custo de um determinado algoritmo na resolução de um problema.

• análise de uma classe de algoritmos: determinar o algoritmo de menor custo possível para resolver um problema.

17

Page 18: Projeto algortimo

Análise de Algoritmo• O que é análise de algoritmos• Segundo Cormen (2002), é a previsão dos

recursos de que o algoritmo necessitará.- Memória.- Largura de banda de comunicação.- Hardware de computação.- Tempo de computação.

18

Page 19: Projeto algortimo

Tipos de Problemas na Análise deAlgoritmos

Análise de um algoritmo particular. Qual é o custo de usar um dado algoritmo para resolver um problema específico? Características que devem ser investigadas:

1.análise do número de vezes que cada parte do algoritmo deve ser executada,

2.estudo da quantidade de memória necessária.

19

Page 20: Projeto algortimo

Tipos de Problemas na Análise deAlgoritmos

Análise de uma classe de algoritmos.– Qual é o algoritmo de menor custo possível para

resolver um problema particular?– Toda uma família de algoritmos é investigada.– Procura-se identificar um que seja o melhor

possível.

– Coloca-se limites para a complexidade computacional dos algoritmos pertencentes à classe.

20

Page 21: Projeto algortimo

Custo de um Algoritmo• Determinando o menor custo possível

para resolver problemas de uma dada classe, temos a medida da dificuldade inerente para resolver o problema.

• Quando o custo de um algoritmo é igual ao menor custo possível, o algoritmo é ótimo para a medida de custo considerada.

21

Page 22: Projeto algortimo

Custo de um Algoritmo

• Podem existir vários algoritmos para resolver o mesmo problema.

• Se a mesma medida de custo é aplicada a diferentes algoritmos, então é possível compará-los e escolher o mais adequado.

22

Page 23: Projeto algortimo

Tipos Abstratos de Dados (TAD’s)• Modelo matemático, acompanhado das operações

definidas sobre o modelo.• TAD’s são utilizados extensivamente como base para o

projeto de algoritmos.• A implementação do algoritmo em uma linguagem de

programação específica exige a representação do TAD em termos dos tipos de dados e dos operadores suportados.

• A representação do modelo matemático por trás do tipo abstrato de dados é realizada mediante uma estrutura de dados.

23

Page 24: Projeto algortimo

Implementação de TAD’s

Considere uma aplicação que utilize uma lista de inteiros. Poderíamos definir TAD Lista, com as seguintes operações:

1. Faça a lista vazia;

2. Obtenha o primeiro elemento da lista; se a lista estiver vazia, então retorne nulo;

3. Insira um elemento na lista.24

Page 25: Projeto algortimo

Complexidade no Desempenho de Algoritmo

O fato do algoritmo resolver (teoricamente) um problema não significa que seja aceitável na prática. Às vezes, o algoritmo mais imediato está longe se ser razoável em termos de eficiência. Um exemplo é o caso da solução de sistemas de equações lineares.

25

Page 26: Projeto algortimo

Complexidade no Desempenho de Algoritmo

26

n Método de Cramer Método de Gauss2x2 22 µs 50 µs

3x3 102 µs 159 µs

4x4 456 µs 353 µs

5x5 2,35 ms 666 µs

10x10 1,19 mim 4,95 ms

20x20 15.225 séculos 38,63 ms

40x40 5*10 séculos 0.315 sFonte:Complexidade de algoritmo, Toscani, 2001

33

Page 27: Projeto algortimo

Medida do Tempo de Execução de um Programa

• O projeto de algoritmos é fortemente influenciado pelo estudo de seus comportamentos.

• Depois que um problema é analisado e decisões de projeto são finalizadas, é necessário estudar as várias opções de algoritmos a serem utilizados, considerando os aspectos de tempo de execução e espaço ocupado.

• Muitos desses algoritmos são encontrados em áreas como pesquisa operacional, otimização, teoria dos grafos, estatística, probabilidades, entre outras.

27

Page 28: Projeto algortimo

Medida do Custo pela Execução doPrograma

Tais medidas são bastante inadequadas e os resultados jamais devem ser generalizados:

• os resultados são dependentes do compilador que pode favorecer algumas construções em detrimento de outras;

• os resultados dependem do hardware;• quando grandes quantidades de memória são

utilizadas, as medidas de tempo podem depender deste aspecto.

28

Page 29: Projeto algortimo

Medida do Custo pela Execução doPrograma

Apesar disso, há argumentos a favor de se obterem medidas reais de tempo.

– Ex.: quando há vários algoritmos distintos para resolver um mesmo tipo de problema, todos com um custo de execução dentro de uma mesma ordem de grandeza.

– Assim, são considerados tanto os custos reais das operações como os custos não aparentes, tais como alocação de memória, indexação, carga, dentre outros. 29

Page 30: Projeto algortimo

Medida do Custo por meio de umModelo Matemático

• Usa um modelo matemático baseado em um computador idealizado.

• Deve ser especificado o conjunto de operações e seus custos de execuções.

• É mais usual ignorar o custo de algumas das operações e considerar apenas as operações mais significativas.

30

Page 31: Projeto algortimo

Medida do Custo por meio de umModelo Matemático

Ex.: algoritmos de ordenação. Consideramos o número de comparações entre os elementos do conjunto a ser ordenado e ignoramos as operações aritméticas, de atribuição e manipulações de índices, caso existam.

31

Page 32: Projeto algortimo

Conceitos Básicos Complexidade

Análise de algoritmos tem como objetivo

melhorar, se possível, seu desempenho e

escolher, entre os algoritmos disponíveis,

o melhor.

32

Page 33: Projeto algortimo

Conceitos Básicos Complexidade

Existem vários critérios de avaliação de um algoritmo como:•Quantidade de trabalho requerido;•Quantidade de espaço requerido;•Simplicidade ;•Exatidão na resposta.

33

Page 34: Projeto algortimo

Medidas de Complexidade

A quantidade de trabalho requerido por um algoritmo não pode ser descrita simplesmente por um número, porque o número de operações básicas efetuadas em geral não é o mesmo para qualquer entrada (depende do trabalho da entrada).

34

Page 35: Projeto algortimo

Medidas de Complexidade

Se a complexidade é tomada como máxima para qualquer entrada de dado “tamanho”, a complexidade é chamada no pior caso ou simplesmente complexidade.

35

Page 36: Projeto algortimo

Medidas de Complexidade

Se entanto, é levada em conta a probabilidade de ocorrência de cada entrada de um mesmo “tamanho”, a complexidade é chamada complexidade esperada ou complexidade média.

36

Page 37: Projeto algortimo

Função de Complexidade

Para medir o custo de execução de um algoritmo é comum definir uma função de custo ou função de complexidade f.• f(n) é a medida do tempo necessário para executar um algoritmo para um problema de tamanho n.• Função de complexidade de tempo: f(n) mede o tempo necessário para executar um algoritmo em um problema de tamanho n.

37

Page 38: Projeto algortimo

Função de Complexidade

Função de complexidade de espaço: f(n) mede a memória necessária para executar um algoritmo em um problema de tamanho n.Utilizaremos f para denotar uma função de complexidade de tempo daqui para a frente.A complexidade de tempo na realidade não representa tempo diretamente, mas o número de vezes que determinada operação considerada relevante é executada.

38

Page 39: Projeto algortimo

Exemplo - Maior ElementoConsidere o algoritmo para encontrar o maior elemento de um vetor de inteiros v[0..n − 1], n>= 1.

public class Max {public static int max ( int v [ ] , int n) {int max = v[0] ;for ( int i = 1; i < n; i++)i f (max < v[ i ] ) max = v[ i ] ;return max;}}

39

Page 40: Projeto algortimo

Exemplo

Seja f uma função de complexidade tal que f(n) é o número de comparações entre os elementos de v, se v contiver n elementos.

• Logo f(n) = n − 1, para n > 0.• Vamos provar que o algoritmo apresentado no programa acima é ótimo.

40

Page 41: Projeto algortimo

Exemplo

Teorema: Qualquer algoritmo para encontrar o maior elemento de um conjunto com n elementos, n>= 1, faz pelo menos n − 1 comparações.Prova: Deve ser mostrado, por meio de comparações, que cada um dos n − 1 elementos é menor do que algum outro elemento.

41

Page 42: Projeto algortimo

Exemplo

Logo n − 1 comparações são necessárias. O teorema acima nos diz que, se o número de comparações for utilizado como medida de custo, então o método max da classe Max é ótimo.

42

Page 43: Projeto algortimo

Tamanho da Entrada de Dados

A medida do custo de execução de um algoritmo depende principalmente do tamanho da entrada dos dados.É comum considerar o tempo de execução de um programa como uma função do tamanho da entrada.Para alguns algoritmos, o custo de execução é uma função da entrada particular dos dados, não apenas do tamanho da entrada.

43

Page 44: Projeto algortimo

Tamanho da Entrada de Dados

No caso do método max do programa do exemplo, o custo é uniforme sobre todos os problemas de tamanho n.Já para um algoritmo de ordenação isso não ocorre: se os dados de entrada já estiverem quase ordenados, então o algoritmo pode ter que trabalhar menos.

44

Page 45: Projeto algortimo

Melhor Caso, Pior Caso e Caso Médio

Melhor caso: menor tempo de execução sobre todas as entradas de tamanho n.• Pior caso: maior tempo de execução sobre todas as entradas de tamanho n.• Se f é uma função de complexidade baseada na análise de pior caso, o custo de aplicar o algoritmo nunca é maior do que f(n).

45

Page 46: Projeto algortimo

Melhor Caso, Pior Caso e Caso Médio

•Caso médio (ou caso esperado): média dos tempos de execução de todas as entradas de tamanho n.• Na análise do caso esperado, supõe-se uma distribuição de probabilidades sobre o conjunto de entradas de tamanho n e o custo médio é obtido com base nessa distribuição.• A análise do caso médio é geralmente muito mais difícil de obter do que as análises do melhor e do pior caso 46

Page 47: Projeto algortimo

Exemplo - Registros de um Arquivo

• Considere o problema de acessar os registros de um arquivo.

• Cada registro contém uma chave única que é utilizada para recuperar registros do arquivo.

• O problema: dada uma chave qualquer, localize o registro que contenha esta chave.

• O algoritmo de pesquisa mais simples é o que faz a pesquisa seqüencial.

47

Page 48: Projeto algortimo

Exemplo - Registros de um Arquivo

Seja f uma função de complexidade tal que f(n) é o número de registros consultados no arquivo (número de vezes que a chave de consulta é comparada com a chave de cada registro).– melhor caso: f(n) = 1 (registro procurado é o primeiro consultado);– pior caso: f(n) = n (registro procurado é o último consultado ou não está presente no arquivo);– caso médio: f(n) = (n + 1)/2.

48

Page 49: Projeto algortimo

Modelo RAM:

• Instruções executadas uma após a outra, sem operações concorrentes.

• Instruções encontradas em computadores reais, tais como instruções aritméticas, de movimentação de dados e de controle.

Page 50: Projeto algortimo

Função de Complexidade

• O tempo de execução de um algoritmo: função de custo T, onde T(n) é a medida do tempo necessário para executar um algoritmo para um problema de tamanho n.

• T = função complexidade de tempo.• Se T(n) = medida de memória necessária para

a execução de um algoritmo, então • T = função de complexidade de espaço.

Page 51: Projeto algortimo

Função de Complexidade

• Um algoritmo nem sempre se comporta de modo uniforme, podendo identificar três casos:

• Pior caso = maior tempo de execução sobre todas as entradas de tamanho n.

• Melhor caso = menor tempo de execução sobre todas as entradas de tamanho n.

• Caso médio = média dos tempos de execução sobre todas as entradas de tamanho n.

Page 52: Projeto algortimo

Tempo de Execução

• O tempo de execução de um algoritmo aumenta proporcionalmente ao tamanho da entrada n do problema.

• Escolha do algoritmo pelo desempenho em entradas grandes.

• Estudo da eficiência assintótica.

Page 53: Projeto algortimo

Ordem Assintóticas

A complexidade assintótica é definida pelo crescimento da complexidade para entradas suficientemente grandes.

53

Page 54: Projeto algortimo

Introdução As vezes não é necessário implementar um algoritmo para

verificar seu desempenho Na maioria das vezes o que importa é o desempenho do

algoritmo para n grandes

Quando observa-se o tamanho da entrada de modo a influenciar o tempo de execução está se estudando a eficiência asintótica do algoritmo

10 100 1.000 10.000 100.000

n2 100 10.000 1.000.000 100.000.000 1010

n lg n 10 200 3.000 40.000 5x105

2n 1024 1.2x1030 ... ... ...

n! 3.62x106 ... ... ... ...

Page 55: Projeto algortimo

Elementos da Análise Assintótica

• Uma função g(n) domina assintoticamente outra função f(n) se existem duas constantes positivas c e n0 tais que, para n ≥ n0, temos que |f(n)| ≤ c . |g(n)|.

Page 56: Projeto algortimo

Notação O (Omicron)• Define limite assintótico superior sobre uma função: f(n) =

O(n2) ou f(n) O(n∈ 2)

• Para todos os valores n à direita de n0, o valor da função f(n) está em ou abaixo de g(n).

Graziela
Na figura abaixo não está faltando uma reta vertical??????? Verificar!!
Page 57: Projeto algortimo

Verificação da Equação

57

n ȁ�𝒏ȁ�≤ 𝒄∙|𝒏𝟐| c=1

1 1≤ 1 2 2≤ 4 3 3≤ 9 4 4≤ 16

Page 58: Projeto algortimo

Notação Ω

• Uma função f(n) é Ω(g(n)) se existem duas constantes positivas c e n0 tais que c . g(n) ≤ f(n), para todo n ≥ n0.

• A notação Ω define um limite assintótico inferior sobre uma função, dentro de um fator constante.

Page 59: Projeto algortimo

Notação Ω

Para todos os valores n à direita de n0, o valor da função f(n) está em ou acima de g(n).

Page 60: Projeto algortimo

Notação

• Uma função f(n) é (g(n)) se existem constantes positivas c1, c2 e n0 tais que 0 ≤ c1 g(n) ≤ f(n) ≤ c2 . g(n), para todo n ≥ n0.

• A notação define um limite assintótico firme sobre uma função.

Page 61: Projeto algortimo

Notação

Para todos os valores n à direita de n0, o valor da função f(n) está sobre ou acima de c1·g(n) e sobre ou abaixo de c2·g(n).

Page 62: Projeto algortimo

Notação o

Fornece um limite assintótico superior que pode ou não ser assintoticamente restrito.o(g(n)) = {f(n): para qualquer constante positiva c > 0, existe uma constante n0 > 0 tal que 0 ≤ f(n) < c g(n)} ⋅ para todo n ≥ n0}.

Page 63: Projeto algortimo

Notação

Fornece um limite assintótico inferior que pode ou não ser assintoticamente restrito.

(g(n)) = {f(n): para qualquer constante positiva c > 0, existe uma constante n0 > 0 tal que 0 ≤ c g(n) < f(n) ⋅ para todo n ≥ n0}.

Page 64: Projeto algortimo

Recorrências

• Uma função que chama a si mesma é dita recursiva. Pode ser exemplificada pelo fatorial de um número n, que para todo n ≥ 0, é definido por:

Page 65: Projeto algortimo

Recorrências• A análise do tempo de execução de

um algoritmo recursivo é um pouco diferente.

• Todo algoritmo recursivo tem um caso base, que permite finalizar a recursão.

• Existem métodos de solução de recorrências, mostrados a seguir.

Page 66: Projeto algortimo

Expansão Telescópia

Segundo Rezende (2002), a idéia básica é expandir a relação de recorrência até que possa ser detectado o seu comportamento no caso geral.

Page 67: Projeto algortimo

Árvore de Recursão

• Desenhar uma árvore cujos nós representam os tamanhos dos problemas correspondentes.

• Considerar: a altura da árvore e o número de passos executados em cada nível.

Page 68: Projeto algortimo

Método Máster

Usado como “receita” para resolver recorrências.

68

Page 69: Projeto algortimo

Notações, Funções e Somatórios

•Monotonicidade.•Pisos e tetos.•Polinômios. •Exponenciais.•Logaritmos.•Somatórios: série aritmética, série geométrica, série geométrica infinita, série harmônica, somas integrais e diferenciais.

Page 70: Projeto algortimo

Monotonicidade

Segundo Cormen (2002), uma função f(n) é monotonicamente crescente se a<=b produz f(a)<=f(b). Do mesmo modo, ela é monotonicamente descrescente se a<=b produz f(a)>=f(b).Uma função é estritamente crescente se a<b produz f (a) < f(b) e estritamente descrescente se a<b produz f(a) > f(b).

70

Page 71: Projeto algortimo

Pisos e TetosSeja x um número pertencente ao conjunto dos números reais.

Para qualquer número x, denota-se por |x| (piso de x) o maior inteiro menor ou igual a x.

Para qualquer número x, denota-se por |x| (teto de x) o menor inteiro maior ou igual a x.

Para todo número x,

X-1<|X|<= X<=|X|<X+1.

71

Page 72: Projeto algortimo

Polinômios

• Segundo Cormen (2002), dado um inteiro não negativo d, um polinômio em n de grau d é uma função p(n) da forma

72

𝒑ሺ𝒏ሻ= 𝒂𝒊𝒅

𝒊=𝟎 𝒏𝒊

Page 73: Projeto algortimo

Exponenciais

73

Page 74: Projeto algortimo

Logaritmos

74

Page 75: Projeto algortimo

Algoritmos Eficientes•Com um algoritmo ineficiente, um computador rápido não ajuda!•Suponha que uma máquina resolva um problema de tamanho N em um dado tempo.•Qual tamanho de problema uma máquina 10 vezes mais rápida resolve no mesmo tempo?

75

Page 76: Projeto algortimo

Algoritmos Eficientes

76

Page 77: Projeto algortimo

Crescimento de uma função

77

Page 78: Projeto algortimo

Exemplo

Esse exemplo mostra como calcular os dados da tabela acima. Suponha um algoritmo que precisa f(n) passos de execução numa dada máquina e uma outra máquina que é c vezes mais rápida. Portanto, ele é capaz de executar c vezes mais passos que a primeira. Ao mesmo tempo, qual seria o tamanho de problema n0 que a nova máquina é capaz de resolver? Temos

78

Page 79: Projeto algortimo

Exemplo

• f(n0) = cf(n).• Por exemplo para f(n) = log2n e c = 10

(exemplo acima), temos log2 n0 = 10 log2 n () n0 = n10.

• Em geral obtemos n0 = f−1(cf(n)) (isso faz sentido para funções monotônicas, que têm inversa).

79

Page 80: Projeto algortimo

Algoritmo de ordenação por troca (BUBBLE SORT)

Compara dados armazenados em um vetor de tamanho n. Cada elemento de posição i será comparado com o elemento de posição i+1. Quando a ordenação (crescente ou decrescente) é encontrada, trocam-se as posições entre os elementos. Um laço com a quantidade de elementos do vetor será executado (for(j=1;j<=n;j++)), e dentro deste, outro laço que percorre da primeira à penúltima posição do (for(i=0;i<n−1;i++)).

Page 81: Projeto algortimo

Análise da complexidade

Tempo de execução do algoritmo BUBBLE SORT é O(n2), pois n2 − n ≤ cn2, c = 1, n ≥ 1.

Page 82: Projeto algortimo

Gráficos de desempenho

Page 83: Projeto algortimo

BUBBLE SORT melhorado (1ª versão)

Compara cada elemento de posição i com o de posição i−1. Quando a ordenação (crescente ou decrescente) é encontrada, trocam-se posições entre os elementos. Um laço com a quantidade de elementos do vetor menos um será executado (for(j=1;j<n;j++)) e, dentro dele, outro laço que percorre da última posição à posição j, fazendo com que as posições já ordenadas não sejam mais percorridas (for(i=n−1;i>=j;i−−)).

Page 84: Projeto algortimo

Análise da Complexidade X Tempo de Execução

Análise da complexidade Tempo de execução

Page 85: Projeto algortimo

Gráficos de desempenho

Page 86: Projeto algortimo

BUBBLE SORT melhorado (2ª versão)

Compara-se cada elemento de posição i com o de posição i + 1 e, quando a ordenação (crescente ou decrescente) é encontrada, trocam-se posições entre os dados. Um laço com a quantidade de elementos do vetor, enquanto houver trocas, será executado (j = 1) e (while j <= n && troca == 1), e dentro dele, outro laço que percorre da primeira à penúltima posição do vetor (for(i=0;i<n−1;i++)).

Page 87: Projeto algortimo

No melhor caso: O(n)

No pior caso: O(n2)

Análise da Complexidade X Tempo de Execução

http://wikipedia.artudi.org/Bubble%20Sort.php

Simulador online do Bubble Sort

Page 88: Projeto algortimo

Algoritmo de ordenação por inserção (INSERTION SORT)

O segundo número do vetor inicia as comparações. Os elementos à esquerda do número eleito estão sempre ordenados de forma crescente ou decrescente. Um laço com as comparações será executado do segundo elemento ao último, ou seja, na quantidade de vezes igual ao número de elementos do vetor menos um (for(i=1;i<n;i++)).

Page 89: Projeto algortimo

Algoritmo de ordenação por inserção (INSERTION SORT)

Enquanto existirem elementos à esquerda do número eleito para comparações e a posição que atende a ordenação que se busca não for encontrada, o laço será executado. O número eleito está na posição i. Os números à esquerda do eleito estão nas posições de i–1 a 0, logo, o laço a ser executado será (j=i−1) e (while (j>=0 && elemento[j] > eleito)).

Page 90: Projeto algortimo

Análise da Complexidade X Tempo de Execução

Page 91: Projeto algortimo

Gráficos de desempenho

Page 92: Projeto algortimo

Análise do Algoritmo Insertion SortAlgoritmo Insertion Sort Custo Tempo

for j2 to length(A) c1 n

key A[j] c2 n-1

i j – 1 c3 n-1

while i>0 and A[i]>key c4

A[i+1] A[i] c5

i i – 1 c6

end

A[i+1] key c7 n-1

end

12

n

jjt

12

n

jjt

n

jjt

2

Page 93: Projeto algortimo

Análise do Algoritmo de Inserção

• tj é o número de vezes que o laço while é executado para aquele valor j

• Para calcular o tempo de execução T(n) para uma entrada de tamanho n, somamos todas as partes.

Tipos de Análise:

• Melhor Caso: A entrada já está ordenada, então tj = 1.

• Pior Caso: A entrada está desordenada, então tj = j

• Caso Médio: Média com base em uma distribuição93

Page 94: Projeto algortimo

Análise de Algoritmo O custo total para a execução do algoritmo será:

No melhor caso o vetor já esta ordenado, então o comportamento pode ser dado por an + b, ou seja, é linear.

)1()1(

)1()1()1()(

72

6

25

24321

nctc

tctcncncncnT

n

jj

n

jj

n

jj

)()(

)1()1()1()1()(

743274321

74321

ccccnccccc

ncncncncncnT

Page 95: Projeto algortimo

Análise de Algoritmo No pior caso o vetor esta na ordem inversa, logo o while será

executado todas as vezes

)1()2

)1((

)2

)1(()1

2

)1(()1()1()(

76

54321

ncnn

c

nnc

nncncncncnT

n

j

n

jj

n

j

n

jj

nnjt

nnjt

22

22

2

)1()1()1(

12

)1(

Page 96: Projeto algortimo

Análise de Algoritmo

No pior caso o tempo de execução pode ser expresso como an2 + bn + c, logo é uma função quadrática

)1()2

)1((

)2

)1(()1

2

)1(()1()1()(

76

54321

ncnn

c

nnc

nncncncncnT

)(

)222

()222

()(

7432

7654

3212654

cccc

ncccc

cccnccc

nT

Page 97: Projeto algortimo

Análise de Algoritmo Ordem ou Grau de Crescimento

o Na verdade o que interessa no tempo de execução é apenas o termo de maior grau

o Nesse caso, os custos ci e os termos de menor ordem podem ser ignorados

o No exemplo abaixo, diz-se que a ordem de crescimento é n2

)(

)222

()222

()(

7432

7654

3212654

cccc

ncccc

cccnccc

nT

Simulador do Insertion Sort: http://wikipedia.artudi.org/Insertion%20Sort.php

Page 98: Projeto algortimo

Análise de Algoritmo O melhor caso para o Insertion Sort é quando o array já está

ordenado. Neste caso a comparação no laço interno sempre falhará na primeira comparação e o tempo de execução dependerá apenas do laço externo. O tempo de execução obedecerá uma função linear e a complexidade do algoritmo será de O (n).

O pior caso é quando o array está na ordem inversa. Nesta situação para cada iteração do laço externo, o laço interno executará n-1 vezes, onde n é o valor da variável j no laço externo. Temos que a complexidade de tempo do algoritmo neste caso será de O (n(n-1)) = O (n2-n) = O (n2).

98

Page 99: Projeto algortimo

Análise do Algoritmo de Inserção

O tempo de execução no melhor caso pode ser expresso por:

T(n) = an + b

O tempo de execução no pior caso pode ser expresso por:

T(n) = an + bn + c

99

2

Page 100: Projeto algortimo

Algoritmo de ordenação por seleção (SELECTION SORT)

Cada número do vetor, a partir do primeiro, é eleito e comparado com o menor ou maior, dependendo da ordenação desejada, número dentre os que estão à direita do eleito. Procura-se um número menor (quando crescente) ou um maior (quando decrescente). O número eleito está na posição i. Os números à direita estão nas posições de i+1 a n–1, sendo n o número de elementos do vetor. O laço a ser executado para encontrar o menor elemento à direita do eleito será (for(j=i+2;j<=n−1;j++)).

Page 101: Projeto algortimo

Θ(n²). Independentemente do vetor de entrada, o algoritmo se comportará da mesma maneira.

Análise da Complexidade X Tempo de Execução

Page 102: Projeto algortimo

Gráficos de desempenho

Page 103: Projeto algortimo

Algoritmo de ordenação por intercalação (MERGE SORT)

• O vetor é dividido em vetores com a metade do tamanho do original por um procedimento recursivo, até que o vetor fique com apenas um elemento e estes sejam ordenados e intercalados. É aplicada a técnica da divisão e conquista.

- Dividir : dividir a sequência de n em duas subsequências de n/2 elementos cada.

- Conquistar: ordenar as duas subsequências recursivamente utilizando a ordenação por intercalação.

- Combinar: intercalar as duas subsequências ordenadas para produzir a solução.

Page 104: Projeto algortimo

Análise da Complexidade X Tempo de Execução

Tempo de execução:T(n) = Θ

(nlog n).

Page 105: Projeto algortimo

Gráficos de desempenho

Page 106: Projeto algortimo

Algoritmos de ordenação rápida (QUICK SORT)

• O vetor é particionado em dois por meio de um procedimento recursivo até que o vetor fique com apenas um elemento, enquanto os demais ficam ordenados à medida que ocorre o particionamento. Também é baseado na técnica da divisão e conquista, descrita a seguir.

Page 107: Projeto algortimo

Algoritmos de ordenação rápida (QUICK SORT)

• - Dividir: o vetor X[p..r] é particionado em dois subvetores não vazios X[p..q] e X[q+1..r], tais que cada elemento de X[p..q] é menor ou igual a cada elemento de X[q+1..r]. Para determinar o índice q, escolhe-se o elemento que se encontra na metade do vetor original, chamado de pivô, e rearranjam-se os elementos do vetor de forma que os da esquerda de q são menores (ou iguais) e os da direita são maiores (ou iguais) ao pivô.

• - Conquistar: os dois subvetores são ordenados X[p..q] e X[q+1..r] por chamadas recursivas ao QUICK SORT.

• - Combinar: os elementos vão sendo ordenados no próprio vetor, sem processamento nesta etapa.

Page 108: Projeto algortimo

Análise da complexidade

Tempo de execução T(n) = Θ (n. log n).

Page 109: Projeto algortimo

Gráfico de desempenho

Page 110: Projeto algortimo

Algoritmo de ordenação (HEAP SORT)

• Baseado na estrutura de dados HEAP – vetor (X) que pode ser visto como uma árvore binária completa, onde cada nó possui no máximo 2 filhos. Cada vértice corresponde a um elemento do vetor. A árvore é completamente preenchida exceto no último nível. Cada nível é sempre preenchido da direita para a esquerda. Para todo vértice i diferente da raiz, a seguinte propriedade deve ser válida: X[Pai(i)] ≥ X[i].

• Dado um índice i, para se descobrir as posições do pai, do filho esquerdo e do direito, realizam-se os cálculos: Pai(i) = i/2 , Filho Esquerdo(i) = 2*i e Filho Direito(i) = 2*i + 1.

Page 111: Projeto algortimo

Análise da complexidade

O tempo não ultrapassa n.log n.

Page 112: Projeto algortimo

Gráficos de desempenho

Page 113: Projeto algortimo

Algoritmo de busca sequencial

• Em um vetor não ordenado, será buscado o número até que seja encontrado ou até se chegar ao final do vetor. Em um vetor ordenado, será buscado o número até que seja encontrado e enquanto for maior que o número do vetor.

Page 114: Projeto algortimo

Análise da complexidade

O tempo de execução Pior caso: T(n) = O(n).Melhor caso: T(n) = O(1).

O tempo de execução Pior caso: T(n) = O(n).Melhor caso: T(n) = O(1).

Page 115: Projeto algortimo

Algoritmo de busca binária

• O vetor com os dados é dividido ao meio e o número do meio é comparado com o número procurado. Se iguais, a busca termina; se menor que o do meio, a busca será realizada no vetor à esquerda. Se maior que o do meio, será realizada no vetor à direita.

Page 116: Projeto algortimo

Análise da complexidade

• O consumo de tempo é proporcional a lg n.