把**跑一遍,通過統計,監控得到演算法執行時間和占用記憶體大小的方法叫做事後統計法,這種方法有以下侷限性
測試結果非常依賴測試環境
同一段**拿到不同機子上測試會有不同的結果
測試結果受資料規模的影響很大
掌握複雜度分析,將能編寫出效能更優的**,有利於降低系統開發和維護成本。
綜上,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。所以就有了時間,空間複雜度分析方法
大o複雜度表示法
時間複雜度(表示執行的快慢):
大o時間複雜度實際上並不具體表示真正的執行時間,而是表示**執行時間隨資料規模增長的變化趨勢,也叫做漸進時間複雜度
t(n)=o(f(n))**的執行時間跟每行**執行次數的總和成正比
t(n)表示**執行的時間,n表示資料規模的大小,f(n)表示每行**執行的次數總和,因為這是乙個公式,所以用f(n)來表示。公式中的o表示**的執行時間t(n)與f(n)表示式成正比。
當n很大時,你可以把它想象成10000,100000。大o這種複雜度表示方法只是表示一種變化趨勢,而公式中的低價,常量,係數三部分並不左右增長趨勢,所以都可以忽略。
分析法則:
只關注迴圈執行次數最多的一段**
加法法則:總複雜度等於量級最大的那段**的複雜度
注意:只要是常量級的執行時間,不管這個常量是10000,100000 都可以忽略掉,時間複雜度表示的是乙個演算法的執行效率與資料規模增長的變化趨勢,常量可以忽略掉的原因是它對增長趨勢並沒有影響
t1(n)=o(f(n)), t2(n)=o(g(n)),那麼t(n)=t1(n)+t2(n)=max(o(f(n)),o(g(n)))=o(max(f(n),g(n))).
乘法法則:巢狀**的複雜度等於巢狀內外**複雜度的乘積,我們可以把乘法法則看成是巢狀迴圈
t1(n)=o(f(n)), t2(n)=o(g(n)),那麼t(n)=t1(n)*t2(n)=o(f(n))*o(g(n)) =o(f(n)*g(n)).
4.多個規模求加法:比如方法有兩個引數控制兩個迴圈的次數,那麼這時就取二者複雜度相加
當資料規模無法評估哪個量級較大時,加法法則失效,可以使用o(m+n)
常用的複雜度級別:
非多項式量級:
隨著資料規模的增長,演算法的執行時間和空間占用暴增,這類演算法效能極差
o(2n)和o(n!)
多項式量級:
隨著資料規模的增長,演算法的執行時間和空間占用,按照多項式的比例增長。
o(1)常量級時間複雜度
這裡並不是說o(1)只執行了一行**
o(1)表示只要**的執行時間不隨n的增大而增大,這樣**的時間複雜度我們都計作o(1)。一般情況下,只要演算法中不存在迴圈語句,遞迴語句,即使有成千上萬的**,其時間複雜度也是o(1)
2.o(logn),o(nlogn)
不管對數階的底為多少,時間複雜度都為o(logn)。比如:log3n就等於log3nlog2n(換底公式),所以o(log3n)=o(clog2n),其中c=log32是乙個常量,我們知道,在採用大o標記複雜度的時候,可以忽略係數,即o(cf(n))=o(f(n)).所以,o(log2n)就等於o(log3n)。因此,在對數階時間複雜度的表示方法裡,我們忽略對數的」底」,統一表示為o(logn)
o(nlogn)就是來自乘法法則。
3.o(m+n),o(m*n)
空間複雜度分析(表示記憶體的消耗):
表示演算法的儲存空間與資料規模之間的增長關係,也稱為漸進空間複雜度
我們說空間複雜度的時候,是指除了原本的資料儲存空間外,演算法執行還需要額外的儲存空間。
複雜度分析的4個概念
最好情況時間複雜度:
**在最理想情況下執行的時間複雜度。
最壞情況時間複雜度:
**在最壞情況下執行的時間複雜度。
平均情況時間複雜度(加權平均時間複雜度或者期望時間複雜度):
用**在所有情況下執行的次數的加權平均值表示。
均攤時間複雜度:
在**執行的所有複雜度情況中絕大部分是低階別的複雜度,個別情況是高階別複雜度且發生具有時序關係時,使用攤還分析(平攤分析)方法,可以將個別高階別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度。
二、為什麼要引入這4個概念?
1.同一段**在不同情況下時間複雜度會出現量級差異,為了更全面,更準確的描述**的時間複雜度,所以引入這4個概念。
2.**複雜度在不同情況下出現量級差別時才需要區別這四種複雜度。大多數情況下,是不需要區別分析它們的。
三、如何分析平均、均攤時間複雜度?
1.平均時間複雜度
**在不同情況下複雜度出現量級差別,則用**所有可能情況下執行次數的加權平均值表示。
2.均攤時間複雜度
兩個條件滿足時使用:1)**在絕大多數情況下是低級別複雜度,只有極少數情況是高階別複雜度;2)低級別和高階別複雜度出現具有時序規律。均攤結果一般都等於低級別複雜度。
總結:其實平均和平攤基本就是乙個概念,平攤是特殊的平均
3 複雜度分析
如何分析 統計演算法的執行效率和資源消耗?為什麼需要複雜度分析 大o複雜度表示法 規律 所有 的執行時間t n 與每行 的執行次數成正比。時間複雜度分析 1 只關注迴圈執行次數最多的一段 2 加法法則 總複雜度等於量級最大的那段 的複雜度 3 乘法法則 巢狀 的複雜度等於巢狀內外 複雜度的乘積 幾種...
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...