アルゴリズム-時間周波数と時間の複雑さと空間の複雑さ

計算アルゴリズムの実行時間

  • 時間的頻度:アルゴリズムによって費やされる時間は、アルゴリズム内の文の実行数に比例します。アルゴリズム内の文の実行数は、文頻度または時間頻度と呼ばれます。時間頻度は、T(n)で表されます。
  • 2つのアルゴリズムによって計算された、1から100までのすべての数値の合計を計算します。

int total = 0;
int end = 100;

# 使用 for循环计算
for (i = 1; i <= end; i++) {
 total += i;
}
- 以上算法的时间频度是 T(n)=n+1

# 不通过循环, 而直接计算
total = (1 + end) * end / 2;
- 以上算法的时间频度是 T(n)=1

  • nが大きくなると、次の3つの特性があります(無視できる3つの項目)。
  1. 一定期間

(1)nが増加すると、2n + 20と2nの実行時間間隔は無限に近いため、20は無視できます。
(2)nが増加すると、実行時間間隔は無限に近くなるため、10は無視できます。

  1. 下位用語

(1)2n 2 + 3n +10と2n2は、nが大きくなると無限に近づくため、3n + 10は無視できます。
(2)n 2 + 5n +20とn2は、nが大きくなると大きくなります。実行時間間隔は無限に近く、5n +20は無視できます

  1. 係数

(1)nが大きくなると、5n ^ 2 + 7nと3n ^ 2 + 2nの実行時間間隔は無限に近くなり、この時点では5と3は無視できます。
(2)ただし、n ^ 3 + 5nと6n ^ 3 + 4n実行時間間隔が分離され、いくつのパワーを見つけることができるかが重要です

時間の複雑さ

  • アルゴリズムの実行速度は、主に時間の複雑さに依存します
  1. 一般に、アルゴリズムの基本操作ステートメントの繰り返し実行の数は、補助関数f(n)がある場合、T(n)で表される問題スケールnの関数であるため、nが無限大に近づくと、 T(n)/ f(n)の限界値はゼロに等しくない定数であり、f(n)はT(n)と同じオーダーの大きさの関数です。T(n)= O(f(n))、Oとして示されます。 (f(n))は、アルゴリズムの漸進的な時間の複雑さであり、時間の複雑さと呼ばれます
  • 例:T(n)= n2 + 7n + 6およびT(n)= 3n2 + 2n + 2、それらのT(n)は異なりますが、時間の複雑さは同じです。どちらもO(n2)です。
  • 計算方法:
    (1)実行時間内のすべての加法定数を定数1に置き換えますT(n)= n2 + 7n + 6→T(n)= n2 + 7n + 1
    (2)変更された実行周波数関数では、最上位項を維持するT(n)= n2 + 7n + 1→T(n)= n2
    (3)最上位項の係数を削除するT(n)= n2→T(n)= n2→O(n2)
  • 小さいものから大きいものまで、8つの一般的な時間の複雑さ:
  1. 一定次数O(1)
  2. 対数次数O(log2n)
  3. 線形次数O(n)
  4. 線形対数次数O(nlog2n)
  5. 二乗次数O(n ^ 2)
  6. キュービックオーダーO(n ^ 3)
  7. k次O(n ^ k)
  8. 指数次数O(2 ^ n)
  • nの連続的な増加に伴い、上記の時間の複雑さは増加し続け、アルゴリズムの実行効率はますます低くなります。

一定次数O(1)

  • コードの行数に関係なく、ループなどの複雑な構造がある限り、このコードの時間の複雑さはO(1)です。

int a = 1;
int b = 2;
++a;
b++;
int c = a + b;

  • 上記のコードを実行すると、特定の変数の増加に伴って消費時間が増加しないため、このタイプのコードの行数に関係なく、O(1)を使用して時間の複雑さを表すことができます。

対数次数O(log2n)


int a = 1;
while (a < n) {
   a = a * 2;
}

  • 上記のコードのwhileは、ループするたびにaを2倍し、その結果をaに割り当てます。したがって、nのサイズにますます近づきます。ループがx回行われた後、aがn以上であるとすると、ループはこの時点で終了します。 2のx乗はn(x = log2n)に等しくなります。つまり、log2n回ループした後にループが終了します。
  • O(log2n)では、2が底辺、nが真の数であり、底辺を変更できます。2を3 a = a * 3に変更すると、O(log3n)としてマークできます。

線形次数O(n)


for (int i = 1; i <= n; ++i) {
   i++;
}

  • 上記のコードのforループ内のコードはn回実行されるため、消費する時間はnの変化に応じて変化するため、このタイプのコードはO(n)で表すことができます。

線形対数次数O(nlog2n)

  • 線形対数次数O(nlogN)は、O(logn)の時間の複雑さでコードをN回ループするアルゴリズムです。つまり、線形次数と対数次数のネストされたn * O(logN)です。

for (int m =1; m < n; m++) {
   i = 1;
   while (i < n) {
        i = i * 2;
   }
}

二乗次数O(n2)

  • 二乗次数は、2レベルのnサイクル、つまり2レベルの線形次数、つまりO(n²)でネストされます。いずれかのサイクルのnをmに変更すると、その時間の複雑さはO(mn)になります。

int m = 1;
for (int i = 1; i <= n; i++) {
   for(int j =1; j <= n;  j++) {
      m++;
   }
}

キュービックオーダーO(n ^ 3)

  • 3次順序は、3レベルのnループでネストされます

k次O(n ^ k)

  • k次はnサイクルのネストされたkレベルです

指数次数O(2 ^ n)


public int abc(int n) {
    if (n <= 1) {
        return 1;
    } else {
        return abc(n - 1) + abc(n - 2);
    }
}

  • T(n)= T(n-1)+ T(n-2)+1、ここで1を追加すると1回の実行を意味します
  • T(n)= T(n-1)+ T(n-2)はFibonacciシーケンス(Fibonacciシーケンス、ゴールデンセクションシーケンス)であり、Mathematical Induction(MI)によって証明できます。マークを付けることができます。 O((5/3)^ n)、O(2 ^ n)に簡略化

スペースの複雑さ

  • スペースの複雑さは、アルゴリズムが操作中に一時的に占有するストレージスペースの量の尺度です。クイックソート、マージソートなど、nが大きくなると、一部のアルゴリズムはより多くのストレージスペースを占有します。
    * 目前趋势上, 算法主要关注的是时间复杂度. 还有市面上的 如 缓存系统, 基数排序算法等也都是空间换了时间, 提升了程序的执行速度

役に立ったら気に入ってください〜ありがとうございます!!

おすすめ

転載: blog.csdn.net/qcl108/article/details/109103957