[データ構造]複雑さの分析

オファーが届きました。友達を掘って受け取りましょう!私は2022年の春の採用チェックインイベントに参加しています。クリックしてイベントの詳細を表示します。

1なぜ複雑さの分析が必要なのですか?

  1. テスト結果は、さまざまなハードウェア環境のテスト環境に大きく依存し、同じコードをテストした場合の効果は異なります。次に、複雑さの分析には、低コストと高効率の特性があります。
  2. テスト結果は、データのサイズに大きく影響されます。たとえば、並べ替えアルゴリズム、並べ替えの順序、並べ替えの実行時間は大きく異なります。テストデータのサイズが小さい場合、テスト結果はアルゴリズムのパフォーマンスを正確に反映できません。たとえば、小規模なデータソートの場合、挿入ソートはクイックソートよりも高速な場合があります。

2.ビッグ0の複雑さの表記

アルゴリズムの実行効率は、通常、アルゴリズムコードの実行にかかる時間です。では、コードの実行時間を取得するにはどうすればよいですか?最初にコードをリストすることは、コードの各行の実行に同じ時間がかかることを前提としています。

int calc(int n)
{
  int sum=0;//执行一个time
  int i=1;//执行一个time
  int j=1;//执行一个time
  //循环了n遍 所以是2n*time
  //从此整个时间T(n) = (2n2+2n+3)*time 
  for(;i<=n;++i)
  {
      j=1;
      for(;j<=n;j++)
      {
         sum=sum+i*j
      }
  }
}
复制代码

ここから浮かび上がる重要なルールは、すべてのコードの実行時間T(n)とコードの各行の実行は、この時間Tn = O(f(n))でnに比例するということです。T(n)= 2n 2 + 2n + 3が上に表示されているので、最大の大きさを記録するだけで済みます。たとえば、T(n)= O(n 2)。

3.時間計算量分析の3つの方法

  1. 変化する傾向を表す、ループが最も多いBigO表記のコードにのみ焦点を当てます。最大次数の大きさだけを気にする必要があります。たとえば、次のコード
int calc(int n)
{
    int sum=0;
    int i=0;
    for(;i<=n;++i)
    {
       sum=sum+i;
    }
    return sum;
}
复制代码

    ここでコードの一部を直接確認してください。これらの2行のコードはn回実行されるため、合計時間計算量はO(n)です。

  1. 加算ルールの全体的な複雑さは、最大の大きさのコードに等しくなります
int calc(int n)
{
  int sum=0;//执行一个time
  int i=1;//执行一个time
  int j=1;//执行一个time

  int p = 0;
  for(int p=0;p<n;p++)
  {
      sum=sum+p;
  }
  sum=0;
  //循环了n遍 所以是2n*time
  //从此整个时间T(n) = (2n2+2n+3)*time 
  for(;i<=n;++i)
  {
      j=1;
      for(;j<=n;j++)
      {
         sum=sum+i*j
      }
  }
}
复制代码

    このコードの最初のループpは、n回ループします。このnが100、1000などであるかどうかに関係なく、本番レベルの時間です。同様に、2番目の2番目のループコードはO(n 2)であるため、最終結果はO(n 2)になります。

  1. 確率の法定ネストされたコードの複雑さは、ネストの内側と外側のコードの複雑さの積に等しくなります。T1(n)= O(n)、T2(n)= O(n)、T(n)と仮定します。 = T1(n)* T2(n)= O(n 2

4つの一般的な時間計算量分析

  1. 一般的な複雑さは何ですかbg
  2. 0(1)
int i=2;
int j=3;
int sum=i+j;
复制代码

一般に、コードの実行時間がnとともに増加しない場合、それはO(1)です。秘訣は、プログラムにループや再帰などがないことです。

  1. O(logn)和O(nlogn)
int i=1;
while(i<=n)
{
   i=i*2;
}
复制代码

ここで、iは1から始まり、iがn未満になって終了するまで、毎回2を掛けます。つまり、2 0、2 1 ..... 2 x、次に2 x = n、x = log2nです。このとき、i = i * 4、つまりx = log 4 nの場合、log4nは実際にはlog42 * log 2 nに等しいので、O(log 4 n)= O(C * log 2 n)とは何ですか。C定数については前に説明しましたが、無視してかまいません。したがって、O(log4n)= O(log2n)。対数時間計算量の表現では、対数時間計算量を無視します。

4 O(m + n)およびO(m * n)

int cal(int m, int n)
{
  int sum_1 = 0; 
  int i = 1; 
  for (; i < m; ++i)
  {    
    sum_1 = sum_1 + i; 
  } 
 int sum_2 = 0; 
 int j = 1;
 for (; j < n; ++j)
 { 
    sum_2 = sum_2 + j; 
 }  
return sum_1 + sum_2; } 
}
复制代码

ここでのmとnの大きさは、予測するには大きすぎます

5.インタビューにおける一般的なアルゴリズムの複雑さ

  1. 関連する並べ替えbg
  2. 二分木関連bg

6つのまとめ

  1. 複雑さの分析を学ぶことは、より良いコードを書くのに役立ちます。
  2. 複雑さの分析の主なポイント(1)1つのコードが高頻度を調べます。たとえば、ループ(2)を見て、最大のマルチセグメントコードを取得します。たとえば、シングルレベルループとマルチレベルループの両方があります。製品を見つけるには、高レベル(3)のネストされたコードを使用します。再帰など
  3. 一般的な複雑さ(1)多項式次数O(1)定数次数O(logn)対数次数O(n)線形次数O(n 2)二乗次数(2)非多項式指数階乗次数

おすすめ

転載: juejin.im/post/7080286956076154911