35
Projeto e Análise de Algoritmos Professor: Saulo Henrique Cabral Silva Instituto Federal de Minas Gerais Campus Ouro Branco

Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Projeto e Análise de Algoritmos

Professor: Saulo Henrique Cabral Silva

Instituto Federal de Minas Gerais Campus Ouro Branco

Page 2: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

O que vamos abordar nesta disciplina

• Algoritmos;

• Funções assintóticas;

• Recorrências;

• Algoritmos de ordenação;

• Estruturas de dados;

• Programação Dinâmica;

• Algoritmos Gulosos;

• Algoritmo elementares de Grafos;

• Problemas NP-completos;

• Algoritmos de aproximação;

2

Page 3: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Introdução

• O que são os algoritmos?

• Qual foi a sua origem?

• Por que o estudo dos algoritmos vale a pena?

• Qual a função dos algoritmos em relação a outras tecnologias usadas em computadores?

3

Page 4: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Algoritmo

• Os algoritmos fazem parte do dia-a-dia

das pessoas. Exemplos: – instruções para o uso de medicamentos;

– indicações de como montar um aparelho;

– uma receita de culinária.

• Sequencia de ações executáveis para a obtenção de uma solução para um determinado tipo de problema.

• 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.

4

Page 5: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

O papel dos algoritmos na computação

• Definição: um algoritmo é um conjunto finito de instruções precisas para executar uma computação.

• Um algoritmo pode ser visto como uma ferramenta para resolver um problema computacional bem especificado. – Um algoritmo pode receber como entrada um conjunto de valores e pode produzir como saída um outro conjunto de valores.

• Um algoritmo descreve uma sequencia de passos computacionais

que transforma a entrada numa saída, ou seja, uma relação entrada/saída.

• O vocábulo algoritmo origina do nome al-Khowarizmi.

5

Page 6: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Algoritmo (Definição) • Dicionário Houaiss da Língua Portuguesa, 2014:

– [Informática] Conjunto de regras que fornecem uma sequência de operações capazes de resolver um problema específico.

• Dicionário Webster da Língua Inglesa: – An Algorithm is a procedure for solving a mathematical problem in a finite

number of steps that frequently involves a repetition of an operation .

• Introduction to Algorithms, ClRS, 2010: – Informally, an algorithm is any well-defined computational procedure that

takes some value, or set of values, as input and produces some value, or set of values, as output. An algorithm is thus a sequence of computational steps that transform the input onto the output.

• Algorithms in C, Sedgewick, 1998, 3rd edition: – The term algorithm is used in computer science to describe a problem

solving method suitable for implementation as a computer program 6

Page 7: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Algoritmo (Definição)

• Observações: – Regras são precisas

– Conjunto de regras é finito

– Tempo de execução é finito

– Regras executadas por um computador

7

Page 8: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Algoritmo (Consequências da Definição)

• Deve-se definir um repertório finito de regras – Linguagem de programação

• A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação – Estruturas de dados

• Tempo finito não é uma eternidade – A maior parte das pessoas não está interessada em algoritmos que levam

anos, décadas, séculos, milênios para executarem

• Existem diferentes “tipos de computadores” – Existem diferentes modelos computacionais

8

Page 9: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Algumas perguntas importantes Apresente as justificativas

• Um programa pode ser visto como um algoritmo codificado em uma linguagem de programação que pode ser executado por um computador. Qualquer computador pode executar qualquer programa?

• Todos os problemas ligados às ciências exatas possuem algoritmos?

• Todos os problemas computacionais têm a mesma dificuldade de resolução?

• Como algoritmos diferentes para um mesmo problema podem ser comparados/avaliados?

9

Page 10: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Algoritmo e Modelo Computacional

• Modelo: – Esquema que possibilita a representação de uma entidade

– Só se deve incluir o que for relevante para a modelagem do objeto em questão

• Um algoritmo não existe, ou seja, não é possível escrevê-lo, se antes não for definido o modelo associado ao mesmo.

• Questão: – Dado um problema qualquer, sempre existe um algoritmo que pode ser

projetado para um modelo computacional? • Não! Existem vários casos em que é possível mostrar que não existe um

algoritmo para resolver um determinado problema considerando um modelo computacional

10

Page 11: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Algoritmo e Modelo Computacional

• Quais modelos computacionais existem? – Dezenas

– Se não estiver satisfeito, invente o seu!

• O modelo computacional mais utilizado dentre os existentes: – RAM – Random Access Machine

– Modela o computador tradicional e outros elementos computacionais

• Elementos do modelo RAM – Único processador

– Memória para armazenamento

11

Page 12: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Algoritmo e Modelo Computacional

• Observações do modelo RAM – Pode-se ignorar os dispositivos de entrada e saída (teclado, monitor,

etc)

• Assumimos que os dados já estejam armazenados dentro da memória

– Em geral não é relevante para a modelagem do problema saber como o algoritmo e os dados foram armazenados na memória

• Característica da computação no modelo RAM – Processador busca instrução/dado da memória

– Uma única instrução é executada de cada vez.

– Cada instrução é executada sequencialmente.

12

Page 13: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Algoritmo e Modelo Computacional

• Cada operação executada pelo processador, incluindo cálculos aritméticos, lógicos e acesso a memória, implica num custo de tempo. – Função de complexidade de tempo.

• Número de vezes que determinada operação é executada

• Cada operação e dado armazenado na memória, implica num custo de espaço: – Função de complexidade de espaço.

• Quantidade de memória que é necessário para armazenar as estruturas de dados associados ao algoritmo.

13

Page 14: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Problema dos dois exércitos

• Na Grécia antiga, lugares maravilhosos podiam se transformar em cenários de guerra.

• É quando um filósofo propõe o “Problema dos dois exércitos”.

14

Page 15: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Problema dos dois exércitos • Exercito A está em maior número que o exercito B, mas está dividido entre

duas metades, cada uma numa lateral do vale.

• Cada metade do exército A está em menor número que o exército B.

• Objetivo do exército A: coordenar um ataque ao exército B para ganhar a guerra.

15

Page 16: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Problema dos dois exércitos • General do exercito A, do lado esquerdo do vale, chama o seu

melhor soldado para levar uma mensagem para o general do exército A do lado direito: – Vamos atacar juntos o exército B amanhã às 6:00?

– Única possibilidade de comunicação é através do mensageiro

– Os relógios são sincronizados pela posição do sol

16

Page 17: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Problema dos dois exércitos

• O soldado do exército A atravessa as linhas inimigas e leva a mensagem até o general do outro lado.

• O General do exército A do lado direito concorda em ataca o exército B no dia seguinte às 6:00

17

Page 18: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Problema dos dois exércitos

• O soldado do exército A atravessa novamente as linhas inimigas e confirma com o seu general o ataque para o dia seguinte.

18

Page 19: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Problema dos dois exércitos

• Vai haver ataque no dia seguinte???

19

Page 20: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Modelo computacional para sistemas distribuídos

• Mundo distribuído: – Normalmente os elementos computacionais seguem o modelo RAM

que são interconectados através de algum meio e só comunicam entre si através de troca de mensagens.

• Memória não compartilhada

• Elementos desse modelo – Nó computacional representado pelo modelo RAM.

– Canal normalmente representado pelo modelo FIFO.

20

Page 21: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Algoritmo - Problemas

• Informalmente podemos dizer que um algoritmo, é qualquer procedimento computacional bem definido que toma algum valor ou conjunto de valores como entrada e produz um valor ou conjunto de valores como saída. – Ferramenta para resolver um problema computacional bem

especificado;

– O enunciado do problema especifica em termos gerais o relacionamento entre a entrada e a saída desejada.

• Exemplo: – <a1, a2, . . ., an>

– <a’1, a’2, . . .,a’n>

Tal que: a’1 < a’2 < . . . < a’n 21

Page 22: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Algoritmo - Problemas

• Dada uma sequencia de entrada como <31,41,59,26,41,58>, um algoritmo de ordenação retorna como saída a sequencia <26, 31, 41, 41, 58, 59>.

• Uma sequencia de entrada como essa é chamada uma instância do problema de ordenação. Em geral, uma instancia de um problema consiste na entrada.

• No caso da ordenação que é uma operação fundamental na computação, temos uma grande número de bons algoritmos de

ordenação que vem sendo desenvolvidos. – O melhor algoritmo para uma determinada aplicação

depende – entre outros fatores – do número de itens, da

extensão em que os itens já estejam ordenados, de

possíveis restrições sobre os valores de itens e ainda o

dispositivo utilizado (memória, disco, fita).

22

Page 23: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Exemplos de problemas

• Projeto Genoma Humano: Objetivo de identificar todos os 100000 genes do DNA humano, armazenar essas informações em bancos de dados e desenvolver ferramentas para análise de dados;

• Internet: Gerenciar grane volume de dados. Mecanismos de pesquisa para encontrar com rapidez páginas em que residem informações específicas;

• Comércio eletrônico: Troca de mercadorias e

serviços possam ser negociados e trocados

eletronicamente. A capacidade de manter

privativas informações como números de

cartão de crédito.

23

Page 24: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Exemplos de problemas

• Na indústria: alocação de recursos escassos de maneira mais benéfica. Uma empresa petrolífera talvez deseje saber onde localizar seus poços para tornar máximo o lucro esperado. – Provedor de internet que deseja definir onde instalar recursos

adicionais para servir de modo mais eficiente a seus clientes.

• Rotas: Como escolher qual a rota

mais curta? Qual a mais segura?

Qual possui o maior número de

espaços kids.

24

Page 25: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Problemas difíceis

• Trataremos em grande parte desta disciplina de algoritmos eficientes. – Eficiência velocidade (quanto tempo um algoritmo demora para

produzir o seu resultado).

• Existem problemas que não se conhece solução eficiente? – NP-completos;

– Embora não se tenha encontrado um algoritmo eficiente para esse fim. Ninguém provou ainda que não é possível existir um algoritmo.

– Se encontrar uma solução para um deles, automaticamente pode-se aplicar a solução para os demais.

– É importante conhece-los, pois se você em

algum momento se deparar com ele, não

perderá horas tentando a MELHOR solução.

25

Page 26: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Caixeiro Viajante

• Imagine uma empresa de transporte com um armazém central. A cada dia, ela carrega o caminhão no armazém e o envia a diversos locais para efetuar entregas. No final do dia, o caminhão tem de estar de volta ao armazém, a fim de ser preparado para receber a carga do dia seguinte.

• Para reduzir custos, a empresa deve selecionar uma ordem de paradas de entrega que represente a menor distância total a ser percorrida pelo caminhão.

• Este problema não possui algoritmo

eficiente conhecido. Em certas

hipóteses, há algoritmos eficientes

que fornecem uma distância total não

muito acima da menor possível.

26

Page 27: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Para refletir...

• Pense em um exemplo do mundo real no qual apareça o problema de ordenação.

• Além do tempo de execução, que outras medidas de eficiência poderiam ser usadas?

• Selecione uma estrutura de dados que você já tenha visto antes e discuta seus pontos fortes e suas limitações.

• Mostre um problema real no qual apenas a melhor

solução servirá. Em seguida, apresente um

problema em que baste uma solução

que seja “aproximadamente” a melhor.

27

Page 28: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Algoritmos como uma tecnologia

• Suponhamos que os computadores fossem infimamente rápidos e que a memória do computador fosse livre. – Utilizaríamos a forma mais simples de resolver ?

– Precisaríamos estudar para ter um algoritmo com uma boa prática de Engenharia de Software ?

• Computadores podem ser rápidos, mas não são infinitamente rápidos. – A memória pode ser de baixa custo, mas

não é gratuita.

– O tempo de computação é um recurso

limitado, bem como o espaço na

memória.

– Precisamos construir um algoritmo

eficiente em termos de tempo ou espaço. 28

Page 29: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Eficiência

• Os algoritmos podem diferir de forma drástica em sua eficiência. – Hardware;

– Software;

• Ex: – Ordenação por inserção: c1.n² (c1 não depende de n)

– Ordenação por intercalação: c2.n.lg(n)

• Veremos que os fatores constantes

podem ser muito menos significativos

do que o tamanho da entrada.

29

Page 30: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Análise de desempenho

• Geralmente para pequenas entradas

o algoritmo de ordenação por inserção é mais rápido do que o algoritmo por intercalação. – Quando o tamanho da entrada se torna grande o suficiente, a

vantagem de lg(n) contra n compensará com sobras.

– Independente do quanto c1 seja menor que c2;

• Vamos analisar o exemplo com dois computadores (A e B) – A (mais rápido 1 Bilhão de inst.) – executa ordenação por inserção

– B (lento – 10 Milhões de inst.) – executa ordenação por intercalação

– A – algoritmo otimizado por um prog. NINJA (código de máquina)

• Fator 2

– B – algoritmo prog. Médio (linguagem de alto nível)

• Fator 50 30

Page 31: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Análise de desempenho

• Vamos supor uma instância com um milhão de números:

• Calcule para 10 milhões (diferença bem mais pronunciada)

31

Page 32: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Tecnologias que podem influenciar

• O desempenho total do sistema depende da escolha de algoritmos eficientes tanto quanto da escolha de hardware rápido.

• Será que os algoritmos são verdadeiramente tão importantes quanto: – Hardware com altas taxas de clock, pipeline e arquiteturas superescalares;

– Sistemas O.O.

– Redes locais e Remotas.

• Com o aumento da capacidade dos computadores passamos a resolver problemas com instâncias cada vez maiores: – Big Data;

– Projetar componentes mais otimizados

– Traçar melhores rotas. Tudo isso depende de

algoritmos.

32

Page 33: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Exercícios

1. Forneça um exemplo de aplicação que exige conteúdo algorítmico no nível da aplicação e discuta a função do algoritmo envolvido.

2. Suponha que uma comparação entre ordenação por inserção e ordenação por intercalação na mesma máquina. Para entradas de tamanho n, a ordenação por inserção é executada em 8n² etapas, enquanto a ordenação por intercalação é executada em 64.n.lg(n) etapas. Para que valores de n a ordenação por inserção supera a ordenação por intercalação.

3. Qual é o menor valor de n tal que um algoritmo cujo tempo é 100.n² funciona mais rápido que um algoritmo cujo tempo de execução é na mesma máquina?

33

Page 34: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Exercícios

4. Para cada função f(n) e cada tamanho de entrada n, determine o tempo de execução para o algoritmo. Considere que o computador em questão executa 1000000 de instruções por segundo

34

10 20 30 40 50 60

log(n)

n

n.log(n)

n5

2n

3n

Page 35: Projeto e Análise de Algoritmos · • A maior parte dos algoritmos utiliza métodos de organização de dados envolvidos na computação –Estruturas de dados • Tempo finito

Dúvidas

36