我是 PRUM 股份有限公司的 masa。

今天我整理了給初學者看的「資料要怎麼排列、怎麼取出」的規則(資料結構)。

程式會因為「如何處理一組資料」而有很大的不同行為。

這篇文章的目的,是透過認識資料處理的基本模式,打好基礎,讓你能判斷「應該如何整理資料、又該怎麼處理」。

依處理順序區分使用的「堆疊」與「佇列」基礎

在寫程式時,經常會遇到先把多筆資料暫時存起來,之後再依順序取出來處理的情境。

這時候,定義「資料要以什麼順序取出」這個規則的,就是 堆疊佇列 這兩種資料結構。

結論:出口規則會改變「能做的處理」

「最後放進去的東西先拿出來嗎(堆疊)」,還是「最先放進去的東西先拿出來嗎(佇列)」——這個差異會決定可實現的處理形式。

理解這個差異後,處理流程會更容易整理,尤其在順序很重要的邏輯中,也更能避免不預期的行為(bug)。

基礎知識:LIFO 與 FIFO

光看名詞可能會覺得很難,但原理其實很簡單。

  • 堆疊(Stack)LIFO(Last-In, First-Out / 後進先出)
    → 最後存入的資料,最先被取出
  • 佇列(Queue)FIFO(First-In, First-Out / 先進先出)
    → 最先存入的資料,會依序被取出

具體例子:桌上的文件與超市排隊結帳

堆疊就像「桌上疊起來的文件」。
最後放上去的文件會在最上面,所以下一次要用時,會先被拿出來。

瀏覽器的「返回」按鈕也很接近這個概念,會回到最後看過的頁面。
※實際上是透過「返回用」與「前進用」兩個堆疊組合來實現。

佇列就像「超市結帳排隊」。
先排隊的人會先被叫到。

在電腦中,像印表機的列印等待佇列也會用到這個概念。

有效率地處理多筆資料的「陣列」與「串列」使用方式

接著來看,如何在記憶體中排列多筆資料。
最常用的是 陣列(Array)串列(連結串列)

結論:依你想做的操作來選擇「收納方式」

每種資料結構都有擅長與不擅長的地方。
重點是要根據「最常進行哪種操作」來選擇。

基礎知識:記憶體排列方式的差異

  • 陣列(Array)
    在記憶體中是以「連續的區域」排列
    (不同語言的內部實作不同,但基本概念相同)
  • 串列(連結串列 / Linked List)
    資料分散在不同位置,每一個資料都保存「下一個資料的位置」
    (這種「指向下一個」的機制稱為指標)

具體例子:大樓的信箱與聯絡網

陣列就像「號碼固定的大樓信箱」。

101 室、102 室……依序排列,
所以只要說「105 室」,就能立刻找到。

  • 優點:可以快速取得特定位置的資料
  • 缺點:若要在中間插入元素,必須把後面的資料往後挪,成本較高

串列就像「電話聯絡網」。

「A 先生→B 先生→C 先生」這樣依序串接。

  • 優點:容易在中間新增、刪除資料(只要重新連接即可)
  • 缺點:要找到目標資料,必須依序往下追蹤

該用哪一種的判斷基準

如果拿不定主意,就從 最常做哪種操作 來思考。

想快速取出特定位置的資料

→ 陣列

常常在中間新增或刪除

→ 串列

不過在實務上,由於 CPU 快取效率等原因,很多情況會使用陣列(動態陣列)。

最後

資料結構看起來或許不起眼,但它是支撐「程式如何處理資料」這個根本思維的重要基礎。

不需要一開始就全部理解。
先從「這筆資料用什麼規則處理會最自然?」這個角度開始,你看程式碼的方式就會慢慢改變。

一邊累積經驗,一邊學會選擇自己覺得「好處理」的資料形狀吧。


PRUM 的工程師有 95% 以上是從無經驗錄用的。
如果可以,也歡迎來我們的企業網站看看。
企業網站

我們也有經營整理給工程師參考的文章網站。如果有興趣,也歡迎看看。
對工程師有幫助的文章網站


原文出處:https://qiita.com/masa20057/items/3df8598b3ebaf1eb6888


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝3   💬10   ❤️1
230
🥈
我愛JS
💬2  
8
🥉
Gigi
2
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登