偽多項式複雜度

2021-06-25 11:44:05 字數 1823 閱讀 7283

上篇的標記演算法中,談到這個o(k)的演算法是乙個指數級複雜度的演算法,其實對那道題目本身來說,k是固定的,既然不是輸入,那也無所謂複雜度,之所以有o(k)這種說法,是把k當做一種輸入了,這是看待輸入的角度問題,倒不用深究。考慮乙個更簡化的演算法(python**,設輸入n是正整數):

def f(n): 

i = 0

while i < n:

i += 1

這個演算法在任意整數輸入下都返回none,我們關注的重點是它的時間複雜度,根據python的相關機制,賦值操作是乙個指標修改,可以認為是常數時間完成,於是這個演算法執行了n次比較運算和加一運算

之所以用python舉例,因為python的整數和c的整數型別不同,是不限制位數的(由於記憶體有限,實際還是有限制的,但也足夠大了),也就是說,不能將整數的所有運算都看做是常數時間的,因為數字可能非常大,在內部是用乙個陣列來儲存。最簡單的例子,兩個數字a和b相加,需要做的工作和它倆的長度有關,因此加法時間複雜度是和lga,lgb線性相關

不過在這個例子中,我們可以證明比較和加一運算都是平均常數時間的,如果兩個大數比較,先看長度,長的那個顯然大,如果一樣長,則從前往後用類似strcmp的演算法,根據前面某篇的討論,strcmp的平均時間複雜度是o(1);另一方面,雖然上面說加法跟數字的位數線性相關,但若是加一運算,只有在產生連續進製的時候運算時間才和長度有關,而連續加一操作平均每次是常數時間(參考演算法導論的平攤分析一章)

於是我們就可以說,上面這個演算法的複雜度是θ(n),這個結論沒有錯,但這個演算法是乙個指數級複雜度,原因在於,輸入規模並不是和n線性相關的,對於乙個演算法的輸入規模,有乙個明確簡單的定義,就是輸入的長度

由此,可以把輸入分為兩種,資料輸入和數值輸入,假設使用2進製作為表示形式,則對於乙個數值n來說,它的輸入規模是lgn,當然,如果使用base大於2的進製,輸入長度會短,但從漸進意義上來說是一樣的,因為當x和y都大於1的時候,θ(log(n,x))=θ(log(n,y)),因此用二進位制就能說明問題了。時間複雜度為θ(t(n)),可以認為當輸入規模變為原來的k倍時,演算法執行時間大約會增長到原來的t(k)倍這個級別,因此就上面這個演算法來說,如果輸入規模增長到原來的k倍,那輸入的數值n會變成原來的k次方,因此,由於n是數值輸入,θ(n)改寫成以輸入規模n的表示,就是θ(2^n),是乙個指數級別複雜度

對於資料輸入,就比較好理解了,如果不考慮每個資料本身的數值長度(有時候還是要考慮),則資料輸入的規模就是其數量

假如乙個演算法有數值輸入,且其時間複雜度可以表示為輸入數值(不是輸入規模)的多項式,則根據上面的討論,實際應該是乙個指數時間的演算法,但這種情況畢竟和資料輸入規模的指數級複雜度有些不同,一般來說,直觀上也習慣用輸入數值來表示複雜度,對於這種看上去像是多項式(數值的多項式)而實際代表演算法是指數級(輸入規模作為指數)的複雜度,稱其為偽多項式複雜度

很多演算法具有偽多項式複雜度,例如,採用從2開始試除的方式判定乙個整數n是否是素數,需要做n^(1/2)次除法,而每次除法的時間跟lgn有關,乍一看這個多項式也不高,但由於n會隨著輸入規模很快增長,仍然是乙個指數時間的演算法,用它判定素數是很低效的

p.s.聽說已經有了多項式時間判定素數的演算法,時間複雜度是o((lgn)^6)到o((lgn)^12),當然這裡由於n會隨著輸入規模的線性增長而指數級增長,所以不妨設輸入規模m=lgn,就容易理解了

利用動態規劃,0-1揹包問題可以有乙個o(nw)的演算法,由於w是數值輸入,因此這個演算法是偽多項式時間的。事實上,通過計算理論中的方法,可以證明0-1揹包問題是乙個npc問題,如果不理解偽多項式,就很難理解為何它有乙個o(nw)的演算法,卻是npc的

存在偽多項式時間複雜度演算法的npc問題,一般稱為弱npc問題,反之則是強npc問題,弱npc問題似乎更「接近」p,在相關問題的研究中經常引起人們更大的興趣

演算法的時間複雜度比較,計算多項式的直接法和秦九韶法

1.直接法 1 double polynomial 1 int n,double a,doublex 2 每次迴圈迭代,pow函式內部都會執行i次乘法,然後一次加法,所以整體的演算法複雜度為o 1 2 n 2 3 2n,儘管pow函式的實現方法是利用遞迴優化後的,但是演算法複雜度還是達到了o nlo...

複雜度分析 時間複雜度 空間複雜度

執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...

MATLAB多項式及多項式擬合

多項式均表示為陣列形式,陣列元素為多項式降冪係數 1.polyval函式 求多項式在某一點或某幾個點的值.p 1,1,1 x 2 x 1 x 1,0,1 y polyval p,x 另外求函式在某一點或某幾個點的值可以用函式feval.x 1,0,1 y feval x exp x x 注意用的乘法...