多項式時間 Polynomial time

2021-10-11 10:59:59 字數 1742 閱讀 7222

什麼是時間複雜度?

時間複雜度並不是表示乙個程式解決問題需要花多少時間,而是當程式所處理的問題規模擴大後,程式需要的時間長度對應增長得有多快。也就是說,對於某乙個程式,其處理某乙個特定資料的效率不能衡量該程式的好壞,而應該看當這個資料的規模變大到數百倍後,程式執行時間是否還是一樣,或者也跟著慢了數百倍,或者變慢了數萬倍。

不管資料有多大,程式處理所花的時間始終是那麼多的,我們就說這個程式很好,具有 o(1

)o(1)

o(1)

的時間複雜度,也稱常數級複雜度;資料規模變得有多大,花的時間也跟著變得有多長,比如找n個數中的最大值這個程式的時間複雜度就是 o(n

)o(n)

o(n)

,為線性級複雜度,而像氣泡排序、插入排序等,資料擴大2倍,時間變慢4倍的,時間複雜度是 o(n

2)

o(n^2)

o(n2

),為平方級複雜度。還有一些窮舉類的演算法,所需時間長度成幾何階數**,這就是 o(a

n)

o(a^n)

o(an

) 的指數級複雜度,甚至 o(n

!)

o(n!)

o(n!

) 的階乘級複雜度。

不會存在 o(2

∗n2)

o(2*n^2)

o(2∗n2

) 的複雜度,因為前面的那個"2"是係數,根本不會影響到整個程式的時間增長。同樣地,o(n

3+n2

)o(n^3+n^2)

o(n3+n

2)的複雜度也就是 o(n

3)

o(n^3)

o(n3

)的複雜度。因此,我們會說,乙個 o

(0.01∗n

3)

o(0.01*n^3)

o(0.01

∗n3)

的程式的效率比 o

(100∗n

2)

o(100*n^2)

o(100∗

n2) 的效率低,儘管在n很小的時候,前者優於後者,但後者時間隨資料規模增長得慢,最終 o(n

3)

o(n^3)

o(n3

) 的複雜度將遠遠超過 o(n

2)

o(n^2)

o(n2

)。我們也說,o(n

100)

o(n^)

o(n100

) 的複雜度小於 o

(1.01n

)o(1.01^n)

o(1.01

n)的複雜度。

容易看出,前面的幾類複雜度被分為兩種級別,其中後者的複雜度無論如何都遠遠大於前者。像 o(1

)o(1)

o(1)

, o (ln

⁡(n)

)o(\ln(n))

o(ln(n)

), o(n

a)

o(n^a)

o(na

)等,我們把它叫做多項式級複雜度,因為它的規模n出現在底數的位置;另一種像是 o(a

n)

o(a^n)

o(an

) 和 o(n

!)

o(n!)

o(n!

) 等,它是非多項式級的複雜度,其複雜度計算機往往不能承受。當我們在解決乙個問題時,我們選擇的演算法通常都需要是多項式級的複雜度,非多項式級的複雜度需要的時間太多,往往會超時,除非是資料規模非常小。

polynomial 一元多項式加法實現

polynomial 一元多項式加法實現 include stdio.h include malloc.h include stdlib.h typedef struct lnodelink,linklist linklist initlist link makenode linklist crea...

polynomial 一元多項式乘法實現

polynomial 一元多項式乘法實現 include stdio.h include malloc.h include stdlib.h typedef struct lnodelink,linklist linklist initlist link makenode linklist crea...

多項式時間演算法

定義 若存在乙個常數c,使得對於所有n 0,都有 f n c g n 則稱函式f n 是o g n 時間複雜度是o p n 的演算法稱為多項式時間演算法,這裡p n 是關於n的多項式。不能夠這樣限制時間複雜度的演算法被稱為指數時間演算法。例如 時間複雜度為o nlog n o n 3 的演算法都是多...