|
| 1 | +# 堆積(資料結構) |
| 2 | + |
| 3 | +_以其他語言閱讀:_ |
| 4 | +[_English_](README.md), |
| 5 | +[_简体中文_](README.zh-CN.md), |
| 6 | +[_Русский_](README.ru-RU.md), |
| 7 | +[_日本語_](README.ja-JP.md), |
| 8 | +[_Français_](README.fr-FR.md), |
| 9 | +[_Português_](README.pt-BR.md), |
| 10 | +[_Türkçe_](README.tr-TR.md), |
| 11 | +[_한국어_](README.ko-KR.md), |
| 12 | +[_Українська_](README.uk-UA.md) |
| 13 | + |
| 14 | +在電腦科學中,**堆積**是一種特殊的樹狀資料結構,滿足以下描述的堆積性質。 |
| 15 | + |
| 16 | +在*最小堆積*中,若 `P` 是 `C` 的父節點,則 `P` 的鍵值(數值)小於或等於 `C` 的鍵值。 |
| 17 | + |
| 18 | + |
| 19 | + |
| 20 | +*使用 [okso.app](https://okso.app) 製作* |
| 21 | + |
| 22 | +在*最大堆積*中,`P` 的鍵值大於或等於 `C` 的鍵值。 |
| 23 | + |
| 24 | + |
| 25 | + |
| 26 | + |
| 27 | + |
| 28 | +堆積中沒有父節點的最頂端節點稱為根節點。 |
| 29 | + |
| 30 | +## 時間複雜度 |
| 31 | + |
| 32 | +以下是各種堆積資料結構的時間複雜度。函數名稱假設為最大堆積。 |
| 33 | + |
| 34 | +| 操作 | find-max | delete-max | insert | increase-key | meld | |
| 35 | +| ---------- | ---------- | ---------- | ---------- | ------------ | ---------- | |
| 36 | +| [二元堆積](https://en.wikipedia.org/wiki/Binary_heap) | `Θ(1)` | `Θ(log n)` | `O(log n)` | `O(log n)` | `Θ(n)` | |
| 37 | +| [左偏樹](https://en.wikipedia.org/wiki/Leftist_tree) | `Θ(1)` | `Θ(log n)` | `Θ(log n)` | `O(log n)` | `Θ(log n)` | |
| 38 | +| [二項式堆積](https://en.wikipedia.org/wiki/Binomial_heap) | `Θ(1)` | `Θ(log n)` | `Θ(1)` | `O(log n)` | `O(log n)` | |
| 39 | +| [費波那契堆積](https://en.wikipedia.org/wiki/Fibonacci_heap) | `Θ(1)` | `Θ(log n)` | `Θ(1)` | `Θ(1)` | `Θ(1)` | |
| 40 | +| [配對堆積](https://en.wikipedia.org/wiki/Pairing_heap) | `Θ(1)` | `Θ(log n)` | `Θ(1)` | `o(log n)` | `Θ(1)` | |
| 41 | +| [Brodal 佇列](https://en.wikipedia.org/wiki/Brodal_queue) | `Θ(1)` | `Θ(log n)` | `Θ(1)` | `Θ(1)` | `Θ(1)` | |
| 42 | +| [Rank-pairing 堆積](https://en.wikipedia.org/w/index.php?title=Rank-pairing_heap&action=edit&redlink=1) | `Θ(1)` | `Θ(log n)` | `Θ(1)` | `Θ(1)` | `Θ(1)` | |
| 43 | +| [嚴格費波那契堆積](https://en.wikipedia.org/wiki/Fibonacci_heap) | `Θ(1)` | `Θ(log n)` | `Θ(1)` | `Θ(1)` | `Θ(1)` | |
| 44 | +| [2-3 堆積](https://en.wikipedia.org/wiki/2%E2%80%933_heap) | `O(log n)` | `O(log n)` | `O(log n)` | `Θ(1)` | `?` | |
| 45 | + |
| 46 | +其中: |
| 47 | +- **find-max(或 find-min)**:分別找到最大堆積中的最大項目或最小堆積中的最小項目(又稱 *peek*) |
| 48 | +- **delete-max(或 delete-min)**:分別移除最大堆積(或最小堆積)的根節點 |
| 49 | +- **insert**:將新的鍵值加入堆積中(又稱 *push*) |
| 50 | +- **increase-key 或 decrease-key**:分別更新最大堆積或最小堆積中的鍵值 |
| 51 | +- **meld**:將兩個堆積合併成一個新的有效堆積,包含兩者的所有元素,並銷毀原來的堆積 |
| 52 | + |
| 53 | +> 在本知識庫中,[MaxHeap.js](./MaxHeap.js) 和 [MinHeap.js](./MinHeap.js) 是**二元堆積**的範例。 |
| 54 | +
|
| 55 | +## 實作 |
| 56 | + |
| 57 | +- [MaxHeap.js](./MaxHeap.js) 和 [MinHeap.js](./MinHeap.js) |
| 58 | +- [MaxHeapAdhoc.js](./MaxHeapAdhoc.js) 和 [MinHeapAdhoc.js](./MinHeapAdhoc.js) - MinHeap/MaxHeap 資料結構的極簡(ad hoc)版本,不依賴外部相依套件,可在面試中輕鬆複製貼上使用(因為 JavaScript 中缺少許多資料結構)。 |
| 59 | + |
| 60 | +## 參考資料 |
| 61 | + |
| 62 | +- [維基百科](https://zh.wikipedia.org/wiki/堆_(資料結構)) |
| 63 | +- [YouTube](https://www.youtube.com/watch?v=t0Cq6tVNRBA&index=5&t=0s&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) |
0 commit comments