前言
以前在電機系時系上就有開過這門課,記得是以 C++來教授的,不過自己那時對於程式完全沒興趣,因此直到畢業時都不知道這門課到底在做甚麼。多年後在巧合下決定轉職前端,又跟程式走到了一塊,想起來也是蠻有趣的。
資料結構(Data Structure)與演算法(Algorithm) 是電腦科學(Computer Science)和資訊相關科系的基礎必修課之一,由此可知這門課的重要性。許多學校使用 C/C++ 或是 Java 進行教學,而在對語言掌握度不夠情況下,其實是蠻難將這門課程學好的。相比之下,JavaScript 的輕量及搭配瀏覽器作為開發環境的特性,使得學習資料結構和演算法變得單純許多,接下來的一系列文章將會使用 JavaScript 實作經典資料結構和演算法…
…
…
…
看到這邊大家應該會想說怎麼還沒開始,上面這段不就是標準開場了嗎 ?
先等等,在正式開始之前,想跟大家討論一個問題:
為什麼我們要學習資料結構及演算法?
是因為面試會考嗎?恩其實這也可以算是一個答案,結合網路上的分享以及自身的經驗,在面試前刷刷演算法題目,面試時確實能夠提升解題的能力。但在這邊我想分享一下自己多方觀察後得到的結果: 想在程式這條路上走得比人家遠、看得比別人廣的話,務必要學好資料結構及演算法。
當你在撰寫程式時,如果資料量小的話,也許你用物件或者陣列就可以輕鬆處理掉了,但要是資料量龐大的情況呢?使用一樣的方法會不會導致存取困難、效率低下?有沒有甚麼更好的寫法能達成你需要的功能呢?別人又是怎麼寫的呢?
引用胡立在 這篇文章 的結尾所說,如何看透問題的本質並且衡量各種解法的優缺點,才是真正的核心競爭力。資料結構與演算法提供我們一種解決問題的思路和方法,並且有機會撰寫出效率更好的程式碼,而掌握了基礎概念後,也才有機會看的懂其他高手的開源程式碼並拿來應用。好了,前言大概就到這邊,讓我們繼續往下吧!
需要具備的條件
要實作資料結構及演算法需要對於操作的語言有一定的掌握度,在這邊列出幾個我認為比較需要先掌握的觀念,避免在學習的過程中因基礎不穩而導致成效不佳:
- 知道陣列( Array )以及能使用基本的陣列方法
- 了解物件( Object )及其基本的操作
- 具有物件導向的基本概念
- 基本的 ES6 概念
- 知道甚麼是遞迴(Recursion)
前面兩項主要是基本操作,大概是知道有哪些方法、能夠自行查詢文件並使用即可。物件導向的話則需要多熟悉些,特別是建構式部分,因為在 JavaScript 中,幾乎所有的資料結構都得透過將建構式實體化來進行實作;此外實作演算法時有蠻多的地方會使用到遞迴,因此也需要有基本的認識。
目錄
目前規劃的文章目錄如下:
1. 演算法與大O符號( 連結 )
2. 搜尋:線性/二分(連結)
3-1. 排序1: 冒泡/選擇/插入 (連結)
3-2. 排序2: 合併/快速 (連結)
4. 資料結構: 鏈結串列 (連結)
5. 資料結構: 堆疊/佇列 (連結)
6. 資料結構: 集合 (連結)
7. 資料結構: 雜湊表 (連結)
8. 資料結構: 樹 - 二元樹、二元搜尋樹 (連結)
9. 資料結構: 圖形 - 深度優先、廣度優先 (連結)
10.動態規劃 (連結)
首先會講到演算法與大 O 符號,定義與解釋完什麼是演算法後會進入到大 O 符號,大 O 符號提供了一種指標讓我們能評估一個演算法的效能,而其在後續演算法的文章中也將不斷的出現。再來會進入到搜尋及排序的部分,搜尋會講到常用的線性以及二分搜尋,排序則是從基本的冒泡/選擇/插入排序開始,進階到合併/快速排序。接著會進入資料結構的部分,將從有序的資料結構,到無序的實作;最後是動態規劃的部分,透過將一個問題分解成若干的子問題並逐一求解,讓我們能夠解決較為複雜的問題。後續若有足夠的時間,會再加入其他的部分做補充,現在就讓我們開始用 JavaScript 實做資料結構及演算法吧 !