data-structure-typed 2.5.2 → 2.5.3

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.
Files changed (156) hide show
  1. package/CHANGELOG.md +3 -1
  2. package/MIGRATION.md +169 -0
  3. package/README.md +60 -6
  4. package/README_CN.md +551 -143
  5. package/SPECIFICATION.md +20 -14
  6. package/SPECIFICATION.zh-CN.md +20 -14
  7. package/dist/cjs/binary-tree.cjs +2417 -132
  8. package/dist/cjs/graph.cjs +248 -14
  9. package/dist/cjs/hash.cjs +62 -7
  10. package/dist/cjs/heap.cjs +103 -16
  11. package/dist/cjs/index.cjs +3046 -124
  12. package/dist/cjs/linked-list.cjs +219 -0
  13. package/dist/cjs/matrix.cjs +32 -0
  14. package/dist/cjs/priority-queue.cjs +101 -14
  15. package/dist/cjs/queue.cjs +215 -0
  16. package/dist/cjs/stack.cjs +44 -4
  17. package/dist/cjs/trie.cjs +44 -0
  18. package/dist/cjs-legacy/binary-tree.cjs +2406 -123
  19. package/dist/cjs-legacy/graph.cjs +248 -14
  20. package/dist/cjs-legacy/hash.cjs +62 -7
  21. package/dist/cjs-legacy/heap.cjs +103 -16
  22. package/dist/cjs-legacy/index.cjs +3105 -185
  23. package/dist/cjs-legacy/linked-list.cjs +219 -0
  24. package/dist/cjs-legacy/matrix.cjs +32 -0
  25. package/dist/cjs-legacy/priority-queue.cjs +101 -14
  26. package/dist/cjs-legacy/queue.cjs +215 -0
  27. package/dist/cjs-legacy/stack.cjs +44 -4
  28. package/dist/cjs-legacy/trie.cjs +44 -0
  29. package/dist/esm/binary-tree.mjs +2417 -132
  30. package/dist/esm/graph.mjs +248 -14
  31. package/dist/esm/hash.mjs +62 -7
  32. package/dist/esm/heap.mjs +103 -16
  33. package/dist/esm/index.mjs +3046 -124
  34. package/dist/esm/linked-list.mjs +219 -0
  35. package/dist/esm/matrix.mjs +32 -0
  36. package/dist/esm/priority-queue.mjs +101 -14
  37. package/dist/esm/queue.mjs +215 -0
  38. package/dist/esm/stack.mjs +44 -4
  39. package/dist/esm/trie.mjs +44 -0
  40. package/dist/esm-legacy/binary-tree.mjs +2406 -123
  41. package/dist/esm-legacy/graph.mjs +248 -14
  42. package/dist/esm-legacy/hash.mjs +62 -7
  43. package/dist/esm-legacy/heap.mjs +103 -16
  44. package/dist/esm-legacy/index.mjs +3105 -185
  45. package/dist/esm-legacy/linked-list.mjs +219 -0
  46. package/dist/esm-legacy/matrix.mjs +32 -0
  47. package/dist/esm-legacy/priority-queue.mjs +101 -14
  48. package/dist/esm-legacy/queue.mjs +215 -0
  49. package/dist/esm-legacy/stack.mjs +44 -4
  50. package/dist/esm-legacy/trie.mjs +44 -0
  51. package/dist/types/data-structures/binary-tree/avl-tree.d.ts +50 -2
  52. package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +56 -0
  53. package/dist/types/data-structures/binary-tree/binary-tree.d.ts +116 -15
  54. package/dist/types/data-structures/binary-tree/bst.d.ts +99 -3
  55. package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +79 -8
  56. package/dist/types/data-structures/binary-tree/segment-tree.d.ts +24 -0
  57. package/dist/types/data-structures/binary-tree/tree-map.d.ts +520 -1
  58. package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +489 -1
  59. package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +393 -1
  60. package/dist/types/data-structures/binary-tree/tree-set.d.ts +500 -1
  61. package/dist/types/data-structures/graph/directed-graph.d.ts +40 -0
  62. package/dist/types/data-structures/graph/undirected-graph.d.ts +36 -0
  63. package/dist/types/data-structures/hash/hash-map.d.ts +51 -6
  64. package/dist/types/data-structures/heap/heap.d.ts +98 -12
  65. package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +75 -0
  66. package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +61 -1
  67. package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +72 -0
  68. package/dist/types/data-structures/matrix/matrix.d.ts +32 -0
  69. package/dist/types/data-structures/queue/deque.d.ts +82 -0
  70. package/dist/types/data-structures/queue/queue.d.ts +61 -0
  71. package/dist/types/data-structures/stack/stack.d.ts +42 -2
  72. package/dist/types/data-structures/trie/trie.d.ts +48 -0
  73. package/dist/types/interfaces/binary-tree.d.ts +2 -3
  74. package/dist/umd/data-structure-typed.js +3105 -185
  75. package/dist/umd/data-structure-typed.min.js +4 -4
  76. package/docs-site-docusaurus/docs/api/classes/AVLTree.md +188 -200
  77. package/docs-site-docusaurus/docs/api/classes/AVLTreeNode.md +11 -11
  78. package/docs-site-docusaurus/docs/api/classes/AbstractGraph.md +62 -62
  79. package/docs-site-docusaurus/docs/api/classes/BST.md +183 -195
  80. package/docs-site-docusaurus/docs/api/classes/BSTNode.md +13 -13
  81. package/docs-site-docusaurus/docs/api/classes/BinaryIndexedTree.md +15 -15
  82. package/docs-site-docusaurus/docs/api/classes/BinaryTree.md +143 -155
  83. package/docs-site-docusaurus/docs/api/classes/BinaryTreeNode.md +13 -13
  84. package/docs-site-docusaurus/docs/api/classes/Deque.md +99 -85
  85. package/docs-site-docusaurus/docs/api/classes/DirectedGraph.md +73 -73
  86. package/docs-site-docusaurus/docs/api/classes/DoublyLinkedList.md +100 -70
  87. package/docs-site-docusaurus/docs/api/classes/DoublyLinkedListNode.md +8 -8
  88. package/docs-site-docusaurus/docs/api/classes/FibonacciHeap.md +12 -12
  89. package/docs-site-docusaurus/docs/api/classes/FibonacciHeapNode.md +1 -1
  90. package/docs-site-docusaurus/docs/api/classes/HashMap.md +38 -38
  91. package/docs-site-docusaurus/docs/api/classes/Heap.md +96 -85
  92. package/docs-site-docusaurus/docs/api/classes/IterableElementBase.md +25 -25
  93. package/docs-site-docusaurus/docs/api/classes/IterableEntryBase.md +23 -23
  94. package/docs-site-docusaurus/docs/api/classes/LinearBase.md +48 -48
  95. package/docs-site-docusaurus/docs/api/classes/LinearLinkedBase.md +52 -52
  96. package/docs-site-docusaurus/docs/api/classes/LinkedHashMap.md +42 -42
  97. package/docs-site-docusaurus/docs/api/classes/LinkedListNode.md +6 -6
  98. package/docs-site-docusaurus/docs/api/classes/LinkedListQueue.md +74 -74
  99. package/docs-site-docusaurus/docs/api/classes/MapGraph.md +73 -73
  100. package/docs-site-docusaurus/docs/api/classes/Matrix.md +31 -31
  101. package/docs-site-docusaurus/docs/api/classes/MaxHeap.md +104 -89
  102. package/docs-site-docusaurus/docs/api/classes/MaxPriorityQueue.md +104 -89
  103. package/docs-site-docusaurus/docs/api/classes/MinHeap.md +104 -89
  104. package/docs-site-docusaurus/docs/api/classes/MinPriorityQueue.md +104 -89
  105. package/docs-site-docusaurus/docs/api/classes/Navigator.md +5 -5
  106. package/docs-site-docusaurus/docs/api/classes/PriorityQueue.md +103 -88
  107. package/docs-site-docusaurus/docs/api/classes/Queue.md +111 -59
  108. package/docs-site-docusaurus/docs/api/classes/RedBlackTree.md +200 -212
  109. package/docs-site-docusaurus/docs/api/classes/SegmentTree.md +10 -10
  110. package/docs-site-docusaurus/docs/api/classes/SinglyLinkedList.md +75 -75
  111. package/docs-site-docusaurus/docs/api/classes/SinglyLinkedListNode.md +6 -6
  112. package/docs-site-docusaurus/docs/api/classes/SkipList.md +37 -37
  113. package/docs-site-docusaurus/docs/api/classes/Stack.md +42 -42
  114. package/docs-site-docusaurus/docs/api/classes/TreeMap.md +107 -36
  115. package/docs-site-docusaurus/docs/api/classes/TreeMultiMap.md +43 -43
  116. package/docs-site-docusaurus/docs/api/classes/TreeSet.md +106 -35
  117. package/docs-site-docusaurus/docs/api/classes/Trie.md +43 -43
  118. package/docs-site-docusaurus/docs/api/classes/TrieNode.md +8 -8
  119. package/docs-site-docusaurus/docs/api/classes/UndirectedGraph.md +72 -72
  120. package/docs-site-docusaurus/docs/guide/architecture.md +75 -7
  121. package/docs-site-docusaurus/docs/guide/concepts.md +53 -34
  122. package/docs-site-docusaurus/docs/guide/faq.md +53 -0
  123. package/docs-site-docusaurus/docs/guide/guides.md +8 -9
  124. package/docs-site-docusaurus/docs/guide/integrations.md +74 -177
  125. package/docs-site-docusaurus/docs/guide/overview.md +131 -17
  126. package/docs-site-docusaurus/src/pages/index.tsx +4 -0
  127. package/docs-site-docusaurus/typedoc.json +1 -0
  128. package/package.json +7 -6
  129. package/src/data-structures/binary-tree/avl-tree.ts +52 -5
  130. package/src/data-structures/binary-tree/binary-indexed-tree.ts +56 -0
  131. package/src/data-structures/binary-tree/binary-tree.ts +167 -81
  132. package/src/data-structures/binary-tree/bst.ts +101 -7
  133. package/src/data-structures/binary-tree/red-black-tree.ts +82 -15
  134. package/src/data-structures/binary-tree/segment-tree.ts +24 -0
  135. package/src/data-structures/binary-tree/tree-map.ts +540 -3
  136. package/src/data-structures/binary-tree/tree-multi-map.ts +490 -2
  137. package/src/data-structures/binary-tree/tree-multi-set.ts +393 -1
  138. package/src/data-structures/binary-tree/tree-set.ts +520 -3
  139. package/src/data-structures/graph/directed-graph.ts +41 -1
  140. package/src/data-structures/graph/undirected-graph.ts +37 -1
  141. package/src/data-structures/hash/hash-map.ts +67 -12
  142. package/src/data-structures/heap/heap.ts +107 -19
  143. package/src/data-structures/linked-list/doubly-linked-list.ts +88 -0
  144. package/src/data-structures/linked-list/singly-linked-list.ts +61 -1
  145. package/src/data-structures/linked-list/skip-linked-list.ts +72 -0
  146. package/src/data-structures/matrix/matrix.ts +32 -0
  147. package/src/data-structures/queue/deque.ts +85 -0
  148. package/src/data-structures/queue/queue.ts +73 -0
  149. package/src/data-structures/stack/stack.ts +45 -5
  150. package/src/data-structures/trie/trie.ts +48 -0
  151. package/src/interfaces/binary-tree.ts +1 -9
  152. package/.vitepress/cache/deps_temp_51f5f1b0/chunk-7OIKW5WK.js +0 -12984
  153. package/.vitepress/cache/deps_temp_51f5f1b0/package.json +0 -3
  154. package/.vitepress/cache/deps_temp_51f5f1b0/vitepress___@vue_devtools-api.js +0 -4505
  155. package/.vitepress/cache/deps_temp_51f5f1b0/vitepress___@vueuse_core.js +0 -9731
  156. package/.vitepress/cache/deps_temp_51f5f1b0/vue.js +0 -347
package/README_CN.md CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  [English](./README.md) | 简体中文
4
4
 
5
- 一个全面的 TypeScript 数据结构库,包含生产就绪的实现。
5
+ 一个生产就绪的 TypeScript 数据结构库,提供 **Heap、Priority Queue、Deque、Trie、Graph、Red-Black Tree、TreeMap、TreeSet、SkipList、Segment Tree** 等数据结构,其 API 就像 JavaScript 原生 `Array` 一样直观。零依赖。类型安全。支持排名查询(`getRank`)、位置访问(`getByRank`)和范围查询(`rangeByRank`)。
6
+
7
+ > **在 JavaScript 中寻找 TreeMap 或 TreeSet?** 需要优先级队列、有序集合或高效的排名/范围查询?厌倦了每次插入后反复排序数组?这个库提供了所有这些功能,并配有统一的、类似 Array 的 API。
6
8
 
7
9
  ![npm](https://img.shields.io/npm/dm/data-structure-typed)
8
10
  ![GitHub contributors](https://img.shields.io/github/contributors/zrwusa/data-structure-typed)
@@ -12,92 +14,178 @@
12
14
  ![NPM](https://img.shields.io/npm/l/data-structure-typed)
13
15
  ![npm](https://img.shields.io/npm/v/data-structure-typed)
14
16
 
15
- **📚 [安装](#-安装) • [快速开始](#-快速开始30-秒) • [完整文档](#-文档) • [API 参考](./docs/REFERENCE_CN.md) • [Playground](#-playground) [示例](./docs/GUIDES_CN.md)**
17
+ **📦 [安装](#-安装) • 🎮 [Playground](#-playground) • ⚡ [快速开始](#-快速开始-30-秒) • 📖 [文档](#-文档) • 📋 [API](https://data-structure-typed-docs.vercel.app/) • 💡 [示例](./docs/GUIDES_CN.md) • ❓ [FAQ](#-faq)**
16
18
 
17
19
  ---
18
20
 
19
21
  ## 目录
20
22
 
21
- 1. [谁应该使用本库?](#-谁应该使用本库)
22
- 2. [为什么不直接用 Array 或 Map?](#-为什么不直接用-array-或-map)
23
- 3. [主要特性](#-主要特性)
24
- 4. [安装](#-安装)
25
- 5. [快速开始](#-快速开始30-秒)
26
- 6. [可用的数据结构](#-可用的数据结构)
27
- 7. [文档](#-文档)
23
+ 1. [安装](#-安装)
24
+ 2. [Playground](#-playground)
25
+ 3. [快速开始](#-快速开始-30-秒)
26
+ 4. [谁应该使用本库?](#-谁应该使用本库)
27
+ 5. [为什么不直接用 Array 或 Map?](#-为什么不直接用-array-或-map)
28
+ 6. [核心特性](#-核心特性)
29
+ 7. [数据结构](#-可用的数据结构)
30
+ 8. [文档](#-文档)
31
+ 9. [FAQ](#-faq)
28
32
 
29
33
  ---
30
34
 
31
- ## 🎯 谁应该使用本库?
35
+ ## 📦 安装
32
36
 
33
- **如果你正在构建排名集合、调度队列或排序数据结构,**
34
- **考虑使用 `data-structure-typed` 而不是手工编写的 Array 或 Map。**
37
+ ```bash
38
+ npm i data-structure-typed
39
+ ```
40
+
41
+ ```bash
42
+ yarn add data-structure-typed
43
+ ```
35
44
 
36
- ### 完美适用于:
45
+ ```bash
46
+ pnpm add data-structure-typed
47
+ ```
37
48
 
38
- - **排行榜与排名** — 高效维护前 K 个数据,无需重复排序
49
+ ### 子路径导入(支持 Tree-Shaking)
50
+
51
+ 只导入你需要的 — 打包器会自动移除未使用的代码:
52
+
53
+ ```typescript
54
+ // 完整包 — 所有功能可用
55
+ import { RedBlackTree, Deque, HashMap } from 'data-structure-typed';
56
+
57
+ // 子路径 — 更小的包体积,只加载你需要的类别
58
+ import { RedBlackTree, TreeMap, AVLTree } from 'data-structure-typed/binary-tree';
59
+ import { Deque, Queue } from 'data-structure-typed/queue';
60
+ import { HashMap } from 'data-structure-typed/hash';
61
+ import { Heap, MinHeap } from 'data-structure-typed/heap';
62
+ import { Trie } from 'data-structure-typed/trie';
63
+ import { Stack } from 'data-structure-typed/stack';
64
+ import { DoublyLinkedList } from 'data-structure-typed/linked-list';
65
+ import { DirectedGraph } from 'data-structure-typed/graph';
66
+ import { Matrix } from 'data-structure-typed/matrix';
67
+ import { MinPriorityQueue } from 'data-structure-typed/priority-queue';
68
+ ```
69
+
70
+ > **注意:** 使用 `"sideEffects": false` 和现代打包器(Vite、Webpack 5、Rollup),即使是完整导入 `from 'data-structure-typed'` 也会进行 tree-shake。子路径导入让你拥有明确的控制权和更快的 IDE 自动补全。
71
+
72
+ ### 独立包
73
+
74
+ 也提供独立的 NPM 包:
75
+
76
+ ```bash
77
+ npm i avl-tree-typed bst-typed heap-typed
78
+ ```
79
+
80
+ ---
81
+
82
+ ## 🎮 Playground
83
+
84
+ 立即尝试:
85
+
86
+ - [Node.js TypeScript](https://stackblitz.com/github/zrwusa/dst-playgrounds/tree/main/apps/nodejs-ts?file=src%2Findex.ts&title=data-structure-typed%20%E2%80%94%20Node.js%20TypeScript)
87
+ - [Node.js JavaScript](https://stackblitz.com/github/zrwusa/dst-playgrounds/tree/main/apps/nodejs-js?file=src%2Findex.js&title=data-structure-typed%20%E2%80%94%20Node.js%20JavaScript)
88
+ - [React TypeScript](https://stackblitz.com/github/zrwusa/dst-playgrounds/tree/main/apps/reactjs?file=src%2FApp.tsx&title=data-structure-typed%20%E2%80%94%20React%20Playground)
89
+ - [NestJS](https://stackblitz.com/github/zrwusa/dst-playgrounds/tree/main/apps/nestjs?file=src%2Fproduct%2Fservices%2Fproduct-price-index.service.ts&title=data-structure-typed%20%E2%80%94%20NestJS%20Product%20API)
90
+
91
+ ---
92
+
93
+ ## 🎯 谁应该使用本库?
94
+
95
+ **如果你正在用 TypeScript 构建排名集合、调度队列或排序数据结构,**
96
+ **请考虑使用 `data-structure-typed` 而不是手工编写的 Array 或 Map。**
97
+
98
+ ### 适用场景:
99
+
100
+ - **排行榜与排名** — 高效维护 top-K,无需重复排序
39
101
  - **任务调度** — 优先级队列、有序执行、基于时间的操作
40
- - **实时仪表板** — Grafana 风格的工作负载,支持即时查询
41
- - **时间序列数据** — 排序插入 + 快速范围查询
42
- - **搜索与自动完成** — 大规模前缀匹配
43
- - **图论问题** — 路径查找、循环检测、拓扑排序
102
+ - **实时仪表板** — Grafana 风格的工作负载,即时查询
103
+ - **时间序列数据** — 有序插入 + 快速范围查询
104
+ - **搜索与自动补全** — 大规模前缀匹配
105
+ - **图论问题** — 路径查找、环检测、拓扑排序
44
106
 
45
107
  ---
46
108
 
47
- ## ⚡ 为什么不直接用 Array 或 Map
109
+ ## ⚡ 为什么不直接用 Array 或 Map?
48
110
 
49
111
  | 使用场景 | Array | Map | data-structure-typed |
50
112
  |------------------------|----------------------|------------------|:--------------------:|
51
- | **排序查询** | ❌ O(n) | ❌ 无序 | ✅ **O(log n)** |
52
- | **在特定位置插入** | ❌ O(n) shift | ❌ 无位置 | ✅ **O(log n)** |
53
- | **排行榜前 K** | ❌ 重新排序 O(n log n) | ❌ 手动排序 | ✅ **即时** |
54
- | **从前面移除** | ❌ O(n) | ❌ 无出队 | ✅ **O(1)** |
113
+ | **有序查找** | ❌ O(n) | ❌ 无序 | ✅ **O(log n)** |
114
+ | **指定位置插入** | ❌ O(n) shift | ❌ 无位置 | ✅ **O(log n)** |
115
+ | **排行榜 Top-K** | ❌ 重排序 O(n log n) | ❌ 手动排序 | ✅ **即时** |
116
+ | **从前端移除** | ❌ O(n) | ❌ 无出队 | ✅ **O(1)** |
55
117
  | **前缀搜索** | ❌ O(n*m) | ❌ 不适用 | ✅ **O(m + k)** |
56
- | **熟悉的 API** | ✅ | ✅ | ✅ **相同** |
118
+ | **熟悉的 API** | ✅ | ✅ | ✅ **相同** |
57
119
 
58
- ### 真实场景痛点
120
+ ### 真实痛点
59
121
 
60
122
  ```javascript
61
123
  // ❌ 不使用 data-structure-typed
62
- const queue = [1, 2, 3, ..., 100000];
124
+ const queue = [1, 2, 3, ..., 100000
125
+ ]
126
+ ;
63
127
  for (let i = 0; i < 100000; i++) {
64
- queue.shift(); // O(n) - 重新索引所有元素!
128
+ queue.shift(); // O(n) - 重新索引每个元素!
65
129
  }
66
130
  // 耗时: 2829ms ❌
67
131
  ```
68
132
 
69
133
  ```javascript
70
134
  // ✅ 使用 data-structure-typed (Deque)
71
- const deque = new Deque([1, 2, 3, ..., 100000]);
135
+ const deque = new Deque([1, 2, 3, ..., 100000])
136
+ ;
72
137
  for (let i = 0; i < 100000; i++) {
73
- deque.shift(); // O(1) - 仅移动指针
138
+ deque.shift(); // O(1) - 只移动指针
74
139
  }
75
140
  // 耗时: 5.83ms ✅
76
- // **约快 485 倍!**
141
+ // **快 484 倍!**
77
142
  ```
78
143
 
79
144
  ---
80
145
 
81
- ## 🚀 性能 (简版)
146
+ ## 🚀 性能 (TL;DR)
82
147
 
83
- - **针对 V8 热路径优化**(以 [PERFORMANCE_CN.md](./docs/PERFORMANCE_CN.md) 的实测基准为准)
148
+ - **针对 V8 热路径优化** (查看 [PERFORMANCE_CN.md](./docs/PERFORMANCE_CN.md) 了解实测基准)
84
149
  - 重复 Array.shift() O(n) → Deque O(1)
85
- - 频繁更新且需要保持有序 → RedBlackTree O(log n)
86
- - 如果每次更新后都要保持排序,尽量避免反复 `Array.sort()`
87
-
88
- - **针对 V8 JIT 优化** (Node.js 18+、现代浏览器)
89
-
90
- - **Tree-shakable** ESM / CJS / 旧版构建
91
-
92
- 📊 [完整基准测试 →](./docs/PERFORMANCE_CN.md)
150
+ - 频繁更新 + 保持有序的工作流 → RedBlackTree O(log n) 操作
151
+ - 如果每次更新后都必须保持有序,避免重复 `Array.sort()`
152
+
153
+ - **针对 V8 JIT 优化** (Node.js 18+, 现代浏览器)
154
+
155
+ - **Tree-shakable** ESM / CJS / legacy 构建
156
+
157
+ [//]: # (No deletion!!! Start of README Performance Section)
158
+
159
+ | 数据结构 | 测试用例 | DST (ms) | Native (ms) | C++ (ms) | js-sdsl (ms) |
160
+ |----------------|-----------|----------|-------------|----------|---------------|
161
+ | Queue | 1M push | 26.93 | 23.83 | 1.70 | 27.59 |
162
+ | Deque | 1M push | 9.77 | 26.81 | 1.76 | 7.79 |
163
+ | DoublyLinkedList | 100k push | 5.70 | 2.40 | 5.70 | 1.90 |
164
+ | SinglyLinkedList | 100K unshift & shift | 3.77 | 1958.39 | 4.80 | - |
165
+ | PriorityQueue | 100K add | 4.00 | - | 1.05 | 4.96 |
166
+ | TreeSet | 1M add | 995.72 | - | 462.00 | 677.58 |
167
+ | TreeMap | 1M set | 978.72 | - | 512.00 | 623.23 |
168
+ | TreeMultiSet | 1M add (TreeMultiSet expanded iteration) | 217.73 | - | 752.00 | - |
169
+ | TreeMultiMap | 1M add (TreeMultiMap bucketed) | 366.19 | - | 731.00 | - |
170
+ | RedBlackTree | 1M get | 99.24 | - | 52.97 | - |
171
+ | BST | 10K add randomly | 5.50 | - | - | - |
172
+ | BinaryTree | 1K add randomly | 9.77 | - | - | - |
173
+ | HashMap | 1M set | 146.17 | 144.83 | 76.26 | 94.16 |
174
+ | Trie | 100K add | 141.10 | - | - | - |
175
+ | DirectedGraph | 1K addVertex | 0.05 | - | - | - |
176
+ | Stack | 1M push | 46.38 | 30.28 | 1.65 | 32.38 |
177
+
178
+ [//]: # (No deletion!!! End of README Performance Section)
179
+
180
+ 📊 [完整基准测试 →](./docs/PERFORMANCE_CN.md) | [交互式报告 →](./docs/benchmark.html)
93
181
 
94
182
  ---
95
183
 
96
- ## ✨ 主要特性
184
+ ## ✨ 核心特性
97
185
 
98
- ### 🏠 统一的 API
186
+ ### 🏠 统一 API
99
187
 
100
- 不需要学习新 API。在任何地方都使用 `push`、`pop`、`map`、`filter` 和 `reduce`。
188
+ 无需学习新 API。到处都使用 `push`、`pop`、`map`、`filter` 和 `reduce`。
101
189
 
102
190
  ```javascript
103
191
  // 所有线性结构使用相同的 4 个方法
@@ -106,10 +194,10 @@ const queue = new Queue([1, 2, 3]);
106
194
  const doublyLinkeList = new DoublyLinkedList([1, 2, 3]);
107
195
  const singlyLinkedList = new SinglyLinkedList([1, 2, 3]);
108
196
 
109
- // 它们都支持:
197
+ // 它们都支持:
110
198
  structure.push(item); // 添加到末尾
111
- structure.pop(); // 移除末尾
112
- structure.shift(); // 移除开头
199
+ structure.pop(); // 从末尾移除
200
+ structure.shift(); // 从开头移除
113
201
  structure.unshift(item); // 添加到开头
114
202
  ```
115
203
 
@@ -128,94 +216,138 @@ const value = tree.get(1); // 类型: string | undefined
128
216
 
129
217
  ### ✨ 零摩擦
130
218
 
131
- 随处可用。使用扩展运算符 `[...]`、for...of 循环它、立即转换它。
219
+ 随处可用。展开它 `[...]`,循环它 `for..of`,即时转换。使用 `toEntryFn`/`toElementFn` 传入原始数据 — 无需预处理。
132
220
 
133
221
  ```javascript
134
222
  // 所有数据结构都支持迭代器协议
135
223
  const tree = new RedBlackTree([5, 2, 8]);
136
- const sorted = [...tree]; // 扩展运算符
224
+ const sorted = [...tree]; // 展开运算符
137
225
  for (const item of tree) {
138
226
  } // for...of 循环
139
227
  const set = new Set(tree); // Set 构造器
140
- ```
141
228
 
142
- ---
143
-
144
- ## 📥 安装
145
-
146
- ```bash
147
- pnpm add data-structure-typed
229
+ // 直接传入原始数据
230
+ const map = new TreeMap(users, { toEntryFn: u => [u.id, u.name] });
148
231
  ```
149
232
 
150
- ```bash
151
- npm i data-structure-typed --save
152
- ```
153
-
154
- ```bash
155
- yarn add data-structure-typed
156
- ```
233
+ ### 🔄 处理原始数据
157
234
 
158
- ### 单个包
235
+ 有原始对象?三种使用方式 — 根据你想存储的内容选择:
159
236
 
160
- 仅使用你需要的:
237
+ ```typescript
238
+ interface User {
239
+ id: number;
240
+ name: string;
241
+ }
161
242
 
162
- ```bash
163
- pnpm add heap-typed deque-typed red-black-tree-typed
243
+ const users: User[] = [
244
+ { id: 3, name: 'Charlie' },
245
+ { id: 1, name: 'Alice' },
246
+ { id: 2, name: 'Bob' }
247
+ ];
248
+
249
+ // 1. 提取字段 — 仅存储该字段
250
+ const ids = new TreeSet<number, User>(
251
+ users,
252
+ { toElementFn: u => u.id }
253
+ );
254
+ // [1, 2, 3] — 仅数字,不保留原始对象
255
+
256
+ // 2. 存储完整对象 — 按字段排序
257
+ const fullSet = new TreeSet<User>(
258
+ users,
259
+ { comparator: (a, b) => a.id - b.id }
260
+ );
261
+ // [{ id: 1, name: 'Alice' }, { id: 2, ... }, { id: 3, ... }]
262
+
263
+ // 3. 拆分为键值对 — 字段作为键,任意值
264
+ const map = new TreeMap<number, User, User>(
265
+ users,
266
+ { toEntryFn: u => [u.id, u] }
267
+ );
268
+ // map.get(1) → { id: 1, name: 'Alice' }
164
269
  ```
165
270
 
271
+ 适用于所有数据结构 — 单值类型使用 `toElementFn` (Heap、Queue、Stack、LinkedList、Trie),键值类型使用 `toEntryFn` (TreeMap、HashMap、SkipList),任何排序结构使用 `comparator`。
272
+
166
273
  ---
167
274
 
168
- ## 💡 我应该何时考虑使用本库?
275
+ ## 💡 我应该何时考虑本库?
169
276
 
170
- **当你需要:**
277
+ **当你需要:**
171
278
 
172
- - K 个查询 / 排行榜而无需重复排序
173
- - 同时实现插入顺序和查询性能
174
- - 带有快速位置访问的优先级队列
279
+ - Top-K / 排行榜查询而无需重复排序
280
+ - 同时实现插入顺序 + 查找性能
281
+ - 带快速位置访问的优先级队列
175
282
  - 支持范围查询的时间序列数据
176
- - RedBlackTree / Heap 性能而无需学习新 API
283
+ - Red-Black Tree / Heap 性能而无需学习新 API
284
+ - **直接传入原始对象** — 无需 `.map()` 预处理(JS/TS 中本库独有)
177
285
 
178
- **当你的代码有:**
286
+ **当你的代码有:**
179
287
 
180
- - 在热路径中使用 `array.sort()`(请求处理程序、循环)
288
+ - 热路径中的 `array.sort()`(请求处理器、循环)
181
289
  - 插入后的手动索引跟踪
182
- - 在大列表上使用 `Array.shift()`(队列)
183
- - 在文件中重复的自定义排序逻辑
184
- - 需要排序的 Map
290
+ - 大列表上的 `Array.shift()`(队列)
291
+ - 跨文件重复的自定义排序逻辑
292
+ - 需要有序的 Map
293
+ - 仅为重塑数据才调用 `.map()`,然后放入集合
185
294
 
186
295
  ---
187
296
 
188
- ## 🚀 快速开始:30 秒
297
+ ## 🚀 快速开始: 30 秒
189
298
 
190
- ### 排行榜(排名集合)
299
+ ### 排行榜(排名集合)
191
300
 
192
301
  ```typescript
193
302
  import { RedBlackTree } from 'data-structure-typed';
194
303
 
195
- const leaderboard = new RedBlackTree([
304
+ // 降序比较器 最高分在前
305
+ const leaderboard = new RedBlackTree<number, string>([
196
306
  [100, 'Alice'],
197
307
  [85, 'Bob'],
198
308
  [92, 'Charlie']
199
- ]);
309
+ ], { comparator: (a, b) => b - a });
200
310
 
201
- // 获取排序的分数(自动维护!)
202
- for (const [score, player] of leaderboard) {
203
- console.log(`${player}: ${score}`);
204
- }
205
- // 输出:
206
- // Alice: 100
207
- // Charlie: 92
208
- // Bob: 85
311
+ // 通过惰性迭代器获取 Top-2 — O(k log n),无数组拷贝
312
+ const iter = leaderboard.entries();
313
+ const { value: [topScore, topPlayer] } = iter.next();
314
+ console.log(`${topScore}: ${topPlayer}`); // 100: Alice
209
315
 
210
- // 更新分数
316
+ // 更新分数 — O(log n)
211
317
  leaderboard.delete(85);
212
- leaderboard.set(95, 'Bob'); // O(log n)
318
+ leaderboard.set(95, 'Bob');
319
+
320
+ // 范围查询 — 分数 90~100 的玩家, O(log n + k)
321
+ const scores90to100 = leaderboard.rangeSearch([90, 100]);
322
+ // [100, 95, 92] — 自动遵循树的顺序
323
+
324
+ // 对于 O(log n) top-k、排名和分页 → 参见下面的 Order-Statistic Tree
325
+ ```
213
326
 
214
- // 查询前几名玩家
215
- const topPlayers = [...leaderboard.values()].reverse().slice(0, 3);
327
+ ### Order-Statistic Tree(排名查询)
328
+
329
+ ```typescript
330
+ import { RedBlackTree } from 'data-structure-typed';
331
+
332
+ const tree = new RedBlackTree<number, string>([
333
+ [100, 'Alice'], [85, 'Bob'], [92, 'Charlie'],
334
+ [78, 'Diana'], [95, 'Eve']
335
+ ], { comparator: (a, b) => b - a, enableOrderStatistic: true });
336
+
337
+ // select(k) — 查找第 k 个元素, O(log n)
338
+ tree.getByRank(0); // 100 (树顺序的第 1 个)
339
+ tree.getByRank(2); // 92 (树顺序的第 3 个)
340
+
341
+ // rank(key) — 统计树顺序中 key 之前的元素数量, O(log n)
342
+ tree.getRank(92); // 2 (树顺序中 92 之前有 2 个元素)
343
+
344
+ // rangeByRank — 分页, O(log n + k)
345
+ tree.rangeByRank(0, 2); // [100, 95, 92] — 前 3 个
346
+
347
+ // 也适用于 TreeMap、TreeSet、TreeMultiMap、TreeMultiSet
216
348
  ```
217
349
 
218
- ### 任务队列(调度)
350
+ ### 任务队列(调度)
219
351
 
220
352
  ```typescript
221
353
  import { MaxPriorityQueue } from 'data-structure-typed';
@@ -227,7 +359,7 @@ const taskQueue = new MaxPriorityQueue<{priority: number; task: string}>([], {
227
359
  taskQueue.add({ priority: 5, task: 'Email' });
228
360
  taskQueue.add({ priority: 9, task: 'Alert' }); // 即时优先级处理
229
361
 
230
- const nextTask = taskQueue.poll(); // { priority: 9, task: 'Alert' }
362
+ const nextTask = taskQueue.pop(); // { priority: 9, task: 'Alert' }
231
363
  ```
232
364
 
233
365
  ### 快速队列 (FIFO)
@@ -236,74 +368,303 @@ const nextTask = taskQueue.poll(); // { priority: 9, task: 'Alert' }
236
368
  import { Deque } from 'data-structure-typed';
237
369
 
238
370
  const queue = new Deque([1, 2, 3, 4, 5]);
239
- queue.shift(); // 从前面移除: O(1) 而不是 O(n)
240
- queue.push(6); // 添加到后面: O(1)
371
+ queue.shift(); // 从前端移除: O(1) 而非 O(n)
372
+ queue.push(6); // 添加到后端: O(1)
241
373
  ```
242
374
 
243
375
  ---
244
376
 
245
377
  ## 📊 可用的数据结构
246
378
 
247
- | 结构 | 用途 | 时间复杂度 |
248
- |----------------|----------------------------------|:------------------------:|
249
- | **Array** | 基础顺序存储 | O(1) 访问,O(n) 插入 |
250
- | **LinkedList** | 链式存储 | O(n) 访问,O(1) 插入 |
251
- | **Stack** | LIFO (后进先出) | O(1) 推入/弹出 |
252
- | **Queue** | FIFO (先进先出) | O(1) 入队/出队 |
253
- | **Deque** | 双端队列 | O(1) 两端操作 |
254
- | **Heap** | 优先级访问 | O(1) 查看,O(log n) 修改 |
255
- | **BST** | 排序范围查询 | O(log n) 平衡时 |
256
- | **RedBlackTree** | 自平衡树 | O(log n) 保证 |
257
- | **AVL Tree** | 严格平衡树 | O(log n) 保证 |
258
- | **Trie** | 前缀搜索 | O(m) m 是字符串长度 |
259
- | **Graph** | 网络结构 | 取决于实现 |
379
+ | 结构 | 使用场景 | 时间复杂度 | NPM |
380
+ |--------------------------|-----------------------------------|-----------------|-----------------------------------------------------------|
381
+ | **RedBlackTree** | 有序集合、范围查询 | O(log n) | [npm](https://www.npmjs.com/package/red-black-tree-typed) |
382
+ | **Heap / PriorityQueue** | 任务调度、top-K 元素 | O(log n) | [npm](https://www.npmjs.com/package/heap-typed) |
383
+ | **Deque** | 快速前后操作 | O(1) | [npm](https://www.npmjs.com/package/deque-typed) |
384
+ | **Trie** | 自动补全、前缀搜索 | O(m+k) | [npm](https://www.npmjs.com/package/trie-typed) |
385
+ | **DirectedGraph** | 路径查找、DAG 算法 | O(V+E) | [npm](https://www.npmjs.com/package/directed-graph-typed) |
386
+ | **Stack** | 撤销/重做、表达式解析 | O(1) | [npm](https://www.npmjs.com/package/stack-typed) |
387
+ | **LinkedList** | 动态大小、无索引移位 | O(1)* | [npm](https://www.npmjs.com/package/linked-list-typed) |
388
+ | **AVLTree** | 比 RB-Tree 更严格的平衡 | O(log n) | [npm](https://www.npmjs.com/package/avl-tree-typed) |
389
+ | **SkipList** | 有序 KV、TreeMap 替代 | O(log n) avg | — |
390
+ | **SegmentTree** | 范围 sum/min/max/自定义查询 | O(log n) | |
391
+ | **BinaryIndexedTree** | 前缀和、频率计数 | O(log n) | — |
392
+ | **Matrix** | 2D 网格运算 | O(n²) add | — |
393
+
394
+ 👉 [查看全部 20+ 结构 →](./docs/OVERVIEW_CN.md) | [完整 API 文档 →](https://data-structure-typed-docs.vercel.app/)
260
395
 
261
396
  ---
262
397
 
263
- ## 🎮 Playground
398
+ ## 📖 文档
399
+
400
+ ### 不同使用场景
401
+
402
+ | 你的目标 | 从这里开始 | 下一步 |
403
+ |---------------------------|-------------------------------------------|-----------------------------------------|
404
+ | **学习概念** | [CONCEPTS_CN.md](./docs/CONCEPTS_CN.md) | [GUIDES_CN.md](./docs/GUIDES_CN.md) |
405
+ | **在项目中使用** | [GUIDES_CN.md](./docs/GUIDES_CN.md) | [OVERVIEW_CN.md](./docs/OVERVIEW_CN.md) |
406
+ | **查找 API** | [API 文档](https://data-structure-typed-docs.vercel.app/) | [PERFORMANCE_CN.md](./docs/PERFORMANCE_CN.md) |
407
+ | **性能问题** | [PERFORMANCE_CN.md](./docs/PERFORMANCE_CN.md) | [ARCHITECTURE_CN.md](./docs/ARCHITECTURE_CN.md) |
408
+ | **框架集成** | [INTEGRATIONS_CN.md](./docs/INTEGRATIONS_CN.md) | [GUIDES_CN.md](./docs/GUIDES_CN.md) |
409
+ | **理解设计** | [ARCHITECTURE_CN.md](./docs/ARCHITECTURE_CN.md) | [CONCEPTS_CN.md](./docs/CONCEPTS_CN.md) |
410
+
411
+ ### 文档文件
412
+
413
+ 1. **[CONCEPTS_CN.md](./docs/CONCEPTS_CN.md)** - 核心基础与理论
414
+ - 三大核心概念 (BST、平衡树、Heap)
415
+ - 13 个通俗语言解释
416
+ - 迭代器协议设计
417
+ - 5 个与原生 JavaScript 的对比
418
+ - 完整决策指南
419
+
420
+ 2. **[API 文档](https://data-structure-typed-docs.vercel.app/)** - 完整 API 参考 (TypeDoc)
421
+ - 完整的方法签名、参数、返回类型
422
+ - 每个方法的真实 `@example` 代码
423
+ - 继承层次和类型详情
424
+
425
+ 3. **[OVERVIEW_CN.md](./docs/OVERVIEW_CN.md)** - 数据结构概览
426
+ - 快速参考表
427
+ - 全部 20+ 结构及示例
428
+ - CRUD 操作
429
+ - 常用方法
430
+ - TypeScript 支持
431
+
432
+ 4. **[ARCHITECTURE_CN.md](./docs/ARCHITECTURE_CN.md)** - 设计与实现
433
+ - 设计理念与原则
434
+ - 解决的 3 大痛点
435
+ - 为什么 Deque 快 484 倍
436
+ - 迭代器协议设计
437
+ - 自平衡策略
438
+ - V8 JIT 优化
439
+
440
+ 5. **[PERFORMANCE_CN.md](./docs/PERFORMANCE_CN.md)** - 基准测试与对比
441
+ - 性能总结
442
+ - 3 个真实场景
443
+ - 详细基准测试
444
+ - 何时使用什么
445
+ - 优化技巧
446
+
447
+ 6. **[GUIDES_CN.md](./docs/GUIDES_CN.md)** - 真实案例
448
+ - 4 种设计模式
449
+ - 5 个生产代码示例
450
+ - 常见错误
451
+ - 最佳实践
452
+
453
+ 7. **[INTEGRATIONS_CN.md](./docs/INTEGRATIONS_CN.md)** - 框架集成
454
+ - React 集成 (状态管理、排行榜)
455
+ - Express 集成 (LRU 缓存、限流)
456
+ - Nest.js 集成 (排名服务、任务队列)
457
+ - TypeScript 配置
264
458
 
265
- 🏃🏻‍♀️ 立即尝试:
459
+ ---
460
+
461
+ ## 💻 真实案例
266
462
 
267
- - [Node.js TypeScript](https://stackblitz.com/edit/stackblitz-starters-e1vdy3zw?file=src%2Findex.ts)
268
- - [Node.js JavaScript](https://stackblitz.com/edit/stackblitz-starters-oczhrfzn?file=src%2Findex.js)
269
- - [React TypeScript](https://stackblitz.com/edit/vitejs-vite-7bva1zhd?file=src%2FApp.tsx)
270
- - [NestJS](https://stackblitz.com/edit/nestjs-typescript-starter-q9n7okgc?file=src%2Fproduct%2Fservices%2Fproduct-price-index.service.ts)
463
+ ### LRU 缓存
271
464
 
272
- ### 第 4 步:了解更多
465
+ ```typescript
466
+ class LRUCache<K, V> {
467
+ private cache = new Map<K, V>();
468
+ private order = new DoublyLinkedList<K>();
469
+
470
+ get(key: K): V | null {
471
+ if (!this.cache.has(key)) return null;
472
+ // 移到末尾 (最近使用)
473
+ // 利用 O(1) 操作实现高效
474
+ return this.cache.get(key)!;
475
+ }
476
+ }
477
+ ```
273
478
 
274
- 👉 查看 [CONCEPTS_CN.md](./docs/CONCEPTS_CN.md) 了解核心概念
275
- 👉 查看 [GUIDES_CN.md](./docs/GUIDES_CN.md) 了解生产示例
276
- 👉 阅读 [REFERENCE_CN.md](./docs/REFERENCE_CN.md) 了解完整 API
479
+ ### 排行榜
480
+
481
+ ```typescript
482
+
483
+ type Player = {
484
+ id: string;
485
+ name: string;
486
+ score: number;
487
+ };
488
+
489
+ const seedPlayers: Player[] = [
490
+ { id: 'player_01HZX4E8Q2K8Y3J9M7T1A6B3C4', name: 'Pablo', score: 65 },
491
+ { id: 'player_01HZX4E9R6V2D8K1P0N5S4T7U8', name: 'Bunny', score: 10 },
492
+ { id: 'player_01HZX4EA3M9Q7W1E2R8T6Y5U0I', name: 'Jeff', score: 99 },
493
+ ];
494
+
495
+ class ScoreLeaderboard {
496
+ private readonly byScore: RedBlackTree<number, Player, Player>;
497
+
498
+ constructor(initialPlayers: Player[]) {
499
+ this.byScore = new RedBlackTree<number, Player, Player>(initialPlayers, {
500
+ isMapMode: false,// 使用"节点值"存储而非 Map 风格。
501
+ toEntryFn: (player) => [player.score, player], // 将玩家对象转换为树条目: key = score, value = player.
502
+ });
503
+ }
504
+
505
+ /**
506
+ * 返回分数在给定范围内的玩家。
507
+ * 支持元组 [min, max] 或 Range 对象以实现包含/排除边界。
508
+ */
509
+ public findPlayersByScoreRange(range: [number, number] | Range<number>): (Player | undefined)[] {
510
+ return this.byScore.rangeSearch(range, (node) => node.value);
511
+ }
512
+
513
+ public upsertPlayer(player: Player) {
514
+ return this.byScore.set(player.score, player);
515
+ }
516
+ }
517
+
518
+ const leaderboard = new ScoreLeaderboard(seedPlayers);
519
+
520
+ console.log(leaderboard.findPlayersByScoreRange([65, 100]));
521
+
522
+ leaderboard.upsertPlayer({
523
+ id: 'player_01HZX4EB7C4N2M9Q8R1T3Y6U5I',
524
+ name: 'Alex',
525
+ score: 80,
526
+ });
527
+
528
+ console.log(leaderboard.findPlayersByScoreRange(new Range(65, 100, true, true)));
529
+ ```
530
+
531
+ ### 消息队列
532
+
533
+ ```typescript
534
+ type Message = {
535
+ id: string;
536
+ type: string;
537
+ payload: unknown;
538
+ priority: 'urgent' | 'normal';
539
+ createdAt: number;
540
+ retryCount?: number;
541
+ };
542
+
543
+ class MessageQueue {
544
+ private urgent = new Deque<Message>();
545
+ private normal = new Deque<Message>();
546
+
547
+ dequeue(): Message | null {
548
+ return this.urgent.shift() || this.normal.shift();
549
+ }
550
+ }
551
+ ```
552
+
553
+ 👉 [更多示例在 GUIDES_CN.md](./docs/GUIDES_CN.md)
554
+
555
+ ---
556
+
557
+ ## 🎯 行业使用场景
558
+
559
+ ### 📊 金融
560
+
561
+ - 价格排序的订单簿
562
+ - 实时投资组合排名
563
+ - 期权链排序
564
+
565
+ ### 🎮 游戏
566
+
567
+ - 玩家排行榜
568
+ - 敌人优先级队列
569
+ - 游戏事件调度
570
+
571
+ ### 📱 社交媒体
572
+
573
+ - 热门帖子 (top-K)
574
+ - 信息流排序
575
+ - 通知调度
576
+
577
+ ### 🏥 医疗
578
+
579
+ - 患者优先级队列
580
+ - 预约调度
581
+ - 医疗记录组织
582
+
583
+ ### 🛒 电商
584
+
585
+ - 产品价格范围
586
+ - 库存管理
587
+ - 订单调度
588
+
589
+ ---
590
+
591
+ ## ✨ 开发者喜爱的原因
592
+
593
+ | 痛点 | 解决方案 |
594
+ |------------------------------------|-------------------------------------------|
595
+ | 重复排序拖慢代码 | TreeSet 自动维护顺序 |
596
+ | 循环中 Array.shift 超时 | Deque O(1) shift 而非 O(n) |
597
+ | 学习不同 API | 所有结构都使用 push/pop/shift/unshift |
598
+ | 类型安全噩梦 | 完整 TypeScript 泛型支持 |
599
+ | 浏览器兼容性问题 | 随处可用: Node、浏览器、CDN |
277
600
 
278
601
  ---
279
602
 
603
+ ## 📦 你将获得
604
+
605
+ ✅ **20+ 数据结构** (生产就绪)
606
+ ✅ **50+ 代码示例** (真实模式)
607
+ ✅ **完整 TypeScript 支持** (严格类型)
608
+ ✅ **性能基准测试** (484 倍加速)
609
+ ✅ **框架集成** (React、Express、Nest.js)
610
+ ✅ **6 个核心文档文件** (2500+ 行)
611
+
612
+ ---
613
+
614
+ ## 🚀 开始使用
615
+
616
+ ### 步骤 1: 安装
617
+
618
+ ```bash
619
+ npm i data-structure-typed
620
+ ```
621
+
622
+ ### 步骤 2: 导入
623
+
624
+ ```typescript
625
+ import { RedBlackTree, Deque, MaxPriorityQueue } from 'data-structure-typed';
626
+ ```
627
+
628
+ ### 步骤 3: 使用
629
+
630
+ ```typescript
631
+ const tree = new RedBlackTree([5, 2, 8]);
632
+ console.log([...tree]); // [2, 5, 8] - 自动排序!
633
+ ```
634
+
280
635
  ## 📊 对比图表
281
636
 
282
637
  ```
283
- 需要频繁头尾操作?
638
+ 需要频繁头/尾操作?
284
639
  → Deque (O(1) shift/unshift/push/pop)
285
640
 
286
- 需要排序 + 快速查找?
641
+ 需要排序 + 快速查找?
287
642
  → RedBlackTree (O(log n) 保证)
288
643
 
289
- 需要最高/最低优先级?
290
- → Heap/PriorityQueue (O(log n) 添加/删除)
644
+ 需要最高/最低优先级?
645
+ → Heap/PriorityQueue (O(log n) add/remove)
291
646
 
292
- 需要前缀/文本匹配?
647
+ 需要前缀/文本匹配?
293
648
  → Trie (O(m+k) 其中 m=前缀)
294
649
 
295
- 需要图论操作?
650
+ 需要图论操作?
296
651
  → DirectedGraph/UndirectedGraph
297
652
 
298
- 否则?
299
- 使用 Array(最简单的情况)
653
+ 需要数组上的范围查询 (sum/min/max)?
654
+ SegmentTree (任意合并操作) 或 BinaryIndexedTree (仅前缀和)
655
+
656
+ 需要有序键值对且 API 与 TreeMap 相同?
657
+ → SkipList (O(log n) avg, 概率平衡)
658
+
659
+ 否则?
660
+ → 使用 Array (最简单的情况)
300
661
  ```
301
662
 
302
663
  ---
303
664
 
304
665
  ## 🤝 贡献
305
666
 
306
- 找到 bug?有建议?[提出 issue](https://github.com/zrwusa/data-structure-typed/issues)
667
+ 发现 bug?有建议? [提出 issue](https://github.com/zrwusa/data-structure-typed/issues)
307
668
 
308
669
  ---
309
670
 
@@ -319,34 +680,81 @@ MIT
319
680
  README.md (本文件)
320
681
  docs/
321
682
  ├── CONCEPTS_CN.md (理论与基础)
322
- ├── REFERENCE_CN.md (API 文档)
683
+ ├── OVERVIEW_CN.md (数据结构概览)
323
684
  ├── ARCHITECTURE_CN.md (设计原则)
324
- ├── ARCHITECTURE_CN.md (设计细节)
325
685
  ├── PERFORMANCE_CN.md (基准测试)
326
- ├── PERFORMANCE_CN.md (详细基准)
327
- ├── GUIDES_CN.md (实战示例)
328
- ├── INTEGRATIONS_CN.md (框架指南)
329
- └── INTEGRATIONS_CN.md (完整集成)
686
+ ├── GUIDES_CN.md (真实案例)
687
+ └── INTEGRATIONS_CN.md (框架指南)
330
688
  ```
331
689
 
332
690
  ---
333
691
 
334
692
  ## 🎓 了解更多
335
693
 
336
- **刚开始?** → [快速开始](#-快速开始30-秒)
694
+ **刚开始?** → [快速开始](#-快速开始-30-秒)
337
695
 
338
- **需要概念?** → [CONCEPTS_CN.md](./docs/CONCEPTS_CN.md)
696
+ **需要概念?** → [CONCEPTS_CN.md](./docs/CONCEPTS_CN.md)
339
697
 
340
- **想构建?** → [GUIDES_CN.md](./docs/GUIDES_CN.md)
698
+ **想构建?** → [GUIDES_CN.md](./docs/GUIDES_CN.md)
341
699
 
342
- **需要 API?** → [REFERENCE_CN.md](./docs/REFERENCE_CN.md)
700
+ **需要 API?** → [API 文档](https://data-structure-typed-docs.vercel.app/) | [概览](./docs/OVERVIEW_CN.md)
343
701
 
344
- **好奇性能?** → [PERFORMANCE_CN.md](./docs/PERFORMANCE_CN.md)
702
+ **关心性能?** → [PERFORMANCE_CN.md](./docs/PERFORMANCE_CN.md)
345
703
 
346
- **框架问题?** → [INTEGRATIONS_CN.md](./docs/INTEGRATIONS_CN.md)
704
+ **框架问题?** → [INTEGRATIONS_CN.md](./docs/INTEGRATIONS_CN.md)
347
705
 
348
- **深入设计?** → [ARCHITECTURE_CN.md](./docs/ARCHITECTURE_CN.md)
706
+ ---
707
+
708
+ **准备好加速你的 TypeScript 数据结构了吗? [现在开始 →](#-快速开始-30-秒)**
349
709
 
350
710
  ---
351
711
 
352
- **准备好加速你的 TypeScript 数据结构了吗?[现在开始 →](#-快速开始30-秒)**
712
+ ## FAQ
713
+
714
+ ### JavaScript 有 TreeMap 或 TreeSet 吗?
715
+
716
+ 原生没有。JavaScript 的 `Map` 和 `Set` 是基于哈希的(无序)。本库提供由 Red-Black Tree 支持的 `TreeMap` 和 `TreeSet` — 提供有序迭代、`floor`/`ceiling`/`higher`/`lower` 查找,以及 `getRank`/`getByRank`/`rangeByRank` 查询。
717
+
718
+ ### 何时应该使用 Heap 而不是排序数组?
719
+
720
+ 当你需要重复访问最小或最大元素时。排序数组每次都是 O(n log n); Heap 提供 O(log n) 插入和 O(1) 访问顶部元素。对于优先级队列、top-k 问题和调度,使用 `Heap`、`MinHeap` 或 `MaxHeap`。
721
+
722
+ ### 本库支持排名和范围查询吗?
723
+
724
+ 是的。在任何基于树的结构(RedBlackTree、TreeMap、TreeSet 等)上启用 `{ enableOrderStatistic: true }`:
725
+ - `getRank(key)` — 树顺序中这个 key 之前有多少元素
726
+ - `getByRank(k)` — 获取位置 k 的元素
727
+ - `rangeByRank(start, end)` — 获取两个位置之间的所有元素
728
+
729
+ ### 对于有序操作,它比原生数组快吗?
730
+
731
+ 对于有序插入 + 查找: 是的。数组插入到有序位置是 O(n) (移动元素)。Red-Black Tree 插入是 O(log n)。对于 10,000+ 元素,差异显著。查看 [PERFORMANCE_CN.md](./docs/PERFORMANCE_CN.md) 了解基准测试。
732
+
733
+ ### 我可以在 React / Node.js / 浏览器中使用吗?
734
+
735
+ 可以。本库提供 ESM、CJS 和 UMD 构建。它可在 Node.js、浏览器、React、Vue、Angular、Next.js 和任何 JavaScript 运行时中使用。零依赖意味着无兼容性问题。
736
+
737
+ ### 包含哪些数据结构?
738
+
739
+ Heap、MinHeap、MaxHeap、Priority Queue、Deque、Queue、Stack、Linked List (Singly / Doubly)、Red-Black Tree、AVL Tree、BST、TreeMap、TreeSet、TreeMultiMap、TreeMultiSet、SkipList、Trie、HashMap、Graph (Directed / Undirected)、Segment Tree、Binary Indexed Tree (Fenwick Tree)、Matrix。查看[完整列表](#-可用的数据结构)。
740
+
741
+ ### 本库生产就绪吗?
742
+
743
+ 是的。2600+ 测试,99%+ 代码覆盖率,零依赖,并在生产环境中使用。每次发布都通过类型检查、lint 和完整测试套件。
744
+
745
+ ### 与 js-sdsl 或其他库相比如何?
746
+
747
+ `data-structure-typed` 提供更多数据结构(20+)、跨所有结构的统一类似 Array 的 API、tree-shakeable 子路径导出和积极维护。查看 [PERFORMANCE_CN.md](./docs/PERFORMANCE_CN.md) 了解基准对比。
748
+
749
+ ### 我可以在不先转换的情况下传入原始数据吗?
750
+
751
+ 可以。三种模式:
752
+ - **`toElementFn`** — 提取字段,仅存储该字段 (TreeSet、Heap、Queue、Stack、LinkedList、Trie)
753
+ - **`comparator`** — 存储完整对象,按字段排序 (所有排序结构)
754
+ - **`toEntryFn`** — 拆分为键值对 (TreeMap、HashMap、SkipList)
755
+
756
+ 查看[原始数据部分](#-处理原始数据)了解示例。
757
+
758
+ ### 包体积是多少?
759
+
760
+ UMD bundle: ~143KB minified。使用子路径导入(如 `data-structure-typed/heap`),你只加载需要的 — Stack 小至 18KB,Heap 30KB。`sideEffects: false` 启用完整 tree-shaking。