data-structure-typed 2.2.7 → 2.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/README.md +14 -3
- package/README_CN.md +119 -275
- package/benchmark/report.html +1 -1
- package/benchmark/report.json +20 -324
- package/dist/cjs/index.cjs +106 -107
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs-legacy/index.cjs +106 -107
- package/dist/cjs-legacy/index.cjs.map +1 -1
- package/dist/esm/index.mjs +106 -107
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm-legacy/index.mjs +106 -107
- package/dist/esm-legacy/index.mjs.map +1 -1
- package/dist/leetcode/avl-tree-counter.mjs +2957 -0
- package/dist/leetcode/avl-tree-multi-map.mjs +2889 -0
- package/dist/leetcode/avl-tree.mjs +2720 -0
- package/dist/leetcode/binary-tree.mjs +1594 -0
- package/dist/leetcode/bst.mjs +2398 -0
- package/dist/leetcode/deque.mjs +683 -0
- package/dist/leetcode/directed-graph.mjs +1733 -0
- package/dist/leetcode/doubly-linked-list.mjs +709 -0
- package/dist/leetcode/hash-map.mjs +493 -0
- package/dist/leetcode/heap.mjs +542 -0
- package/dist/leetcode/max-heap.mjs +375 -0
- package/dist/leetcode/max-priority-queue.mjs +383 -0
- package/dist/leetcode/min-heap.mjs +363 -0
- package/dist/leetcode/min-priority-queue.mjs +371 -0
- package/dist/leetcode/priority-queue.mjs +363 -0
- package/dist/leetcode/queue.mjs +943 -0
- package/dist/leetcode/red-black-tree.mjs +2765 -0
- package/dist/leetcode/singly-linked-list.mjs +754 -0
- package/dist/leetcode/stack.mjs +217 -0
- package/dist/leetcode/tree-counter.mjs +3039 -0
- package/dist/leetcode/tree-multi-map.mjs +2913 -0
- package/dist/leetcode/trie.mjs +413 -0
- package/dist/leetcode/undirected-graph.mjs +1650 -0
- package/dist/types/data-structures/binary-tree/avl-tree-counter.d.ts +1 -1
- package/dist/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -2
- package/dist/types/data-structures/binary-tree/avl-tree.d.ts +10 -10
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +22 -23
- package/dist/types/data-structures/binary-tree/bst.d.ts +11 -11
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +1 -1
- package/dist/types/data-structures/binary-tree/tree-counter.d.ts +1 -1
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +2 -2
- package/dist/umd/data-structure-typed.js +102 -103
- package/dist/umd/data-structure-typed.js.map +1 -1
- package/dist/umd/data-structure-typed.min.js +2 -2
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +48 -171
- package/src/data-structures/binary-tree/avl-tree-counter.ts +6 -6
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +13 -13
- package/src/data-structures/binary-tree/avl-tree.ts +15 -15
- package/src/data-structures/binary-tree/binary-tree.ts +53 -55
- package/src/data-structures/binary-tree/bst.ts +21 -22
- package/src/data-structures/binary-tree/red-black-tree.ts +3 -3
- package/src/data-structures/binary-tree/tree-counter.ts +4 -4
- package/src/data-structures/binary-tree/tree-multi-map.ts +13 -13
- package/test/performance/data-structures/binary-tree/red-black-tree.test.ts +1 -2
- package/test/unit/data-structures/binary-tree/avl-tree-counter.test.ts +30 -30
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +46 -46
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +43 -43
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +151 -151
- package/test/unit/data-structures/binary-tree/bst.test.ts +99 -99
- package/test/unit/data-structures/binary-tree/overall.test.ts +20 -20
- package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +141 -141
- package/test/unit/data-structures/binary-tree/tree-counter.test.ts +37 -37
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +145 -145
- package/tsup.config.js +50 -21
- package/tsup.umd.config.js +29 -0
- package/tsup.node.config.js +0 -83
package/CHANGELOG.md
CHANGED
|
@@ -8,7 +8,7 @@ All notable changes to this project will be documented in this file.
|
|
|
8
8
|
- [Semantic Versioning](https://semver.org/spec/v2.0.0.html)
|
|
9
9
|
- [`auto-changelog`](https://github.com/CookPete/auto-changelog)
|
|
10
10
|
|
|
11
|
-
## [v2.2.
|
|
11
|
+
## [v2.2.8](https://github.com/zrwusa/data-structure-typed/compare/v2.2.3...main) (upcoming)
|
|
12
12
|
|
|
13
13
|
## [v2.2.3](https://github.com/zrwusa/data-structure-typed/compare/v2.2.2...v2.2.3) (6 January 2026)
|
|
14
14
|
|
package/README.md
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
|
-
#
|
|
1
|
+
# data-structure-typed
|
|
2
|
+
|
|
3
|
+
English | [简体中文](./README_CN.md)
|
|
2
4
|
|
|
3
5
|
A comprehensive TypeScript data structures library with production-ready implementations.
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+

|
|
8
|
+

|
|
9
|
+

|
|
10
|
+

|
|
11
|
+

|
|
12
|
+

|
|
13
|
+

|
|
14
|
+

|
|
15
|
+
|
|
16
|
+
**📚 [Installation](#-installation) • [Quick Start](#-quick-start-30-seconds) • [Full Docs](#-documentation) • [API Reference](./docs/REFERENCE.md) • [Playground](#playground) • [Examples](./docs/GUIDES.md)**
|
|
6
17
|
|
|
7
18
|
---
|
|
8
19
|
|
|
@@ -541,8 +552,8 @@ MIT
|
|
|
541
552
|
## 📚 Full Documentation Structure
|
|
542
553
|
|
|
543
554
|
```
|
|
555
|
+
README.md (this file)
|
|
544
556
|
docs/
|
|
545
|
-
├── README.md (this file)
|
|
546
557
|
├── CONCEPTS.md (theory & fundamentals)
|
|
547
558
|
├── REFERENCE.md (API documentation)
|
|
548
559
|
├── ARCHITECTURE.md (design principles)
|
package/README_CN.md
CHANGED
|
@@ -1,102 +1,116 @@
|
|
|
1
|
-
#
|
|
1
|
+
# data-structure-typed
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[English](./README.md) | 简体中文
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
一个全面的 TypeScript 数据结构库,包含生产就绪的实现。
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+

|
|
9
|
+

|
|
10
|
+

|
|
11
|
+

|
|
12
|
+

|
|
13
|
+

|
|
14
|
+

|
|
15
|
+
|
|
16
|
+
**📚 [安装](#-安装) • [快速开始](#-快速开始30-秒) • [完整文档](#-文档) • [API 参考](./docs/REFERENCE_CN.md) • [Playground](#-playground) • [示例](./docs/GUIDES_CN.md)**
|
|
6
17
|
|
|
7
18
|
---
|
|
8
19
|
|
|
9
20
|
## 目录
|
|
10
21
|
|
|
11
|
-
1. [
|
|
22
|
+
1. [谁应该使用本库?](#-谁应该使用本库)
|
|
12
23
|
2. [为什么不直接用 Array 或 Map?](#-为什么不直接用-array-或-map)
|
|
13
|
-
3. [
|
|
24
|
+
3. [主要特性](#-主要特性)
|
|
14
25
|
4. [安装](#-安装)
|
|
15
|
-
5. [快速开始](#-快速开始30
|
|
26
|
+
5. [快速开始](#-快速开始30-秒)
|
|
16
27
|
6. [可用的数据结构](#-可用的数据结构)
|
|
17
28
|
7. [文档](#-文档)
|
|
18
29
|
|
|
19
30
|
---
|
|
20
31
|
|
|
21
|
-
## 🎯
|
|
32
|
+
## 🎯 谁应该使用本库?
|
|
22
33
|
|
|
23
|
-
|
|
24
|
-
|
|
34
|
+
**如果你正在构建排名集合、调度队列或排序数据结构,**
|
|
35
|
+
**考虑使用 `data-structure-typed` 而不是手工编写的 Array 或 Map。**
|
|
25
36
|
|
|
26
|
-
###
|
|
37
|
+
### 完美适用于:
|
|
27
38
|
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
- **实时仪表板** — Grafana
|
|
31
|
-
- **时间序列数据** —
|
|
32
|
-
-
|
|
33
|
-
- **图论问题** —
|
|
39
|
+
- **排行榜与排名** — 高效维护前 K 个数据,无需重复排序
|
|
40
|
+
- **任务调度** — 优先级队列、有序执行、基于时间的操作
|
|
41
|
+
- **实时仪表板** — Grafana 风格的工作负载,支持即时查询
|
|
42
|
+
- **时间序列数据** — 排序插入 + 快速范围查询
|
|
43
|
+
- **搜索与自动完成** — 大规模前缀匹配
|
|
44
|
+
- **图论问题** — 路径查找、循环检测、拓扑排序
|
|
34
45
|
|
|
35
46
|
---
|
|
36
47
|
|
|
37
48
|
## ⚡ 为什么不直接用 Array 或 Map?
|
|
38
49
|
|
|
39
|
-
| 使用场景
|
|
40
|
-
|
|
41
|
-
| **排序查询**
|
|
42
|
-
|
|
|
43
|
-
| **排行榜前 K**
|
|
44
|
-
| **从前面移除**
|
|
45
|
-
| **前缀搜索**
|
|
46
|
-
| **熟悉的 API**
|
|
50
|
+
| 使用场景 | Array | Map | data-structure-typed |
|
|
51
|
+
|------------------------|----------------------|------------------|:--------------------:|
|
|
52
|
+
| **排序查询** | ❌ O(n) | ❌ 无序 | ✅ **O(log n)** |
|
|
53
|
+
| **在特定位置插入** | ❌ O(n) shift | ❌ 无位置 | ✅ **O(log n)** |
|
|
54
|
+
| **排行榜前 K** | ❌ 重新排序 O(n log n) | ❌ 手动排序 | ✅ **即时** |
|
|
55
|
+
| **从前面移除** | ❌ O(n) | ❌ 无出队 | ✅ **O(1)** |
|
|
56
|
+
| **前缀搜索** | ❌ O(n*m) | ❌ 不适用 | ✅ **O(m + k)** |
|
|
57
|
+
| **熟悉的 API** | ✅ 是 | ✅ 是 | ✅ **相同** |
|
|
47
58
|
|
|
48
|
-
###
|
|
59
|
+
### 真实场景痛点
|
|
49
60
|
|
|
50
61
|
```javascript
|
|
51
62
|
// ❌ 不使用 data-structure-typed
|
|
52
63
|
const queue = [1, 2, 3, ..., 100000];
|
|
53
64
|
for (let i = 0; i < 100000; i++) {
|
|
54
|
-
queue.shift(); // O(n) -
|
|
65
|
+
queue.shift(); // O(n) - 重新索引所有元素!
|
|
55
66
|
}
|
|
56
|
-
//
|
|
67
|
+
// 耗时: 2829ms ❌
|
|
68
|
+
```
|
|
57
69
|
|
|
70
|
+
```javascript
|
|
58
71
|
// ✅ 使用 data-structure-typed (Deque)
|
|
59
72
|
const deque = new Deque([1, 2, 3, ..., 100000]);
|
|
60
73
|
for (let i = 0; i < 100000; i++) {
|
|
61
|
-
deque.shift(); // O(1) -
|
|
74
|
+
deque.shift(); // O(1) - 仅移动指针
|
|
62
75
|
}
|
|
63
|
-
//
|
|
76
|
+
// 耗时: 5.83ms ✅
|
|
64
77
|
// **快 484 倍!**
|
|
65
78
|
```
|
|
66
79
|
|
|
67
80
|
---
|
|
68
81
|
|
|
69
|
-
## 🚀
|
|
82
|
+
## 🚀 性能 (简版)
|
|
70
83
|
|
|
71
|
-
-
|
|
84
|
+
- **快 10-40%** 比常见 JS 实现在热路径中
|
|
72
85
|
- Array.sort() O(n log n) → TreeSet O(log n) 插入
|
|
73
86
|
- 重复 Array.shift() O(n) → Queue O(1)
|
|
74
|
-
-
|
|
87
|
+
- 手动索引跟踪 → RB-Tree 自动平衡
|
|
75
88
|
|
|
76
|
-
- **针对 V8 JIT
|
|
89
|
+
- **针对 V8 JIT 优化** (Node.js 18+、现代浏览器)
|
|
77
90
|
|
|
78
|
-
-
|
|
91
|
+
- **Tree-shakable** ESM / CJS / 旧版构建
|
|
79
92
|
|
|
80
93
|
📊 [完整基准测试 →](./docs/PERFORMANCE_CN.md)
|
|
81
94
|
|
|
82
95
|
---
|
|
83
96
|
|
|
84
|
-
## ✨
|
|
97
|
+
## ✨ 主要特性
|
|
85
98
|
|
|
86
99
|
### 🏠 统一的 API
|
|
87
100
|
|
|
88
|
-
不需要学习新 API
|
|
101
|
+
不需要学习新 API。在任何地方都使用 `push`、`pop`、`map`、`filter` 和 `reduce`。
|
|
89
102
|
|
|
90
103
|
```javascript
|
|
91
104
|
// 所有线性结构使用相同的 4 个方法
|
|
92
105
|
const deque = new Deque([1, 2, 3]);
|
|
93
106
|
const queue = new Queue([1, 2, 3]);
|
|
94
|
-
const
|
|
107
|
+
const doublyLinkeList = new DoublyLinkedList([1, 2, 3]);
|
|
108
|
+
const singlyLinkedList = new SinglyLinkedList([1, 2, 3]);
|
|
95
109
|
|
|
96
110
|
// 它们都支持:
|
|
97
111
|
structure.push(item); // 添加到末尾
|
|
98
|
-
structure.pop(); //
|
|
99
|
-
structure.shift(); //
|
|
112
|
+
structure.pop(); // 移除末尾
|
|
113
|
+
structure.shift(); // 移除开头
|
|
100
114
|
structure.unshift(item); // 添加到开头
|
|
101
115
|
```
|
|
102
116
|
|
|
@@ -110,17 +124,17 @@ tree.set(1, 'Alice');
|
|
|
110
124
|
tree.set(2, 'Bob');
|
|
111
125
|
|
|
112
126
|
// 类型安全的访问
|
|
113
|
-
const value = tree.get(1); //
|
|
127
|
+
const value = tree.get(1); // 类型: string | undefined
|
|
114
128
|
```
|
|
115
129
|
|
|
116
130
|
### ✨ 零摩擦
|
|
117
131
|
|
|
118
|
-
|
|
132
|
+
随处可用。使用扩展运算符 `[...]`、for...of 循环它、立即转换它。
|
|
119
133
|
|
|
120
134
|
```javascript
|
|
121
135
|
// 所有数据结构都支持迭代器协议
|
|
122
136
|
const tree = new RedBlackTree([5, 2, 8]);
|
|
123
|
-
const sorted = [...tree]; //
|
|
137
|
+
const sorted = [...tree]; // 扩展运算符
|
|
124
138
|
for (const item of tree) {
|
|
125
139
|
} // for...of 循环
|
|
126
140
|
const set = new Set(tree); // Set 构造器
|
|
@@ -142,9 +156,9 @@ npm i data-structure-typed --save
|
|
|
142
156
|
yarn add data-structure-typed
|
|
143
157
|
```
|
|
144
158
|
|
|
145
|
-
###
|
|
159
|
+
### 单个包
|
|
146
160
|
|
|
147
|
-
|
|
161
|
+
仅使用你需要的:
|
|
148
162
|
|
|
149
163
|
```bash
|
|
150
164
|
pnpm add heap-typed deque-typed red-black-tree-typed
|
|
@@ -152,29 +166,29 @@ pnpm add heap-typed deque-typed red-black-tree-typed
|
|
|
152
166
|
|
|
153
167
|
---
|
|
154
168
|
|
|
155
|
-
## 💡
|
|
169
|
+
## 💡 我应该何时考虑使用本库?
|
|
156
170
|
|
|
157
|
-
✅
|
|
171
|
+
✅ **当你需要:**
|
|
158
172
|
|
|
159
|
-
-
|
|
160
|
-
-
|
|
161
|
-
-
|
|
162
|
-
-
|
|
163
|
-
-
|
|
173
|
+
- 前 K 个查询 / 排行榜而无需重复排序
|
|
174
|
+
- 同时实现插入顺序和查询性能
|
|
175
|
+
- 带有快速位置访问的优先级队列
|
|
176
|
+
- 支持范围查询的时间序列数据
|
|
177
|
+
- RedBlackTree / Heap 性能而无需学习新 API
|
|
164
178
|
|
|
165
|
-
✅
|
|
179
|
+
✅ **当你的代码有:**
|
|
166
180
|
|
|
167
|
-
- `array.sort()
|
|
168
|
-
-
|
|
169
|
-
-
|
|
170
|
-
-
|
|
171
|
-
-
|
|
181
|
+
- 在热路径中使用 `array.sort()`(请求处理程序、循环)
|
|
182
|
+
- 插入后的手动索引跟踪
|
|
183
|
+
- 在大列表上使用 `Array.shift()`(队列)
|
|
184
|
+
- 在文件中重复的自定义排序逻辑
|
|
185
|
+
- 需要排序的 Map
|
|
172
186
|
|
|
173
187
|
---
|
|
174
188
|
|
|
175
189
|
## 🚀 快速开始:30 秒
|
|
176
190
|
|
|
177
|
-
###
|
|
191
|
+
### 排行榜(排名集合)
|
|
178
192
|
|
|
179
193
|
```typescript
|
|
180
194
|
import { RedBlackTree } from 'data-structure-typed';
|
|
@@ -185,7 +199,7 @@ const leaderboard = new RedBlackTree([
|
|
|
185
199
|
[92, 'Charlie']
|
|
186
200
|
]);
|
|
187
201
|
|
|
188
|
-
//
|
|
202
|
+
// 获取排序的分数(自动维护!)
|
|
189
203
|
for (const [score, player] of leaderboard) {
|
|
190
204
|
console.log(`${player}: ${score}`);
|
|
191
205
|
}
|
|
@@ -198,7 +212,7 @@ for (const [score, player] of leaderboard) {
|
|
|
198
212
|
leaderboard.delete(85);
|
|
199
213
|
leaderboard.set(95, 'Bob'); // O(log n)
|
|
200
214
|
|
|
201
|
-
//
|
|
215
|
+
// 查询前几名玩家
|
|
202
216
|
const topPlayers = [...leaderboard.values()].reverse().slice(0, 3);
|
|
203
217
|
```
|
|
204
218
|
|
|
@@ -207,7 +221,7 @@ const topPlayers = [...leaderboard.values()].reverse().slice(0, 3);
|
|
|
207
221
|
```typescript
|
|
208
222
|
import { MaxPriorityQueue } from 'data-structure-typed';
|
|
209
223
|
|
|
210
|
-
const taskQueue = new MaxPriorityQueue([], {
|
|
224
|
+
const taskQueue = new MaxPriorityQueue<{priority: number; task: string}>([], {
|
|
211
225
|
comparator: (a, b) => b.priority - a.priority
|
|
212
226
|
});
|
|
213
227
|
|
|
@@ -217,244 +231,69 @@ taskQueue.add({ priority: 9, task: 'Alert' }); // 即时优先级处理
|
|
|
217
231
|
const nextTask = taskQueue.poll(); // { priority: 9, task: 'Alert' }
|
|
218
232
|
```
|
|
219
233
|
|
|
220
|
-
###
|
|
234
|
+
### 快速队列 (FIFO)
|
|
221
235
|
|
|
222
236
|
```typescript
|
|
223
237
|
import { Deque } from 'data-structure-typed';
|
|
224
238
|
|
|
225
239
|
const queue = new Deque([1, 2, 3, 4, 5]);
|
|
226
|
-
queue.shift(); //
|
|
227
|
-
queue.push(6); //
|
|
240
|
+
queue.shift(); // 从前面移除: O(1) 而不是 O(n)
|
|
241
|
+
queue.push(6); // 添加到后面: O(1)
|
|
228
242
|
```
|
|
229
243
|
|
|
230
244
|
---
|
|
231
245
|
|
|
232
246
|
## 📊 可用的数据结构
|
|
233
247
|
|
|
234
|
-
| 结构
|
|
235
|
-
|
|
236
|
-
| **
|
|
237
|
-
| **
|
|
238
|
-
| **
|
|
239
|
-
| **
|
|
240
|
-
| **
|
|
241
|
-
| **
|
|
242
|
-
| **
|
|
243
|
-
| **
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
## 📖 文档
|
|
250
|
-
|
|
251
|
-
### 不同使用场景
|
|
252
|
-
|
|
253
|
-
| 您的目标 | 从这里开始 | 后续步骤 |
|
|
254
|
-
|---------|----------|---------|
|
|
255
|
-
| **学习概念** | [CONCEPTS_CN.md](./docs/CONCEPTS_CN.md) | [GUIDES_CN.md](./docs/GUIDES_CN.md) |
|
|
256
|
-
| **在项目中使用** | [GUIDES_CN.md](./docs/GUIDES_CN.md) | [REFERENCE_CN.md](./docs/REFERENCE_CN.md) |
|
|
257
|
-
| **查询 API** | [REFERENCE_CN.md](./docs/REFERENCE_CN.md) | [PERFORMANCE_CN.md](./docs/PERFORMANCE_CN.md) |
|
|
258
|
-
| **性能问题** | [PERFORMANCE_CN.md](./docs/PERFORMANCE_CN.md) | [ARCHITECTURE_CN.md](./ARCHITECTURE_CN.md) |
|
|
259
|
-
| **框架集成** | [INTEGRATIONS_CN.md](./docs/INTEGRATIONS_CN.md) | [GUIDES_CN.md](./docs/GUIDES_CN.md) |
|
|
260
|
-
| **理解设计** | [ARCHITECTURE_CN.md](./ARCHITECTURE_CN.md) | [CONCEPTS_CN.md](./docs/CONCEPTS_CN.md) |
|
|
261
|
-
|
|
262
|
-
### 文档文件
|
|
263
|
-
|
|
264
|
-
1. **[CONCEPTS_CN.md](./docs/CONCEPTS_CN.md)** - 核心基础和理论
|
|
265
|
-
- 三大核心概念(BST、平衡树、堆)
|
|
266
|
-
- 13 个易于理解的解释
|
|
267
|
-
- 迭代器协议设计
|
|
268
|
-
- 5 个与原生 JavaScript 的对比
|
|
269
|
-
- 完整的决策指南
|
|
270
|
-
|
|
271
|
-
2. **[REFERENCE_CN.md](./docs/REFERENCE_CN.md)** - 完整 API 和数据结构
|
|
272
|
-
- 快速参考表
|
|
273
|
-
- 所有 20+ 结构及示例
|
|
274
|
-
- CRUD 操作
|
|
275
|
-
- 常见方法
|
|
276
|
-
- TypeScript 支持
|
|
277
|
-
|
|
278
|
-
3. **[ARCHITECTURE_CN.md](./ARCHITECTURE_CN.md)** - 设计和实现
|
|
279
|
-
- 设计理念和原则
|
|
280
|
-
- 3 个解决的痛点
|
|
281
|
-
- 为什么 Deque 快 484 倍
|
|
282
|
-
- 迭代器协议设计
|
|
283
|
-
- 自平衡策略
|
|
284
|
-
- V8 JIT 优化
|
|
285
|
-
|
|
286
|
-
4. **[PERFORMANCE_CN.md](./docs/PERFORMANCE_CN.md)** - 基准和对比
|
|
287
|
-
- 性能摘要
|
|
288
|
-
- 3 个真实场景
|
|
289
|
-
- 详细基准
|
|
290
|
-
- 何时使用什么
|
|
291
|
-
- 优化技巧
|
|
292
|
-
|
|
293
|
-
5. **[GUIDES_CN.md](./docs/GUIDES_CN.md)** - 真实示例
|
|
294
|
-
- 4 个设计模式
|
|
295
|
-
- 5 个生产代码示例
|
|
296
|
-
- 常见错误
|
|
297
|
-
- 最佳实践
|
|
298
|
-
|
|
299
|
-
6. **[INTEGRATIONS_CN.md](./docs/INTEGRATIONS_CN.md)** - 框架集成
|
|
300
|
-
- React 集成(状态管理、排行榜)
|
|
301
|
-
- Express 集成(LRU 缓存、速率限制)
|
|
302
|
-
- Nest.js 集成(排名服务、任务队列)
|
|
303
|
-
- TypeScript 配置
|
|
248
|
+
| 结构 | 用途 | 时间复杂度 |
|
|
249
|
+
|----------------|----------------------------------|:------------------------:|
|
|
250
|
+
| **Array** | 基础顺序存储 | O(1) 访问,O(n) 插入 |
|
|
251
|
+
| **LinkedList** | 链式存储 | O(n) 访问,O(1) 插入 |
|
|
252
|
+
| **Stack** | LIFO (后进先出) | O(1) 推入/弹出 |
|
|
253
|
+
| **Queue** | FIFO (先进先出) | O(1) 入队/出队 |
|
|
254
|
+
| **Deque** | 双端队列 | O(1) 两端操作 |
|
|
255
|
+
| **Heap** | 优先级访问 | O(1) 查看,O(log n) 修改 |
|
|
256
|
+
| **BST** | 排序范围查询 | O(log n) 平衡时 |
|
|
257
|
+
| **RedBlackTree** | 自平衡树 | O(log n) 保证 |
|
|
258
|
+
| **AVL Tree** | 严格平衡树 | O(log n) 保证 |
|
|
259
|
+
| **Trie** | 前缀搜索 | O(m) m 是字符串长度 |
|
|
260
|
+
| **Graph** | 网络结构 | 取决于实现 |
|
|
304
261
|
|
|
305
262
|
---
|
|
306
263
|
|
|
307
|
-
##
|
|
308
|
-
|
|
309
|
-
### LRU 缓存
|
|
310
|
-
|
|
311
|
-
```typescript
|
|
312
|
-
class LRUCache<K, V> {
|
|
313
|
-
private cache = new Map<K, V>();
|
|
314
|
-
private order = new DoublyLinkedList<K>();
|
|
315
|
-
|
|
316
|
-
get(key: K): V | null {
|
|
317
|
-
if (!this.cache.has(key)) return null;
|
|
318
|
-
// 移动到末尾(最近使用)
|
|
319
|
-
// 使用 O(1) 操作高效处理
|
|
320
|
-
return this.cache.get(key)!;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
### 排行榜
|
|
326
|
-
|
|
327
|
-
```typescript
|
|
328
|
-
class Leaderboard {
|
|
329
|
-
private scores = new RedBlackTree<number, Player>(
|
|
330
|
-
(a, b) => b - a // 降序
|
|
331
|
-
);
|
|
332
|
-
|
|
333
|
-
getTopN(n: number): Player[] {
|
|
334
|
-
return [...this.scores.values()].slice(0, n);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
### 消息队列
|
|
340
|
-
|
|
341
|
-
```typescript
|
|
342
|
-
class MessageQueue {
|
|
343
|
-
private urgent = new Deque<Message>();
|
|
344
|
-
private normal = new Deque<Message>();
|
|
345
|
-
|
|
346
|
-
dequeue(): Message | null {
|
|
347
|
-
return this.urgent.shift() || this.normal.shift();
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
👉 [更多示例请见 GUIDES_CN.md](./docs/GUIDES_CN.md)
|
|
353
|
-
|
|
354
|
-
---
|
|
355
|
-
|
|
356
|
-
## 🎯 按行业的使用场景
|
|
357
|
-
|
|
358
|
-
### 📊 金融
|
|
359
|
-
|
|
360
|
-
- 价格排序的订单簿
|
|
361
|
-
- 实时投资组合排名
|
|
362
|
-
- 期权链排序
|
|
363
|
-
|
|
364
|
-
### 🎮 游戏
|
|
264
|
+
## 🎮 Playground
|
|
365
265
|
|
|
366
|
-
|
|
367
|
-
- 敌人优先级队列
|
|
368
|
-
- 游戏事件调度
|
|
266
|
+
🏃🏻♀️ 立即尝试:
|
|
369
267
|
|
|
370
|
-
|
|
268
|
+
- [Node.js TypeScript](https://stackblitz.com/edit/stackblitz-starters-e1vdy3zw?file=src%2Findex.ts)
|
|
269
|
+
- [Node.js JavaScript](https://stackblitz.com/edit/stackblitz-starters-oczhrfzn?file=src%2Findex.js)
|
|
270
|
+
- [React TypeScript](https://stackblitz.com/edit/vitejs-vite-7bva1zhd?file=src%2FApp.tsx)
|
|
271
|
+
- [NestJS](https://stackblitz.com/edit/nestjs-typescript-starter-q9n7okgc?file=src%2Fproduct%2Fservices%2Fproduct-price-index.service.ts)
|
|
371
272
|
|
|
372
|
-
|
|
373
|
-
- 信息流排序
|
|
374
|
-
- 通知调度
|
|
375
|
-
|
|
376
|
-
### 🏥 医疗保健
|
|
377
|
-
|
|
378
|
-
- 患者优先级队列
|
|
379
|
-
- 约诊调度
|
|
380
|
-
- 医疗记录组织
|
|
381
|
-
|
|
382
|
-
### 🛒 电子商务
|
|
383
|
-
|
|
384
|
-
- 产品价格范围
|
|
385
|
-
- 库存管理
|
|
386
|
-
- 订单调度
|
|
387
|
-
|
|
388
|
-
---
|
|
389
|
-
|
|
390
|
-
## ✨ 开发者为什么喜欢这个库
|
|
391
|
-
|
|
392
|
-
| 痛点 | 解决方案 |
|
|
393
|
-
|-----|---------|
|
|
394
|
-
| 重复排序拖累代码速度 | TreeSet 自动维护顺序 |
|
|
395
|
-
| 循环中 Array.shift 超时 | Deque O(1) shift 而不是 O(n) |
|
|
396
|
-
| 学习不同的 API | 所有结构使用 push/pop/shift/unshift |
|
|
397
|
-
| 类型安全噩梦 | 完整的 TypeScript 泛型支持 |
|
|
398
|
-
| 浏览器兼容性问题 | 在任何地方工作:Node、浏览器、CDN |
|
|
399
|
-
|
|
400
|
-
---
|
|
401
|
-
|
|
402
|
-
## 📦 您将获得什么
|
|
403
|
-
|
|
404
|
-
✅ **6 个核心文档文件**(2500+ 行)
|
|
405
|
-
✅ **20+ 个数据结构**(生产级)
|
|
406
|
-
✅ **50+ 个代码示例**(真实模式)
|
|
407
|
-
✅ **完整 TypeScript 支持**(严格类型)
|
|
408
|
-
✅ **性能基准**(484 倍加速)
|
|
409
|
-
✅ **框架集成**(React、Express、Nest.js)
|
|
410
|
-
|
|
411
|
-
---
|
|
412
|
-
|
|
413
|
-
## 🚀 开始使用
|
|
414
|
-
|
|
415
|
-
### 步骤 1:安装
|
|
416
|
-
|
|
417
|
-
```bash
|
|
418
|
-
npm i data-structure-typed
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
### 步骤 2:导入
|
|
422
|
-
|
|
423
|
-
```typescript
|
|
424
|
-
import { RedBlackTree, Deque, MaxPriorityQueue } from 'data-structure-typed';
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
### 步骤 3:使用
|
|
428
|
-
|
|
429
|
-
```typescript
|
|
430
|
-
const tree = new RedBlackTree([5, 2, 8]);
|
|
431
|
-
console.log([...tree]); // [2, 5, 8] - 自动排序!
|
|
432
|
-
```
|
|
433
|
-
|
|
434
|
-
### 步骤 4:了解更多
|
|
273
|
+
### 第 4 步:了解更多
|
|
435
274
|
|
|
436
275
|
👉 查看 [CONCEPTS_CN.md](./docs/CONCEPTS_CN.md) 了解核心概念
|
|
437
|
-
👉 查看 [GUIDES_CN.md](./docs/GUIDES_CN.md)
|
|
438
|
-
👉 阅读 [REFERENCE_CN.md](./docs/REFERENCE_CN.md)
|
|
276
|
+
👉 查看 [GUIDES_CN.md](./docs/GUIDES_CN.md) 了解生产示例
|
|
277
|
+
👉 阅读 [REFERENCE_CN.md](./docs/REFERENCE_CN.md) 了解完整 API
|
|
439
278
|
|
|
440
279
|
---
|
|
441
280
|
|
|
442
|
-
## 📊
|
|
281
|
+
## 📊 对比图表
|
|
443
282
|
|
|
444
283
|
```
|
|
445
|
-
|
|
284
|
+
需要频繁头尾操作?
|
|
446
285
|
→ Deque (O(1) shift/unshift/push/pop)
|
|
447
286
|
|
|
448
|
-
需要排序 +
|
|
287
|
+
需要排序 + 快速查找?
|
|
449
288
|
→ RedBlackTree (O(log n) 保证)
|
|
450
289
|
|
|
451
290
|
需要最高/最低优先级?
|
|
452
|
-
→ Heap/PriorityQueue (O(log n)
|
|
291
|
+
→ Heap/PriorityQueue (O(log n) 添加/删除)
|
|
453
292
|
|
|
454
293
|
需要前缀/文本匹配?
|
|
455
294
|
→ Trie (O(m+k) 其中 m=前缀)
|
|
456
295
|
|
|
457
|
-
|
|
296
|
+
需要图论操作?
|
|
458
297
|
→ DirectedGraph/UndirectedGraph
|
|
459
298
|
|
|
460
299
|
否则?
|
|
@@ -465,11 +304,11 @@ console.log([...tree]); // [2, 5, 8] - 自动排序!
|
|
|
465
304
|
|
|
466
305
|
## 🤝 贡献
|
|
467
306
|
|
|
468
|
-
|
|
307
|
+
找到 bug?有建议?[提出 issue](https://github.com/zrwusa/data-structure-typed/issues)
|
|
469
308
|
|
|
470
309
|
---
|
|
471
310
|
|
|
472
|
-
## 📄
|
|
311
|
+
## 📄 许可
|
|
473
312
|
|
|
474
313
|
MIT
|
|
475
314
|
|
|
@@ -478,25 +317,28 @@ MIT
|
|
|
478
317
|
## 📚 完整文档结构
|
|
479
318
|
|
|
480
319
|
```
|
|
320
|
+
README.md (本文件)
|
|
481
321
|
docs/
|
|
482
|
-
├──
|
|
483
|
-
├── CONCEPTS_CN.md (理论和基础)
|
|
322
|
+
├── CONCEPTS_CN.md (理论与基础)
|
|
484
323
|
├── REFERENCE_CN.md (API 文档)
|
|
485
324
|
├── ARCHITECTURE_CN.md (设计原则)
|
|
325
|
+
├── ARCHITECTURE_CN.md (设计细节)
|
|
486
326
|
├── PERFORMANCE_CN.md (基准测试)
|
|
487
|
-
├──
|
|
488
|
-
|
|
327
|
+
├── PERFORMANCE_CN.md (详细基准)
|
|
328
|
+
├── GUIDES_CN.md (实战示例)
|
|
329
|
+
├── INTEGRATIONS_CN.md (框架指南)
|
|
330
|
+
└── INTEGRATIONS_CN.md (完整集成)
|
|
489
331
|
```
|
|
490
332
|
|
|
491
333
|
---
|
|
492
334
|
|
|
493
335
|
## 🎓 了解更多
|
|
494
336
|
|
|
495
|
-
|
|
337
|
+
**刚开始?** → [快速开始](#-快速开始30-秒)
|
|
496
338
|
|
|
497
339
|
**需要概念?** → [CONCEPTS_CN.md](./docs/CONCEPTS_CN.md)
|
|
498
340
|
|
|
499
|
-
|
|
341
|
+
**想构建?** → [GUIDES_CN.md](./docs/GUIDES_CN.md)
|
|
500
342
|
|
|
501
343
|
**需要 API?** → [REFERENCE_CN.md](./docs/REFERENCE_CN.md)
|
|
502
344
|
|
|
@@ -504,6 +346,8 @@ docs/
|
|
|
504
346
|
|
|
505
347
|
**框架问题?** → [INTEGRATIONS_CN.md](./docs/INTEGRATIONS_CN.md)
|
|
506
348
|
|
|
349
|
+
**深入设计?** → [ARCHITECTURE_CN.md](./docs/ARCHITECTURE_CN.md)
|
|
350
|
+
|
|
507
351
|
---
|
|
508
352
|
|
|
509
|
-
|
|
353
|
+
**准备好加速你的 TypeScript 数据结构了吗?[现在开始 →](#-快速开始30-秒)**
|
package/benchmark/report.html
CHANGED
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
.content table tr:nth-child(odd) { background:#fff; }
|
|
11
11
|
</style></head><body><div class="content">
|
|
12
12
|
<div class="json-to-html-title">Benchmark Report</div>
|
|
13
|
-
<h2>red-black-tree</h2><table><thead><tr><th>Test Case</th><th>Latency Avg (ms)</th><th>Min (ms)</th><th>Max (ms)</th><th>Stability</th></tr></thead><tbody><tr><td>1,000,000 set</td><td>
|
|
13
|
+
<h2>red-black-tree</h2><table><thead><tr><th>Test Case</th><th>Latency Avg (ms)</th><th>Min (ms)</th><th>Max (ms)</th><th>Stability</th></tr></thead><tbody><tr><td>1,000,000 set</td><td>2544.36</td><td>2387.12</td><td>2869.15</td><td>±8.37%</td></tr><tr><td>1,000,000 get</td><td>54.20</td><td>52.66</td><td>72.16</td><td>±1.47%</td></tr><tr><td>1,000,000 iterator</td><td>484.95</td><td>470.10</td><td>542.07</td><td>±3.63%</td></tr><tr><td>Competitor 1,000,000 set</td><td>676.05</td><td>651.85</td><td>729.81</td><td>±4.07%</td></tr><tr><td>Competitor 1,000,000 get</td><td>682.61</td><td>675.91</td><td>699.91</td><td>±1.00%</td></tr></tbody></table>
|
|
14
14
|
</div></body></html>
|