De acordo com Pippenger [1996] , ao comparar um sistema Lisp que é puramente funcional (e tem uma semântica estrita de avaliação, não preguiçosa) com um que pode alterar dados, um algoritmo escrito para o impuro Lisp executado em O ( n ) pode ser traduzido a um algoritmo no Lisp puro que é executado no tempo O ( n log n ) (baseado no trabalho de Ben-Amram e Galil [1992] sobre simulação de memória de acesso aleatório usando apenas ponteiros). Pippenger também estabelece que existem algoritmos para o melhor que você pode fazer; existem problemas que são O ( n ) no sistema impuro que são Ω ( n log n ) no sistema puro.
Existem algumas ressalvas a serem feitas sobre este artigo. O mais significativo é que ele não trata de linguagens funcionais preguiçosas, como Haskell. Bird, Jones e De Moor [1997] demonstram que o problema construído por Pippenger pode ser resolvido em uma linguagem funcional preguiçosa em O ( n ) tempo, mas eles não estabelecem (e até onde eu sei, ninguém o tem) se ou não nenhuma linguagem funcional preguiçosa pode resolver todos os problemas no mesmo tempo de execução assintótico que uma linguagem com mutação.
O problema criado por Pippenger requer Ω ( n log n ) é especificamente construído para alcançar esse resultado e não é necessariamente representativo de problemas práticos do mundo real. Existem algumas restrições no problema que são um pouco inesperadas, mas necessárias para que a prova funcione; em particular, o problema requer que os resultados sejam computados on-line, sem poder acessar a entrada futura, e que a entrada consiste em uma sequência de átomos a partir de um conjunto ilimitado de átomos possíveis, em vez de um conjunto de tamanho fixo. E o artigo apenas estabelece resultados (limite inferior) para um algoritmo impuro de tempo de execução linear; para problemas que exigem um tempo de execução maior, é possível que o O extra (log n), o fator observado no problema linear pode ser "absorvido" no processo de operações extras necessárias para algoritmos com maiores tempos de execução. Esses esclarecimentos e questões em aberto são explorados brevemente por Ben-Amram [1996] .
Na prática, muitos algoritmos podem ser implementados em uma linguagem funcional pura com a mesma eficiência que em uma linguagem com estruturas de dados mutáveis. Para uma boa referência sobre técnicas a serem usadas para implementar estruturas de dados puramente funcionais com eficiência, consulte "Estruturas de Dados Puramente Funcionais" de Chris Okasaki [Okasaki 1998] (que é uma versão expandida de sua tese [Okasaki 1996] ).
Qualquer pessoa que precise implementar algoritmos em estruturas de dados puramente funcionais deve ler Okasaki. Você sempre pode obter, na pior das hipóteses, uma desaceleração de O (log n ) por operação simulando memória mutável com uma árvore binária equilibrada, mas em muitos casos você pode se sair consideravelmente melhor do que isso, e Okasaki descreve muitas técnicas úteis, de técnicas amortizadas a reais. os que executam o amortizado trabalham incrementalmente. Estruturas de dados puramente funcionais podem ser um pouco difíceis de trabalhar e analisar, mas oferecem muitos benefícios, como transparência referencial, que são úteis na otimização do compilador, na computação paralela e distribuída e na implementação de recursos como controle de versão, desfazer e reversão.
Observe também que tudo isso discute apenas os tempos de execução assintóticos. Muitas técnicas para implementar estruturas de dados puramente funcionais fornecem uma certa quantidade de desaceleração constante dos fatores, devido à contabilidade extra necessária para que eles funcionem e aos detalhes de implementação do idioma em questão. Os benefícios de estruturas de dados puramente funcionais podem compensar essas lentidões constantes dos fatores; portanto, você geralmente precisará fazer trocas com base no problema em questão.
Referências
- Ben-Amram, Amir e Galil, Zvi 1992. "On Pointers versus Addresses" Jornal da ACM, 39 (3), pp. 617-648, julho de 1992
- Ben-Amram, Amir 1996. "Notas sobre a comparação entre Pippenger e Lisp puro e impuro" Manuscrito não publicado, DIKU, Universidade de Copenhague, Dinamarca
- Bird, Richard, Jones, Geraint e De Moor, Oege 1997. "Mais pressa, menos velocidade: avaliação preguiçosa versus ansiosa" Journal of Functional Programming 7, 5 pp. 541-547, setembro de 1997
- Okasaki, Chris 1996. Tese de doutorado "Estruturas de dados puramente funcionais" , Universidade Carnegie Mellon
- Okasaki, Chris 1998. "Estruturas de dados puramente funcionais" Cambridge University Press, Cambridge, Reino Unido
- Pippenger, Nicholas 1996. Simpósio ACM "Pure Versus Impure Lisp" sobre princípios de linguagens de programação, páginas 104-109, janeiro de 1996