再帰ツリー:どのように再帰的なアルゴリズムの時間の複雑さを解決するためにツリーを使用するには?

再帰ツリー:どのように再帰的なアルゴリズムの時間の複雑さを解決するためにツリーを使用するには?

再帰木と時間の複雑さの解析

再帰を解決するために小さな問題に大きな問題である、レイヤマッピングによって層を塗装の分解プロセスは、実際には、ツリーは、再帰的な木があります

実1:迅速な放電時間の複雑さの解析

高速行の平均場合の時間複雑さの再帰的ツリー分析

各パーティション後、両者のパーティションのサイズ比は1:Kが、あるK = 9を取って、各パーティションが非常に不均一であり、パーティションは、抽出中に9倍速い別のパーティションであり、各パーティションマスト仕切部を横断するすべてのデータがので、各レイヤは、データを分割することによって横断されること数の和であるN、Hを再帰的にツリーの高さである、プロセスデータ高速行番号を横断する時間* N、時間複雑ですO(H * n)が

高速放電条件は、セルの端部との間にソートすることであるワンサイズであり、リーフノードにおけるデータの、すなわちサイズがリーフノードに1、nはルートノードから1である、再帰的に最短経路ツリーは、それぞれ乗算されます 1 / 10 1/10 、最長パスは、それぞれ乗算されます 9 / 10 9/10 ので、リーフノードにルートノードからの最短経路 l o g   2   n ログ〜2〜n個 、最長パス l o g   10 / 9   n ログ〜10月9日〜N 、パーティションのサイズ比が1である場合:9、時間複雑度が速いドレインあります O ( n l o g n ) O(nlogn)

Kは= 99、パーティションおよび平均ではない、2つのパーティションのサイズが1:99であれば、時間の複雑さはどのくらいですか?

K = 99は、最短経路ツリーはlog100nが、時間複雑性は依然としてあります O ( n l o g n ) O(nlogn) 、塩基番号、高速放電時間複雑度が何に関係なく O ( n l o g n ) O(nlogn)

戦闘II:時間の複雑さの分析フィボナッチ数

int f (int n){
  if (n == 1) return 1;
  if(n == 2) return 2;
  return f(n-1) + f(n-2);
}

再帰的なツリーの木の高さはどのくらいですか?F(N)F(N-1)に分解される&F(N-2)、たびには、データサイズが約1~2で、葉のサイズは、1又は2である-1たびに、最長パスである場合nは、毎回-2場合、最短パスはN / 2であります

分解の各々の組み合わせ動作は、第1層1が消費される総時間であり、上から下へ、順次のみ加算演算を必要とし、総時間の消費は、第二の層2、第3の層が消費される総時間であります 2 2 2 ^ 2 、......、k番目の層は時間がかかり 2 ( k 1 ) 2 ^(K-1) 、総時間消費がアルゴリズムの各レイヤで費やされた時間の合計であり、アルゴリズムの時間複雑性は間にあります O ( 2 n ) O(2 ^ N) 、および O ( 2 ( n / 2 ) ) O(2 ^(N / 2)) 複雑さが指数と非常に高い時間の間に

実際III:全体の配置の時間の複雑さの分析

n個のデータのすべての順列を配置する方法を見つけるためにありますか?

たとえば、1,2,3の3つのデータ、6つの異なる構成があり、その後、どのようにそれをプログラミングするすべての順列を介してデータのセットを印刷するには?再帰を使用して実装することができます

したがって、我々は、最後のビットを同定配列の残りの部分は、その価値がありますので、解決するために、データの最後のビットがN個のデータのいずれかとすることができるn-1個のデータとなるN状況の種類「Nデータ配置」の問題は、「に配置されたデータの部分問題のn-1個」に分解n個

假设数组中存储的是1,2,3……n
f(1,2……n) = {最后一位是1,f(n-1)}  +  {最后一位是2,f(n-1)}   +  {最后一位是n,f(n-1)}
//调用方式:
//int[] a = {1,2,3,4} ;      printPermutations(a ,4,4);
//k表示要处理的子数组的数据个数

public void printPermutations(int[] data , int n , int k){
  if (k == 1){
    for (int i = 0 ;i < n ; ++ i){
      System.out.print(data[i] + " ");
    }
    System.out.println();
  }
  for(int i = 0;i < k ;++i){
    int tmp = data[i] ; 
    data[i] = data[k-1];
    data[k-1] = tmp;
    
    printPermutaations(data , n,k-1);
    
    tmp = data[i];
    data[i] = data[k-1];
    data[k-1] = tmp;
  }
}

各層はノードが存在するn個分解交換動作をn回、第二層を有し、各ノードは、分解時間n-1の交換を必要とする、第二の交換層は、N *(N-1)、第三の層の総数であります交換の数は、N *(N-1)(N-2)など

セルのライフサイクルは、コンテナでは、細胞の数を求めてN時間後、3時間、一回一時間分割ですか?

F(N-3) - その漸化式はF(N)= F(N-1)* 2であります

しかし、それは間違っています

2つのセルの最初の時間は、3時間目に死亡しているため、第四の時間ので、唯一の死細胞、N = 4が13である場合

1,2,4,7,13

死細胞の数は、n時間の古い細胞が死んでしまったので、その後、死んだ細胞の数が正しいので、n-3系細胞数時間の新入生である必要があり、新しい細胞と古い細胞前の3時間ではありませんF(N-4) - 漸化式はF(N)= 2F(N-1)であります

if(n<0) return 0;
if(n == 0) return 1;
if(n ==1) return 2;
if(n ==2) return 4;
if(n == 3) return 7;

xiaozhuanlan.coom /トピック/ 6091358742

公開された76元の記事 ウォンの賞賛9 ビュー9193

おすすめ

転載: blog.csdn.net/ywangjiyl/article/details/104382439