Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
415 changes: 262 additions & 153 deletions README.zh-TW.md

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion src/data-structures/hash-table/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ _Read this in other languages:_
[_Français_](README.fr-FR.md),
[_Português_](README.pt-BR.md),
[_한국어_](README.ko-KR.md),
[_Українська_](README.uk-UA.md)
[_Українська_](README.uk-UA.md),
[_繁體中文_](README.zh-TW.md)

In computing, a **hash table** (hash map) is a data
structure which implements an _associative array_
Expand Down
28 changes: 28 additions & 0 deletions src/data-structures/hash-table/README.zh-TW.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# 雜湊表

_以其他語言閱讀:_
[_English_](README.md),
[_简体中文_](README.zh-CN.md),
[_Русский_](README.ru-RU.md),
[_日本語_](README.ja-JP.md),
[_Français_](README.fr-FR.md),
[_Português_](README.pt-BR.md),
[_한국어_](README.ko-KR.md),
[_Українська_](README.uk-UA.md)

在電腦科學中,**雜湊表**(雜湊對映)是一種實作*關聯式陣列*抽象資料型別的資料結構,它可以將*鍵對映到值*。雜湊表使用*雜湊函數*來計算一個索引值,指向一個桶(bucket)或槽(slot)的陣列,從中可以找到所需的值。

理想情況下,雜湊函數會將每個鍵分配到唯一的桶中,但大多數雜湊表的設計採用不完美的雜湊函數,這可能會導致雜湊碰撞——即雜湊函數為多個不同的鍵產生相同的索引值。這類碰撞必須以某種方式處理。

![Hash Table](./images/hash-table.jpeg)

透過分離鏈結法解決雜湊碰撞

![Hash Collision](./images/collision-resolution.jpeg)

*使用 [okso.app](https://okso.app) 製作*

## 參考資料

- [維基百科](https://zh.wikipedia.org/wiki/哈希表)
- [YouTube](https://www.youtube.com/watch?v=shs0KM3wKv8&index=4&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
3 changes: 2 additions & 1 deletion src/data-structures/heap/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ _Read this in other languages:_
[_Português_](README.pt-BR.md),
[_Türkçe_](README.tr-TR.md),
[_한국어_](README.ko-KR.md),
[_Українська_](README.uk-UA.md)
[_Українська_](README.uk-UA.md),
[_繁體中文_](README.zh-TW.md)


In computer science, a **heap** is a specialized tree-based
Expand Down
63 changes: 63 additions & 0 deletions src/data-structures/heap/README.zh-TW.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# 堆積(資料結構)

_以其他語言閱讀:_
[_English_](README.md),
[_简体中文_](README.zh-CN.md),
[_Русский_](README.ru-RU.md),
[_日本語_](README.ja-JP.md),
[_Français_](README.fr-FR.md),
[_Português_](README.pt-BR.md),
[_Türkçe_](README.tr-TR.md),
[_한국어_](README.ko-KR.md),
[_Українська_](README.uk-UA.md)

在電腦科學中,**堆積**是一種特殊的樹狀資料結構,滿足以下描述的堆積性質。

在*最小堆積*中,若 `P` 是 `C` 的父節點,則 `P` 的鍵值(數值)小於或等於 `C` 的鍵值。

![MinHeap](./images/min-heap.jpeg)

*使用 [okso.app](https://okso.app) 製作*

在*最大堆積*中,`P` 的鍵值大於或等於 `C` 的鍵值。

![MaxHeap](./images/max-heap.jpeg)

![Array Representation](./images/array-representation.jpeg)

堆積中沒有父節點的最頂端節點稱為根節點。

## 時間複雜度

以下是各種堆積資料結構的時間複雜度。函數名稱假設為最大堆積。

| 操作 | find-max | delete-max | insert | increase-key | meld |
| ---------- | ---------- | ---------- | ---------- | ------------ | ---------- |
| [二元堆積](https://en.wikipedia.org/wiki/Binary_heap) | `Θ(1)` | `Θ(log n)` | `O(log n)` | `O(log n)` | `Θ(n)` |
| [左偏樹](https://en.wikipedia.org/wiki/Leftist_tree) | `Θ(1)` | `Θ(log n)` | `Θ(log n)` | `O(log n)` | `Θ(log n)` |
| [二項式堆積](https://en.wikipedia.org/wiki/Binomial_heap) | `Θ(1)` | `Θ(log n)` | `Θ(1)` | `O(log n)` | `O(log n)` |
| [費波那契堆積](https://en.wikipedia.org/wiki/Fibonacci_heap) | `Θ(1)` | `Θ(log n)` | `Θ(1)` | `Θ(1)` | `Θ(1)` |
| [配對堆積](https://en.wikipedia.org/wiki/Pairing_heap) | `Θ(1)` | `Θ(log n)` | `Θ(1)` | `o(log n)` | `Θ(1)` |
| [Brodal 佇列](https://en.wikipedia.org/wiki/Brodal_queue) | `Θ(1)` | `Θ(log n)` | `Θ(1)` | `Θ(1)` | `Θ(1)` |
| [Rank-pairing 堆積](https://en.wikipedia.org/w/index.php?title=Rank-pairing_heap&action=edit&redlink=1) | `Θ(1)` | `Θ(log n)` | `Θ(1)` | `Θ(1)` | `Θ(1)` |
| [嚴格費波那契堆積](https://en.wikipedia.org/wiki/Fibonacci_heap) | `Θ(1)` | `Θ(log n)` | `Θ(1)` | `Θ(1)` | `Θ(1)` |
| [2-3 堆積](https://en.wikipedia.org/wiki/2%E2%80%933_heap) | `O(log n)` | `O(log n)` | `O(log n)` | `Θ(1)` | `?` |

其中:
- **find-max(或 find-min)**:分別找到最大堆積中的最大項目或最小堆積中的最小項目(又稱 *peek*)
- **delete-max(或 delete-min)**:分別移除最大堆積(或最小堆積)的根節點
- **insert**:將新的鍵值加入堆積中(又稱 *push*)
- **increase-key 或 decrease-key**:分別更新最大堆積或最小堆積中的鍵值
- **meld**:將兩個堆積合併成一個新的有效堆積,包含兩者的所有元素,並銷毀原來的堆積

> 在本知識庫中,[MaxHeap.js](./MaxHeap.js) 和 [MinHeap.js](./MinHeap.js) 是**二元堆積**的範例。

## 實作

- [MaxHeap.js](./MaxHeap.js) 和 [MinHeap.js](./MinHeap.js)
- [MaxHeapAdhoc.js](./MaxHeapAdhoc.js) 和 [MinHeapAdhoc.js](./MinHeapAdhoc.js) - MinHeap/MaxHeap 資料結構的極簡(ad hoc)版本,不依賴外部相依套件,可在面試中輕鬆複製貼上使用(因為 JavaScript 中缺少許多資料結構)。

## 參考資料

- [維基百科](https://zh.wikipedia.org/wiki/堆_(資料結構))
- [YouTube](https://www.youtube.com/watch?v=t0Cq6tVNRBA&index=5&t=0s&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
3 changes: 2 additions & 1 deletion src/data-structures/linked-list/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ _Read this in other languages:_
[_한국어_](README.ko-KR.md),
[_Español_](README.es-ES.md),
[_Türkçe_](README.tr-TR.md),
[_Українська_](README.uk-UA.md)
[_Українська_](README.uk-UA.md),
[_繁體中文_](README.zh-TW.md)

In computer science, a **linked list** is a linear collection
of data elements, in which linear order is not given by
Expand Down
156 changes: 156 additions & 0 deletions src/data-structures/linked-list/README.zh-TW.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
# 鏈結串列

_以其他語言閱讀:_
[_English_](README.md),
[_简体中文_](README.zh-CN.md),
[_Русский_](README.ru-RU.md),
[_日本語_](README.ja-JP.md),
[_Português_](README.pt-BR.md),
[_한국어_](README.ko-KR.md),
[_Español_](README.es-ES.md),
[_Türkçe_](README.tr-TR.md),
[_Українська_](README.uk-UA.md)

在電腦科學中,**鏈結串列**是一種資料元素的線性集合,其線性順序不是由元素在記憶體中的物理位置決定的。每個元素指向下一個元素。鏈結串列是由一組節點組成的資料結構,這些節點共同表示一個序列。在最簡單的形式下,每個節點由資料和一個指向序列中下一個節點的參考(換句話說,就是一個連結)組成。這種結構允許在走訪過程中,從序列的任何位置有效率地插入或移除元素。更複雜的變體會增加額外的連結,允許從任意元素參考進行有效率的插入或移除。鏈結串列的缺點是存取時間為線性的(且難以進行管線化處理)。較快速的存取方式,如隨機存取,是不可行的。與鏈結串列相比,陣列擁有更好的快取局部性。

![Linked List](./images/linked-list.jpeg)

*使用 [okso.app](https://okso.app) 製作*

## 基本操作的虛擬碼

### 插入

```text
Add(value)
Pre: value 是要新增到串列的值
Post: value 已被放置在串列的尾端
n ← node(value)
if head = ø
head ← n
tail ← n
else
tail.next ← n
tail ← n
end if
end Add
```

```text
Prepend(value)
Pre: value 是要新增到串列的值
Post: value 已被放置在串列的頭部
n ← node(value)
n.next ← head
head ← n
if tail = ø
tail ← n
end
end Prepend
```

### 搜尋

```text
Contains(head, value)
Pre: head 是串列中的頭部節點
value 是要搜尋的值
Post: 如果項目在鏈結串列中則回傳 true;否則回傳 false
n ← head
while n != ø and n.value != value
n ← n.next
end while
if n = ø
return false
end if
return true
end Contains
```

### 刪除

```text
Remove(head, value)
Pre: head 是串列中的頭部節點
value 是要從串列中移除的值
Post: 如果 value 從串列中移除則回傳 true,否則回傳 false
if head = ø
return false
end if
n ← head
if n.value = value
if head = tail
head ← ø
tail ← ø
else
head ← head.next
end if
return true
end if
while n.next != ø and n.next.value != value
n ← n.next
end while
if n.next != ø
if n.next = tail
tail ← n
tail.next = null
else
n.next ← n.next.next
end if
return true
end if
return false
end Remove
```

### 走訪

```text
Traverse(head)
Pre: head 是串列中的頭部節點
Post: 串列中的項目已被走訪
n ← head
while n != ø
yield n.value
n ← n.next
end while
end Traverse
```

### 反向走訪

```text
ReverseTraversal(head, tail)
Pre: head 和 tail 屬於同一個串列
Post: 串列中的項目已被反向走訪
if tail != ø
curr ← tail
while curr != head
prev ← head
while prev.next != curr
prev ← prev.next
end while
yield curr.value
curr ← prev
end while
yield curr.value
end if
end ReverseTraversal
```

## 複雜度

### 時間複雜度

| 存取 | 搜尋 | 插入 | 刪除 |
| :-------: | :-------: | :-------: | :-------: |
| O(n) | O(n) | O(1) | O(n) |

### 空間複雜度

O(n)

## 參考資料

- [維基百科](https://zh.wikipedia.org/wiki/链表)
- [YouTube](https://www.youtube.com/watch?v=njTh_OwMljA&index=2&t=1s&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
3 changes: 2 additions & 1 deletion src/data-structures/queue/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ _Read this in other languages:_
[_Français_](README.fr-FR.md),
[_Português_](README.pt-BR.md),
[_한국어_](README.ko-KR.md),
[_Українська_](README.uk-UA.md)
[_Українська_](README.uk-UA.md),
[_繁體中文_](README.zh-TW.md)

In computer science, a **queue** is a particular kind of abstract data
type or collection in which the entities in the collection are
Expand Down
24 changes: 24 additions & 0 deletions src/data-structures/queue/README.zh-TW.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# 佇列

_以其他語言閱讀:_
[_English_](README.md),
[_简体中文_](README.zh-CN.md),
[_Русский_](README.ru-RU.md),
[_日本語_](README.ja-JP.md),
[_Français_](README.fr-FR.md),
[_Português_](README.pt-BR.md),
[_한국어_](README.ko-KR.md),
[_Українська_](README.uk-UA.md)

在電腦科學中,**佇列**是一種特定的抽象資料型別或集合,其中集合中的元素按照順序排列,對集合的主要(或唯一)操作是將元素加入到尾端位置(稱為 enqueue,入列),以及從前端位置移除元素(稱為 dequeue,出列)。這使得佇列成為先進先出(FIFO, First-In-First-Out)的資料結構。在 FIFO 資料結構中,第一個被加入佇列的元素將會是第一個被移除的。這等同於一旦新元素被加入後,所有在其之前加入的元素都必須先被移除,新元素才能被移除。通常還會提供一個 peek 或 front 操作,用於回傳前端元素的值而不將其移出佇列。佇列是線性資料結構的一個範例,或更抽象地說,是一種循序集合。

先進先出(FIFO)佇列的示意圖

![Queue](./images/queue.jpeg)

*使用 [okso.app](https://okso.app) 製作*

## 參考資料

- [維基百科](https://zh.wikipedia.org/wiki/队列)
- [YouTube](https://www.youtube.com/watch?v=wjI1WNcIntg&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=3&)
3 changes: 2 additions & 1 deletion src/data-structures/stack/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ _Read this in other languages:_
[_Français_](README.fr-FR.md),
[_Português_](README.pt-BR.md),
[_한국어_](README.ko-KR.md),
[_Українська_](README.uk-UA.md)
[_Українська_](README.uk-UA.md),
[_繁體中文_](README.zh-TW.md)

In computer science, a **stack** is an abstract data type that serves
as a collection of elements, with two principal operations:
Expand Down
29 changes: 29 additions & 0 deletions src/data-structures/stack/README.zh-TW.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# 堆疊

_以其他語言閱讀:_
[_English_](README.md),
[_简体中文_](README.zh-CN.md),
[_Русский_](README.ru-RU.md),
[_日本語_](README.ja-JP.md),
[_Français_](README.fr-FR.md),
[_Português_](README.pt-BR.md),
[_한국어_](README.ko-KR.md),
[_Українська_](README.uk-UA.md)

在電腦科學中,**堆疊**是一種作為元素集合的抽象資料型別,具有兩個主要操作:

* **push**:將元素加入集合
* **pop**:移除最近加入且尚未被移除的元素

元素離開堆疊的順序產生了它的另一個名稱——LIFO(Last In, First Out,後進先出)。此外,peek 操作可以存取堆疊頂端的元素而不修改堆疊。「堆疊」這個名稱來自於一疊物品堆放在一起的比喻——從堆疊頂端取出物品很容易,但要取得堆疊深處的物品可能需要先移開許多其他物品。

堆疊執行時期的 push 和 pop 操作簡單示意圖

![Stack](./images/stack.jpeg)

*使用 [okso.app](https://okso.app) 製作*

## 參考資料

- [維基百科](https://zh.wikipedia.org/wiki/堆栈)
- [YouTube](https://www.youtube.com/watch?v=wjI1WNcIntg&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=3&)
3 changes: 2 additions & 1 deletion src/data-structures/tree/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

_Read this in other languages:_
[_简体中文_](README.zh-CN.md),
[_Português_](README.pt-BR.md)
[_Português_](README.pt-BR.md),
[_繁體中文_](README.zh-TW.md)

* [Binary Search Tree](binary-search-tree)
* [AVL Tree](avl-tree)
Expand Down
27 changes: 27 additions & 0 deletions src/data-structures/tree/README.zh-TW.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# 樹

_以其他語言閱讀:_
[_English_](README.md),
[_简体中文_](README.zh-CN.md),
[_Português_](README.pt-BR.md)

* [二元搜尋樹](binary-search-tree)
* [AVL 樹](avl-tree)
* [紅黑樹](red-black-tree)
* [線段樹](segment-tree) - 包含最小值/最大值/總和的範圍查詢範例
* [樹狀數組](fenwick-tree)(二元索引樹)

在電腦科學中,**樹**是一種廣泛使用的抽象資料型別(ADT)——或實作此 ADT 的資料結構——它模擬一種階層式的樹狀結構,具有一個根值以及由父節點表示的子樹,呈現為一組鏈結的節點。

樹狀資料結構可以被遞迴地(局部地)定義為節點的集合(從根節點開始),其中每個節點是一個由值和指向其他節點的參考列表(稱為「子節點」)組成的資料結構,並且不允許重複的參考,也沒有參考指向根節點。

一棵簡單的無序樹;在此圖中,標記為 3 的節點有兩個子節點(標記為 2 和 6),以及一個父節點(標記為 2)。最頂端的根節點沒有父節點。

![Tree](./images/tree.jpeg)

*使用 [okso.app](https://okso.app) 製作*

## 參考資料

- [維基百科](https://zh.wikipedia.org/wiki/树_(数据结构))
- [YouTube](https://www.youtube.com/watch?v=oSWTXtMglKE&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=8)
Loading