iT邦幫忙

2026 iThome 鐵人賽

DAY 30
1
Software Development

30 天的資料結構與演算法之旅系列 第 30 篇

[Day 30] 系列文總結與完賽心得

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20261014/20168201H97FoySiKu.png

這是第三次參與鐵人賽,很感動終於完成了🫠!

系列文總結

先來回顧一下此次系列文包含的主題:

資料結構與演算法初探

Array、搜尋與索引

Linear Data Structures

Recursion 與排序演算法

Tree

Graph 與 Dynamic Programming

總結

這系列文一開始是因為自己想完成 Udemy 的 《Master the Coding Interview: Data Structures + Algorithms》線上課程,所以主題主要圍繞它,後來覺得可能相關知識不夠,又去讀了《A Common-Sense Guide to Data Structures and Algorithms》這本書,A Common-Sense Guide 的寫法很淺顯易懂,也有很多好理解的示意圖,不過我還是想有比較紮實的理解,所以又去上了台大林軒田教授放在 YouTube 的 《Data Structures and Algorithms》 課程,這對我來說就有點硬了XD。原本預計是三個學習資源都要完整看完,但後來因為有其他事要忙,只完成前兩者,台大的課程還在努力中QQ,希望近期也能把它上完~

資料結構與演算法(以下簡稱 DSA)是個有很多技術細節可深入研究的主題,這系列文只是以我讀的書、上的課為主來整理,可能有些不夠深入,但也希望能作為自己入門這個主題的學習筆記。此外,後來因時間關係,沒能學習並寫到更多 C++ 語言的部分,這也和一開始的規劃有些不同><但還是希望大家能藉這個系列初步認識 DSA~

那些沒寫到的遺珠

如上所述,這次是圍繞幾個主要學習資源來寫,但時間心力有限,要在 30 天內涵蓋所有內容並不容易,難免有所取捨。有些原本規劃要提的沒有寫出來,或因為自己還不夠理解,所以只先大致帶過,例如:

  • Heap Sort:Day 22 只在最後帶到做法,Udemy 課程其實還討論了為什麼它平均比 Quick Sort 慢,這部分其實也很值得再仔細介紹。
  • Radix Sort / Counting Sort:Day 18 有提到它們不靠兩兩比較、成本和鍵值範圍有關,但實際一步步怎麼排、程式怎麼寫都還沒寫到,之後有機會想再研究看看!
  • Bellman-Ford:Day 27 只稍微提到 weight 有負數時,可以改用 Bellman-Ford,但沒仔細介紹它的做法,如果能完整介紹再和 Dijkstra 比較,應該會更清楚兩者的差別。
  • AVL Tree / Red-Black Tree:Day 21 只提到它們會自己調整形狀,但怎麼調整(rotation)沒有說明,這是 Tree 主題很常聽到的詞彙,我自己也還不夠理解,希望之後能補上~

進階與延伸學習

上述遺珠有些也是我還不夠理解、需要再進一步學習的。除此之外,DSA 還有很多深入的技術主題可以探討,以下列出幾個這次學習資源沒有涵蓋、但也很常看到的主題:

  • Dynamic Array 與 Amortized Analysis:Day 05 提到 Array 空間不夠時,要另外找一段更大的空間、把元素整批複製過去,Amortized Analysis 就是用來說明這種「偶爾很慢、平均起來仍很快」的成本。
  • Topological Sort:把有先後依賴的工作排出順序,例如套件的 build 順序或課程的先修關係,可以接在 Day 24~26 的 Graph 與走訪之後。
  • Union-Find 與 Minimum Spanning Tree:前者判斷兩個點是否已經連通,後者找出把所有點連起來、總 weight 最低的那組 edge,都是 Graph 很常見的主題。
  • B-Tree:Day 08 介紹 PostgreSQL 索引類型時有出現這名詞,它是為了減少讀取硬碟次數而設計的多分支 Tree,資料庫索引很常使用。
  • Skip List:在 Linked List 上隨機疊出多層捷徑,達到接近平衡 BST 的搜尋效率,Redis 的 Sorted Set 就有用到它。

如果對 DSA 有更多興趣,以下也列一些可以參考的資源,這也是我的待讀清單(待讀清單隨著鐵人賽持續增加中,哈哈哈嗚嗚嗚...):

資料結構與演算法,然後呢?

應該很多人接觸 DSA 是為了刷 LeetCode,我一開始也是,想說先對這主題有大致了解後再開始刷題。不過寫完這系列文後,我覺得自己並沒有因此精通 LeetCode,畢竟刷題和學 DSA 需要不同的策略和角度,但也許以後看題目時會比以前稍微🤏有概念一點嗎(?

雖然不是刷題大師,但我仍然藉這次機會多認識了一些日常應用背後的實作,了解它們可能和哪些資料結構或演算法有關,也從中學到分析程式複雜度的方法,也算有點收穫了><

去年寫 FP 系列文時,我提到學會 FP 讓我多了另一種看待問題的角度,並且能應用到日常開發上,與 FP 這主題相比,我覺得我在 DSA 這領域上並沒有那麼精熟。現在有了 AI Agent 後,大部分人應該幾乎不再手寫程式了,但我想 DSA 這些基礎核心的東西仍有其重要性,軟體工程師也許不寫程式,但仍然要是能解決問題的人,多了解 DSA,思考問題時就會有更多考量面向與可行解方,我覺得這就像工具包的概念吧~它會隨著自己的學習與成長變得多元豐富,能解決的問題也會跟著變多,希望自己能繼續努力延伸學習~!

完賽心得

這次參賽前沒有太多糾結,但過程一樣非常痛苦,尤其演算法分析涉及一些數學的東西,看得頭很痛,相關讀物也是讀不完...。

另外,這次文章架構也有部分參考去年的寫法,以 Huli 大大在跟著小明一起搞懂技術名詞:MVC、SPA 與 SSR文章最後提到的方式來介紹每個主題:

我們可以用三個問題來幫助自己理解一項事物:

  1. 為什麼要有 XXX?
  2. 沒有 XXX 跟有 XXX 的區別是什麼?
  3. 所以 XXX 是什麼?

但這次不是每篇都依循這脈絡,因為我也參考了 EduHub 的 Concept Explainer skill,先從類比、一句話定義開始,再逐漸進入主題,希望還算好理解~

參賽心態與雞湯

其實我今年的狀態一直不是很好,身心都很疲憊,求職上也有點挫折,好像還沒找到生活、工作、學習,又或是整個職涯上的平衡與方向。這次寫鐵人賽時也同時在忙別的事情,因此有些主題來不及好好查資料、深入學習。總是很忙碌地追趕著什麼,卻又感覺什麼都沒有(?,這陣子真的十分迷茫...因此,我們還是要再次重複雞湯!(突然的轉折🤣)

🚀先寫就對了

沒時間心力研究太多也無所謂,就先把目前學到的寫下來就好!

🚀回到參賽目標

DSA 是每屆鐵人賽都會看到的主題,今年也看到很多優秀大大寫了這個題目,非常佩服。但回到自己的參賽目標,我想做的是上完《Master the Coding Interview: Data Structures + Algorithms》線上課程、讀完《A Common-Sense Guide to Data Structures and Algorithms》這本書,以及上完台大林軒田教授的課程。雖然台大課程還沒上完,但有達到部分目標就很棒了~

🚀沒有人一開始就很厲害,但要開始才有辦法很厲害

小小的進展也許看起來沒什麼,但相信自己每天一點點的學習都是累積,至少跟去年相比,我又多認識了 DSA 一點了!

🚀為自己而學

即使現在 AI 已經很擅長寫程式、解 LeetCode 題,學 DSA 仍然有它的收穫,不一定是知識本身,也可能是從更多觀點思考的判斷力。學習是為了自己,重點是我有從中學到一些新東西,那就足夠了~

🚀其他勵志雞湯們

這陣子最喜歡的還是馬男波傑克的台詞:「It gets easier. Every day it gets a little easier. But you gotta do it every day — that's the hard part. But it does get easier.」每次覺得自己要不行了,都會默默重複的一句話。也許我學習與成長的步伐不快,但要相信一點一滴累積的力量!會越來越好的💪

完賽收穫

為了完成系列文,我學到一些書中沒提到的知識,例如 V8 的 Array.prototype.sort 怎麼依陣列長度選擇排序方式、垃圾回收怎麼標記還在使用的物件。雖然和平常開發沒有直接相關,但看到 V8 為了效能做的這些處理就覺得蠻有趣的(有些真的好複雜哇),以實際應用為動機來接觸、學習 DSA,也讓它變得沒那麼遙遠。

另外這次文章也有很多示意圖,DSA 不少概念都很適合搭配圖來說明。本來想自己畫的,無奈這次真的太忙了QQ,就請 Claude Code 參考我過去畫的圖來繪製,來回也調整了很多次,希望大家會喜歡這次的圖~


最後的最後,給自己還有參賽的大家大大的掌聲吧!堅持 30 天真的不容易~即使有了 AI 能加速文章產出,但還是要先理解內容,才能進一步組織成文章,這也是很不簡單的事👍

如果你喜歡我的系列文,可以多多分享,文章中有任何敘述不清或錯誤的地方,都歡迎指教與討論!

若有興趣,也可以追蹤我的 Medium,另外我也建立好個人部落格啦!雖然鐵人賽文章還沒搬過去,但部落格會和 Medium 文章同步更新,也歡迎逛逛😆

希望這次資料結構與演算法之旅還算充實,謝謝大家,我們下次見👋🏻


上一篇
[Day 29] 優化程式的小技巧
系列文
30 天的資料結構與演算法之旅 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言