Saya sedang menjelaskan algoritma pemilihan waktu linear deterministik yang terkenal (median algoritma median) kepada seorang teman.
Rekursi dalam algoritma ini (walaupun sangat sederhana) cukup canggih. Ada dua panggilan rekursif, masing-masing dengan parameter berbeda.
Saya mencoba untuk menemukan contoh lain dari algoritma rekursif yang menarik, tetapi tidak dapat menemukannya. Semua algoritme rekursif yang dapat saya buat adalah rekursi ekor sederhana atau pembagian sederhana dan taklukkan (di mana kedua panggilan itu "sama").
Bisakah Anda memberikan beberapa contoh rekursi canggih?
algorithms
recursion
elektronaj
sumber
sumber
Jawaban:
Perulangan favorit saya muncul dalam algoritma output-sensitif untuk komputasi lambung cembung, pertama oleh Kirkpatrick dan Seidel , tetapi kemudian diulang oleh yang lain. Misalkan menunjukkan waktu untuk menghitung lambung cembung dari n poin dalam pesawat, ketika lambung cembung memiliki h simpul. (Nilai h tidak diketahui sebelumnya, selain dari batasan sepele h ≤ n .) Algoritma Kirkpatrick dan Seidel menghasilkan rekurensi T ( n , h ) = { O ( n ) jikaT(n,h) n h h h≤n
jikan1,n2≤3n/4dann1+n2=ndanh1+h2=h.
Solusinya adalah . Ini sedikit mengejutkan, karena h bukan parameter yang dibagi secara merata. Tapi pada kenyataannya, terburuk kasus kekambuhan terjadi ketika h 1 dan h 2 keduanya sekitar jam / 2 ; jika entah bagaimana secara ajaib h 1 selalu konstan, solusinya adalah T ( n , h ) = O ( n ) .T(n,h)=O(nlogh) h h1 h2 h / 2 h1 T( n , h ) = O ( n )
Saya menggunakan varian pengulangan ini di salah satu makalah topologi komputasi pertama saya : mana
sumber
Rekursi yang saya gunakan dalam makalah saya "Algoritma linear-waktu untuk menghitung diagram Voronoi dari poligon cembung" oleh Aggarwal et al juga cukup rumit.
Berikut adalah deskripsi algoritma dari makalah kami. Jika tidak jelas dari deskripsi, pada langkah 3 titik merah dipartisi menjadi titik merah dan garnet. Langkah 1, 3, dan 6 semuanya merupakan waktu linier. Kita juga tahu bahwa jika adalah jumlah total poin, | B | ≥ α n , | R | ≥ β n , dan | C | ≥ γ n untuk beberapa α , β , γ > 0 .n | B | ≥αn | R | ≥βn | C | ≥γn α , β, γ> 0
Saya akan memberi tahu Anda mengapa seluruh algoritma membutuhkan waktu linier.
sumber
Ada variasi pada rekurensi temuan median yang berasal dari rentang pencarian dengan setengah pesawat. Perulangan itu sendiri berbentuk
sumber
Ada banyak algoritma rekursif keren [1], [2] yang digunakan dalam prediksi struktur sekunder RNA. Jika dibiarkan sendiri, untaian RNA akan membentuk pasangan basa dengan dirinya sendiri; satu contoh yang relatif sederhana dari [3] menghitung jumlah maksimum basis berpasangan yang bersarang pada string RNA dengan sendirinya:
Lipat komputer optimal dari sekuens RNA besar menggunakan termodinamika dan informasi tambahan oleh M. Zuker, P. Stiegler (1981)
Algoritma Pemrograman Dinamis untuk Prediksi Struktur RNA Termasuk Pseudoknots oleh E. Rivas, SR Eddy (1999)
Algoritma cepat untuk memprediksi struktur sekunder RNA untai tunggal oleh R. Nussinov, AB Jacobson (1980)
sumber
Saya masih tidak benar-benar mengerti apa yang Anda maksud dengan "rekursi canggih". Misalnya, langkah rekursi dalam algoritma FFT canggih!
Tetapi jika Anda ingin mencari rekursi yang lebih rumit , maka rekursi bersama mungkin menjadi salah satu jawaban yang mungkin. Rekursi timbal balik berguna ketika bekerja dengan bahasa pemrograman fuctional . Rekursi timbal balik adalah fitur kunci dari parser keturunan rekursif .
sumber
Dari atas kepala saya, fungsi McCarthy 91
dan fungsi Ackermann
mungkin dianggap sebagai offbeat, meskipun toy-ish, fungsi rekursif.
sumber