【學習筆記 - DSA】用公司工作流程,理解資料結構

更新 發佈閱讀 8 分鐘

什麼是資料結構

資料結構是資料在記憶體中的組織方式,包含資料的集合、彼此之間的關係,以及可以對這些資料進行的操作。

資料結構很像「收納」。
記憶體就像收納空間,資料是被收納的物品,而資料結構就是收納的方式。

在有限的空間下,不同的收納方式,會影響我們找資料的速度、使用的空間大小,以及新增或移除資料的成本。

資料結構的選擇,本質上就是在「找得快」和「用得省」之間做取捨。

vocus|新世代的創作平台


Array|座位表式的管理

比喻情境

在公司剛成立、人數還不多的時候,人資最喜歡做的一件事就是「排座位表」。每個人都有固定座位,第 1 位、第 2 位、第 3 位清清楚楚。主管只要說:「幫我找第 15 位同事」,行政立刻知道要走到哪一排、哪一個位置。這種管理方式的優點非常明確:找人快
因為位置是固定的,不用問、不用查關係,只看編號就好。但當問題來了,如果中間突然多了一位新人,或某個人離職,整排座位就要重排。不是不能改,只是改動成本很高

Array 就像這樣的座位表:用「固定、連續的位置」,換取最快的存取速度。

圖解概念

  • 存取:數據以連續方式存於記憶體中,可用索引計算位置 → 隨機存取 O(1)
  • vocus|新世代的創作平台
  • 新增:確保後方有空間 → 後方元素依次後移 → 插入新元素 (O(n))
    • 新增一個空間,在位置 1 加入黃色,後面的球會向後移動
    vocus|新世代的創作平台
  • 刪除:移除元素 → 後方元素依次前移 → 收尾 (O(n))
    • 移除綠色的球後,藍色球會向前移動,並把多餘的空間移除
    vocus|新世代的創作平台

    Linked List|交接清單式的流程

比喻情境

有些公司不排座位表,而是用「工作交接清單」。每一位負責人只知道兩件事:
1. 我現在負責什麼
2. 下一棒是誰
事情要找誰,就從第一位開始,一個一個往下問。這樣找人不算快,但有一個很大的好處:流程很容易調整。如果中間要插入一個新角色,只要改交接對象就好;某個人離開,也只需要重新接上下一棒。

Linked List 就是這種概念:不追求快速定位,而是讓結構保持彈性。

圖解概念

  • 每個資料都會有對應的指標,指標會指向下一個數據的記憶體位置(數據不一定會以連續的方式存在記憶體,可能會分散在不同的領域)
  • vocus|新世代的創作平台
  • 存取:只能依序從頭跟著指標存取(sequential access)O(n)
    • 存取藍球,需從紅球開始
    vocus|新世代的創作平台
  • 新增:只需要把新數據前後指標轉向即可 O(1)
    • 將黃球加入並指向綠球,紅色指標改指黃球
    vocus|新世代的創作平台
  • 刪除:只需要把指標轉向即可 O(1)
    • 綠球可能還在記憶體中,但已變成無法存取的狀態,可不用特地移除
    vocus|新世代的創作平台

    Stack|主管桌上的待辦事項

比喻情境

想像主管桌上有一疊文件。新的事情來了,就直接放在最上面;要處理事情,也一定是從最上面那一份開始。為什麼?因為那通常是「剛剛才發生、最需要立刻回應的事」。舊的事情沒有不重要,只是要等最新的處理完,才輪得到。

Stack 就像這疊文件:你永遠只處理「最後進來的那一件」。

圖解概念

  • 推入:只能加在最上面,將數據加到堆疊的操作稱為 Psuh
    • 將黃球推入 stacks 中
    vocus|新世代的創作平台
  • 彈出:只能從在最上面, 將數據移出到堆疊的操作稱為 Pop
    • 將黃球彈出 stack
    vocus|新世代的創作平台

    Queue|客服或簽核流程

比喻情境

客服中心的電話不可能讓人插隊。誰先打進來,就先被服務;新來的,只能乖乖排在後面。這樣做也許不是最快,但最公平、最穩定,也最容易讓整個系統持續運作。

Queue 就是這樣的流程:順序比速度更重要。

圖解概念

  • 輸入:只能加在最後端,將數據加到佇列的操作稱為 enqueue
    • 將黃球加入佇列
    vocus|新世代的創作平台
  • 輸出:只能從在最前端,將數據移出到佇列的操作稱為 dequeue
    • 輸出時,只能存最前端的紅球先輸出
    vocus|新世代的創作平台

    Hash Table|用員工編號找人

比喻情境

如果公司已經有上百、上千人,還要一個一個翻名冊找人,效率一定很差。所以公司會給每個人一個員工編號。只要輸入編號,系統立刻知道這個人是誰、在哪個部門。你不需要知道他在第幾頁、排第幾個,只要 key 正確,就能直接命中

Hash 解決的就是這件事:不用照順序,只求快速對應。

圖解概念

  • Hash Table
    • 數據為鍵值對(key-value pairs)
    • Hash Function: 計算出雜湊值,再計算出索引(index)
    • 會在記憶體先準備一定長度的空陣列
    vocus|新世代的創作平台
  • 碰撞:
    • 放入資料的過程中,可能會發生計算出相同索引的狀況,稱為碰撞Collision
      • Bob 與 Amy 因為計算出雜湊值相同而發生碰撞
      vocus|新世代的創作平台
      • 使用列表( Linked List)接續在已存入的數據後面。這裡用鏈結法(chaining)
      vocus|新世代的創作平台
  • 存取:將輸入值(key)使用雜湊函式計算出雜湊值,計算出索引,找到對應資料的位置
    • 如果找 Amy 則會多一個線性搜尋的步驟
    vocus|新世代的創作平台

    Heap|老闆的優先事項清單

情境比喻

老闆每天收到一堆事情,但他其實只在乎一件事:「現在最重要的是什麼?」
他不會把事情全部排好順序,而是確保「最重要的那一件,隨時都在最前面」。處理完一件,再看看下一件最重要的是誰。

Heap 就像這個清單:不排序全部,只確保優先權正確。


圖解概念

  • Heap
    • 樹狀結構,最多有兩個子節點
    • 順序規則,由上方開始加入,位處同階層時,由左方開始加入(灰色數字)
    • 堆疊規則,父節點永遠小於子節點(最小二元堆積)
    vocus|新世代的創作平台
  • 新增:
    • 依照規則填到最下面階層的空位
      • 將 5 加入到位置 7
    • 不符合堆積規格,與父節點對調(bubble up)
      • 將 6 與 5 互換
    vocus|新世代的創作平台
  • 取值:
    • 最上面為最小的數值
    • 將最尾端的數值移到最上方
      • 將位置 7 回補到位置 1
    • 開始下沉(sink down),與較小的一邊對調
      • 6 比子節點 3 大,所以互換。6 還是比子節點 4 大,所以再互換
    vocus|新世代的創作平台

    Binary Tree|會自己長大的分類系統

比喻情境

當公司要管理越來越多資料時,與其每次新增就重新整理,不如先訂好分類規則。
例如:金額小的放左邊,大的放右邊;再在各自底下,繼續細分。
每一筆新資料進來,只要照著規則一路往下,自然就會找到屬於自己的位置。當你要找資料時,也只要走同樣的路,每走一層,就排除一半不可能。

Binary Search Tree 描述的正是這總結:一邊成長,一邊維持搜尋與插入的效率。

圖解概念

  • Binary Tree
    • 將數據從存到節點內,每個節點最多兩個子節點
    vocus|新世代的創作平台
    • 所有節點的數值都會大於連結在其左邊的節點的數值
      • 從根節點往左的最尾端,即為此二元樹的值最小的節點
      vocus|新世代的創作平台
    • 所有節點的數值都會小於連結在其右邊的節點的數值
      • 從根節點往右的最尾端,即為此二元樹的值最大的節點
      vocus|新世代的創作平台
  • 新增:一路從根節點尋找應該追加的位置,直到最末端(小往左,大往右)
    • 當加入 1 時,比 15 小往左,以此類推
    • 當加入 4 時,其中比 3 大,所以往右,其他都是往左
    vocus|新世代的創作平台
  • 刪除:
    • 如果沒有子節點,直接移除即可
    • 如果有子節點,移除節點後,從子樹狀圖找到最大節點,移到父樹狀結構
    vocus|新世代的創作平台
  • 搜尋:按照規則小往左,大往右


留言
avatar-img
樹杷林柳橙誌
1會員
6內容數
記錄生活、思考、心得
你可能也想看
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
Prefix Sum(前綴和)是一種用於計算陣列中任意區間和的高效方法。 前綴和算是一種犧牲空間換取時間效能提升的策略。 這在需要頻繁查詢區間和的情況下特別有用。 一開始,初始化時花費O(n)時間,掃描每個元素累加,建立一個prefix sum table, 接著,提供query介面查詢區間和
Thumbnail
Prefix Sum(前綴和)是一種用於計算陣列中任意區間和的高效方法。 前綴和算是一種犧牲空間換取時間效能提升的策略。 這在需要頻繁查詢區間和的情況下特別有用。 一開始,初始化時花費O(n)時間,掃描每個元素累加,建立一個prefix sum table, 接著,提供query介面查詢區間和
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
深入探討圖(Graph)的基本概念 及 最短路徑Shortest Path的尋找。 我們專注於廣度優先搜尋(BFS)演算法,以等權圖的最短路徑為例, 詳細說明如何利用BFS從起點擴散到終點,並且提供詳細的程式碼範例。 透過實作,讀者能夠更清楚理解圖論及BFS的應用,並體會水波紋擴散模型的重要性。
Thumbnail
深入探討圖(Graph)的基本概念 及 最短路徑Shortest Path的尋找。 我們專注於廣度優先搜尋(BFS)演算法,以等權圖的最短路徑為例, 詳細說明如何利用BFS從起點擴散到終點,並且提供詳細的程式碼範例。 透過實作,讀者能夠更清楚理解圖論及BFS的應用,並體會水波紋擴散模型的重要性。
Thumbnail
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Queue(佇列 或稱 隊列)。
Thumbnail
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Queue(佇列 或稱 隊列)。
Thumbnail
接著來進入圖論的重點之一,Tree與Binary Tree。 二元樹(Binary Tree)是一種樹狀數據結構,其中每個節點最多有兩個子節點,通常稱為左子節點和右子節點。這些子節點可以是其他節點或空節點(即無子節點)。 二元樹是其他進階樹的基礎,可延伸推廣到Binary Search Tree
Thumbnail
接著來進入圖論的重點之一,Tree與Binary Tree。 二元樹(Binary Tree)是一種樹狀數據結構,其中每個節點最多有兩個子節點,通常稱為左子節點和右子節點。這些子節點可以是其他節點或空節點(即無子節點)。 二元樹是其他進階樹的基礎,可延伸推廣到Binary Search Tree
Thumbnail
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Stack 堆疊。
Thumbnail
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Stack 堆疊。
Thumbnail
定義 圖Graph: 由節點和邊所組成的一個網狀資料結構。 圖的表達方式Graph representation: 常見的有相鄰串列adjacency list或相鄰矩陣adjacency matrix。 本文以adjacenct list作為示範。
Thumbnail
定義 圖Graph: 由節點和邊所組成的一個網狀資料結構。 圖的表達方式Graph representation: 常見的有相鄰串列adjacency list或相鄰矩陣adjacency matrix。 本文以adjacenct list作為示範。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
定義 圖Graph: 由節點和邊所組成的一個網狀資料結構。 圖的表達方式Graph representation: 常見的有相鄰串列adjacency list或相鄰矩陣adjacency matrix。 本文以adjacenct list作為示範。 節點Vertex: 節點
Thumbnail
定義 圖Graph: 由節點和邊所組成的一個網狀資料結構。 圖的表達方式Graph representation: 常見的有相鄰串列adjacency list或相鄰矩陣adjacency matrix。 本文以adjacenct list作為示範。 節點Vertex: 節點
Thumbnail
在之前的教學中,已經學會了用雙向鏈結串列來實作Stack 堆疊。 今天,要用另一種底層資列結構,python list,來實作Stack 堆疊。 讀者可以從中發現,因為python list的功能和function實作已經很豐富, 所以使用起來,相當直覺,也簡單許多。
Thumbnail
在之前的教學中,已經學會了用雙向鏈結串列來實作Stack 堆疊。 今天,要用另一種底層資列結構,python list,來實作Stack 堆疊。 讀者可以從中發現,因為python list的功能和function實作已經很豐富, 所以使用起來,相當直覺,也簡單許多。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News