私のプログラミング2クラスの最近の割り当てでは、Java ArrayListに13,040個の文字列を入力して、検索の効率をテストしました。逐次検索は、複雑さの違いとコードが実際にコードをループしなければならない回数。
ただし、反復バイナリ検索と再帰バイナリ検索では、同じ量の比較が行われました。例えば:
sequentialSearch(): 'some_Word' found in ArrayList at index 13,020 - comparisons: 13,021
比較は、ユーザーの「some_Word」が値ArrayListと等しいかどうかコンピューターが実際にチェックした回数です。
iterativeBinarySearch(): 'some_Word' found in ArrayList at index 13,020 - comparisons: 14
recursiveBinarySearch(): 'some_Word' found in ArrayList at index 13,020 - comparisons: 14
では、反復と再帰の比較が同じ場合、どの状況でどちらを選択するのでしょうか。それは単に個人的な好みなのか、それとも特定のものを使用する特定の理由があるのか?
言語プロセッサー(コンパイラーまたはインタープリター)がテール再帰最適化を適切に実装している場合、適切にコーディングされたテール再帰バイナリー検索と反復バイナリー検索の間に違いはありません。言語プロセッサは、再帰呼び出しを単純なループに変えます。
その時点で、再帰的な式と反復的な式のどちらを選択するかは、個人およびローカルの好みの問題です。一部の人々は、再帰的なコードを理解しやすいと感じています。一部の人々は、再帰の死に恐怖を感じるか、それを理解していないか、末尾再帰の最適化についての手がかりがなく、どこでも明示的に反復コードを望んでいます。
さらに調査した後、各アルゴリズムについていくつかの長所と短所を作成しました。テーブルで視覚化する方が簡単ですが、現在マークダウンではサポートされていないようです。ただし、これらの長所/短所を6つのカテゴリ(構造、制御、条件、更新、速度、およびスペース)に分類しました。
手元のプロジェクトに応じて、これは実践するのに最適なアルゴリズムを決定できるはずです。
構造-繰り返し
Control-ループの明示的な使用
条件-入口条件
pdate-カウンターによって制御され、カウンターを更新し続けます
速度-通常、再帰よりも高速に実行されます
スペース-通常、再帰よりスペースが少なくて済みます。
構造-選択
Control-再帰呼び出し(つまり、再帰ケース)。データは呼び出されるたびに小さくなります。
条件-終了条件(つまり、基本ケース)
更新-徐々にベースケースに近づきます。それは各呼び出しでより小さいバージョンを生成し続けます。
速度-通常、反復よりも実行が遅くなります
スペース-通常、「コールスタック」と呼ばれる反復よりも多くのスペースが必要です。