株式會社 PRUM 的 masa。
今天我針對程式設計初學者,寫了一篇關於「演算法的基本概念」的文章。
讀完這篇文章後,你應該能把原本容易覺得很難的演算法,理解成身邊常見的事物,並獲得用邏輯來組織程式碼的契機。
如果你有興趣,歡迎閱讀。
從零開始學習時,我想你一定會在某個時點遇到 演算法 這個詞。
我自己剛成為工程師時,每次聽到這個詞,都會先退縮一下,心想:「那不是理工背景的人才會做的、很難的計算類東西嗎?」
但結論先說,演算法就是 「解決問題的步驟」。
你可以把它想成讓電腦高效率運作的「食譜」。
例如,假設你今天晚餐要做咖哩。
下面兩種做法,哪一種會比較快完成呢?
當然是第二種「並行作業」會比較快完成對吧。
即使目標都是「做咖哩」,只要改變步驟(流程),所花的時間就會大不相同。這種 「思考如何高效率又美味地完成料理的流程」,正是演算法。
如果只有日常生活的例子,可能還是有點難以體會,所以我們來看看實際開發現場常做的「登入功能」。
登入功能拆開來看,也是由以下這些步驟組成。
像這樣,把想讓電腦做的事情有順序、且有邏輯地組合起來,這也是很標準的演算法。
「要怎麼做才能最順暢地達成目標?」只要是這種在思考路徑的事情,本身就是演算法,所以並不是一定要有特殊的數學知識。
一開始先用「食譜」的感覺來思考就好
在開始寫程式前,先習慣用日文或中文把步驟寫成「先做這個,再做那個」的條列式,腦中的內容就會清楚整理很多喔!
在對演算法有一點概念之後,我們來看一個更像程式設計的例子。
演算法中有一個很經典的例子,叫做 「排序(整列)」。它是把零散的資料依照特定規則,例如「由大到小」或「由小到大」,整齊地重新排列的步驟。
這裡先介紹最簡單也最有名的 「氣泡排序(Bubble Sort)」。
假設你面前有 5 張寫著零散數字的撲克牌。
[ 5, 3, 8, 1, 4 ]
如果想把它從最左邊開始排成小到大,氣泡排序會重複做一個非常單純的動作:「比較相鄰的兩張牌,如果右邊那張比較小,就把它交換。」
我們慢慢看它實際怎麼運作。
【第 1 輪作業】
[ 3, 5, 8, 1, 4 ][ 3, 5, 8, 1, 4 ][ 3, 5, 1, 8, 4 ][ 3, 5, 1, 4, 8 ]這樣第 1 輪就結束了。可以看到,最大的數字「8」移到了最右邊。
因為就像水中的氣泡會一顆一顆往水面浮上來一樣,最大的數字會逐漸浮到邊緣,所以稱為「氣泡排序」。
接著只要對剩下的 4 張牌繼續重複同樣的動作,做第 2 輪、第 3 輪……最後就會排成 [ 1, 3, 4, 5, 8 ] 這樣整齊的順序。
電腦看起來像是能瞬間幫我們排序的魔法箱,但在背後,其實就是這種「老老實實地比較兩個數字,再交換位置」的作業,只是以非常快的速度在執行而已。
「原來如此,步驟很重要我懂了。可是現在還在學習階段,先讓程式能動不就好了嗎?」也許有人會這麼想。
的確,一開始只要能寫出會動的程式碼就很棒了!
但如果完全不去意識演算法(步驟)就養成寫程式的習慣,最後很容易變成 「雖然大致能動,但不知道為什麼會動的程式碼」,之後連自己都無法修正,進而增加開發現場的負擔。
不帶著演算法觀念寫程式,就很像 「不看食譜、憑感覺隨便做出來的料理」。
一開始也許碰巧做得很好吃。但下次再做如果味道跑掉了,就無法事後回頭檢查「到底是哪個調味料放錯了」或「火候是不是太大了」對吧。
程式設計也是一樣。
當你寫了一段稍微複雜的處理,然後出現錯誤時,如果腦中有一條清楚的演算法「步驟脈絡」,你就能大概推測出錯誤原因,例如:「前面第 3 個處理都正常,所以問題應該出在第 4 個步驟。」
但是,如果你完全不去意識步驟,只是「先複製貼上讓它能跑」,一旦出錯就會立刻陷入「根本不知道該看哪裡」的迷路狀態。
為了修正錯誤花上好幾天,最後甚至討厭起程式設計。這是包括我在內,很多初學者都會遇到的一道大關卡。
所以,從一開始就去意識「此刻我是在用什麼樣的步驟讓電腦運作?」這件事,最後反而會幫助自己很多。
演算法並不是什麼特別艱深的數學,而是 「為了達成目的所安排的流程」。不需要一次就完全理解也沒關係。只要先知道「原來有這樣的技巧」,你就已經比昨天的自己往前了一步。接下來也不要著急,我們一起一點一滴累積吧!
PRUM 的工程師有 95% 以上都是從零經驗錄取的。
如果可以的話,也歡迎來我們的企業網站逛逛。
▶ 企業網站
我們也經營了一個整理工程師實用文章的網站。如果你有興趣,也歡迎看看。
▶ 工程師實用文章網站