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

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

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

ブログ    
ブログ    
ブログ    

推薦する

Huang が H100 を「ブースト」: NVIDIA が大規模モデル アクセラレーション パッケージを発表、Llama2 推論速度が 2 倍に

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

ナンバーワンのディープラーニングフレームワークはどれですか? 2022年、PyTorchとTensorFlowが再び競い合う

PyTorch または TensorFlow を使用していますか?人々のグループによって答えは異なる...

...

第四次産業革命:人工知能

人工知能 (AI): 私たちの日常生活、生き方、他者との関わり方に根本的な変化がもたらされるのは、第...

McKinsey AI Notes: 19 の業界における 400 を超える人工知能の使用事例を解読すると、1 兆ドルの価値はどこにあるのか?

[[229251]]最近、マッキンゼーは、人工知能が分析技術の年間価値の40%を占め、毎年3.5兆...

[NCTS サミット レビュー] Ele.me Qiu Huafeng: バグの検出における人工知能の応用

2019年10月26日、Testinが主催する第2回NCTS中国クラウドテスト業界サミットが北京で開...

...

ビッグデータと人工知能の違いすら分からないのに、あなたはまだトップへの道を歩んでいる

ビッグデータと AI は公平に比較​​できるでしょうか? ある程度は公平ですが、まずはその違いを明確...

...

ソラの13人のメンバーを解読:北京大学卒業生を含む中国人3人、博士号を取得したばかりの1人、そして21歳の天才

OpenAIはSoraで世界に衝撃を与えた。どのような才能あるチームがこのような傑作を開発できるので...

ALS の少年がアリ数学コンテストで輝く!ブラックホールを研究するためにMITに独学で入学、指導者はホーキングと非常に似ている

今年のアリババ世界数学コンテストでは、特別優秀賞受賞者が決定しました。 ALSを患う20歳の少年、ル...

第4世代移動ロボット:凌東科技V-AMRのグローバル発売と投資促進

8月26日、北京の中関村国家自主革新モデル区展示センターで、玲東科技マックスの新製品発表会およびチャ...

人工知能とブロックチェーンが連携すると、どのような技術的利益が生まれるのでしょうか?

ブロックチェーンと人工知能は、現在のテクノロジー業界で最も注目されている2つの業界です。Statis...

速報:バイトダンスAIの馬衛英最高責任者が辞任し、清華大学の張亜琴チームに加わる

新知源は、バイトダンスの副社長兼AIラボ責任者である馬衛英氏がバイトダンスを離れ、清華大学の張亜琴氏...