iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
1

為什麼要從資料結構開始?

任何一堂程式語言課程,在 Tutorial 時常常會讓學習者實作出 Hello World 來體會到程式的奧妙之處,接著會接觸到 NumberBoolean。完成之後開始學習 ArrayObject。那為什麼要這樣設計學習路徑呢?從 JS 來分析會顯得卡卡的,這邊更適合用 C 來分析。

除此之外,讓觀點可以放得更遠一點,這些資料可以分類成:

  • 基本資料型態。
  • 結構化資料型態。
  • 抽象化資料型態。

基本資料型態,Primitive Data Type

C Java JS
整數 Int Int Number
浮點數 Float Float Number
布林值 Boolean(C99 之後,使用時需要 #include <stdbool.h> Boolean Boolean
字元 Char Char 沒有

不論學習什麼語言,這四個幾乎是一開始要接觸學習的概念。JS 沒有字元的概念,而是直接提供進階的型態 String

結構化資料型態,Structured Data Type

C Java JS
陣列 Array Array Array
字串 String String String
指標 Pointer 沒有 沒有
串列 List 沒有,使用 Object 仿照 沒有,使用 Object仿照
結構 Struct Object Object

使用上述結構的原因,在於能夠有效地將相關資料組織在一起,除了讓記憶體的使用可以更為有效率之外,對於工程師來說減輕開發時的困難度。

抽象資料型態,Abstract Data Tye

常見種類 目的 實作
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

如何運用結構化資料型態,不同的需求造就出不同的組合,目的永遠只有一個,讓執行的程式可以持續優化。而資料如何運作也算是一種抽象資料型態。

從記憶體方面可以用另一種看法

  • 基本資料型態,可以看成佔用一格的記憶體
  • 如何組織資料?
    • 圈起一大塊記憶體來儲存資料,那可以使用 ArrayStruct
    • 記憶體無法提供連續的區段,只有不連續的區塊可以使用,那可以用 Pointer 來製作 Linked List,減少記憶體浪費的情況。
    • ArrayLinked List 只能指向一組資料,那能不能同時指向兩組資料呢?於是開發出 Tree
    • 指向兩組資料不滿足,想要指向多組資料,B Tree 為此而生。
    • 除了指向多組資料之外,探討每個節點之間的聯繫,所以有了 Graph

結論

今天快速介紹常見的資料結構,針對結構化資料型態與抽象資料型態,該思考的地方在於:

  • 為什麼要這樣設計?
  • 為什麼這樣的設計大家都心服口服?
  • 優點在哪?
  • 缺點在哪?

舉例來說,Tree 的使用,如果還停留在 ArrayLinked List 的情況,在搜尋特定資料的效率在抵達一個階段後就無法提升。為了有更快的速度才會開發出 Tree 的結構。同理,開發出 B Tree 的原因是要在更大級距的資料內,快速找尋資料。

科技始終來自人性,人性則來自於惰性。

人類的生活永遠在追求更舒適的環境、更快速的裝置,從資料結構的發展史來看,似乎印證這項道理。


上一篇
Day 03: Leetcode 如何測量效率
下一篇
Day 05: Array
系列文
你總是躲不掉的,不如放膽面對 LeetCode 吧!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言