2016-11-23 10 views
1

私は、反復アルゴリズムを使用して再帰アルゴリズムを使用して、除算と征服のアプローチではなくを使用してアルゴリズムを作成しようとしています。反復除算と征服アルゴリズム

私はループに近づく方法について混乱しています。

ベースケースにヒットするまで、問題を小さな問題に分割する必要があります。私はこれがまだ当てはまると仮定していますが、より大きな問題を解決するために小さなサブプログラムをどのように(再帰なしで)使うことができるか分かりません。

たとえば、(1次元空間で - 私はこれを自分自身で高次元に一般化しようとしますが)最も近い点のペアを見つけるアルゴリズムを考え出しています。もしLが整数の座標であるnearest_pair(L)を持っていたら、に分割し、この問題を解決できるITERATIVEアルゴリズムを克服するにはどうすればいいでしょうか?

(一般性を失うことなく、私は、Pythonを使用しています)

+0

再帰を使用しない(使用できない)特別な理由はありますか? – Gormador

+0

私はクラスで与えられた代入に対して反復アルゴリズムを設計しなければなりません。私はこれを再帰的に(D&Cを使用して)解くことを知っており、これを反復コードに変換して、D&CアプローチがO(n^2)とは対照的にO(nlogn)時間であるという事実を利用できると確信しています。 – TimelordViktorious

+1

それは私が恐れていたものです。特にクラス割り当ての文脈では、特にコードではなく一般的なプログラミングに関することを理解しているにもかかわらず、コードの期間に既に試したことを示す前に、ここで助けを得ることはありません。悲しいかな、ある時点でコードを書く必要があり、これが具体的な回答に影響します... 誰かが返事をしたようですが!あなたは運があるようです! – Gormador

答えて

4

反復アルゴリズムに任意の再帰アルゴリズムを有効にする安価な方法は、再帰関数を取るループに入れ、そしてあなた自身のスタックを使用することです。これにより、関数呼び出しのオーバーヘッドがなくなり、不要なデータがスタックに保存されることがなくなります。しかし、これは通常、「最良の」アプローチではありません(「ベスト」は問題と文脈によって異なります)。

あなたの問題を言いましたが、それはリストをサブリストに分解し、それぞれの中で最も近いペアを選び、それらの2つの結果から最も近いペアを取る。これを繰り返し行うには、上記の一般的な方法よりも、これにアプローチするより良い方法は、逆の方法をとることです:サイズ3のリスト(見て3つのペアがあります)を見てそこから上に向かいます。サイズ2のリストは自明であることに注意してください。

最後に、座標が整数の場合、それらはZ(Rのサブセットのほうがずっと小さい)にあります。

+0

ええ、あなたは正しいです。私はZを意味しました:-)。私はStackのアイデアについて考えていましたが、このアルゴリズムを分析して正しさを証明しようとしているので、私はこの考えを避けたいと思います。 私はあなたが何を意味しているのかを理解していれば、ボトムアップアプローチを提案していますか? – TimelordViktorious

+0

@TimelordViktoriousはい。アルゴリズム的な観点からも異なる順序付けが可能ですが、反復バージョンはボトムアップになります(メモリ内で互いに近接している要素の作業に時間を費やすため、キャッシュのパフォーマンスが向上する傾向があります) – Andrew

+0

これを行うには、リストLをリニアスキャンして、リストの最後までヒットするまで、3つの要素のパーティションを一度に(または2)調べるだけです。私はこれをやっているのですか? – TimelordViktorious

関連する問題