上課補充 by ZCKevinCredit by Howard41436, double Complexity

33  Download (0)

Full text

(1)

Complexity

上課補充 by ZCKevin

Credit by Howard41436, double

(2)

• 影片看了嗎

• Q&A

(3)

今天要學的東西

• 今天的課以理論為主,不太會寫到題目

• 但是對於複雜度的知識絕對是寫程式最重要的一環

• 大家都怎麼算複雜度?

(4)

今天要學的東西

• 今天的課以理論為主,不太會寫到題目

• 但是對於複雜度的知識絕對是寫程式最重要的一環

• 大家都怎麼算複雜度?

(5)

今天要學的東西

• 今天的課以理論為主,不太會寫到題目

• 但是對於複雜度的知識絕對是寫程式最重要的一環

• 大家都怎麼算複雜度?

• “沒有迴圈就是O(1),一層迴圈就是O(n),兩層就O(n2)”

• By Foxconn Specialist

(6)

今天要學的東西

• 今天的課以理論為主,不太會寫到題目

• 但是對於複雜度的知識絕對是寫程式最重要的一環

• 大家都怎麼算複雜度?

• “沒有迴圈就是O(1),一層迴圈就是O(n),兩層就O(n2)”

• By Foxconn Specialist

• 真的是如此嗎?

(7)

複雜度的正確算法

• 數迴圈有幾層的優缺點:

• 優點:大部分的程式我們大概都可以這樣算啦

• 缺點:

• 1.有些操作可能不是O(1)

• 2.無法計算遞迴的時間複雜度

• 3.可能會錯估均攤複雜度

(8)

複雜度的正確算法

• 首先,先來討論複雜度的正確算法

• 正式的數學定義手寫作業有,也會讓大家證一些東西

• 不過在99%的時候,複雜度都這樣算就好了:

• 計算總共需要的操作數,留下量級最大那一項,常數去掉

• ex:O(3n2logn + 2n2 + 4n + logn) = O(n2logn)

(9)

案例1

• 計算a的n次方模109+7:

• Foxconn specialist:

• return a**n % 1000000007

• 沒有迴圈,所以O(1)

• 實測時間

(10)

案例1

(11)

案例1

(12)

案例1

• 事實上,計算a的n次方時,通常是在n很小,或著是在做a或n為 浮點數的運算時,我們才會用內建的 ** 運算,且將複雜度當 作O(1)

• 當計算整數a的n次方時,內建的 ** 運算似乎變成與n成線性 時間,複雜度應為O(n)

• 未來會學到如何將複雜度降為O(logn) (快速冪)

(13)

案例2

• 估算遞迴的複雜度

• gcd(p, q):

if q = 0:

return p else:

return gcd(q, p % q)

• 這種自己呼叫自己的函式,沒有迴圈可以數,複雜度要怎麼算?

(14)

案例2

• 估算遞迴的複雜度

• fib(n):

if n = 1 or 2:

return 1 else:

return fib(n - 1) + fib(n - 2)

• 這種自己呼叫自己的函式,沒有迴圈可以數,複雜度要怎麼算?

(15)

案例3

• 模擬一個stack,有3種操作

• 1. push(x)

• 2. top()

• 3. pop(k) : 連續pop掉k個物品,其中k<=stack的大小

• 執行n次操作的總複雜度是多少?

• 每個操作的時間複雜度是多少?

(16)

案例3

• 模擬一個stack,有3種操作

• 1. push(x)

• 2. top()

• 3. pop(k) : 連續pop掉k個物品,其中k<=stack的大小

• 執行n次操作的總複雜度是多少?O(n*n)=O(n2)?

• 每個操作的時間複雜度是多少?O(1),O(1),O(n)

(17)

案例3

• 模擬一個stack,有3種操作

• 1. push(x)

• 2. top()

• 3. pop(k) : 連續pop掉k個物品,其中k<=stack的大小

• 每個操作的時間複雜度是多少?O(1),O(1),O(n)

• 執行n次操作的總複雜度是多少?O(n*n)=O(n2)?

• pop掉的物品數<=push進的物品數<=n

• 均攤複雜度O(n)

(18)

案例4

• 底下的程式會計算對於所有 1 <= i <= n, i 有幾個因數

(19)

案例4

• 底下的程式會計算對於所有 1 <= i <= n, i 有幾個因數

• 複雜度 O(N log N)

(20)

複雜度的重要性

• 在競賽程式中,複雜度計算通常是為了讓我們判斷這個演算法 寫了會不會TLE

• 我們可以假設機器每秒大概跑 5e8 左右的操作

• 這件事也告訴我們,除非複雜度真的在 5e8 左右,否則演算法 的常數不是很重要,如果複雜度相同挑最好寫的方式寫就好

(21)

計算理論中的複雜度類

• recognizable

• decidable

• nondeterministic polynomial

• polynomial

recognizable

decidable

NP

P

(22)

計算理論中的複雜度類

• recognizable

對於答案是yes的輸入,能夠輸出yes 對於答案是no的輸入,則不一定跑的完

• decidable

• nondeterministic polynomial

• polynomial

recognizable

decidable

NP

P

(23)

計算理論中的複雜度類

• recognizable

• decidable

對於答案是yes的,能輸出yes 對於答案是no的,能輸出no

此複雜度類的問題才有「演算法」

• nondeterministic polynomial

• polynomial

recognizable

decidable

NP

P

(24)

計算理論中的複雜度類

• recognizable

• decidable

• nondeterministic polynomial

常常聽到的NP問題,並不是指非多項式 時間(decidable裡面很多非多項式但 也不是NP的問題)

是指如果我們多給程式一個提示,

就有辦法在多項式時間內得知答案是yes

• polynomial

recognizable

decidable

NP

P

(25)

計算理論中的複雜度類

• recognizable

• decidable

• nondeterministic polynomial

• polynomial

這個就很直觀了,是指能夠在多項式時 間內判斷答案是yes還是no

一般我們能有效率解決的問題都是P問題

recognizable

decidable

NP

P

(26)

P與NP

• 所有P問題都是NP問題

• 我們可能會很想幫NP和P之間的區域取一個 名字,這樣當我們發現一個問題很難,我

可就可以試圖去證明它屬於那個區域

recognizable

decidable

NP

P

(27)

P與NP

• 所有P問題都是NP問題

• 我們可能會很想幫NP和P之間的區域取一個 名字,這樣當我們發現一個問題很難,我

可就可以試圖去證明它屬於那個區域

• 但目前我們不確定那個區域是否存在

• 也就是有可能P=NP

• 於是我們定義NP問題裡最難的那些問題為 NP-Complete,如果有一天確定了P!=NP,那 那些NPC的問題肯定不屬於P

recognizable

decidable

NP

P

(28)

多項式時間複雜度

• 剛剛P和NP都有提到的多項式時間,大家都知道多項式要有一個 變數,那麼題目裡的變數有時候是指個數,有時候是數字範圍,

有時候甚至超過一個變數,多項式時間是指哪個變數的多項式呢

• 印出1+2+...+n:

• 1.使用公式解

• 2.使用暴力法

• 上述哪些是多項式時間演算法,哪些不是呢?

(29)

多項式時間複雜度

• 剛剛P和NP都有提到的多項式時間,大家都知道多項式要有一個 變數,那麼題目裡的變數有時候是指個數,有時候是數字範圍,

有時候甚至超過一個變數,多項式時間是指哪個變數的多項式呢

• A: 輸入總長度(字元數),N,的多項式

• 因此當你的複雜度裡面有代表數字大小而非個數的變數時,其實 不能算是多項式演算法,因為長度為N的輸入可以表示出約10N大 小的數字。

• 這種看似是多項式時間的演算法,我們會稱其為「偽多項式時間」

演算法。在題目有限制數字範圍不會太大時依然很有效率。

(30)

問題時間

• 為什麼我們剛剛都只討論yes/no問題?這樣適用於其他問題 嗎?

(31)

P問題的重要性

• 當我們在歸類一個問題為P問題時,等於不在乎他的複雜度是 O(N2)還是O(N3)之類的,只要是多項式時間就好。

• 這是因為多項式次數的差別可以透過運算速度隨著科技進步的 提升,或是更多更高級的運算資源來突破。但是非多項式時間的 問題我們基本上就是永遠沒辦法有效率的解決。

(32)

P問題的重要性

• 當我們在歸類一個問題為P問題時,等於不在乎他的複雜度是 O(N2)還是O(N3)之類的,只要是多項式時間就好。

• 這是因為多項式次數的差別可以透過運算速度隨著科技進步的 提升,或是更多更高級的運算資源來突破。但是非多項式時間的 問題我們基本上就是永遠沒辦法有效率的解決。

• 存在無法多項式時間解決的問題並不是壞事,這可以製造 computational gap

• 可以用在密碼學中

• 如果P=NP會發生什麼事?

(33)

P=?NP

• If P = NP, then the world would be a profoundly different place than we usually assume it to be.

There would be no special value in "creative leaps," no fundamental gap between solving a problem and recognizing the solution once it's found. Everyone who could appreciate a symphony would be Mozart; everyone who could follow a

step-by-step argument would be Gauss; everyone who could recognize a good investment strategy would be Warren Buffett.

Figure

Updating...

References

Related subjects :