在學校的同學們之間,演算法總是被放在一個非常高的位置,有多高呢?嗯...就是非常非常高啦,高到有人只要能說出幾個非常牛掰的和演算法有關的名詞,比如NP完全問題啦、模擬退火啦就覺得自己是大神了(其實有些人連快排都寫不出來,或者寫個快排還要先翻翻書)。其實我覺得演算法跟資料結構、設計模式一樣,都只是一種工具,用這樣的工具能快速有效地解決一些實際問題,如果只知道演算法,而不懂這些演算法能夠用於哪些場景,那麼這些演算法在這些人的大腦中是沒有什麼意義的。
根據我的經驗,演算法對於大一的學生是“那個人演算法很厲害,大神大神”,對於大二"你聽說過模擬退火過沒?你聽說過遺傳演算法沒?你聽說過反饋神經網路沒?現在的AI演算法可以......",對於大三"嗯,演算法很重要,以後工作有比沒有好,工作中經常用到,平時有空閒的時間多研究研究,對未來的成長大大的有好處"。
演算法其實就是對一個問題或一類問題的解決過程的描述。比如說用加法求1加到100,那麼就可以用
count=0
for i in 1...100
count += i
來描述。這個描述的過程就是不斷的累加。演算法非常關注於複雜度,也就是時間複雜度和空間複雜度。有些演算法可以讓時間用得儘量少,而有些演算法為了節約空間,會用犧牲時間的方式來換取少用空間。不過,由於現在的物理儲存裝置的空間越來越大,空間暫時不是非常重要,除非在一些特殊的場景,比如說在大規模資料的情況下。當資料只有1M的時候,空間增加100倍沒有什麼很大的問題,但是如果資料有1T的話,再增加100倍後的資料量,是很難讓人接受的。對於一個演算法,我們經常需要在時間和空間之間進行取捨。
演算法跟程式不同,演算法是對一個問題解決過程的描述,需要有0個或多個輸入,至少1個輸出,每個過程都是確定的,並且一定要有有限的時間內完成。但程式就不一定,有些程式可以一直執行下去,只有一直給機器供電,程式一直不出現致命錯誤。
演算法也可以一種模型,資料結構是對資料儲存的模型,而演算法是對問題解決過程的模型。資料結構是為了更方便的儲存和訪問資料,演算法是為了更有效率地處理資料。所以演算法和資料結構是不分家的,沒有資料結構,演算法根本沒有資料可以操作,演算法也無法進行,而沒有演算法,資料結構光儲存有資料,這些資料不經處理,也大部分是無用的。
經過無數計算機演算法前輩的研究,已經有非常多現成的演算法供我們學習和使用。演算法並非是計算機專有的,或者說演算法的思想來源於很多其他行業。比如說前面說到的模擬退火演算法。演算法還涉及到了很多微積分、線性代數、離散數學、概率論、博弈論、數論方面的知識。