1. 算法的特性
1) 輸入輸出
算法具有零個(gè)或者多個(gè)輸入,同時(shí),算法具有至少一個(gè)的輸出。
對(duì)于在屏幕上打印”Hello World”一樣,你可以不需要有任何的輸入,直接輸出得到結(jié)果即可,而對(duì)于一個(gè)沒有輸出的算法,沒有任何意義。
2) 確定性
算法的每一步都具有確定的含義,無二義性。任何條件下,算法只有唯一的一條執(zhí)行路徑,即對(duì)于相同的輸入只能得到相同的輸出。
請(qǐng)注意,如果算法的目的是產(chǎn)生一個(gè)隨機(jī)數(shù)字,每一次運(yùn)行產(chǎn)生了不同的結(jié)果,看上去好像違反了算法確定性原則,但計(jì)算機(jī)產(chǎn)生隨機(jī)數(shù)亦是使用一種(或多種)算法解決,以線性同余產(chǎn)生隨機(jī)數(shù)為例,其利用了CPU時(shí)間的不同產(chǎn)生的不同的結(jié)果,當(dāng)CPU的時(shí)間完全一樣的時(shí)候依舊會(huì)產(chǎn)生相同結(jié)果,只不過人類無法察覺到如此精確的時(shí)間區(qū)別。
3)有窮性
一個(gè)算法總是需要(輸入合法的情況下)在有限的步驟結(jié)束,即每個(gè)算法需要在有窮的時(shí)間內(nèi)完成。
這是算法與程序的最主要的區(qū)別,程序可以無限制循環(huán)的執(zhí)行下去。對(duì)于此,你可以理解為一個(gè)算法必須要有一個(gè)”邊界“,即使一個(gè)算法需要計(jì)算機(jī)連續(xù)運(yùn)算50年,但依舊是有窮的,只不過這個(gè)算法意義已經(jīng)不是很大了。
4)可行性
一個(gè)算法是可以被執(zhí)行的,即算法中的每個(gè)操作都可以通過已經(jīng)實(shí)現(xiàn)的基本運(yùn)算執(zhí)行有限的次數(shù)完成。
盡管在目前計(jì)算機(jī)解存在著沒有實(shí)現(xiàn)成功的極為復(fù)雜的算法,但是并不能說的上是無法實(shí)現(xiàn),只不過是受到現(xiàn)在的工具和人類的大腦限制了,這屬于理論研究的范圍。
2. 算法設(shè)計(jì)要求
1) 正確性
正確性(Correctness)指的是該算法能夠滿足預(yù)先指定的功能與性能的需求,即能夠得到正確答案。
其大致可以分為以下四點(diǎn):
a)該算法中不含任何語法錯(cuò)誤。
b)程序?qū)τ趲捉M輸入數(shù)據(jù)能夠得到滿足需求的結(jié)果。
c)程序?qū)τ诜欠ǖ妮斎胍材軌虻玫綕M足需求說明的結(jié)果(如拋出異常)。
d)程序?qū)τ诰奶暨x的嚴(yán)苛數(shù)據(jù)依舊能夠產(chǎn)生滿足需求的結(jié)果。
2)健壯性
健壯性(Robustness)指的是當(dāng)輸入數(shù)據(jù)不合法時(shí),算法也能做出相關(guān)的處理,而不是產(chǎn)生不可預(yù)計(jì)的效果。
3)可讀性
可讀性(Readability)指的是算法是可以閱讀,理解和交流的。
4)耗時(shí)低,占用空間少
運(yùn)行時(shí)間(Running time)與占用空間(Storage space)概念,在設(shè)計(jì)算法時(shí),我們總是希望能夠更少的使用時(shí)間和空間達(dá)成我們的目標(biāo)。
我們算法與數(shù)據(jù)結(jié)構(gòu)的研究的重點(diǎn)就是為了讓程序運(yùn)行塊,占用空間低。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程