JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

什麼是資料結構?

演算法作用*於*資料——所以你怎麼存放這些資料,悄悄地決定了什麼輕鬆、什麼痛苦。這篇導讀引入**資料結構**:你組織資訊的方式。我們會把一個結構*承諾*什麼,跟它*怎麼*搭起來分開,並先瞄一眼你最常用的三種。

東西放在哪裡,決定了一切

想像兩個廚房。第一個裡,每一種香料都按字母順序立在貼了標籤的架子上。第二個裡,所有香料一股腦倒進一個大抽屜。兩邊*裝的*是同樣的香料——可在一個廚房裡拿孜然只需瞄一眼,在另一個裡卻得煩躁地翻找。香料就是你的資料。架子還是抽屜的這個選擇,就是你的[[data-structure|資料結構]]:你安排資訊、以便處理它的方式。

這是上一篇的搭檔觀念。演算法是那些步驟;資料結構則是這些步驟運行時,*資料所棲身的形狀*。而形狀關係重大:一本按姓名排序的電話簿能讓你幾秒鐘找到一個人,可如果你手上只有*號碼*、想反查姓名,那同一本按姓名排序的簿子就幾乎沒用了。不存在唯一最好的結構——只有最適合你最常問的那些問題的結構。

承諾與機器(抽象資料型別與實作)

這裡藏著一個有用的區分。一邊是*承諾*:「你可以加入一項、移除一項,還能問一共有多少項。」這份操作清單連同它們的含義——隻字不提內部是怎麼搭的——就叫[[abstract-data-type|抽象資料型別]](ADT)。另一邊是*機器*:記憶體裡真正兌現這份承諾的螺絲與齒輪。那就是實作

想像一台自動售貨機。承諾很簡單:按下編號、投幣、零食掉出來。它*怎麼*做到的——螺旋貨道、感測器、一個小馬達——都藏在玻璃後面,而你並不在乎,只要零食出來就行。ADT 就是機器的正面;實作就是玻璃後面的一切。同一個承諾(一份「東西的清單」)可以由很不一樣的機器來兌現(一個陣列,或一串鏈起來的小盒子),各有各的代價。

你最先遇到的三種:陣列、串列、映射

今天你不必把它們全學會——只是先看一眼,好讓這些名字日後顯得熟悉。[[dsa-array|陣列]]是一排編號為 0、1、2…… 的格子;直接跳到第 5 格,值就*在那裡*,瞬間到手。串列是一串鏈起來的項,容易增長和重排,但你得一節一節地走過去。映射(也叫字典)存的是*鍵 → 值*的成對關係,就像一個單字連著它的釋義,於是你按名字、而非按位置去查找。

array:   [ A | B | C | D | E ]      jump to index 3 -> D  (instant)
           0   1   2   3   4

list:    A -> B -> C -> D -> E      walk from A to reach D (4 steps)

map:     "cat" -> 9                 look up by the key "cat", not a number
         "dog" -> 4
         "fox" -> 7
同樣的五個值,三種形狀。陣列一步就能到任意格;串列必須一節節走;映射按名字找東西。不同的形狀讓不同的活兒變得容易。

這幾種之後都會各有一篇導讀。眼下要帶走的,是道理而非細節:你選的結構,決定了哪些操作便宜、哪些操作昂貴。選得好,就完成了寫出快程式的一半——而要*度量*便宜與昂貴,我們需要下一篇所講的那套語言。