Java でアルゴリズムを実装する場合は、再帰に注意してください。

Java でアルゴリズムを実装する場合は、再帰に注意してください。

現象:

再帰は、アルゴリズムの原理をうまく説明できる古典的なアルゴリズム実装です。再帰は、アルゴリズムの説明、パフォーマンス、コード構造の理解に適しています。

しかし、この記事で言いたいのは、Java で再帰アルゴリズムを実装するときには、再帰を使用せず、非再帰実装に変換するようにすることです。

最近、より複雑なアルゴリズムを実装する際に試してみたところ、非再帰実装では再帰実装に比べて速度が 1/3 向上することがわかりました。

次の簡単な例を見てみましょう: (注: 説明を簡略化するために、ここでは簡単な例のみを使用しています)

入力パラメータ: N

出力: log1+log2+log3+....+logN

2 つの実装コードは次のとおりです。

Javaコード

  1. パッケージテスト;
  2.     
  3. 公共 クラスRecursiveTest {
  4.      /**
  5. * 再帰実装
  6. *
  7. * @param n
  8. * @戻る
  9. */     
  10.     公共 静的 二重再帰( long n) {
  11.          (n == 1 )の場合{
  12.              Math.log( 1 )を返します
  13. }それ以外{
  14.              Math.log(n) + recursive(n - 1 )を返します
  15. }
  16. }
  17.     
  18.      /**
  19. * 非再帰実装
  20. *
  21. * @param n
  22. * @戻る
  23. */     
  24.     公共 静的 直接倍精度浮動小数点数型( long n) {
  25.         ダブル結果 = 0 ;
  26.          ( int i = 1 ; i <= n; i++)の場合{
  27. 結果 += Math.log(i);
  28. }
  29.         結果を返します
  30. }
  31.     
  32.     公共 静的  void main(String[] args) {
  33.         整数i = 5000000 ;
  34.         長いテスト = System.nanoTime();
  35.         長いstart1 = System.nanoTime();
  36.         ダブルr1 = 再帰(i);
  37.         長いend1 = System.nanoTime();
  38.         長いstart2 = System.nanoTime();
  39.         ダブルr2 = 直接(i);
  40.         長いend2 = System.nanoTime();
  41.     
  42. System.out.println( "再帰結果:" + r1);
  43. System.out.println( "使用された再帰時間: " + (end1 - start1));
  44. System.out.println( "非再帰結果:" + r2);
  45. System.out.println( "非再帰使用時間: " + (end2 - start2));
  46. }
  47. }

実行結果は次のとおりです。

  1. 再帰結果:7.212475098340103E7
  2. 再帰使用時間:539457109
  3. 非再帰結果:7.212475098340103E7
  4. 非再帰使用時間:282479757

再帰実行時間は非再帰実行時間のほぼ 2 倍であることがわかります。

(注: 上記のコードは、パラメータ -Xss200m の下で実行されます。スタック スペースが不足している場合は、直接実行できません)

理由の簡単な分析:

上図は、Java スレッド スタックの構造を示しています。 Java はスレッドごとにスタックを維持し、スタックはメソッドごとにスタック フレームを保存します。スタック フレームはメソッドの実行状態を表します。 これは、メソッド スタックと呼ばれることが多いものです。 ***1つは現在実行中のスタック フレームです。

各メソッド呼び出しには次の内容が含まれます。

1. 新しい呼び出しメソッドのスタックフレームを生成する

2. 現在のメソッドのスタックフレームの状態を保存する

3. スタック フレームのコンテキストが *** メソッド スタック フレームに切り替わります。

再帰的な実装はスタック メモリの消費 (多くの場合、Xss パラメータの調整が必要) とスタック フレームの作成および切り替えによるパフォーマンスのオーバーヘッドにつながり、最終的には効率に大きな影響を与えます。

したがって、アルゴリズムの効率を向上させたい場合は、再帰を使用しないことが基本原則です。

さらに、再帰はアルゴリズムを理解するために使用する方法です。コードに実装すると、基本的に非再帰的なコード実装に変換できます。

<<:  コンシステントハッシュアルゴリズムの詳細な説明

>>:  Cacti パーセンタイル監視アルゴリズム

ブログ    
ブログ    

推薦する

時系列予測におけるディープラーニングの概要と今後の方向性の分析

2023年は大きな言語モデルと着実な普及の年です。時系列の分野ではそれほど大きな成果は得られていませ...

単一のニューロンでも DNN 機能を実現でき、画像分類の精度は 98% です。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

AI を活用したエンジニアリングは、ロボット工学と自動化をどのように強化できるのでしょうか?

AI プロンプト エンジニアリングは、AI ツールを使用して望ましい結果を生み出す効果的な方法です...

AI誇大宣伝はサイバーセキュリティのデフレにおけるバブルなのか?

人工知能は、その概念が最初の電子メールウイルスと同じくらい古いにもかかわらず、「ネットワークにおける...

DAMOアカデミーの医療AIは、整形外科手術における歴史的課題を解決し、解剖学的位置を0.3秒で特定します。

「21世紀で最も成功した手術」として知られる人工股関節全置換術(THA)では、まもなく最新のAI技...

必ず読むべき28の古典的なプログラミングアルゴリズム

最初の 10 個は、聖書からのトップ 10 アルゴリズムです。発起者からの説明: Proofs fr...

大学入試結果が続々発表。ボランティア応募で人工知能が注目の選択肢に

今日から、全国各地の大学入試結果が続々と発表され、出願手続きが始まります。今年、各大学は、専門分野、...

...

...

中国の建設ロボット軍団がやってくる!

[[408565]]香港のサウスチャイナ・モーニング・ポストに6月29日に掲載された記事「中国の道...

...

初心者のためのホームオートメーション完全ガイド

スマートホームはテクノロジーを活用して、居住者にさらなる利便性、節約、快適性、セキュリティを提供しま...

Kevin P. Murphy の「確率的機械学習: 上級」が PDF でダウンロードできるようになりました。

本日、Google の研究科学者 Kevin P. Murphy 氏は、「確率的機械学習: 上級」の...

南京科技大学とオックスフォード大学は、1行のコードでゼロショット学習法の効果を大幅に向上させるプラグアンドプレイ分類モジュールを提案した。

ゼロショット学習は、トレーニングプロセス中に出現しなかったカテゴリの分類に重点を置いています。意味記...

...