コンテンツ
この章の目的
1.時間計算量と空間計算量とは何ですか。
2.なぜ時間計算量と空間計算量があるのですか。
3.時間と空間の複雑さを計算する方法。
4.一般的な複雑さの計算演習
時間と空間の複雑さを理解する
時間計算量:アルゴリズムの実行速度の尺度。
スペースの複雑さ:プログラムの実行によって一時的に占有されているストレージスペースの量を測定するインジケーター。
なぜ時間計算量と空間計算量があるのですか?
時間計算量と空間計算量は、アルゴリズムの長所と短所を測定するのに役立ちます。環境が異なれば、時間効率と空間効率の要件も異なります。したがって、時間計算量と空間計算量は、プログラマーがプログラムに沿って設計するように導くことができます。環境コード。
計算時間の複雑さ
時間計算量の計算では、アルゴリズムの正確な実行時間を計算する必要はありません。実行時間は実行回数に比例するため、時間計算量の計算にはアルゴリズムの実行回数を使用します。
さらに、一部のアルゴリズムの時間計算量には、最良、平均、および最悪のケースがあり、最悪のケースを時間計算量と見なします。
注:最悪の場合は、アルゴリズムの実行の最大数を表し、通常は条件付きの判断ステートメントを使用します。
理由を説明してください:平均的なケース=(最悪のケース+最良のケース)/2=最悪のケース/2+最良のケース/2
Big Oの漸近表記によると、平均的なケースは最悪のケースに等しくなります。(制限を取るのと同様)
計算空間の複雑さ
スペースの複雑さの計算は、アプリケーション変数の数に基づいています。
計算演習
1.1一般的な時間計算量の計算例
例1
void Func2(int N)
{
int count = 0;
for (int k = 0; k < 2 * N ; ++ k)
{
++count;
}
int M = 10;
while (M--)
{
++count;
}
printf("%d\n", count);
}
例2
void Func3(int N, int M)
{
int count = 0;
for (int k = 0; k < M; ++ k)
{
++count;
}
for (int k = 0; k < N ; ++ k)
{
++count;
}
printf("%d\n", count);
}
例3
// 计算BinarySearch的时间复杂度?
int BinarySearch(int* a, int n, int x)
{
assert(a);
int begin = 0;
int end = n;
while (begin < end)
{
int mid = begin + ((end-begin)>>1);
if (a[mid] < x)
begin = mid+1;
else if (a[mid] > x)
end = mid;
else
return mid;
}
return -1;
}
例4
// 计算阶乘递归Factorial的时间复杂度?
long long Factorial(size_t N)
{
return N < 2 ? N : Factorial(N-1)*N;
}
例5
// 计算BubbleSort的时间复杂度?
void BubbleSort(int* a, int n)
{
assert(a);
for (size_t end = n; end > 0; --end)
{
int exchange = 0;
for (size_t i = 1; i < end; ++i)
{
if (a[i-1] > a[i])
{
Swap(&a[i-1], &a[i]);
exchange = 1;
}
}
if (exchange == 0)
break;
}
}
回答と分析の例
1.例1の基本操作は2N+10回実行されます。ビッグオーオーダー法を導出することにより、時間計算量はO(N)であることがわかります。
2.例2の基本操作はM+N回実行され、2つの未知数MとNがあり、時間計算量はO(N + M)
3です。例3の基本操作は1回実行するのが最適で、最悪です。はO(logN)倍、時間計算量はO(logN)psです。アルゴリズム分析のlogNは
、底が2で、対数がNであることを意味します。いくつかの場所では、lgNと表記されます。
4.例4では、計算と分析により、基本操作がN回繰り返され、時間計算量はO(N)であることがわかります。
5.例5の基本操作は、N回実行するのが最適で、最悪の実行(N *(N + 1)/ 2回)です。大きなO次法を導出することにより、時間計算量は
一般に最悪と見なされ、時間計算量はO(N ^ 2)です
1.2共通空間の複雑さの計算
例1
// 计算BubbleSort的空间复杂度?
void BubbleSort(int* a, int n)
{
assert(a);
for (size_t end = n; end > 0; --end)
{
int exchange = 0;
for (size_t i = 1; i < end; ++i)
{
if (a[i-1] > a[i])
{
Swap(&a[i-1], &a[i]);
exchange = 1;
}
}
if (exchange == 0)
break;
}
}
例2
// 计算Fibonacci的空间复杂度?
long long* Fibonacci(size_t n)
{
if(n==0)
return NULL;
long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));
fibArray[0] = 0;
fibArray[1] = 1;
for (int i = 2; i <= n ; ++i)
{
fibArray[i ] = fibArray[ i - 1] + fibArray [i - 2];
}
return fibArray ;
}
例3
// 计算阶乘递归Factorial的空间复杂度?
long long Factorial(size_t N)
{
return N < 2 ? N : Factorial(N-1)*N;
}
回答と分析の例:
1。例1は一定量の余分なスペースを使用するため、スペースの複雑さはO(1)です
。2。例2は動的にN個のスペースを開き、スペースの複雑さはO(N)
3です。例3は再帰的にN回呼び出すと、N個のスタックフレームが開かれ、各スタックフレームは一定量のスペースを使用します。スペースの複雑さはO(N)です