如何理解演算法中的漸進符號
我們分析乙個演算法的時候,常常需要用到數學去描述其效能。最常用的的是ø。比如在一段程式中有
for(i = 0,i < n ; i ++)
for(j = 0; j < n ; j++);
for (k = 0; k < n ; k ++);
我們會說其最壞情況是n + n²,這時候,實際上我們沒有考慮機器因素,我們把每一條指令的執行時間都當做單位1來看,如果我們考慮到機器因素,比如在a機器上,每條指令執行的速度是c1,那麼他的最壞情況是( n + n²) ·c1,而在機器b上,速度變成了c2,那麼最壞情況變成了( n + n²) ·c2,如果c1是10,而c2是20,那麼我們就說:演算法在機器a上面的效能比機器b上差?顯然不是這樣的,機器變差了但演算法本身沒有變差,所以說在不同的機器上跑同樣的演算法,最壞情況時間總是不一樣的,我們得想方設法去除機器效能的影響,而只是去單單分析演算法本身的優劣,以便於在具體量化演算法效能的時候又能去除機器因素的影響,因為我們講演算法分析而不是計算機系統分析。於是有人發明了θ符號。對於這個符號我們來看幾個例子,再看定義
比如說 :
ax ² + bx + c = f(x);那麼有θ(x²)= f(x).
ax³ + bx² + cx + d = f(x);那麼有θ(x³) = f(x).
也就是說它相當於取出f(x)的最高次項然後去掉其常數因子,然後放入θ()中,而放入θ()中又表示了什麼呢?為了弄清楚這個問題,我們來看其定義:
注:在集合表示中「:」符號表示「滿足於 …條件」
θ(g(n)) =
從後面半句開始,「存在 n > n0,0 ≤ c1·g(n)」這裡保證了g(n)是乙個增函式。接著,有 c1·g(n) ≤ f(n) ≤ c2·g(n)。在腦海裡可以想象出來函式影象 [ c1·g(n), c2·g(n) ]這個區間實際上是搖擺的曲線,如果把g(n)看做是y = x這樣的正比例函式,就是乙個扇形是吧?一根曲線搖擺著,掃出乙個扇形來。而f(n)就是這組成扇形的眾多曲線中的一根!這裡也就是說,無論g(n)是什麼,總能有乙個常數因子使得c1·f(n) =g(n)。再返回來原來的題目中去理解:
a x² + bx + c = f(x);那麼有θ(x²)= f(x),這裡θ(x²)表示,在x趨於無窮大這個過程中,有乙個常數c使得cn²= ax² + bx +c = f(x),也就是:同!階!數!(見高數上);這樣,我們用θ()來描述先程式的效能n² + n變成了θ(n²),這裡表明,在n趨於無窮大的過程中,總有乙個常數因子使得cn² = n² + n,這個常數因子c在上文中說到,由機器和其它非演算法因素來決定。也就是說,我們用θ(n²)來表示乙個演算法的效能的時候,我們就完全忽略了機器,只研究演算法本身,它好像是說:無論你在什麼機器上跑這個演算法,只要輸入規模足夠大,你的效能都是n²的整數倍,至於是多少倍,由機器決定的,反正在同樣的機器上,這個倍數是相等了。
你看,θ(x²)表示的不就是機器無關的,純演算法的效能了嗎?原來的問題解決了。不過θ(x²)符號還使得我們只關注最高次冪,不去關注低次項,因為在n→∞的時候,低次項是沒有意義的,因為此時只要n變化一點點,就足以抵消低次項的變化(其實還是同階數)。所以我們知道,對於乙個時間複雜度為θ(x²)的演算法,它的時間效能是優於θ(x³)的演算法的,這裡我們沒有考慮常數因子,即使θ(x³)的常數因子是1而θ(x²)的常數因子是10000000000000也沒有關係,因為無論如何,總有乙個值n0使得n越過這個點之後θ(x²)的演算法總能打敗θ(x³)的演算法,也就是說使用了θ這類的符號(漸進符號)去比較演算法時間效能的時候,是與機器無關的,即使你在超級計算機上跑θ(x³)演算法,只要輸入規模和時間足夠,跑θ(x²)演算法的老式386機子總能打敗超級計算機。類似於θ符號我們引出了o符號(讀作大o)。
o(g(n)) =
這裡我們就只關心最壞情況,我們在談論乙個演算法的最壞情況時間複雜度的時候總是喜歡使用o符號,我通過前面的例子來說明這個o符號的作用。
for(i = 0,i < n ; i ++)
for(j = 0; j < n ; j++);
for (k = 0;k < n ; k ++);
這時候我們把機器執行的速度看做單位1,於是執行的時間是n² + n,我們會說,上面這個演算法最壞情況時間複雜度是o(n²),還是同樣的目的,我們不去考慮機器本身的影響,因為機器執行的速度如果是c,那麼時間也就是變成了(n² + n) · c,也只是常數因子的問題而已。在輸入規模足夠大的情況下,我們用o(n²)來忽略機器的影響,只考慮演算法本身的最壞情況,告訴別人: 嘿!無論你在什麼機器上跑,你的最壞情況都不能比n² 這個值的x倍更壞啦。至於x倍是多少倍,反正我們只是研究演算法的,只有做機器的人才知道x是多少倍,而我們比較演算法的時候,不會在不同的機器上去測同樣的演算法然後拿來比較,往往在同樣的機器上去考察乙個演算法,這時常數因子x是相等的,關心它也是多餘的了,這就好比我們高考的時候每個人的分數都乘以10分然後再來報考,結果還不是一樣?因為考大學是根據排名來錄取的,所以對於演算法也是一樣的,我們只關注:「那個演算法才是最好的?我們應該選擇哪個演算法?」這種比較性的問題。 vue是乙個漸進式的框架,如何理解「漸進式」
場景1 如果你的技術團隊技術選型比較保守,沒有新技術的使用場景,比如讓你去維護乙個管理後台。管理後台,日常就是提交各種表單了,這部分現有的方案,比如form表單提交或者jquery收集資訊ajax提交。這時候你可以把vue 當成乙個js庫來使用,就用來收集form表單,和表單驗證。場景5 年終獎,拿...
如何理解有符號數和無符號數
這一點,你可能聽過兩種不同的回答。一種是教科書,它會告訴你 計算機用 補碼 表示負數。可是有關 補碼 的概念一說就得一節課,這一些我們需要在第6章中用一章的篇幅講2進製的一切。再者,用 補碼 表示負數,其實一種公式,公式的作用在於告訴你,想得問題的答案,應該如何計算。卻並沒有告訴你為什麼用這個公式就...
MIT演算法導論 第二講 漸進符號,遞迴及解法
符號,f n g n 表示f n 的複雜度既大於等於 g n 的複雜度,又小於等於g n 的複雜度,即於g n 的複雜度相當 o符號,f n o g n 表示f n 的複雜度最多與g n 乙個數量級,即小於等於。符號,f n g n f n 的複雜度最少與g n 乙個數量級,即大於等於。o符號,f ...