1. 程式人生 > >演算法設計與分析—基礎知識

演算法設計與分析—基礎知識

前言

      回顧我以往的部落格,曾想暢遊leetcode的題海,踏遍千山翻遍萬水以求有所進步,刷題到不到一半便因為碩士開題而中道崩殂;曾想成為一名Qt高手,想把Qt的官方文件翻譯成中文,卻在浩如煙海的官方文件中迷失自己,僅僅有幾篇孤零零的翻譯文稿,翻譯計劃最終被我拋棄;曾想要將閱讀的文獻進行總歸納結,最後寫成讀書筆記,執行了幾天之後因為寫部落格太過艱辛而逐漸的不了了之;曾經信誓旦旦要堅持學習英語,但是英語考試結束後這個計劃早已被我拋之腦後,那些所謂的雄心壯志和豪言壯語,在我貪玩懶惰的本性中逐漸煙消雲散。到頭來,發現很多事情都是虎頭蛇尾,從一而終的事情卻寥寥無幾。
    我想我最大的問題是想的太多,做的太少,想學的東西太多太多,但是真正去下定決心鑽研努力少之又少,我的整個知識體系龐雜並且毫無章法。時至今日,我慢慢發現我不需要擅長很多東西,但是定下的學習目標就應該很好的完成它,我慢慢懂得了什麼叫有始有終,凡是我們下定決心去做的事情,值得我們去做的事情,都應該有始有終。
     隨著歲月的更迭,課本會變得破舊不堪,逐漸被我所遺棄,寫下的學習卻筆記一直在那裡,歲月的長河奔流不息,縱使時過境遷,帶不走的,卻娟娟細流組成的知識海洋。

正文

     計算機演算法在計算機專業中有這舉足輕重的地位,無論是找工作的面試還是在程式設計中都離不開計算機演算法設計,為了方便的對這些知識的進行復習回顧,在學習之餘,特寫下演算法設計與分析的部落格,這個小目標一定要堅持到底!

重要的數學概念和定義

  • 漸進上界和漸進下界

fg是定義域為自然數集N上的函式.

(1) 若存在正數c和n0使得對於一切nn00f(n)cg(n)成立,則成f(n)漸進的上界g(n),記作f(n)=Og(n)

(2)若存在正數c和n0使得對於一切

nn00cg(n)f(n)成立,則成f(n)漸進的下界g(n),記作f(n)=Og(n)

(3)若對於任意正數c都存在n0,使得當nn00f(n)<cg(n)成立,則記作f(n)=o(g(n))

(4)若對於任意正數c都存在n0,使得當nn00cg(n)<f(n)成立,則記作f(n)=w(g(n))

(5)若f(n)=O(g(n))

f(n)=Ω(g(n)),則記作f(n)=Θ(g(n))

上式中“小o記號”和“大O記號”的區別在於,漸進的屆中存在等於的可能性,即f(n)和g(n)可以是同一個函式, 我們表示f(n) = o(g(n)),那麼f(n) = O(g(n))也是成立的,但是反過來不一定成立。

  • 判斷兩個高階低階或者同階的方法

判斷f(n)g(n)的階,首先計算兩函式相除的極限,設limnf(n)g(n)=c
1. 如果c是某個大於0的常數,那麼f(n)=Θ(g(n))
2. 如果c=0,那麼f(n)=o(g(n))
3. 如果c=+,那麼f(n)=w(g(n))

  • 對數運算性質