任何一堂程式語言課程,在 Tutorial 時常常會讓學習者實作出 Hello World
來體會到程式的奧妙之處,接著會接觸到 Number
、Boolean
。完成之後開始學習 Array
、Object
。那為什麼要這樣設計學習路徑呢?從 JS
來分析會顯得卡卡的,這邊更適合用 C
來分析。
除此之外,讓觀點可以放得更遠一點,這些資料可以分類成:
C | Java | JS | |
---|---|---|---|
整數 | Int | Int | Number |
浮點數 | Float | Float | Number |
布林值 | Boolean(C99 之後,使用時需要 #include <stdbool.h> ) |
Boolean | Boolean |
字元 | Char | Char | 沒有 |
不論學習什麼語言,這四個幾乎是一開始要接觸學習的概念。JS
沒有字元的概念,而是直接提供進階的型態 String
。
C | Java | JS | |
---|---|---|---|
陣列 | Array | Array | Array |
字串 | String | String | String |
指標 | Pointer | 沒有 | 沒有 |
串列 | List | 沒有,使用 Object 仿照 | 沒有,使用 Object仿照 |
結構 | Struct | Object | Object |
使用上述結構的原因,在於能夠有效地將相關資料組織在一起,除了讓記憶體的使用可以更為有效率之外,對於工程師來說減輕開發時的困難度。
常見種類 | 目的 | 實作 |
---|---|---|
Stack | 後進先出的資料運作方式(Last In, First Out) | Array、List |
Queue | 先進先出的資料運作方式(First In,m First Out) | Array、List |
Tree | 一個節點可以同時指向兩個不同節點的資料運作方式 | Array、List |
Heap | Tree 的特殊種類,讓樹的節點組成,不是由小到大就是由大到小排列的節點 | Array、List |
Graph | Tree 的進化形態,探討節點之間的加權值 | Array、List |
如何運用結構化資料型態,不同的需求造就出不同的組合,目的永遠只有一個,讓執行的程式可以持續優化。而資料如何運作也算是一種抽象資料型態。
Array
與 Struct
。Pointer
來製作 Linked List
,減少記憶體浪費的情況。Array
與 Linked List
只能指向一組資料,那能不能同時指向兩組資料呢?於是開發出 Tree
。B Tree
為此而生。Graph
。今天快速介紹常見的資料結構,針對結構化資料型態與抽象資料型態,該思考的地方在於:
舉例來說,Tree
的使用,如果還停留在 Array
與 Linked List
的情況,在搜尋特定資料的效率在抵達一個階段後就無法提升。為了有更快的速度才會開發出 Tree
的結構。同理,開發出 B Tree
的原因是要在更大級距的資料內,快速找尋資料。
科技始終來自人性,人性則來自於惰性。
人類的生活永遠在追求更舒適的環境、更快速的裝置,從資料結構的發展史來看,似乎印證這項道理。