進入 JavaScript 主題的第一站,先寫個面試常見的快速排序法(Quick Sort),順便聊聊「為什麼要練習演算法」。
快速排序法#
由小到大的版本:
function quickSort(arr) {
if (arr.length < 2) return arr;
const [p, ...ary] = arr;
const left = [],
right = [];
ary.forEach((c) => {
if (c < p) left.push(c);
else right.push(c);
});
return [...quickSort(left), p, ...quickSort(right)];
}用的空間有點多,這版本不是原地交換的版本。
快速排序的基本概念:
- 挑出一個 樞紐(pivot)
- 其他元素與樞紐比較:由小到大時,比樞紐小的往前放、大的往後放,樞紐位置同時也固定下來
- 對「比它大的部分」及「比它小的部分」遞迴執行
- 直到陣列為空或只有一個元素就直接回傳
演算法#
先思考一下,演算法的本質是什麼?其實就只是前人經驗與智慧的累積,是一些優秀的解決問題的方法。
如果能理解各個演算法的思考過程,遇到合適的情境便能套用,甚至觸類旁通,思考出更好的解決方案;例如 Tim Peters 將 Merge sort 與 Insertion sort 的優點結合,利用原始資料中連續升序或降序的片段,進一步優化了排序,發明了 Timsort。
換言之,學習演算法,就如同是在學習高手們的思考方式,讓你在面對問題時,能找出更「聰明」的解決方法。
面試#
那為什麼許多公司行號的面試都喜歡考演算法呢?作者認為有兩種可能:
- 把演算法當成一種門檻,認為熟知這些是這個職位的基本條件。
- 藉由一個已知最佳解的問題,鑑定求職者的邏輯是否正確、思路是否靈活清晰。
第 1 種情況的公司其實不少,可能一些熱門的職位求職者眾多,徵才方希望透過設定好的門檻,快速篩選出合適的人選。
第 2 種情況,通常就是讓許多求職者感到害怕的現場筆試甚至白板題;但從徵才方的角度思考一下,其實也不用太過害怕,畢竟就只是想看你的思考邏輯,而不是要你一口氣默寫出最佳解,通常面試官也會給予適當的引導。
刻意練習#
當然,有公司會考就有人會準備,訪間也有許多練習演算法的解題網站:
- LeetCode:網羅全球各大公司的面試考古題,解題後能看到解題時間等指標,付費版甚至有模擬面試。
- CodeWars:多了經驗值、等級、戰隊、排行榜等遊戲化要素,並開放讓所有使用者自創題目,除了基本演算法題型外,還有各種產業可能遇到的真實問題。
刻意練習是很重要的事情,畢竟只是讀過看過,並不能讓人真正學會一件新事物。
目的只是通過面試的刻意練習演算法,是毫無意義的。透過大量刷題也許可以熟記這些考古題的題型,但如果不能真正的認識、理解、掌握,進而內化成自己的功力,最終也只是淪為背誦答案的考試機器。
結語#
演算法與資料結構是軟體工程的基礎學科,掌握其中知識是職涯發展的必經之路。為了求職刷好刷滿,比不上為了讓自己更強而刻意練習。
原文出處#
- 原書/iThome:https://ithelp.ithome.com.tw/articles/10219151