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

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

[[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とプライバシーの未来: コンピュータービジョンソリューションとプライバシー

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

推薦する

AIが建物の運営に及ぼす影響

昨年、ChatGPT とその他の AI 搭載サービス エンジンがリリースされて以来、このテクノロジー...

AI と Wi-Fi 6: 家庭内 Wi-Fi の革命を推進

固定ネットワークが F5G (第 5 世代) 時代に入るにつれ、家庭用 Wi-Fi テクノロジも、新...

...

在庫 | 今年の世界の AI 事情

​​​ [[253255]]​​ 1. 2018 年の世界の AI 業界の発展は非常に爆発的でした。...

自動運転車インフラの新たなビジョン

自動運転車の台頭により、都市の建設方法や都市環境における交通手段に対する考え方が一変するでしょう。 ...

...

SQL Server 2008 のデータ マイニングのための 9 つのアルゴリズム

SQL Server 2008 データ マイニング決定木アルゴリズム決定木は判断木とも呼ばれ、バイナ...

...

...

Ocado が機械学習を活用して食品廃棄を減らし、飢餓と闘う方法

[[282701]] [51CTO.com クイック翻訳] 食品廃棄は世界中で大きな問題となっていま...

...

一つ選びますか? Python 機械学習の実践的なヒント

原題は「Some Essential Hacks and Tricks for Machine Le...

電子顧客サービスの管理不足は問題を解決することはできず、トラブルを増やすだけです

カスタマーサービスに電話すると、ロボットはプログラムに従ってプロンプトを出すだけで、ユーザーが望む情...

小規模、高効率:DeepMind がマルチモーダル ソリューション Mirasol 3B を発表

マルチモーダル学習が直面している主な課題の 1 つは、テキスト、オーディオ、ビデオなどの異種のモダリ...

ビデオ通話の低品質なビデオとはおさらば: NVIDIA の新しいアルゴリズムはトラフィックを最大 90% 圧縮できます

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