時間と空間の複雑さの計算

コンテンツ

この章の目的

時間と空間の複雑さを理解する

計算時間の複雑さ

計算空間の複雑さ

計算演習

        1.1一般的な時間計算量の計算例

例1

例2

例3

例4

例5

1.2コモンスペースの複雑さの計算

例1

例2

例3


この章の目的

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)です

 

おすすめ

転載: blog.csdn.net/m0_62171658/article/details/123228832