算法之數學

算法的分析是我們計算機科學的一項重要事務,算法的設計也是我們程序中比較重要的一塊,算法屬於數學領域,相對穩定,我們做應用軟件更多的是組合算法,利用算法,抽象算法,軟件透視圖從算法提升到架構,算法被封裝,我們將精力要大部分放在設計軟件的靈活性,伸縮性和維護性,以讓軟件像條狗一樣爲我們服務


算法是求解一個特定問題的有限個良好定義的相繼步驟的指令列表,解決這個特定問題往往可以有多種算法,我們需要分析這些算法,以找到一個高效率的算法,算法的效率衡量標準一般就是時間複雜度和空間複雜度。


算法的複雜性分析其實就是找出一個數學函數f(n),n是輸入數據的規模,一般空間複雜度是數據規模的倍數,所以我們說複雜度一般就是指時間複雜度,要分析一個算法的時間複雜度,只要找到這個算法的基本原操作,然後和輸入規模n建立函數f(n)就可以了。由於一個算法的執行時間會受到輸入數據的某些特性影響,所以需要拋棄這個影響而關注算法的最壞情況和平均情況,最壞是指這個算法執行的最大時間,平均則需要先假定輸入數據的一個概率分佈,通過概率來計算複雜度,這個要複雜些,對於很多算法,其平均情況的複雜性常與最壞情況的複雜性成比例


得到函數f(n)之後,比如2n*n + n +1,這樣表示算法複雜度不是太直觀,所以我們只關心這個函數的增長率,這通常由f(n)於某標準函數相比較而的,例如指數函數,對數函數,線性對數函數以及線性函數,二次函數,三次函數這些多項式函數等等,將f(n)與一些標準函數相比較的一種方法我們用大O記號,這個大O的定義如下:


設f(x)與g(x)是定義於R或R的子集上的任意兩個函數,f(x)於g(x)同階則記作 f(x) = O(g(x))

如果存在實數k和正常數C使得對於所有的x>k有| f(x) | <= C | g(x) |


明確了這個過程,我們就可以分析各個算法的複雜度


大O表示法是用於算法的上界,如果要表示算法的下界就要使用符號,表示上下界則需要

   


下面貼出常用排序算法的時間複雜度




 

發佈了26 篇原創文章 · 獲贊 1 · 訪問量 1223
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章