Eu estava explicando o famoso algoritmo determinístico de seleção em tempo linear ( algoritmo de mediana de medianas) a um amigo.
A recursão neste algoritmo (embora seja muito simples) é bastante sofisticada. Existem duas chamadas recursivas, cada uma com parâmetros diferentes.
Eu estava tentando encontrar outros exemplos de algoritmos recursivos tão interessantes, mas não consegui encontrar nenhum. Todos os algoritmos recursivos que eu pude apresentar são simples recursões de cauda ou simples divisão e conquista (onde as duas chamadas são "as mesmas").
Você pode dar alguns exemplos de recursão sofisticada?
algorithms
recursion
elektronaj
fonte
fonte
Respostas:
Minha recorrência favorita aparece em algoritmos sensíveis à saída para calcular cascos convexos, primeiro por Kirkpatrick e Seidel , mas depois repetidos por outros. Seja o tempo para calcular o casco convexo de pontos no plano, quando o casco convexo tiver vértices. (O valor de não é conhecido antecipadamente, além do limite trivial .) O algoritmo de Kirkpatrick e Seidel produz a recorrência que e en h h h ≤ n T ( n , h ) = { O ( n ) se n ≤ 3 ou h ≤ 3 T ( n 1 , h 1 ) + T ( n 2 , h 2 ) + O ( n ) caso contrário n 1 , n 2T(n,h) n h h h≤n
A solução é . Isso é um pouco surpreendente, pois não é o parâmetro que está sendo dividido igualmente. Mas, de fato, o pior caso de recorrência ocorre quando e são aproximadamente ; se de alguma forma magicamente for sempre constante, a solução seria .h h 1 h 2 h / 2 h 1 T ( n , h ) = O ( n )T(n,h)=O(nlogh) h h1 h2 h/2 h1 T(n,h)=O(n)
Eu usei uma variante dessa recorrência em um dos meus primeiros trabalhos de topologia computacional : onde e . Novamente, a solução é , e o pior caso ocorre quando e são sempre divididos igualmente.
fonte
A recursão que usei no meu artigo "Um algoritmo de tempo linear para calcular o diagrama de Voronoi de um polígono convexo" por Aggarwal et al também é bastante complicada.
Aqui está uma descrição do algoritmo de nosso artigo. Caso não esteja claro a partir da descrição, na etapa 3, os pontos vermelhos serão particionados em pontos vermelhos e granados. Os passos 1, 3 e 6 são todos de tempo linear. Também sabemos que se é o número total de pontos, , e para alguns .n |B|≥αn |R|≥βn |C|≥γn α,β,γ>0
Vou deixar você descobrir por que todo o algoritmo leva tempo linear.
A recursão é, portanto, onde você não conheceemas é garantido que .
fonte
Há uma variação na recorrência da descoberta mediana que vem da pesquisa por intervalo com semiplanos. A recorrência em si é da forma
fonte
Existem vários algoritmos recursivos interessantes [1], [2] usados na previsão da estrutura secundária do RNA. Deixada por conta própria, uma cadeia de RNA formará pares de bases consigo mesma; um exemplo relativamente simples de [3] calcula o número máximo de bases aninhadas e emparelhadas que uma sequência de RNA formará consigo mesma:
Dobragem ideal por computador de grandes seqüências de RNA usando termodinâmica e informações auxiliares por M. Zuker, P. Stiegler (1981)
Um algoritmo de programação dinâmica para previsão de estrutura de RNA incluindo pseudo-nós por E. Rivas, SR Eddy (1999)
Algoritmo rápido para prever a estrutura secundária do RNA de fita simples por R. Nussinov, AB Jacobson (1980)
fonte
Eu ainda não entendo o que você quer dizer com "recursão sofisticada". Por exemplo, a etapa de recursão no algoritmo FFT é sofisticada!
Mas se você deseja procurar recursões mais complicadas , recursões mútuas podem ser uma resposta possível. A recursão mútua é útil ao trabalhar com linguagens de programação funcionais . A recursão mútua é a característica principal dos analisadores de descida recursiva .
fonte
Em cima da minha cabeça, a função McCarthy 91
e a função Ackermann
pode contar como funções incomuns, embora de brinquedo, recursivas.
fonte