MO417- Complexidade de Algoritmos I
Aula de 18/06/2003
Ata da Resolução de Exercícios


Livro Texto: ALGORITMOS - Teoria e Prática
Capítulo 34 - Problemas NP-completos
Redator: André Santanchè
 

Nota:
As letras entre colchetes {a}, {b} e {c} - utilizadas nas questões em azul - cumprem o papel de associar cada subdivisão de uma questão à respectiva resposta.


Questão 34.1-2

Dê uma definição formal para o problema de encontrar o ciclo simples mais longo em um grafo não orientado {a}. Forneça um problema de decisão relacionado {b}. Forneça a linguagem correspondente ao problema de decisão {c}.

Resolução

{a}

Ciclo simples: Dado um grafo G=(V,E) não orientado, um ciclo simples é uma lista ordenada de vértices (v1, v2, ..., vx) pertencentes a G, tal que x>=3 e existe um caminho simples <v1, ..., vx-1> além de uma aresta (vx-1, vx).

Ciclo simples mais longo: Considerando que o grafo G é ponderado, chamaremos de peso do ciclo simples w(c) a soma do peso de todas as arestas que pertencem ao ciclo c. Um problema de ciclo simples de maior peso em G, que chamamos LONG-CYCLE, consiste em encontrar um ciclo simples pertencente a G, cujo peso w(c) é o maior entre todos os valores de w(x), para qualquer ciclo simples x pertencente a G (se o grafo não for ponderado considera-se o mesmo raciocínio atribuindo-se o peso 1 a cada aresta).

{b}
Um problema de decisão CYCLE relacionado com LONG-CYCLE é tal que, para uma instância do problema de decisão (G, k):

{c}

CYCLE = {(G, k) : G = (V, E) é um grafo não orientado,
k >= 0 é um inteiro e,
existe um ciclo simples mais longo c pertencente a G, com w(c) >= k}.

Questão 34.1-4


O algoritmo de programação dinâmica para o problema da mochila 0-1 que é apresentado no Exercício 16.2-2 é um algoritmo de tempo polinomial? Explique sua resposta. 

Resolução

Não, pois para uma entrada de magnitude O(n.lg W) o tempo de execução do algoritmo é O(n.W). Isto caracteriza uma relação exponencial entre o tamanho da entrada e o tempo de execução.

A magnitude da entrada é calculada sabendo-se que n é o número de itens e W é o peso máximo que algum item pode ter. Codificando em binário um valor numérico que pode variar de 0 até W, ele ocupará no máximo teto(lg W) bits, deste modo o tamanho da entrada será O(n.lg W).

Questão 34.1-5

Mostre que um algoritmo que efetua no máximo um número constante de chamadas a sub-rotinas de tempo polinomial é executado em tempo polinomial, mas que um número polinomial de chamadas a sub-rotinas de tempo polinomial pode resultar em um algoritmo de tempo exponencial.

Resolução

Quando um algoritmo executa um número constante K de chamadas a uma sub-rotina, que executa em tempo polinomial de acordo com o tamanho de uma entrada fixa, o tempo de execução resultante do algoritmo será de ordem K vezes o tempo de execução da sub-rotina, o que resultará em um tempo polinomial (por ser K uma constante ela não interfere na ordem de crescimento quando multiplicada pelo polinômio).

Quando um algoritmo executa um número polinomial de chamadas a uma sub-rotina e o tamanho da entrada que o algoritmo repassa para a sub-rotina cresce exponencialmente, o tempo total de execução do algoritmo pode se tornar exponencial. Abaixo um exemplo de algoritmo:

SUPERCONCATENA
    a <- "xx"
    for i <- 1 to n do
        a <- CONCATENA(a, a)

Note que o algoritmo SUPERCONCATENA executa n vezes a sub-rotina CONCATENA, cujo tempo de execução é O(m), sendo m a soma dos comprimentos das cadeias de entrada. Como o tamanho da cadeia armazenada na variável a dobra a cada chamada de CONCATENA, quando o valor da variável i for igual a n, o tamanho da entrada será 2^n, caracterizando um tempo exponencial de execução.

Se por outro lado utilizarmos este mesmo algoritmo com um número constante K no lugar de n, o tamanho da entrada na última chamada de CONCATENA será 2^K. Como K é uma constante, 2^K também é uma constante, não caracterizando um algoritmo de tempo exponencial.