時間的頻度と時間の複雑さ&空間の複雑さ
計算アルゴリズムの実行時間
- 時間的頻度:アルゴリズムによって費やされる時間は、アルゴリズム内の文の実行数に比例します。アルゴリズム内の文の実行数は、文頻度または時間頻度と呼ばれます。時間頻度は、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)nが増加すると、2n + 20と2nの実行時間間隔は無限に近いため、20は無視できます。
(2)nが増加すると、実行時間間隔は無限に近くなるため、10は無視できます。
- 下位用語
(1)2n 2 + 3n +10と2n2は、nが大きくなると無限に近づくため、3n + 10は無視できます。
(2)n 2 + 5n +20とn2は、nが大きくなると大きくなります。実行時間間隔は無限に近く、5n +20は無視できます
- 係数
(1)nが大きくなると、5n ^ 2 + 7nと3n ^ 2 + 2nの実行時間間隔は無限に近くなり、この時点では5と3は無視できます。
(2)ただし、n ^ 3 + 5nと6n ^ 3 + 4n実行時間間隔が分離され、いくつのパワーを見つけることができるかが重要です
時間の複雑さ
- アルゴリズムの実行速度は、主に時間の複雑さに依存します
- 一般に、アルゴリズムの基本操作ステートメントの繰り返し実行の数は、補助関数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つの一般的な時間の複雑さ:
- 一定次数O(1)
- 対数次数O(log2n)
- 線形次数O(n)
- 線形対数次数O(nlog2n)
- 二乗次数O(n ^ 2)
- キュービックオーダーO(n ^ 3)
- k次O(n ^ k)
- 指数次数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が大きくなると、一部のアルゴリズムはより多くのストレージスペースを占有します。
* 目前趋势上, 算法主要关注的是时间复杂度. 还有市面上的 如 缓存系统, 基数排序算法等也都是空间换了时间, 提升了程序的执行速度
役に立ったら気に入ってください〜ありがとうございます!!