算法的复杂度
目錄
- 算法的復雜度
- 一、算法時間復雜度
- 二、算法的空間復雜度
算法的復雜度
算法的復雜度分為:空間復雜度和時間復雜度。
我們研究算法的復雜度,側重的是研究算法隨著輸入規模擴大增長量的一個抽象,而不是精確地定位需要執行多少次。因為如果那樣的話,我們還要考慮編譯器的優化問題等等一些其他的問題。
我們在計算算法的復雜度時不用關心編寫程序所用的語言時什么,也不用關心這些程序將跑在什么樣的計算機上,我們只關心它所實現的算法。不計那些循環索引的遞增和循環終止條件、變量聲明、打印結果等操作。
最終,在分析程序的運行時間時,最重要的是把程序看成是獨立于程序設計語言的算法或一系列步驟。
我們在分析一個算法的運行時間時,重要的是把基本操作的數量和輸入模式關聯起來。
一、算法時間復雜度
定義:在進行算法分析時,語句總的執行次數T(n)是關于問題規模n的函數,進而分析T(n)隨n的變化情況并確定T(n)的數量級。算法的時間復雜度,也就是算法的時間量度。記作:T(n)=O(f(n))。它表示隨著問題規模n的擴大,算法執行時間的增長率和f(n)的增長率相同,稱作算法的漸進時間復雜度,簡稱為時間復雜度。其中f(n)是問題規模n的函數。
一般情況下,隨著輸入規模n的增加,T(n)增長最慢的算法為最優算法。
如何分析一個算法的時間復雜度呢?
用常數1取代運行時間中的所有的加法。
在修改后的運行次數函數中,只保留最高階項。
如果最高階項存在且不是1,則除去與這個項相乘的常數。
得到的最后結果就是時間復雜度。
例:
上面程序的時間復雜度按理說應為O(n^2+n),但其實不是這樣的。按照上面的概念可知時間復雜度為O(n ^2)這是因為當n特別大的時候O(n)對原來時間復雜度的增加效果不明顯,就可以忽略了。
由上圖可知:常用的時間復雜度所耗費的時間從小到大依次為:O(1)<O(logn)<O(n)<O(nlogn)<O(n ^2 )<
(n ^ 3)<O(2^n)<O(n!)<O(n ^n)
二、算法的空間復雜度
算法的空間復雜度通過計算算法所需的存儲空間實現,算法的空間復雜度的計算公式記作:S(n)=O(f(n)),其中,n為問題的規模,f(n)為語句關于n所占存儲空間的函數。
通常,我們都是用 “ 時間復雜度 ” 來指運行時間的需求,用 “ 空間復雜度 ” 來指空間需求。當題目中要讓我們求 “ 復雜度 ” 時,通常指的是時間復雜度。
總結
- 上一篇: C语言sprintf 和 sscanf函
- 下一篇: 线性表简介