渐进时间复杂度
時間復雜度
1.概念
? ? ?漸進時間復雜度(時間復雜度)是算法效率的度量。在一般情況下,算法基本操作重復執行的次數用T(n)表示。同時用一個輔助函數f(n),T(n)/f(n)!=0,那么f(n)是T(n)的同數量級函數,T(n)=O(f(n)),這就稱為漸進時間復雜度。
2.大(O)表示法
? ? ?T(n)=O(f(n))稱為大(O)表示法。算法的復雜度可以從最優、最壞、平均三個角度來評估,一般以最壞角度來進行時間復雜度的評估。大(O)表示法的時間復雜度的函數階一般有以下幾種情況,分別是O(1),O(n),O(nx),O(log2n),O(nlog2n)等等。并且如果函數階里同時出現多種函數組合,則以階數最大的函數作為時間復雜度。并且如果函數系數非1,則化為1。
3.時間復雜度實例
3.1 常數階?
int sum=0,n=10;//執行1次 sum+=n*(n+1);//執行1次 sum++;//執行1次 cout<<sum;//執行1次? ? ? ?此段代碼執行4次,執行次數與n并無關系,所以根據大(O)表示法推導,我們應該將4改為1,即結果都應該為O(1)。
3.2 線性階
int sum=0; for(int i=0;i<n;i++){sum++;cout<<sum; }? ? ? ? 此段代碼是單層循環,運行了n次,所以時間負責度是O(n)。
3.3 對數階
int num=1; while(num<n){num*=2; }? ? ? ? num初始值為1,不斷自乘2逼近n,設循環次數為x,由數學公式2x=n,x=log2n次。
3.4 平方階
int n=10; for(int i=0;i<n;i++)for(int j=10;j>i;j--){} }? ? ? ?由上述線性階的時間復雜度說明容易得知在外層循環中,時間復雜度為O(n),再經過內層循環,兩個O(n*n)的結果為O(n2),冪次階同理。
3.4 階乘階
int fac(int n){cout<<n*fac(n-1);
}
? ? ? ? 以上代碼是一個階乘函數,顧名思義,為O(n!)。
4.復雜度圖表比較
n | l? ogn | nlogn | n2 | 2? | n! | |
| 5 | 2 | 10 | 25 | 32 | 120 | |
| 10 | 3 | 30 | 100 | 1024 | ||
| 50 | 5 | 250 | 2500 | 約10^15 |
| |
| 100 | 6 | 600 | 10000 | 約10^30 | 約9.3*10^157 | |
| 1000 | 9 | 9000 | 1000 000 | 約1 | 約4.0*10^2567 |
常用的時間復雜度按照耗費的時間從小到大依次是:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2?)<O(n!)
參考來源:
1.數據結構
2.大話數據結構
| 約3.0*10^64 |
總結
- 上一篇: Android权限管理及动态申请权限
- 下一篇: 计算机考研复试——离散数学知识点