不知道你是否也曾經有過打開知名題庫網站 LeetCode 心想著要刷題練功,然後開始被一大堆完全沒看過的專有名詞轟炸,然後明明是 Easy 題卻完全沒有頭緒,看到 Two Sum 不知道如何寫出 O(n) 解,然後去看教學文章或影片也是講著這些陌生名詞還是聽不懂,最後默默關掉這個白癡網站。
這次鐵人賽我想寫一些新手向的資料結構和演算法,讓同樣也是非本科的前端工程師對於這些能夠有一定的認識,將來萬一在面試時被問到了一些基本的資料結構和演算法的問題,也不會完全不知所措。
資料結構是資料在電腦中儲存、組織的方式,讓資料可以被有效的使用。
用生活化的例子來說,今天有一個小七店員要把一堆待領的包裹給整理好放到貨架上,他可以把包裹依照大小、重量、形狀或是領貨人的手機號碼等等來分類,這些分類的方式可以看作是一種資料結構。
在電腦科學裡一般我們常見的資料結構有:
不同資料結構有不同的適用場景,例如陣列的讀取速度很快,但是刪除或新增元素的效率就不太好,而鏈結串列的刪除或新增元素的效率就很好,但是讀取的效率就不太好,所以工程師在設計演算法時,如果使用了不適合的資料結構,會讓程式的執行效率變差。
在這次鐵人賽中,我會介紹一些基本的線性資料結構,例如:鏈結串列、堆疊、佇列、雜湊表,以及非線性資料結構,例如:樹、堆積等等。讓大家對這些資料結構有一定的了解,在往後的開發中也可以試著利用這些資料結構的概念或是實作來解決問題。
演算法是一系列的步驟,用來解決特定問題的方法。
演算法其實就是解決特定問題的一種方法或者步驟。它定義了如何從輸入得到輸出,或者如何操作資料結構來達到特定的目標。其與資料結構是密不可分的,如何選擇適合的資料結構,提高演算法的效率,是一個很重要的課題。
我們剛才提到超商貨架,店員要從一堆包裹中找到特定的包裹的過程,就是一個演算法,此時他可以是從頭開始一個一個找,也可以是根據事先做好的分類,直接找到對應的分類,然後再找到對應的包裹,這兩種方式就是兩種不同的演算法,而我們也可以注意到在一開始對所有包裹進行有效且合理的分類,會對於在尋找特定包裹時有很大的幫助,這就是前面說的選擇合適的資料結構會讓我們的演算法效率更高,也是為什麼這兩者是密不可分的原因。
那麼我們要怎麼知道這個演算法是不是一個好的演算法呢?我們可以利用時間複雜度(Time Complexity)和空間複雜度(Space Complexity)來衡量一個演算法的好壞。而這兩個概念我會在明天的文章中做更詳細的介紹。