Complexity
上課補充 by howard41436
• 影片看了嗎
•
今天要學的東西
• 今天的課以理論為主,不太會寫到題目
• 但是對於複雜度的知識絕對是寫程式最重要的一環
• 大家都怎麼算複雜度?
今天要學的東西
• 今天的課以理論為主,不太會寫到題目
• 但是對於複雜度的知識絕對是寫程式最重要的一環
• 大家都怎麼算複雜度?
今天要學的東西
• 今天的課以理論為主,不太會寫到題目
• 但是對於複雜度的知識絕對是寫程式最重要的一環
• 大家都怎麼算複雜度?
• 沒有迴圈就是 ,一層迴圈就是 ,兩層就
•
今天要學的東西
• 今天的課以理論為主,不太會寫到題目
• 但是對於複雜度的知識絕對是寫程式最重要的一環
• 大家都怎麼算複雜度?
• 沒有迴圈就是 ,一層迴圈就是 ,兩層就
•
• 真的是如此嗎?
複雜度的正確算法
• 數迴圈有幾層的優缺點:
• 優點:大部分的程式我們大概都可以這樣算啦
• 缺點:
• 有些操作可能不是
• 無法計算遞迴的時間複雜度
• 可能會錯估均攤複雜度
複雜度的正確算法
• 首先,先來討論複雜度的正確算法
• 正式的數學定義手寫作業有,也會讓大家證一些東西
• 不過在 的時候,複雜度都這樣算就好了:
• 計算總共需要的操作數,留下量級最大那一項,常數去掉
•
案例
• 計算 的 次方模 :
•
•
• 沒有迴圈,所以
• 實測時間
案例
• 事實上,計算 的 次方時,通常是在 很小,或著是在做 或 為 浮點數的運算時,我們才會用內建的 函數,且將複雜度當作
• 當計算整數 的 次方時,內建的 函數似乎變成與 成線性時 間,複雜度應為
• 利用快速冪可以將複雜度降為
案例
• 估算遞迴的複雜度
•
• 這種自己呼叫自己的函式,沒有迴圈可以數,複雜度要怎麼算?
案例
• 估算遞迴的複雜度
•
• 這種自己呼叫自己的函式,沒有迴圈可以數,複雜度要怎麼算?
案例
• 模擬一個 ,有 種操作
•
•
• : 連續 掉 個物品,其中 的大小
• 每個操作的時間複雜度是多少?
• 執行 次操作的總複雜度是多少?
案例
• 模擬一個 ,有 種操作
•
•
• : 連續 掉 個物品,其中 的大小
• 每個操作的時間複雜度是多少?
• 執行 次操作的總複雜度是多少?
案例
• 模擬一個 ,有 種操作
•
•
• : 連續 掉 個物品,其中 的大小
• 每個操作的時間複雜度是多少?
• 執行 次操作的總複雜度是多少?
• 掉的物品數 進的物品數
• 均攤複雜度
複雜度的重要性
• 在競賽程式中,複雜度計算通常是為了讓我們判斷這個演算法 寫了會不會
• 如果把題目的變數限制代進複雜度後算出來 ,通常可行
• 如果算出來後 ,通常不可行 假設時限是 秒左右
• 這件事也告訴我們,除非複雜度在 左右,否則演算法的常數 不是很重要,如果複雜度相同挑最好寫的方式寫就好
計算理論中的複雜度類
•
•
•
•
計算理論中的複雜度類
•
對於答案是 的輸入,能夠輸出
對於答案是 的輸入,則不一定跑的完
•
•
•
計算理論中的複雜度類
•
•
對於答案是 的,能輸出 對於答案是 的,能輸出
此複雜度類的問題才有 演算法
•
•
計算理論中的複雜度類
•
•
•
常常聽到的 問題,並不是指非多項式 時間 裡面很多非多項式但 也不是 的問題
是指如果我們多給程式一個 , 就有辦法在多項式時間內得知答案是
•
計算理論中的複雜度類
•
•
•
•
這個就很直觀了,是指能夠在多項式時 間內判斷答案是 還是
一般我們能有效率解決的問題都是 問題
與
• 所有 問題都是 問題
• 我們可能會很想幫 和 之間的區域取一個 名字,這樣當我們發現一個問題很難,我
可就可以試圖去證明它屬於那個區域
與
• 所有 問題都是 問題
• 我們可能會很想幫 和 之間的區域取一個 名字,這樣當我們發現一個問題很難,我
可就可以試圖去證明它屬於那個區域
• 但目前我們不確定那個區域是否存在
• 也就是有可能
• 於是我們定義 問題裡最難的那些問題為
,如果有一天確定了 ,那 那些 的問題肯定不屬於
多項式時間複雜度
• 剛剛 和 都有提到的多項式時間,大家都知道多項式要有一個 變數,那麼題目裡的變數有時候是指個數,有時候是數字範圍,
有時候甚至超過一個變數,多項式時間是指哪個變數的多項式呢
• 印出 :
• 使用公式解
• 使用暴力法
• 上述哪些是多項式時間演算法,哪些不是呢?
多項式時間複雜度
• 剛剛 和 都有提到的多項式時間,大家都知道多項式要有一個 變數,那麼題目裡的變數有時候是指個數,有時候是數字範圍,
有時候甚至超過一個變數,多項式時間是指哪個變數的多項式呢
• 輸入總長度(字元數), ,的多項式
• 因此當你的複雜度裡面有代表數字大小而非個數的變數時,其實 不能算是多項式演算法,因為長度為 的輸入可以表示出約 大 小的數字。
• 這種看似是多項式時間的演算法,我們會稱其為 偽多項式時間 演算法。在題目有限制數字範圍不會太大時依然很有效率。
問題的重要性
• 當我們在歸類一個問題為 問題時,等於不在乎他的複雜度是 還是 之類的,只要是多項式時間就好。
• 這是因為多項式次數的差別可以透過運算速度隨著科技進步的 提升,或是更多更高級的運算資源來突破。但是非多項式時間的 問題我們基本上就是永遠沒辦法有效率的解決。
問題的重要性
• 當我們在歸類一個問題為 問題時,等於不在乎他的複雜度是 還是 之類的,只要是多項式時間就好。
• 這是因為多項式次數的差別可以透過運算速度隨著科技進步的 提升,或是更多更高級的運算資源來突破。但是非多項式時間的 問題我們基本上就是永遠沒辦法有效率的解決。
• 存在無法多項式時間解決的問題並不是壞事,例如這讓我們可以 用夠強的加密系統來讓解密無法有效率地進行
• 如果 會發生什麼事?
•