Algoritmos e complexidade Notas de aula - Arquivo Escolar

Algoritmos e complexidade Notas de aula - Arquivo Escolar Algoritmos e complexidade Notas de aula - Arquivo Escolar

arquivoescolar.org
from arquivoescolar.org More from this publisher
13.04.2013 Views

1. Introdução e conceitos básicos Introdução • Um algoritmo é um procedimento que consiste em um conjunto de regras não ambíguas as quais especificam, para cada entrada, uma sequência finita de operações, terminando com uma saída correspondente. • Um algoritmo resolve um problema quando, para qualquer entrada, produz uma resposta correta, se forem concedidos tempo e memória suficientes para a sua execução. Motivação • Na teoria da computação perguntamos “Quais problemas são efetivamente computáveis?” • No projeto de algoritmos, a pergunta é mais específica: “Quais problemas são eficientemente computáveis?” • Para responder, temos que saber o que “eficiente” significa. • Uma definição razoável é considerar algoritmos em tempo polinomial como eficiente (tese de Cobham-Edmonds). Custos de algoritmos • Também temos que definir qual tipo de custo interessa. • Uma execução tem vários custos associados: Tempo de execução, uso de espaço (cache, memória, disco), energia consumida, energia dissipada, ... • Existem características e medidas que são importantes em contextos diferentes Linhas de código fonte (LOC), legibilidade, manutenabilidade, corretude, custo de implementação, robustez, extensibilidade,... • A medida mais importante: tempo de execução. • A complexidade pode ser vista como uma propriedade do problema Mesmo um problema sendo computável, não significa que existe um algoritmo que vale a pena aplicar. O problema 10

Expressões regulares com · 2 Instância Uma expressão regular e com operações ∪ (união), · ∗ (fecho de Kleene), · (concatenação) e · 2 (quadratura) sobre o alfabeto Σ = {0, 1}. Decisão L(e) = Σ ∗ ? que parece razoavelmente simples é, de fato, EXPSPACE-completo [52, Corolário 2.1] (no momento é suficiente saber que isso significa que o tempo para resolver o problema cresce ao menos exponencialmente com o tamanho da entrada). Exemplo 1.2 Com e = 0 ∪ 1 2 temos L(e) = {0, 11}. Com e = (0 ∪ 1) 2 · 0 ∗ temos L(e) = {00, 01, 10, 11, 000, 010, 100, 110, 0000, 0100, 1000, 1100, . . .}. Existem exemplos de outros problemas que são decidíveis, mas têm uma complexidade tão grande que praticamente todas instâncias precisam mais recursos que o universo possui (por exemplo a decisão da validade na lógica monádica fraca de segunda ordem com sucessor). O universo do ponto da vista da ciência da computação Falando sobre os recursos, é de interesse saber quantos recursos nosso universo disponibiliza aproximadamente. A seguinte tabela contém alguns dados básicos: Idade 13.75 ± 0.11 × 10 9 anos ≈ 43.39 × 10 16 s Tamanho ≥ 78 × 10 9 anos-luz Densidade 9.9 × 10 −30 g/cm 3 Número de átomos 10 80 Número de bits 10 120 Número de operações 10 lógicas elementares até hoje 120 Operações/s ≈ 2 × 10102 ♦ 11

1. Introdução e conceitos básicos<br />

Introdução<br />

• Um algoritmo é um procedimento que consiste em um conjunto <strong>de</strong> regras<br />

não ambíguas as quais especificam, para cada entrada, uma sequência<br />

finita <strong>de</strong> operações, terminando com uma saída correspon<strong>de</strong>nte.<br />

• Um algoritmo resolve um problema quando, para qualquer entrada, produz<br />

uma resposta correta, se forem concedidos tempo e memória suficientes<br />

para a sua execução.<br />

Motivação<br />

• Na teoria da computação perguntamos “Quais problemas são efetivamente<br />

computáveis?”<br />

• No projeto <strong>de</strong> algoritmos, a pergunta é mais específica: “Quais problemas<br />

são eficientemente computáveis?”<br />

• Para respon<strong>de</strong>r, temos que saber o que “eficiente” significa.<br />

• Uma <strong>de</strong>finição razoável é consi<strong>de</strong>rar algoritmos em tempo polinomial<br />

como eficiente (tese <strong>de</strong> Cobham-Edmonds).<br />

Custos <strong>de</strong> algoritmos<br />

• Também temos que <strong>de</strong>finir qual tipo <strong>de</strong> custo interessa.<br />

• Uma execução tem vários custos associados:<br />

Tempo <strong>de</strong> execução, uso <strong>de</strong> espaço (cache, memória, disco), energia consumida,<br />

energia dissipada, ...<br />

• Existem características e medidas que são importantes em contextos<br />

diferentes<br />

Linhas <strong>de</strong> código fonte (LOC), legibilida<strong>de</strong>, manutenabilida<strong>de</strong>, corretu<strong>de</strong>,<br />

custo <strong>de</strong> implementação, robustez, extensibilida<strong>de</strong>,...<br />

• A medida mais importante: tempo <strong>de</strong> execução.<br />

• A <strong>complexida<strong>de</strong></strong> po<strong>de</strong> ser vista como uma proprieda<strong>de</strong> do problema<br />

Mesmo um problema sendo computável, não significa que existe um algoritmo<br />

que vale a pena aplicar. O problema<br />

10

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!