NOIP-C++大神培養計劃 實戰篇——時間複雜度

時間複雜度是同一問題可用不同算法解決,而一個算法的質量優劣將影響到算法乃至程序的效率。算法分析的目的在於選擇合適算法和改進算法。

計算機科學中,算法的時間複雜度是一個函數,它定性描述了該算法的運行時間。這是一個關於代表算法輸入值的字符串的長度的函數。時間複雜度常用大O符號表述,不包括這個函數的低階項和首項係數。使用這種方式時,時間複雜度可被稱爲是漸近的,它考察當輸入值大小趨近無窮時的情況。

以上詞條來自百度百科QAQ

我們在上一課中說到了O(n),O(n^2)的算法,是什麼意思呢?
在一臺一般計算機中,一秒鐘可以計算2.5*10^7次,O(…)就表示算法要計算的總數。

比如說O(n),這裏的n是數據的最大值。假設1<=n<=10^6,那麼O(n)就是10^6。在我們考試時,題目總數中會說,時限1s,這就是告訴你,時間複雜度O(…)不能超過2.5*10^7。

for(int i=1;i<=n;i++)
O(n)算法,有m層循環,複雜度就是O(n^m)。

還有一種很常見的複雜度:O(log n)。
log是自然對數,這裏與數學上有所不同,log的底數默認爲2,log(1024)就是10。

我們在看到一道題目的數據範圍時,就應該想到算法的複雜度。一般來說,爲了增加難度,題目會將數據範圍出到最大,於是,我們來終結一下規律:
數據範圍-----------算法
10^0~10^2 額,啥都行吧,一般沒有這麼水的數據
10^3 O(n^2 log n)
10^4 O(n log2 n)
10^5~10^7 O(n)或O(n log n)

既然我們知道了時間複雜度,我們就要重視它,以後的每一道題我都會給大家介紹它的算法複雜度,讓大家建立起時間複雜度的思維,對做題有很大的幫助。
推薦一個大佬博客https://blog.csdn.net/qq_41523096/article/details/82142747
可惜是Java語言的,我來把它翻譯成C++

場景1:T(n) = 3n,執行次數是線性的。

void eat1(int n)
{
    for(int i=0; i<n; i++)
    {
        cout<<"等待一天"<<endl;
        cout<<"等待一天"<<endl;
        cout<<"吃一寸麪包"<<endl;
    }
}

場景2:T(n) = 5logn,執行次數是對數的。

void eat2(int n)
{
   for(int i=1; i<n; i*=2)
   {
       cout<<"等待一天"<<endl;
       cout<<"等待一天"<<endl;
       cout<<"等待一天"<<endl;
       cout<<"等待一天"<<endl;
       cout<<"吃一半面包"<<endl;
   }
}

場景3:T(n) = 2,執行次數是常量的。

void eat3(int n)
{
   cout<<"等待一天"<<endl;
   cout<<"吃一個雞腿"<<endl;
}

場景4:T(n) = 0.5n^2 + 0.5n,執行次數是一個多項式。

void eat4(int n)
{
   for(int i=0; i<n; i++)
   {
       for(int j=0; j<i; j++)
       {
           cout<<"等待一天"<<endl;
       }
       cout<<"吃一寸麪包"<<endl;
   }
}

今天的實戰篇就到這裏結束了,我們下節課將講到排序算法,我們明天見!

如果大家有問題或者想和我討論,我很樂意爲您解答

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章