時間計算量と空間計算量を計算するにはどうすればよいですか?

導出アルゴリズム:Big O導出法

1、用常数1取代运行时间中的所有加法常数
2、在修改后的运行次数函数中,只保留最高阶项 
3、如果最高阶项存在且不是1,那么我们就去除于这个项相乘的常数。

時間の複雑さ

意味

アルゴリズムを分析する場合、ステートメントの合計実行時間 T(n) は問題サイズ n の関数であり、n による T(n) の変化を分析して T(n) の大きさを決定します。アルゴリズムの時間計算量、つまりアルゴリズムの時間測定値は、T(n}=0(f(n)) として記録されます。これは、問題サイズ n が増加すると、アルゴリズムの実行時間が増加することを意味します。の増加と f(n ) の増加率が同じであることを、アルゴリズムの漸近時間計算量、または略して時間計算量と呼びますが、このうち f(n) は問題仕様 n のある関数です。

一定の順序

void main()
{
    
    
    func();
}
void func()
{
    
    
    int i=0;//执行1次
    i++;//执行1次
    i++;//执行1次
    i++;//执行1次
}
/*
共执行了4次,所以时间复杂度为O(4);根据大O推导法,略去常数,所以此函数的时间复杂度为O(1);
*/
//假如func变成如下结构
void func()
{
    
    
    int i=0;//执行1次
    i++;//执行1次
    i++;//执行1次
    i++;//执行1次
    i++;//执行1次
    i++;//执行1次 
    i++;//执行1次
    i++;//执行1次 
    i++;//执行1次 
    i++;//执行1次 
    i++;//执行1次 
    i++;//执行1次 
    i++;//执行1次
}
/*
共执行了13次,时间复杂度为O(13);根据大O推导法,略去常数,所以此函数的时间复杂度仍然为O(1);
*/

線形秩序

void main()
{
    
    
   for(int i=0;i<n;i++)
    {
    
    
        func();
    }
}
void func()//时间复杂度为O(1)的函数
{
    
    
   printf("大O推导法");//执行1次
}
/*
在main中,func共被执行了n次,所以main的时间复杂度为O(n);
*/
//加入main函数被修改成如下
void main()
{
    
    
   for(int i=0;i<n;i++)
    {
    
    
        func();
        func();
    }
}
/*
在main中,func共被执行了2n次,main的时间复杂度为O(2n);根据大O推导法,略去常数系数,所以main的时间复杂度仍为为O(n);
*/

対数次数

void main()
{
    
    
   for(int i=1;i<n;i++)
    {
    
    
        func();
        i=2i;
    }
}
void func()//时间复杂度为O(1)的函数
{
    
    
   printf("大O推导法");//执行1次
}
/*
在main中,
因为i每次被乘2,所以,执行的算法为 2的几次相乘 大于 n,即 2^x>n,--> x= log2n  ,  在推导对数时间复杂度时,一般都是以10作为对数的底数。 func共被执行了logn次,所以main的时间复杂度为O(logn);
*/

平方オーダー

void main()
{
    
    
   for(int i=1;i<n;i++)
    {
    
    
       for(int j=1;j<n;j++)
        {
    
    
            func();
        }
    }
}
void func()//时间复杂度为O(1)的函数
{
    
    
   printf("大O推导法");//执行1次
}
/*
在main中, func()共被执行了n^2,所以main的时间复杂度为O(n^2);
*/
//假如main被修改成 如下
void main()
{
    
    
   for(int i=1;i<n;i++)
    {
    
    
       for(int j=i;j<n;j++)
        {
    
    
            func();
        }
    }
}
/*
那么, func() 执行的次数为 n+n-1+n-2+……--> n(n+1)/2  =  n2/2 + n/2   根据大O推导方法,保留最高阶项,n2/2 ,然后去掉这个项相乘的常数,1/2, 所以main的时间复杂度为O(n2)
*/

まとめ

ここに画像の説明を挿入
時間計算量に費やされる時間は次のとおりです:
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) <O(2n) < O(n!) < O (ん)

参考 https://www.cnblogs.com/fanchangfa/p/3868696.html

空間の複雑さ

意味

Baidu Encyclopedia: スペースの複雑さ (Space Complexity) は、動作中にアルゴリズムが一時的に占有するストレージ スペースのサイズの尺度であり、S(n)=O(f(n)) として記録されます。たとえば、直接挿入ソートの時間計算量は O(n^2)、空間計算量は O(1) です。一般的な再帰的アルゴリズムは、再帰ごとに戻り情報を保存する必要があるため、空間計算量は O(n) になります。アルゴリズムの長所と短所は、主に、アルゴリズムの実行時間とアルゴリズムが占有する必要があるストレージ容量の 2 つの側面から測定されます。
このアルゴリズムは時間計算量と似ていますが、計算が実行回数ではなく、実行中に一時変数が使用された回数である点が異なります。

参考 https://www.cnblogs.com/irenebbkiss/p/4243715.html

おすすめ

転載: blog.csdn.net/tianxiaojie_blog/article/details/86607748