2016-10-21 13 views
0

おはようございます、私は再帰呼び出しを行う際にアルゴリズムと複雑さを計算する方法を研究していますが、再帰呼び出しのレベル制限が複雑さの計算にどのように影響するかについてのリファレンスは見つかりません。たとえば、次のコードは深い制限で再帰アルゴリズムの複雑さを計算する

countFamilyMembers(int level,....,int count){ 
     if(noOperationCondition) { // for example no need to process this item because business rules like member already counted 
      return count; 
     } else if(level >= MAX_LEVEL) { // Level validation, we want just to look up to certain level 
      return ++count //last level to see then no more recurrence. 
     } else { 
      for (...each memberRelatives...) { //can be a database lookup for relatives to explore 
       count = countFamilyMembers(++level,...,++count); 
      } 
      return count; 
     } 
    } 

私はこれがO(2^n)ループ内の再帰呼び出しだと思います。しかし、私は2つの主な質問があります: 1.ループの値が元の入力とまったく関係していないとどうなりますか?それも "n"と考えることができますか? 2.レベルの検証は、再帰呼び出しを制限して切断することです。これが複雑な計算にどのように影響しますか?

+1

1つのアプローチは、再帰をループに展開することです(この場合はかなり簡単に見えます)。次に、非再帰アルゴリズムの複雑さを評価することができます。これはしばしば簡単です。 – PaulF

+0

元の入力パラメータに関して、** n **とは何ですか? MAX_LEVELは定数ですか?ファンアウト(特定のノードからの親戚の数)が境界か、別の変数か、それとも何か他のものか?これらは深刻な複雑さに影響します。 – Prune

+0

nは、各人の親戚の数に関連しています。 MAX_LEVELは定数ですが、これは複雑さを大幅に減らすか、複雑さを少なくとも書く必要があると私は考えています。 特定のノードの親戚の数は制限されていません。実生活のような任意の値にすることができます。 –

答えて

0

ありがとうございます。だから私たちはnをいくつかの親戚の "ベストメトリック"と取るでしょう。これはいくつかのパラダイムでは「ファンアウト」としても知られています。

したがって、あなたはレベル0で1人、レベル1のN、レベル2ののn^2、などがあるでしょう。戻り値と操作数(ノード訪問、増分など)の概算は、レベル範囲0〜MAX_LEVELに対してn ^レベルの合計です。支配的な項は、最も高い指数、n^MAX_LEVELです。

私はあなたの答えです:O(n ^^ MAX_LEVEL)、a.k.a.多項式時間。もしNの値を与えることが起こる場合、Nに対しても上限、これは一定となり、複雑さがO(1)である、ことを

注。

+0

ありがとうございます!私は本当にレベルの面で答えのシンプルさ、非常によく説明され、明確に感謝しています!あなたは一定の時間についての最後の行について詳しく説明してください。 nに上限がある場合、それぞれのレベルに対してn回繰り返し、次にそれぞれの親に対してnを繰り返しますか? –

+0

MAX_LEVELが5で、nが10に制限されているとします。これで、10^5 + 10^4 + ... + 10^0の厳密な上限が得られました。それは111,111件の検査です。 *任意の定数は** O(1)**の複雑さを与えます。確かに、それはそれより短い時間で完了するかもしれませんが、あなたは実行時間の制約されない要因としてパラメータを除去しました。 はい、** n ** **の実際の値でスケーリングすることで、短い実行時間を予測できますが、複雑さの理論では、単に「部分定数時間」の詳細です。 – Prune

+0

非常にクリアです。どうもありがとうございました! –

関連する問題