再帰アルゴリズムの時間計算量について十分に理解していない

再帰アルゴリズムの時間計算量について十分に理解していない

[[414048]]

この記事では、面接の質問と面接のシナリオを使用して、再帰アルゴリズムの時間計算量を計算する方法を分析します。

多くの学生は再帰アルゴリズムの時間計算量について非常に漠然としていると思うので、この記事ではカールが徹底的に説明します。

同じ質問に対して、同じ再帰アルゴリズムを使用すると、O(n) コードを書く生徒もいれば、O(logn) コードを書く生徒もいます。

これはなぜでしょうか?

再帰の時間計算量を十分に理解していないと、このようなことが起こります。

次に、簡単な面接の質問を使用して面接のシナリオをシミュレートし、再帰アルゴリズムの時間計算量を徐々に分析して、最終的に最適なソリューションを見つけ、同じ再帰を O(n) コードとして記述する方法を確認します。

面接の質問: x の n 乗を求めてください

このような単純な質問について考えてみましょう。コードはどのように記述すればよいでしょうか?最も直感的な方法は、 for ループを使用して結果を見つけることです。コードは次のとおりです。

  1. int関数1( intx , intn ){
  2. int result = 1; // 0 乗した数値はどれも 1 になることに注意してください
  3. ( int i = 0; i < n; i++)の場合{
  4. 結果 = 結果 * x;
  5. }
  6. 結果を返します
  7. }

時間計算量は O(n) です。このとき、面接官はより効率的なアルゴリズムがあるかどうかを尋ねます。

現時点でアイデアがない場合は、「できません」「わかりません」などと言わないでください。

これについて面接官と話し合い、「ヒントをもらえますか?」と尋ねることができます。面接官のプロンプト: 「再帰アルゴリズムについて考えてください。」

次に、次のような再帰アルゴリズムを記述し、再帰を使用してこの問題を解決します。

  1. int関数2( intx , intn ){
  2. (n == 0)の場合{
  3. return 1; // 1を返すこれも0が1に等しいためである
  4. }
  5. 関数2(x, n - 1) * xを返します
  6. }

インタビュアーはこう尋ねました。「それでは、このコードの時間計算量はどれくらいですか?」

再帰を見ると O(logn) を思い浮かべる学生もいるかもしれません。実際はそうではありません。再帰アルゴリズムの時間計算量は、基本的に、再帰の数 * 各再帰の操作の数によって決まります。

では、もう一度コードを見てみましょう。ここでは何回再帰しているでしょうか?

n-1 ごとに再帰が n 回実行され、時間の計算量は O(n) です。乗算演算が実行されるたびに、乗算演算の時間計算量は定数項 O(1) であるため、このコードの時間計算量は n * 1 = O(n) です。

この時間の複雑さは面接官の期待に応えられませんでした。そこで、次の再帰アルゴリズム コードを書きました。

  1. int関数3( intx , intn ){
  2. (n == 0)の場合{
  3. 1 を返します
  4. }
  5. (n % 2 == 1)の場合{
  6. function3(x, n / 2) * function3(x, n / 2)*x を返します
  7. }
  8. function3(x, n / 2) * function3(x, n / 2) を返します
  9. }

これを見た面接官は微笑んで「このコードの時間計算量はどれくらいですか?」と尋ねました。この瞬間、深い考えに陥る学生もいるかもしれません。

分析してみましょう。まず、再帰が何回実行されるかを見てみましょう。再帰を完全な二分木に抽象化できます。学生が書いたアルゴリズムは、図に示すように、完全な二分木で表すことができます (表現の便宜上、n は偶数 16 に選択されています)。


現在のバイナリ ツリーは、x の n 乗を求めるものです。n が 16 の場合、乗算演算はいくつ実行されますか。

このツリー内の各ノードは再帰と乗算演算を表すため、再帰の数はツリー内のノードの数によって異なります。

バイナリ ツリーに精通している場合は、完全なバイナリ ツリーのノードの数を計算する方法を知っている必要があります。この完全なバイナリ ツリーのノードの数は、2^3 + 2^2 + 2^1 + 2^0 = 15 です。これは実際には等比数列の和の式であることがわかります。この結論は、バイナリ ツリーに関連する面接の質問でよく出てきます。

では、x の n 乗を求める場合、この再帰ツリーにはいくつのノードがあるでしょうか? 次の図に示すように: (m は深さで、0 から始まります)


定数項 -1 を無視した後でも、この再帰アルゴリズムの時間計算量は O(n) のままです。はい、正しくお読みいただけました。依然として O(n) の時間計算量です。

この時点で、面接官は「この再帰アルゴリズムは依然として O(n) です」と言うでしょうが、これは明らかに面接官の期待を満たしていません。

では、O(logn) 再帰アルゴリズムをどのように記述すればよいでしょうか?

先ほど示した再帰アルゴリズムのコードについて考えてみましょう。冗長性はありますか? 実際、繰り返し計算がいくつかあります。

そこで、次の再帰アルゴリズム コードを書きました。

  1. int関数4( intx , intn ){
  2. (n == 0)の場合{
  3. 1 を返します
  4. }
  5. int t = function4(x, n / 2); // function3と比較すると、再帰演算が抽出されます
  6. (n % 2 == 1)の場合{
  7. t * t * xを返します
  8. }
  9. t * tを返します
  10. }

ここで、このコードの時間計算量を見てみましょう。

再帰回数を引き続き見てみると、ここでは再帰呼び出しが 1 回だけであり、そのたびに n/2 であることがわかります。つまり、ここでは 2 を底とする n の対数を合計 回呼び出していることになります。

各再帰演算は乗算演算であり、定数演算でもあります。したがって、この再帰アルゴリズムの時間計算量は、まさに O(logn) です。

この時点で、全員がようやくこのようなコードを書いて、時間の計算量を非常に明確に分析しました。面接官はかなり満足していると思います。

要約する

結局のところ、初心者は再帰の時間計算量について混乱することがありますし、多くの問題を練習したベテランでさえもまだ混乱しています。

この記事では、非常に簡単な面接の質問「x の n 乗を求める」を使用して、再帰アルゴリズムの時間計算量を段階的に分析します。再帰を見たときに O(logn) を考えないように注意してください。

再帰を使用すると、O(logn) のコードを書くことができる生徒もいれば、O(n) のコードを書くことができる生徒もいます。

function3 のような再帰実装の場合、これは O(logn) の時間計算量であると感じることは簡単ですが、実際には O(n) アルゴリズムです。

  1. int関数3( intx , intn ){
  2. (n == 0)の場合{
  3. 1 を返します
  4. }
  5. (n % 2 == 1)の場合{
  6. function3(x, n / 2) * function3(x, n / 2)*x を返します
  7. }
  8. function3(x, n / 2) * function3(x, n / 2) を返します
  9. }

この質問は非常にシンプルですが、アルゴリズム、特に再帰の理解に関する確固たる基礎も必要です。これは私が他の人を面接するときに使った質問でもあるので、全体のシナリオをとても現実的に書きました。笑

大企業は面接の際、候補者のアルゴリズムスキルをテストするために「簡単な質問」を使うのが好きです。ここでの「簡単な質問」は必ずしも本当に簡単なものではないことに注意してください。

この記事を注意深く読めば、再帰アルゴリズムに対する新たな理解が得られると思います。同じ問題、同じ再帰ですが、効率が異なります。

<<:  Python で機械学習を簡単に

>>:  AIとプライバシーの未来: コンピュータービジョンソリューションとプライバシー

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

Nvidia 3090が180億パラメータの大規模モデルに単独で挑む。今度は国内オープンソースプロジェクトが大暴れ

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

マッキンゼー:2045年までに仕事の50%がAIに取って代わられる

▲ 画像出典:マッキンゼーこのレポートで、マッキンゼーは、AIが人間の仕事に取って代わる時期が早まっ...

巨大企業がAIビッグモデルに参入する背景

ChatGPT に代表されるコンセプトが出現し始めると、ますます多くのインターネット プレーヤーが関...

...

2020 年の RPA の 7 つの主要トレンド: AI の有効化からより戦略的な拡張まで

ロボティック プロセス オートメーション (RPA) サービス プロバイダーである Blue Pri...

ビッグデータアルゴリズムのジレンマ

2013年、米国で窃盗罪で有罪判決を受けた男性がウィスコンシン州の裁判所に訴訟を起こしたという物議を...

シンプルでスマートなアプローチ: Python による顔認識

この記事は、公開アカウント「Reading the Core」(ID: AI_Discovery)か...

ジェネレーティブ AI によるヘルスケアの変革: 新たなユースケースと将来の可能性

ヘルスケアとウェルネスのダイナミックな分野では、ANI と生成 AI の組み合わせによる革命が進行し...

企業における機械学習の導入を妨げる4つの障害

[51CTO.com クイック翻訳] 機械学習には多くの利点があるのに、なぜ誰もが導入しないのでしょ...

2020年のライフスタイルに関する2008年の予測:そのほとんどが実現

米国のピュー・リサーチ・センターは2008年に、主に以下のような2020年のライフスタイルを予測しま...

...

Appleは開発者がアプリのコードを書くのに役立つXcodeのアップデート版を開発中だ

2月18日、海外メディアの報道によると、AppleはXcodeプログラミングソフトウェアの新しい生成...

人気は高まり続け、医療AIは業界の爆発的な成長の重要なポイントに達している

現在、世界の注目は5Gに集中しているが、人工知能の発展も軽視できない。わが国では、継続的な優遇政策の...