空間複雑さの計算は超完璧です! !(複雑さの計算を切り離す

 上記の続き: アルゴリズムの効率と時間計算量(8 メッセージ) 時間計算量の計算は非常に完全です。(データ構造とアルゴリズムの最初のステップ_vpurple__ のブログ - CSDN ブログ


目次

0. 序文

1. 空間の複雑さ

1.1 ビッグ O の漸近表現

1.2 計算空間の複雑さの例をいくつか挙げる

1.2.1 バブルソートの空間複雑度の計算

1.2.1 階乗再帰の時間計算量を計算する

 1.2.3 配列と変数を使用して実装されたフィボナッチ数列の空間計算量を計算する

 1.2.4 再帰を使用して実装されたフィボナッチ数の空間計算量の計算

2. 一般的な複雑さの比較



0. 序文

それに比べて、現在の機器の記憶スペースは比較的大きいため、現在のアルゴリズムではスペースの複雑さにはあまり注意が払われません。

1GB=1024*1024*1024バイト   

1GBは約10億バイトです

1MBは約100万バイトです

1GB=1024MB 1MB=1024KB 1KB=1024バイト


1. 空間の複雑さ

スペースの複雑さは数式でもあり、演算中にアルゴリズムによって一時的に占有される記憶域のサイズ、つまり占有される追加のスペースのサイズの尺度です。

空間複雑度はプログラムが占めるバイト数ではありません。これはあまり意味がないため、空間複雑度は変数の数によって計算されます。

空間計算量の計算ルールは基本的に実際の計算量と同様であり、ビッグ O の漸近表記も使用されます。

注:実行時に関数に必要なスタック スペース (ストレージ パラメーター、ローカル変数、一部のレジスタ情報など) はコンパイル中に決定されるため、スペースの複雑さは主に、実行時に関数によって明示的に要求される追加スペースによって決まります。


1.1 ビッグ O の漸近表現

Big O 記法 (Big O 記法): 関数の漸近的な動作を記述するために使用される数学的記法です。

O() の括弧内の数字は、アルゴリズムの規模をより表しています。Big O は推定値であり、正確な実行数ではありません。

ビッグ O オーダー メソッドを導出します。

1. 実行時のすべての加法定数を定数 1 に置き換えます。

2. 修正された実行時間関数では、最上位の項のみが保持されます。

3. 最上位項目の係数が存在し、1 でない場合は、この項目に乗じた定数を取り除きます。結果はビッグオーオーダー。


1.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;
    }
}

バブルソートの空間計算量は次のとおりです: O(1)

以下のように分析します。

1.2.1 階乗再帰の時間計算量を計算する

// 计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{
 if(N == 0)
 return 1;
 
 return Fac(N-1)*N;
}

 階乗再帰の時間計算量: O(N)。

以下のように分析します。

 1.2.3 配列と変数を使用して実装されたフィボナッチ数列の空間計算量を計算する

// 计算Fibonacci的空间复杂度?
// 返回斐波那契数列的前n项
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;
}

配列を使用してフィボナッチ数列を実装する場合の空間複雑さ: O(N)。

3 つの変数を使用してフィボナッチ数列を前後に計算する場合の空間複雑さは、O(N) です。

 1.2.4 再帰を使用して実装されたフィボナッチ数の空間計算量の計算

// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{
 if(N < 3)
 return 1;
 
 return Fib(N-1) + Fib(N-2);
}

再帰で実装されたフィボナッチ数の空間計算量: O(N)。

まず、main 関数で 2 つの関数が繰り返し呼び出されるときに、関数が占めるスペースを計算します。

 

 

スペースは再利用できます。

スペースをオペレーティング システムに返し、破壊するのではなく解放しますが、使用する権利をオペレーティング システムに与えます。

空間複雑度は基本的に O(1) または O(N) であり、他の空間複雑度は一般的ではありません。N*N 配列が開かれていると仮定すると、その空間複雑さは O(N^2) です。この構造では、構造の数については説明せず、全体についてのみ説明します。詳細を見るのではなく、規模だけを見てください。


2. 一般的な複雑さの比較

一般的なアルゴリズムの一般的な複雑さは次のとおりです。

テーブルが低いほど複雑さが高くなります

5201314

○(1)

一定の順序
3log(2)n+4 O(log(2)n) 対数次数
3n+4 の上) 線形秩序
2n+3nlog(2)n+14 O(nlog(2)n) ログイン注文
3n^2+4n+5 O(n^2) 平方オーダー
4n^3+3n^2+4n+5 O(n^3) 立方次数
2^n O(2^n) 指数関数的順序

伝説は次のとおりです (写真は百度から引用):

 

注: log_2N logN に相当します。


こんにちは!Yuanzai です。空間の複雑さに関するこの要約が役に立てば幸いです。私のコラム「データ構造への上級道 - ハードワーク編」をフォローしてください。このコラムでは、データ構造関連のコンテンツも同期的に更新されます。また、もっとコミュニケーションをとって、一緒に進歩していけたらと思っています。幸せな一日をお祈りします^-^、Yuanzaiは次の記事に行きます~~

 

おすすめ

転載: blog.csdn.net/vpurple_/article/details/126018218