洗練された再帰アルゴリズムの例


14

有名な決定的線形時間選択アルゴリズム(中央値アルゴリズムの中央値)を友人に説明していました。

このアルゴリズムの再帰は(非常に単純ですが)非常に洗練されています。それぞれ異なるパラメーターを持つ2つの再帰呼び出しがあります。

このような興味深い再帰アルゴリズムの別の例を見つけようとしていましたが、見つけられませんでした。私が思いつく可能性のある再帰アルゴリズムはすべて、単純な末尾再帰または単純な分割統治(2つの呼び出しが「同じ」である)のいずれかです。

洗練された再帰の例をいくつか挙げていただけますか?


迷路、またはより一般的には幅優先の検索を伴うグラフを走査することは、興味深い再帰の簡単な例です。

ちなみに、BFSはキューとwhileループを使用して簡単かつ自然に実装できるため、私の質問には適さないと思います。
— elektronaj

パズルの解決と解析のバックトラックはどうですか?また、ランキングアルゴリズムと非ランキングアルゴリズムには、非標準の再帰もあります。
— ウリ

メモ化アルゴリズム?
— カヴェー

2
@vzn:キューはスタックを置き換えることができません。BFSは特殊なケースです。
— ラファエル

回答:


15

私のお気に入りの再発は、最初にKirkpatrickとSeidelによって凸包を計算するための出力依存アルゴリズムに現れますが、後に他の人によって繰り返されました。LETの凸包を計算するために示す時間凸包を有する場合、平面上の点を頂点。(の値は、自明な境界除き、事前にはわかりません。)Kirkpatrick and Seidelのアルゴリズムは、再帰 whereおよびおよびN H H H ≤ N T (N 、H )= { O (N )であれば  、N ≤ 3  又は  H ≤ 3 T (N 1、H 1)+ T (N 2、H 2)+ O (n )それ以外は n 1、n 2T(n,h)nhhh≤n

T(n,h)={O(n)if n≤3 or h≤3T(n1,h1)+T(n2,h2)+O(n)otherwise
、N 1 + N 2 = N H 1 + H 2 = Hn1,n2≤3n/4n1+n2=nh1+h2=h。

解はです。は均等に分割されるパラメーターではないため、これは少し驚くべきことです。しかし実際には、とが両方ともである場合、再発の最悪のケースが発生します。なんとなく魔法のようにが常に一定であれば、解はます。h h 1 h 2 h / 2 h 1 T (n 、h )= O (n )T(n,h)=O(nlog⁡h)hh1h2h/2h1T(n、h)=O(n)

最初の計算トポロジーの論文の1つで、この繰り返しのバリアントを使用しました: ここで、および。繰り返しになりますが、解決策はであり、と両方が常に均等に分割される場合に最悪のケースが発生します。

T(n、g)={O(n)もし n≤3 または g=0T(n1、g1)+T(n2、g2)+O(分{n1、n2})さもないと
g 1 + g 2 = g O (n log g )n gn1+n2=ng1+g2=gO(nログ⁡g)ng

条件「if or」に問題があります。何をんここに意味ですか?1つ目の場合に最終的にとがアンダーカットする必要のあるグローバルな境界定数はありますか(著者はそれらを与えることを気にしません)。文字通りに読むと(つまり、両方のを同じ行のと同じように解釈する場合)、ケース2は決して発生しないか、常に発生するからです(確信が持てません)。表記法の乱用が行き過ぎ、私見。h = O (1 )n=O(1)h=O(1)n h O (1 )O (n )OnhO(1)O(n)
— ラファエル

1
申し訳ありませんが、明確にするために回答を編集しました。 は「お気に入りの定数」を意味していました。リビジョンではを使用しましたが、でも同様に機能します。O(1)31010100!
— JeffE

計算トポロジーの論文では、これらの図をどのように描きましたか?
— user119264

12

Aggarwal らの論文「凸多角形のボロノイ図を計算するための線形時間アルゴリズム」で使用した再帰も非常に複雑です。

ここに私たちの論文のアルゴリズムの説明があります。説明から明らかでない場合は、ステップ3で赤い点を深紅色とガーネットの点に分割します。ステップ1、3、および6はすべて線形時間です。また、がポイントの総数である場合、、および一部について。n|B|≥αn|R|≥βn|C|≥γnα,β,γ>0

なぜアルゴリズム全体が線形の時間を要するのかを説明します。

  1. 元のポイントを青と赤のセットBとRに分割します。
  2. 青い点の凸包を再帰的に計算します。
  3. 青い船体の構造を使用して、深紅色の点Cを選択します。
  4. 深紅のポイントを青い船体に1つずつ追加します。
  5. ガーネットポイントGの凸包を再帰的に計算します。
  6. このガーネット船体をステップ4の拡張された青い船体と結合します。

アルゴリズムを線形にするのは、ポイントごとに一定のコストで、赤いハルの固定分数を青いハルに追加する機能です。追加されるポイントは深紅色のポイントです。

したがって、再帰は であり、知らないところでおよびただし、。

T(n)=T(|B|)+T(|G|)+O(n)
|B||G||B|+|G|≤(1−γ)n

7

ハーフプレーンを使用した範囲検索から生じる再発の中央値にはばらつきがあります。繰り返し自体は次の形式です

T(n)=T(n/2)+T(n/4)+cn
は、中央値検出の繰り返しに似ています。詳細については、Jeff Ericksonの講義ノート、特にセクション4をご覧ください。

1
ここでの私の答え(cs.stackexchange.com/questions/332/…)は、実行時間とまったく同じ繰り返しをたまたま持っています:)
— アレックス10ブリンク

6

RNA二次構造予測で使用されるクールな再帰アルゴリズム[1]、[2]がたくさんあります。独自のデバイスに任せて、RNAの鎖はそれ自体と塩基対を形成します。[3]の1つの比較的単純な例では、RNAストリングがそれ自体で形成するネストされたペアの塩基の最大数を計算します。

M(i,j)=maxi≤k<j−Lmin{M(i,k−1)+M(k+1,j−1)+1M(i,j−1)


  1. M. Zuker、P。Stiegler(1981)による熱力学と補助情報を使用した大きなRNA配列の最適なコンピューターフォールディング

  2. E. Rivas、SR Eddy(1999)による偽結び目を含むRNA構造予測のための動的プログラミングアルゴリズム

  3. R. Nussinov、AB Jacobson(1980)による一本鎖RNAの二次構造を予測する高速アルゴリズム


ここで提案されている関連するものは、3つの相互依存(動的プログラミング)再帰を実行するため、非常に複雑です。
— ラファエル

4

「洗練された再帰」とはどういう意味か、まだよくわかりません。たとえば、FFTアルゴリズムの再帰ステップは洗練されています!

しかし、より複雑な再帰を探したい場合は、相互再帰が1つの可能な答えかもしれません。相互再帰は、関数型プログラミング言語で作業するときに役立ちます。相互再帰は、再帰降下パーサーの重要な機能です。


さて、FFT(Cooley-Tukeyの最も単純な形式)の再帰は、「標準」の分割統治です。これは、O(nlogn)の複雑さから明らかです。2つの再帰呼び出し(1つは偶数、1つはオッズ)はやや「同じ」です。
— elektronaj

3

私の頭の上には、マッカーシー91機能

F(N) = 
    n - 100    if n > 100
    F(F(n+11)) if n <= 100

およびアッカーマン関数

A(m, n) = 
    n + 1             if m = 0
    A(m-1, 1)         if m > 0 and n = 0
    A(m-1, A(m, n-1)) if m > 0 and n > 0

おもちゃっぽいですが、再帰的な機能であるにもかかわらず、風変わりなものとしてカウントされる可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.