A maioria dos algoritmos conhecidos é de primeira ordem, no sentido de que sua entrada e saída são dados "simples". Alguns são de segunda ordem de uma maneira trivial, por exemplo, classificação, hashtables ou funções map e fold: são parametrizadas por uma função, mas na verdade não fazem nada de interessante, exceto invocá-la em partes de outros dados de entrada.
Alguns também são de segunda ordem, mas um pouco mais interessantes:
- Fingertrees parametrizados por monoides
- Divisão de uma fingertree em um predicado monótono
- Algoritmos de soma de prefixos, novamente normalmente parametrizados por um monóide ou predicado etc.
Finalmente, alguns são "verdadeiramente" de ordem superior, no sentido mais interessante para mim:
- O combinador Y
- Listas de diferenças
Existem outros algoritmos não triviais de ordem superior?
Na tentativa de esclarecer minha pergunta, em "ordem superior não trivial", quero dizer "usar instalações de ordem superior do formalismo computacional de maneira crítica na interface e / ou implementação do algoritmo"
Respostas:
Há muitas funções de ordem superior em http://math.andrej.com/ , por exemplo, na postagem sobre exponenciais duplas , o seguinte tipo de Haskell aparece (com os sinônimos de tipo expandidos):
Você também pode se divertir muito com a postagem A Haskell Monad for Infinite Search in Finite Time - por exemplo:
Eu acho que o tipo de bigUnion é de 4 ou 5 ordem!
fonte
existem vários algoritmos que são "realmente de segunda ordem", embora geralmente não sejam explicitamente descritos nesses termos. Sempre que temos algoritmos de tempo sub-lineares, implícito é algum tipo de acesso do oráculo à entrada, ou seja, realmente tratando a entrada como uma função.
Exemplos:
(1) Os algoritmos elipsóides ao trabalhar com um "oráculo de separação" (por exemplo, http://math.mit.edu/~vempala/18.433/L18.pdf )
(2) Minimização da função submodular (por exemplo, http://people.commerce.ubc.ca/faculty/mccormick/sfmchap8a.pdf )
(3) Todo o campo de teste de propriedades é realmente desse formato ( http://www.wisdom.weizmann.ac.il/~oded/test.html )
(4) Leilões combinatórios no modelo de consulta (por exemplo, http://pluto.huji.ac.il/~blumrosen/papers/iter.pdf )
fonte
Há outra resposta para essa pergunta: não há nenhuma. Mais especificamente, qualquer algoritmo de ordem superior (implementável!) É mecanicamente equivalente a um algoritmo de primeira ordem, usando a defuncionalização .
Deixe-me ser mais preciso: embora existam realmente algoritmos de ordem superior, na prática é sempre possível reescrever cada instância como um programa puramente de primeira ordem. Em outras palavras, não há programas saturados de ordem superior - essencialmente porque a entrada / saída dos programas são cadeias de bits. [Sim, essas cadeias de bits pode representar funções, mas esse é o ponto: eles representam funções, eles são não funções].
As respostas já dadas são excelentes, e minha resposta não deve ser considerada contraditória. Deve-se considerar como resposta à pergunta em um contexto um pouco maior (programas completos em vez de algoritmos independentes). E essa mudança de contexto muda a resposta radicalmente. O objetivo da minha resposta é lembrar às pessoas disso, que é fácil demais de esquecer.
fonte
(\\() -> "Ceci n'est pas une fonction") ()
Nas bibliotecas combinadoras do analisador, a ordem da função geralmente é bastante alta. Confira Funções de ordem superior para análise ou por que alguém iria querer usar uma função de sexta ordem? de Chris Okasaki. Journal of Functional Programming , 8 (2): 195-199, março de 1998.
fonte
A análise computável caracteriza números reais programaticamente, uma vez que os números reais contêm uma quantidade ilimitada de informações e, portanto, as operações em números reais são de ordem superior no sentido das perguntas. Normalmente, os números reais são apresentados usando uma visão topológica no fluxo infinito de bits, o espaço Cantor, emprestando interesse ao campo mais amplo da topologia computável.
Klaus Weihrach falou disso como a Hierarquia de Efetividade do Tipo Dois da topologia computável. Para mais informações, consulte Weihrach & Grubba, 2009, Topologia computável elementar e a página de pesquisa de John Tucker, Computação com dados topológicos . Menciono a página de Tucker na minha pergunta, Applications of Cantor Space .
fonte
Um módulo de continuidade funcional é um mapa
m
que aceita uma (contínua) funcionalF : (nat -> nat) -> nat
e gera um númerok
tal queF f = F g
sempref i = g i
para todosi < k
. Existem algoritmos para calcular o módulo de continuidade (não muito eficientes), o que o torna uma instância de um algoritmo de terceira ordem.fonte
Para complementar a resposta de Noam , também existem várias situações em que é importante que a saída seja (uma representação explícita de) uma função.
fonte
Nos algoritmos de gráfico, os vértices e as arestas são geralmente considerados dados simples, mas na verdade podem ser generalizados de maneira produtiva para que sejam gerados programaticamente sob demanda.
Durante meu doutorado (em química computacional), implementei muitos algoritmos de gráficos em forma de ordem superior, a fim de aplicá-los à análise de gráficos implícitos, principalmente porque meus gráficos reais eram infinitos, então eu não podia armazená-los explicitamente! Especificamente, eu estava estudando a topologia de materiais amorfos representados como inclinações 3D de células unitárias (supercélulas).
Por exemplo, você pode escrever uma função para calcular o shell vizinho enésimo mais próximo de um vértice de origem
i
como este:onde
neighbors
é uma função que retorna o conjunto de vértices vizinhos ao vértice fornecido.Por exemplo, a estrutura quadrada 2D:
Outros algoritmos interessantes nesse contexto incluem as estatísticas de anel de caminho mais curto de Franzblau.
fonte
U
de vértices e uma funçãoU -> U -> Bool
de arestas.