這很明顯是一個百度的東西。。。
所以目錄我都懶得整了。。。
算法就是准確描述解決一類問題的方法
比如解決雞兔同籠問題
這個算法首先就是輸入
然后就運算
然后輸出
這樣輸入,運算,輸出,就可以稱為一個簡單的算法。
一個合格的算法應該滿足以下5個條件
- 確切性
你能確切描述這個算法,不存在任何含糊和二義性 - 有窮性
經過有限次數的執行之后可以求出問題的解
怎么算是無窮呢?
輸出\(\frac{1}{3}\)的小數形式
無限循環小數怎么有限次輸出解決嘛。。。 - 可行性
你的程序是可以運行的
什么叫做不可行呢?
比如輸出\(\pi\)就很不可行
(無限不循環小數輸出個鬼) - 輸入項
任意個合法輸入項。如果輸入項為0表示輸入已經給出(默認)。
不會有程序不存在輸入項(輸入項為0項也叫作存在,那個叫做初始條件)
合法的輸入項表示這個輸入項是會影響輸出的,而且這個輸入項對於問題來說是合理的。
如果這個輸入項無論輸入什么問題的結果都不變,那么這個輸入項沒有意義。 - 輸出項
必須有輸出,表示問題的結果
輸出愛有幾個就輸幾個,你管不着。
如何評價一個算法
首先我們從從正確性來說
正確性就是指在算法具備上述五個條件的前提下,對於每一個輸入,都能得到確定的,正確的輸出。
比如我計算雞兔同籠問題,給我整出了\(-1\)只雞,\(1.5\)只兔子
這叫做不正確
然后就是時空復雜度
是的我時間空間是一起分析的
時間復雜度就表示執行算法所需要的計算工作量。一般來說,時間復雜度問題規模的遞增函數。
問題的規模越大,時間復雜度越高。
比如說我用枚舉法解決雞兔同籠問題
有100個頭的時候,我要枚舉50次(不就全部都是雞一直削減到沒有雞)
10000000000個頭的時候,我要枚舉5000000000次
隨着頭的個數的增長,問題的規模越來越大,時間復雜度也越來越高。
當然,如果你用解二元一次方程組的方法。。。時間復雜度就不變了
所以枚舉法的時間復雜度高於解方程
至於空間復雜度,就是你解決這個問題的時候所用的內存
我們如果要開一棵線段樹,那么空間復雜度就是\(O(4n)\),這個也是隨着問題的規模越大,空間復雜度越大的典例。
但是為了我們開全局變量的方便,我們一般都會在不知道n的時候直接開到\(4n_{max}\),但是實際上解決問題所用的空間復雜度只是\(4n\)
接着就是可讀性
算法的可讀性就是指。。。就是指你讀它的難易程度。
比如說當你在做數學題
不可讀的過程是長成這樣的:
可讀的過程。。。不知道真的不知道
最后就是魯棒性
(emmm競賽中沒有遇見過)
就是指你的程序應對非法輸入的應變能力
比如說我雞兔同籠
1.5個頭,-1只腳,叫做非法輸入。
在比如說我計算a/b,輸入b=0,這叫做非法輸入
魯棒性是指一個算法對不合理數據輸入的反應能力和處理能力,也稱為容錯性
算法的描述
怎么描述算法呢?我們可以用自然語言,流程圖和偽代碼
比如交換兩個變量的值。
自然語言描述:我直接告訴你怎么做。先給我定義一個新的變量,保存其中一個變量的值。然后另一個變量覆蓋這個變量。新定義的變量再賦值給另一個變量
(我都暈了)
流程圖:自己畫去
偽代碼:由於這題太簡單了。。。偽代碼都變成代碼了
int c=a; a=b; b=c;
偽代碼其實就是用代碼來描述一個程序的功能(注意不是實現)
因為不同語言在實現同一個功能時代碼可能長得不一樣
所以我們就用類似於英語的偽代碼來描述這個模塊的組成和功能。