株式會社 PRUM 的 masa。

今天我針對程式設計初學者,寫了一篇關於「演算法的基本概念」的文章。

讀完這篇文章後,你應該能把原本容易覺得很難的演算法,理解成身邊常見的事物,並獲得用邏輯來組織程式碼的契機。

如果你有興趣,歡迎閱讀。

演算法是「解決問題的步驟」

從零開始學習時,我想你一定會在某個時點遇到 演算法 這個詞。
我自己剛成為工程師時,每次聽到這個詞,都會先退縮一下,心想:「那不是理工背景的人才會做的、很難的計算類東西嗎?」

但結論先說,演算法就是 「解決問題的步驟」
你可以把它想成讓電腦高效率運作的「食譜」。

以做咖哩來思考「步驟最佳化」

例如,假設你今天晚餐要做咖哩。
下面兩種做法,哪一種會比較快完成呢?

  1. 等到蔬菜和肉全部切完之後,再開始燒水。
  2. 一邊燒水,一邊在旁邊切蔬菜和肉。

當然是第二種「並行作業」會比較快完成對吧。
即使目標都是「做咖哩」,只要改變步驟(流程),所花的時間就會大不相同。這種 「思考如何高效率又美味地完成料理的流程」,正是演算法。

開發現場的「登入功能」也是演算法

如果只有日常生活的例子,可能還是有點難以體會,所以我們來看看實際開發現場常做的「登入功能」。
登入功能拆開來看,也是由以下這些步驟組成。

  1. 接收使用者輸入的 ID 和密碼
  2. 在資料庫中搜尋該 ID 是否存在
  3. 如果有找到 ID,確認密碼是否一致(※實際上是比較經過加密的密碼值)
  4. 如果一致,就顯示「登入成功」畫面;如果不一致,就回傳「錯誤」畫面

像這樣,把想讓電腦做的事情有順序、且有邏輯地組合起來,這也是很標準的演算法。
「要怎麼做才能最順暢地達成目標?」只要是這種在思考路徑的事情,本身就是演算法,所以並不是一定要有特殊的數學知識。

一開始先用「食譜」的感覺來思考就好
在開始寫程式前,先習慣用日文或中文把步驟寫成「先做這個,再做那個」的條列式,腦中的內容就會清楚整理很多喔!

試著把資料排得整整齊齊:排序(整列)

在對演算法有一點概念之後,我們來看一個更像程式設計的例子。
演算法中有一個很經典的例子,叫做 「排序(整列)」。它是把零散的資料依照特定規則,例如「由大到小」或「由小到大」,整齊地重新排列的步驟。

這裡先介紹最簡單也最有名的 「氣泡排序(Bubble Sort)」

把撲克牌按「小到大」排列看看

假設你面前有 5 張寫著零散數字的撲克牌。
[ 5, 3, 8, 1, 4 ]

如果想把它從最左邊開始排成小到大,氣泡排序會重複做一個非常單純的動作:「比較相鄰的兩張牌,如果右邊那張比較小,就把它交換。」
我們慢慢看它實際怎麼運作。

【第 1 輪作業】

  • 53 比較 → 3 比較小,所以交換。 [ 3, 5, 8, 1, 4 ]
  • 58 比較 → 5 比較小,所以不變。 [ 3, 5, 8, 1, 4 ]
  • 81 比較 → 1 比較小,所以交換。 [ 3, 5, 1, 8, 4 ]
  • 84 比較 → 4 比較小,所以交換。 [ 3, 5, 1, 4, 8 ]

這樣第 1 輪就結束了。可以看到,最大的數字「8」移到了最右邊。
因為就像水中的氣泡會一顆一顆往水面浮上來一樣,最大的數字會逐漸浮到邊緣,所以稱為「氣泡排序」。

接著只要對剩下的 4 張牌繼續重複同樣的動作,做第 2 輪、第 3 輪……最後就會排成 [ 1, 3, 4, 5, 8 ] 這樣整齊的順序。

電腦看起來像是能瞬間幫我們排序的魔法箱,但在背後,其實就是這種「老老實實地比較兩個數字,再交換位置」的作業,只是以非常快的速度在執行而已。

如果不意識演算法,會變成怎樣?

「原來如此,步驟很重要我懂了。可是現在還在學習階段,先讓程式能動不就好了嗎?」也許有人會這麼想。

的確,一開始只要能寫出會動的程式碼就很棒了!
但如果完全不去意識演算法(步驟)就養成寫程式的習慣,最後很容易變成 「雖然大致能動,但不知道為什麼會動的程式碼」,之後連自己都無法修正,進而增加開發現場的負擔。

「憑感覺做出來的料理」之後無法修正

不帶著演算法觀念寫程式,就很像 「不看食譜、憑感覺隨便做出來的料理」

一開始也許碰巧做得很好吃。但下次再做如果味道跑掉了,就無法事後回頭檢查「到底是哪個調味料放錯了」或「火候是不是太大了」對吧。

「此刻我是在用什麼樣的步驟讓電腦運作?」

程式設計也是一樣。
當你寫了一段稍微複雜的處理,然後出現錯誤時,如果腦中有一條清楚的演算法「步驟脈絡」,你就能大概推測出錯誤原因,例如:「前面第 3 個處理都正常,所以問題應該出在第 4 個步驟。」

但是,如果你完全不去意識步驟,只是「先複製貼上讓它能跑」,一旦出錯就會立刻陷入「根本不知道該看哪裡」的迷路狀態。

為了修正錯誤花上好幾天,最後甚至討厭起程式設計。這是包括我在內,很多初學者都會遇到的一道大關卡。

所以,從一開始就去意識「此刻我是在用什麼樣的步驟讓電腦運作?」這件事,最後反而會幫助自己很多。

最後

演算法並不是什麼特別艱深的數學,而是 「為了達成目的所安排的流程」。不需要一次就完全理解也沒關係。只要先知道「原來有這樣的技巧」,你就已經比昨天的自己往前了一步。接下來也不要著急,我們一起一點一滴累積吧!


PRUM 的工程師有 95% 以上都是從零經驗錄取的。
如果可以的話,也歡迎來我們的企業網站逛逛。
企業網站

我們也經營了一個整理工程師實用文章的網站。如果你有興趣,也歡迎看看。
工程師實用文章網站


原文出處:https://qiita.com/masa20057/items/b1a956add6ec342f31b5


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝11   💬10   ❤️1
237
🥈
我愛JS
💬2  
8
🥉
Gigi
2
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登