1. 程式人生 > >淺談演算法,一些感悟(1)

淺談演算法,一些感悟(1)

最近看到好幾個同學在學演算法,看了一些書,另外跟一個演算法較好的同學討論了一下,若有所悟,作此文,以求各位大神指教;

 現在看到好多同學學演算法,可是,事實上看起來,真正明白理解了演算法是一種什麼東西的極少,很多都是為了參加ACM而去學演算法,並沒有對演算法有真正意義上的研究,甚至說,他們拿到了ACM的入場券的時候還不知道演算法是什麼,我感到很惋惜,從我個人的理解來說,演算法其實一直都在我們身邊,它就是一切可以通過邏輯解釋的活動的一整個過程,這樣說可能有點泛泛而談了,總的來說,演算法就是一個抽象的流程;而且在我看來,我們計算機領域內所談的演算法應該算是一種比較狹義上的演算法,是一種基於計算機的演算法,而此類演算法,我覺得應該可以分兩種型別:求解型和功能型,何為求解型呢?具體說來,就是當前各種演算法大賽所要求的那種演算法,是為了對一類題求解,至於功能型,就是軟體設計方面所用到的演算法,可以說是把一系列求解型演算法整合在一起的演算法,好了,說了這麼多廢話,該入正題了;

會演算法的人很多,可是演算法也是有好有壞的,對一個程式來說,在得到同等結果的情況下,能儘量地減少時間損耗的就是好演算法,但是,很多人為了追求完成任務,在時間損耗上不加以注意,使用了很多很粗糙的演算法,比如說:要做一個迴圈十次的演算法,有的人使用了迴圈演算法,有的就使用分步的演算法,把每一步都寫出來,這只是一種很極端的情況,一般已經入門的人都不會這樣做,後者就是一種很粗糙的演算法,不僅執行效率低,而且寫起來也吃力不討好,相對後者來說,前者就是一種較美的演算法,簡潔、執行效率高、寫起來也方便,這就是我對演算法美的一種定義;

至今為止,我也沒寫出多少美的演算法,但是,可以說我一直在追求,我嘗試通過不斷地思考,學習去改善一個演算法,一下就是在演算法由粗糙到美這個過程的一些感悟:

1、模糊演算法模型,在寫演算法之前,應該先對整個演算法有一個比較模糊的演算法模型,應該知道這個演算法是幹嘛的,要怎麼實現等等,不要一拿到題目就急著寫演算法,然後一邊寫一邊思考,這種行為會把一個原來比較容易寫的美的演算法寫的粗糙的;

2、在模糊演算法模型的基礎上,一步步往模型中新增具體的演算法,使整個模型清晰起來,如果只是做一些比較的小的演算法的話,這種行為可能沒太大必要,可是,對一些比較大的演算法來說,或者一下子要把整個演算法模型弄出來會很困難,而且很多細節地方會顧及不到,因此,在模糊演算法模型的基礎上,把整個完整的模型分解成很多小的演算法,一些小的演算法比較容易寫得美;

3、整合所有小演算法,往模糊模型中新增完小演算法之後,最重要的就是如何把這些小演算法連線起來,這又涉及到一些連線的演算法,而這些連線演算法,有可能是相同的;

4、很多人寫完演算法之後,就開始根據演算法程式設計,可是,有的時候,我們沒預料到的就是語言本身的一些問題,會導致我們的演算法錯誤,因此,我們在寫完演算法,甚至在寫的過程加入我們所需要注意的程式設計問題,以求最好的演算法;

5、有的時候,我們看看身邊事物,沒有什麼特別,可是當我們從演算法的角度出發,思考每種行為的演算法的時候,我們可以領悟到更多的演算法,同時,這些演算法也可以在某些時候被應用到我們的專案之中;

時間問題,這次就先寫這麼多吧,只是個人的一些感悟,可能不太正確,懇請各位賜教!