
嗨大家好!我是 Monica,第一天一樣來講講系列文動機與大綱,談談未來的內容規劃。
再次嘗試鐵人賽,希望能藉此督促自己學習新東西~這次的主題很經典也很常見,應該也是被寫到爛的主題了(?),不過這同時也是我認為自己需要補足的部分。
資料結構與演算法是 Computer Science 的基礎知識,我想把這些基礎打好以後,再進一步深入學習其他 CS 知識,因此想藉由這次鐵人賽,把目前學到的內容整理下來。可能整理出來的內容還是很初階,也可能有些內容是很多人早就知道的,但我覺得也無所謂,就單純想把自己目前學到的東西記錄下來!
除此之外,也希望可以試著把這些看起來比較理論的概念,連結到平常比較常接觸的應用,看看它們在實際的程式或系統中可能會以什麼方式出現。不過這些延伸內容應該只會作為簡單補充,畢竟每個主題繼續挖下去,都可以再寫成另一個完整系列(?),很怕自己又不小心挖太多洞 XD。
這個系列也是為了督促自己看完課程,因為我買了 Udemy 的 《Master the Coding Interview: Data Structures + Algorithms》 線上課程,大概斷斷續續看了兩年都還沒看完🫣,想藉此完成它!
因為 Udemy 課程主要使用 JavaScript,而 JavaScript 也是我目前比較熟悉的語言,因此這系列文章會以 JavaScript 來說明概念並撰寫範例程式。雖然要進一步了解底層,應該還是免不了接觸 C 或 C++,但因為自己目前還不熟悉,所以只會視情況加入一些簡單的 C++ 補充,希望也能藉這次機會慢慢學習 ><。
文章會盡量從各種資料結構與演算法想解決的問題出發,介紹基本概念、JavaScript 實作與複雜度分析,也會試著連結一些平常開發中可能見過的應用。整理過程中如果有不懂的地方,也會搭配 AI 工具來輔助我理解及撰寫文章。
很常聽到大家說「資料結構與演算法」,但這到底是什麼呢?在正式進入後面的主題以前,先簡單說明一下這個系列所談的「資料結構」與「演算法」大概是什麼。
演算法(Algorithm)聽起來很複雜,其實可以簡單理解成「一組用來解決特定問題的步驟」。它接收一些輸入資料,按照明確、可執行的步驟進行運算,並在有限的步驟內完成運算,產生預期的輸出。例如,要找出陣列中的最小值,我們可以先將第一個元素當成目前的最小值,再逐一和後面的元素比較;只要遇到更小的值,就更新目前保存的結果。這一連串解決問題的步驟,就是一種演算法。
資料結構(Data Structure)則是程式中組織與保存資料的方式。同一份資料可以用不同形式組織,而資料如何被組織,也會影響我們讀取、搜尋、插入或刪除資料的方式。舉例來說,假設程式中有一組使用者資料:
const users = [
{ id: 1, name: 'Amy' },
{ id: 2, name: 'Ben' },
{ id: 3, name: 'John' },
];
如果使用 Array 保存資料,要根據 id 找到使用者,可以從陣列中逐一尋找:
const targetId = 3;
const user = users.find((item) => item.id === targetId);
但如果程式經常需要根據 id 查找使用者,也可以先將資料整理成以 id 為 key 的 Map:
const usersById = new Map(
users.map((item) => [item.id, item]),
);
const sameUser = usersById.get(targetId);
兩種方式保存的是相同的使用者資料,但資料的組織方式不同,查找資料的方法也會跟著改變。
不過這並不代表 Map 在所有情況下一定比較好。建立額外的 Map 也需要時間與記憶體,如果資料只會被搜尋一次,事先轉換資料不一定划算。真正要考量的是,程式經常進行什麼操作、資料量有多大,以及我們願意付出哪些額外成本。
這也是資料結構與演算法重要的地方,兩者會互相影響,並且需要根據實際需求進行取捨。
再深入看一層,這兩件事分別對應到電腦的兩種基本資源:
也就是說,程式設計師在做的事,是想辦法用有限的儲存與計算資源,把想要的結果算出來。而所謂「妥善使用」也不是說有個標準答案,而是要看情境,譬如說,是希望在很短的時間內算完嗎?還是必須在很小的儲存空間裡完成?
對資料結構與演算法這主題來說,重點並不是「哪個資料結構最好」,而是從中學習如何判斷這情境在意什麼,了解不同方法如何輔助我們達到目標。
因此希望自己在學習資料結構與演算法時,除了認識不同資料結構與運算的時間複雜度外,還能進一步思考:
後續文章會再慢慢展開這些問題,希望自己也能從中逐步培養分析與判斷能力~
這次系列文會以 Udemy 的 《Master the Coding Interview: Data Structures + Algorithms》 課程內容為主,並搭配 《A Common-Sense Guide to Data Structures and Algorithms》 和台大林軒田教授的 《Data Structures and Algorithms》 課程作為部分補充(假設我有看完的話QQ)。
這裡列出目前預計會涵蓋的主題,實際文章名稱與順序可能會隨著撰寫狀況稍微調整。
如果撰寫過程中發現篇幅需要調整,部分主題可能還會再替換,但整體會先以建立基本的 DSA 知識脈絡為主。
資料結構與演算法是一個很經典、範圍也很大的主題,感覺越查資料,越會發現自己不懂的東西還有很多 ><。
自己目前也不能說真的理解所有內容,C++ 和比較深入、理論的演算法分析對我來說也還很陌生,但希望可以盡量以淺顯的方式整理目前學到的知識,慢慢補足 Computer Science 的相關基礎。
總之,希望這次也可以順利完成 30 天🙏
如果之後文章中有任何敘述不清楚或錯誤的地方,也歡迎提出討論~