避免有人沒看到介紹,讓我再說一次這次 30 篇的緣起(是很懶的複製貼上):
最近有工作方面的需求,需要對演算法更熟悉,也就是俗稱的刷題。在自我練習的過程中,希望能留些紀錄當作筆記釐清自己的思緒、完善思考結構。就像一開始不熟悉狗狗的時候可能覺得惡犬勿進,熟悉了之後就變成了好夥伴,讓我們用 30 天一起好好跟這隻 Algo 培養感情吧。
※本主題以分類介紹各種演算法基礎為主,並非高難度的算法探討
一如跟狗狗建立感情要循序漸進一樣,演算法可能很多人的瓶頸會是在動態規劃、高級資料結構等等,如果你很確定你前面已經熟稔,那從難度高練習的無妨,但可以的話,也許也從基本資料結構特性、衍生算法開始慢慢練習,會讓你在面對高難度題目的核心思路更有底氣。
個人的主力使用語言是 C#,本次 30 天的內容如果有需要,會以 C# 為主要展示語言,但應該會有不少是寫虛擬碼(pseudocode)的時候,更著重在思考邏輯上。配題網站會使用 Leetcode 為主。如果你真的需要其他語言的版本,我會推薦你把 C# 的程式碼直接貼到 Chatgpt 去讓他幫你翻譯,準確度應該大差不差,可能就細節還差點火侯。
對一般對接 API 的工程師、開發一般需求的工程師而言,或許演算法是個聽的到,學習過,但總覺得工作上用不上的主題。大多數人總是在找工作的時候,覺得公司面試的考察重點會以演算法為主題,所以開始刷題,但又覺得工作用不到,厭惡這種為刷而刷的行為。
老實說筆者這篇的緣起也是因為近期有找工作需求才會開始重刷演算法,但這次我自己希望能夠換個心態:除了為刷而刷以外,也想想演算法被拿來當作考察的原因‧對一間對你一無所知的公司而言,演算法裡面包含的資料結構使用方法、邏輯思考能力、看到題目的分析能力,都是能夠更了解你的思考邏輯、語言熟悉度的方式。不只是最後寫出什麼,我相信確認你的思路、解題過程中的討論也是很重要的。
簡單的說,我個人認為的好處是,幫助你重新梳理邏輯思考能力、面對問題能夠系統性的思考、根據需求找到合適的資料結構以及使用技巧,來優化你的解決方案的練習過程。對每個人而言,認為的好處可能都不一樣,你也可以為自己想想,如果除了面試以外,你還能從這些演算法練習刷題的過程中得到什麼。
一如上面提到的,資料結構會是演算法的核心之一,如果說演算法是畫技,資料結構就是材料,空有畫技,不知道怎麼善用材料,也沒有辦法畫出一幅好畫(解決方法)。用資料結構來分練習模式,其實也是很棒的方式。
在這 30 天內,我尚無法說到很準確地每天會練習什麼,僅能用我參考自各種文章的分類法,加上自己的考量調整、大致會以下面的方式來練習(會提到中國翻譯上不同的名詞,只會這邊出現一次,方便參考中文資源的人能夠確認兩邊名詞對照):
演算法為主題
初步列出大綱後可能還會有調整,有機會我再回頭調整這邊的編排,以上不代表實際一項對應到一篇文章,也有可能有複數項綜合的狀況,或者針對以上條目做增修刪減。
分出這些類的目的是幫助我們在面對未知題目的時候更能系統思考,透過了解且大量的去刷同一類的題目,我們能夠建立起熟悉度與手感(直覺),避免盲目刷題,刷的題數是多了,但總覺得能力沒有進步。
一如如果你今天看到一題他的題目是要用陣列,你可能就會先冒出一些算法作為選擇,參考題目提示/限制如 In Place、無重複、時間複雜度 / 空間複雜度等等,又可以從選擇中做限縮。如果腦袋裡沒有選擇,那也談不上解題了。
對程式語言有基本能力,對資料結構有基本了解,想要系統性的了解演算法選擇跟原因的人。如果完全沒有程式基礎,建議從其他基礎打起,不然會讀得比較辛苦,我也不會就太基本的部分著墨太多。如果你是想找個能陪你好好刷題的系列文章,請按下你的訂閱,你找對地方了,讓我們一起用 30 天把各個主體好好了解一下。
網路上各種來源的演算法刷題綱要不勝枚舉,就像這篇一樣,其實找到一篇你能看得下去的,好好跟著一起練習就好了。這 30 天的文章輸出其實也是一種對自己的督促,希望自己能好好地完賽,把自己的思考方式寫下來。
嚕狗的路上有你有我,帶著 Algo 去散步吧。