Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Módulo 5 -Tempo de Execução de um Programa: Comportamento Assintóptico de Funções O objeto de estudo módulo anterior foi aquele denominado decidibilidade, que é o estudo das propriedades exibidas pelas linguagens com o objetivo de determinar a existência ou não de um algoritmo capaz de aceitar ou rejeitar, em tempo e espaço finitos, uma cadeia qualquer apresentada para análise. Por outro lado, não basta um problema ser decidível. Há que se considerar os custos dessa solução. Custos dizem respeito ao tempo total de execução e ao volume total de memória para se chegar à solução do problema. Complexidade Computacional Complexidade: “estudo das propriedades exibidas pelas linguagens com o objetivo de determinar o custo de seu processamento, em termos do tempo e espaço finitos” (RAMOS, VEGA e NETO, 2009). “A complexidade de tempo de uma computação mede a quantidade de trabalho gasto pela computação” (ROSA, J. L. G.). Seja n um parâmetro que caracteriza o tamanho da entrada do algoritmo. Por exemplo, ordenar n números ou multiplicar duas matrizes quadradas n x n (cada uma com n 2 elementos). Costuma-se medir um algoritmo em termos de tempo de execução ou o espaço (ou memória) usado. Para o tempo, pode-se considerar o tempo absoluto (em minutos, segundos, etc.). Medir o tempo absoluto não é interessante, visto que depende da máquina. Em Análise de Algoritmos conta-se o número de operações consideradas relevantes realizadas pelo algoritmo e expressa-se esse número como uma função de n. Essas operações podem ser comparações, operações aritméticas, movimento de dados, etc. Tabela 1: Estudo comparativo da grandeza de algumas funções n log2(n) n*log2(n) n 2 n 3 2 n 1 0 0 1 1 2 10 3.32 33 100 1000 1024 100 6.64 664 10 4 10 6 1, 268 x10 30 1000 9.97 9970 10 6 10 9 1, 072 x 10 301 2 Um caso de particular interesse é quando n tem valor muito grande (n ), denominado comportamento assintótico. Complexidade de tempo Seja MT uma Máquina de Turing determinística. “A complexidade de tempo (tempo de execução) é a função f: tal que f(n) é o número máximo de transições processadas por uma computação de MT quando iniciada com uma cadeia de entrada de comprimento n, independentemente de MT aceitar ou não.” (ROSA, J. L. G.) Assume-se que a computação termina para toda a cadeia de entrada. A notação – grande Para se estudar o comportamento assintótico – para n grande – emprega-se o termo de ordem superior. Sejam f, g R +, diz-se que f(n) = O(g(n)), se existirem números inteiros e positivos c e n0 tais que: n, n n0, f(n) < c. g(n) A notação é utilizada para dar um limite assintótico superior sobre uma função, dentro de um fator constante Operações com a notação Tabela 2 Operações com a notação f(n) = O(f(n)) c . f(n), c constante = O(f(n)) O(f(n)) + O(f(n)) = O(f(n)) O(O(f(n)) = O(f(n)) O(f(n)) + O(g(n)) = O(max(f(n), g(n))) O(f(n)) . O(g(n)) = O(f(n) . g(n)) f(n) . O(g(n)) = O(f(n) . g(n)) Seja f(n) = n e g(n) = n2. Tem-se que n = O(n2). De fato, n2 n e, portanto, f(n) é O(n 2 ), com constantes c = 1 e n0 0 3 Seja f(n) = (n + 2)2, f(n) é (n2), com c = 5: De fato:n2 + 4n + 4 5 n2, para n 2. Máquina de Turing de k fitas Teorema: seja L uma linguagem aceita por uma Máquina de Turing determinística de k fitas M com complexidade de tempo f(n). Então L é aceita por uma Máquina de Turing padrão de uma fita com complexidade de tempo (f(n) 2 ). Observe-se que a eliminação de fitas adicionais (de k fitas para 1 fita) transforma o tempo de execução para no máximo uma potência de 2. Não determinismo Definição: seja uma Máquina de Turing não determinística. A complexidade de tempo de M é a função f : tal que f(n) é o número máximo de transições processadas por uma computação de M, empregando qualquer escolha de transições quando iniciada com uma cadeia de entrada de comprimento n. Deve-se considerar todas as computações possíveis para uma cadeia de entrada! Algumas considerações Cálculos em uma Máquina de Turing em tempo exponencial são bastante ineficientes e, portanto, raramente apresentam utilidade. Problemas para os quais não existe um algoritmo em tempo polinomial são ditos intratáveis. A teoria da complexidade classifica os problemas decidíveis em tratáveis e intratáveis. Exercício Resolvido 1: Colocar em ordem crescente as seguintes complexidades: n.log2(n), 3 10 ; n 3 ; n 1/3 Resposta: A ordem crescente é: 3 10 ; n 1/3 ; nlog2(n); n 3 . Observe-se a seguinte tabela n log2(n) n*log2(n) N 1/3 n 3 1 0 0 1 1 1000 9.97 9970 10 10 9 Ainda, 3 10 é o menor, pois trata-se de uma função constante. 4 Exercício Resolvido 2: Considere a seguinte afirmação: “Todo problema decidível apresenta solução com complexidade computacional polinomial.” A afirmação é verdadeira ou falsa? Resposta: A afirmação é falsa. Diz-se que um problema é decidível se existe um algoritmo capaz de aceitar ou rejeitar, em tempo e espaço finitos, uma cadeia qualquer apresentada para análise. No entanto, o desempenho do algoritmo pode não ser polinomial, ou seja, pode ser de natureza combinatória, exponencial (confira na tabela 1, a coluna correspondente à função 2 n ). Uma máquina de Turing não-determinística - e portanto um algoritmo - apresenta a função de transição tal que para uma mesma combinação de estado corrente e de símbolo na fita de trabalho, é possível especificar múltiplas transições. Assim, em situações de não determinismos, deve-se considerar todas as computações possíveis para uma cadeia de entrada, o que pode resultar em desempenho de ordem combinatório ou exponencial. Referências Gersting, J. L. Fundamentos Matemáticos para a Ciência da Computação Rio de Janeiro: LTC, 2001. Lewis H. R. ; Papadimitrious, C. H. Elementos da Teoria da Computação Porto Alegre: Bookman, 2004. RAMOS, Marcus Vinicius Midena. NETO; João José. VEGA, Italo Santiago. Linguagens Formais. Teoria, Modelagem e Implementação Porto Alegre: Bookman, 2009. ROSA, L. G. Linguagens Formais e Autômatos Rio de Janeiro: LTC, 2010.
Compartilhar