data-structure-typed 1.48.4 → 1.48.6

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 (97) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +109 -59
  3. package/README_zh-CN.md +1028 -0
  4. package/benchmark/report.html +16 -16
  5. package/benchmark/report.json +204 -174
  6. package/dist/cjs/data-structures/base/iterable-base.d.ts +6 -6
  7. package/dist/cjs/data-structures/base/iterable-base.js +3 -3
  8. package/dist/cjs/data-structures/base/iterable-base.js.map +1 -1
  9. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +5 -3
  10. package/dist/cjs/data-structures/binary-tree/avl-tree.js +6 -4
  11. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  12. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +24 -22
  13. package/dist/cjs/data-structures/binary-tree/binary-tree.js +35 -22
  14. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  15. package/dist/cjs/data-structures/binary-tree/bst.d.ts +30 -22
  16. package/dist/cjs/data-structures/binary-tree/bst.js +38 -26
  17. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  18. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +19 -13
  19. package/dist/cjs/data-structures/binary-tree/rb-tree.js +20 -14
  20. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  21. package/dist/cjs/data-structures/binary-tree/tree-multimap.d.ts +21 -14
  22. package/dist/cjs/data-structures/binary-tree/tree-multimap.js +25 -18
  23. package/dist/cjs/data-structures/binary-tree/tree-multimap.js.map +1 -1
  24. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +52 -52
  25. package/dist/cjs/data-structures/graph/abstract-graph.js +78 -78
  26. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  27. package/dist/cjs/data-structures/graph/directed-graph.d.ts +47 -47
  28. package/dist/cjs/data-structures/graph/directed-graph.js +56 -56
  29. package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
  30. package/dist/cjs/data-structures/graph/map-graph.d.ts +5 -5
  31. package/dist/cjs/data-structures/graph/map-graph.js +8 -8
  32. package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
  33. package/dist/cjs/data-structures/graph/undirected-graph.d.ts +29 -29
  34. package/dist/cjs/data-structures/graph/undirected-graph.js +57 -57
  35. package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
  36. package/dist/cjs/data-structures/hash/hash-map.d.ts +8 -8
  37. package/dist/cjs/data-structures/hash/hash-map.js +2 -2
  38. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  39. package/dist/cjs/interfaces/binary-tree.d.ts +2 -2
  40. package/dist/cjs/types/data-structures/base/base.d.ts +3 -3
  41. package/dist/mjs/data-structures/base/iterable-base.d.ts +6 -6
  42. package/dist/mjs/data-structures/base/iterable-base.js +1 -1
  43. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +5 -3
  44. package/dist/mjs/data-structures/binary-tree/avl-tree.js +6 -4
  45. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +24 -22
  46. package/dist/mjs/data-structures/binary-tree/binary-tree.js +36 -23
  47. package/dist/mjs/data-structures/binary-tree/bst.d.ts +30 -22
  48. package/dist/mjs/data-structures/binary-tree/bst.js +38 -26
  49. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +19 -13
  50. package/dist/mjs/data-structures/binary-tree/rb-tree.js +20 -14
  51. package/dist/mjs/data-structures/binary-tree/tree-multimap.d.ts +21 -14
  52. package/dist/mjs/data-structures/binary-tree/tree-multimap.js +25 -18
  53. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +52 -52
  54. package/dist/mjs/data-structures/graph/abstract-graph.js +79 -79
  55. package/dist/mjs/data-structures/graph/directed-graph.d.ts +47 -47
  56. package/dist/mjs/data-structures/graph/directed-graph.js +56 -56
  57. package/dist/mjs/data-structures/graph/map-graph.d.ts +5 -5
  58. package/dist/mjs/data-structures/graph/map-graph.js +8 -8
  59. package/dist/mjs/data-structures/graph/undirected-graph.d.ts +29 -29
  60. package/dist/mjs/data-structures/graph/undirected-graph.js +59 -59
  61. package/dist/mjs/data-structures/hash/hash-map.d.ts +8 -8
  62. package/dist/mjs/data-structures/hash/hash-map.js +3 -3
  63. package/dist/mjs/interfaces/binary-tree.d.ts +2 -2
  64. package/dist/mjs/types/data-structures/base/base.d.ts +3 -3
  65. package/dist/umd/data-structure-typed.js +336 -295
  66. package/dist/umd/data-structure-typed.min.js +2 -2
  67. package/dist/umd/data-structure-typed.min.js.map +1 -1
  68. package/package.json +2 -2
  69. package/src/data-structures/base/iterable-base.ts +6 -6
  70. package/src/data-structures/binary-tree/avl-tree.ts +7 -4
  71. package/src/data-structures/binary-tree/binary-tree.ts +47 -27
  72. package/src/data-structures/binary-tree/bst.ts +52 -32
  73. package/src/data-structures/binary-tree/rb-tree.ts +20 -14
  74. package/src/data-structures/binary-tree/tree-multimap.ts +26 -18
  75. package/src/data-structures/graph/abstract-graph.ts +82 -82
  76. package/src/data-structures/graph/directed-graph.ts +56 -56
  77. package/src/data-structures/graph/map-graph.ts +8 -8
  78. package/src/data-structures/graph/undirected-graph.ts +59 -59
  79. package/src/data-structures/hash/hash-map.ts +8 -8
  80. package/src/interfaces/binary-tree.ts +2 -2
  81. package/src/types/data-structures/base/base.ts +3 -3
  82. package/test/integration/bst.test.ts +1 -1
  83. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +1 -1
  84. package/test/performance/data-structures/hash/hash-map.test.ts +8 -8
  85. package/test/performance/data-structures/linked-list/doubly-linked-list.test.ts +2 -2
  86. package/test/performance/data-structures/linked-list/singly-linked-list.test.ts +12 -1
  87. package/test/performance/data-structures/priority-queue/priority-queue.test.ts +1 -1
  88. package/test/performance/data-structures/queue/deque.test.ts +27 -15
  89. package/test/performance/data-structures/queue/queue.test.ts +27 -4
  90. package/test/performance/data-structures/stack/stack.test.ts +2 -2
  91. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +1 -1
  92. package/test/unit/data-structures/binary-tree/bst.test.ts +29 -29
  93. package/test/unit/data-structures/binary-tree/overall.test.ts +1 -1
  94. package/test/unit/data-structures/binary-tree/tree-multimap.test.ts +3 -3
  95. package/test/unit/data-structures/graph/directed-graph.test.ts +15 -15
  96. package/test/unit/data-structures/graph/map-graph.test.ts +3 -3
  97. package/test/unit/data-structures/graph/undirected-graph.test.ts +12 -12
@@ -0,0 +1,1028 @@
1
+ # data-structure-typed
2
+
3
+ ![npm](https://img.shields.io/npm/v/data-structure-typed)
4
+ ![npm](https://img.shields.io/npm/dm/data-structure-typed)
5
+ ![npm package minimized gzipped size (select exports)](https://img.shields.io/bundlejs/size/data-structure-typed)
6
+ ![GitHub top language](https://img.shields.io/github/languages/top/zrwusa/data-structure-typed)
7
+ ![eslint](https://aleen42.github.io/badges/src/eslint.svg)
8
+ ![NPM](https://img.shields.io/npm/l/data-structure-typed)
9
+
10
+ [//]: # (![npm bundle size](https://img.shields.io/bundlephobia/min/data-structure-typed))
11
+
12
+ <p><a href="https://github.com/zrwusa/data-structure-typed/blob/main/README.md">English</a> | <a href="https://github.com/zrwusa/data-structure-typed/blob/main/README_zh-CN.md">简体中文</a></p>
13
+
14
+ ## 为什么
15
+
16
+ JavaScript和TypeScript的数据结构。
17
+
18
+ 是否羡慕C++ [STL]() (std::)、Python的 [collections]() 和Java的 [java.util]()?
19
+
20
+ 不再需要羡慕了!JavaScript和TypeScript现在拥有 [data-structure-typed]()。
21
+
22
+ **`基准测试`** 与C++ STL相比。**`API 标准`** 与ES6和Java对齐。**`易用性`** 可与Python媲美。
23
+
24
+
25
+ ### 提供了JS/TS中没有的数据结构
26
+
27
+ Heap, Binary Tree, RedBlack Tree, Linked List, Deque, Trie, Directed Graph, Undirected Graph, BST, AVL Tree, Priority Queue, Queue, Tree Multiset, Linked List.
28
+
29
+
30
+ ### 性能超越原生JS/TS
31
+
32
+ **`Queue和原生Array, 在100,000数据规模下性能对比`**
33
+ <table style="display: table; width:100%; table-layout: fixed;">
34
+ <thead>
35
+ <tr>
36
+ <th>Test Methods</th>
37
+ <th>Time Taken (ms)</th>
38
+ </tr>
39
+ </thead>
40
+ <tbody>
41
+ <tr>
42
+ <td>Queue push &amp; shift</td>
43
+ <td>5.83</td>
44
+ </tr>
45
+ <tr>
46
+ <td>Array push &amp; shift</td>
47
+ <td>2829.59</td>
48
+ </tr>
49
+ </tbody>
50
+ </table>
51
+
52
+ **`Deque和原生Array在100,000数据规模下的性能对比`**
53
+ <table style="display: table; width:100%; table-layout: fixed;">
54
+ <thead>
55
+ <tr>
56
+ <th>Test Methods</th>
57
+ <th>Time Taken (ms)</th>
58
+ </tr>
59
+ </thead>
60
+ <tbody>
61
+ <tr>
62
+ <td>Deque unshift &amp; shift</td>
63
+ <td>2.44</td>
64
+ </tr>
65
+ <tr>
66
+ <td>Array unshift &amp; shift</td>
67
+ <td>4750.37</td>
68
+ </tr>
69
+ </tbody>
70
+ </table>
71
+
72
+
73
+ **`HashMap和原生Map/Set在100,000数据规模下的性能对比`**
74
+ <table style="display: table; width:100%; table-layout: fixed;">
75
+ <thead>
76
+ <tr>
77
+ <th>Method</th>
78
+ <th>Time Taken (ms)</th>
79
+ </tr>
80
+ </thead>
81
+ <tbody>
82
+ <tr>
83
+ <td>HashMap 1,000,000 set</td>
84
+ <td>122.51</td>
85
+ </tr>
86
+ <tr>
87
+ <td>Native Map 1,000,000 set</td>
88
+ <td>223.80</td>
89
+ </tr>
90
+ <tr>
91
+ <td>Native Set 1,000,000 add</td>
92
+ <td>185.06</td>
93
+ </tr>
94
+ </tbody>
95
+ </table>
96
+
97
+ [//]: # (![Branches]&#40;https://img.shields.io/badge/branches-55.47%25-red.svg?style=flat&#41;)
98
+
99
+ [//]: # (![Statements]&#40;https://img.shields.io/badge/statements-67%25-red.svg?style=flat&#41;)
100
+
101
+ [//]: # (![Functions]&#40;https://img.shields.io/badge/functions-66.38%25-red.svg?style=flat&#41;)
102
+
103
+ [//]: # (![Lines]&#40;https://img.shields.io/badge/lines-68.6%25-red.svg?style=flat&#41;)
104
+
105
+ ## 安装和使用
106
+
107
+ 现在你可以在 Node.js 和浏览器环境中使用它
108
+
109
+ CommonJS:**`require export.modules =`**
110
+
111
+ ESModule:&nbsp;&nbsp;&nbsp;**`import export`**
112
+
113
+ Typescript:&nbsp;&nbsp;&nbsp;**`import export`**
114
+
115
+ UMD:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**`var Deque = dataStructureTyped.Deque`**
116
+
117
+ ### npm
118
+
119
+ ```bash
120
+ npm i data-structure-typed --save
121
+ ```
122
+
123
+ ### yarn
124
+
125
+ ```bash
126
+ yarn add data-structure-typed
127
+ ```
128
+
129
+ ```js
130
+ import {
131
+ BinaryTree, Graph, Queue, Stack, PriorityQueue, BST, Trie, DoublyLinkedList,
132
+ AVLTree, MinHeap, SinglyLinkedList, DirectedGraph, TreeMultimap,
133
+ DirectedVertex, AVLTreeNode
134
+ } from 'data-structure-typed';
135
+ ```
136
+
137
+ ### CDN
138
+
139
+ 将下面的代码复制到 HTML 文档的头标签中。
140
+
141
+ #### 开发环境
142
+
143
+ ```html
144
+ <script src='https://cdn.jsdelivr.net/npm/data-structure-typed/dist/umd/data-structure-typed.js'></script>
145
+ ```
146
+
147
+ #### 生产环境
148
+
149
+ ```html
150
+ <script src='https://cdn.jsdelivr.net/npm/data-structure-typed/dist/umd/data-structure-typed.min.js'></script>
151
+ ```
152
+
153
+ 将下面的代码复制到你的 HTML 的 script 标签中,你就可以开始你的开发了。
154
+
155
+ ```js
156
+ const {Heap} = dataStructureTyped;
157
+ const {
158
+ BinaryTree, Graph, Queue, Stack, PriorityQueue, BST, Trie, DoublyLinkedList,
159
+ AVLTree, MinHeap, SinglyLinkedList, DirectedGraph, TreeMultimap,
160
+ DirectedVertex, AVLTreeNode
161
+ } = dataStructureTyped;
162
+ ```
163
+
164
+ ## 生动示例
165
+
166
+ ### Binary Tree(二叉树)
167
+
168
+ [试一下](https://vivid-algorithm.vercel.app/),或者你可以使用我们的可视化工具运行自己的代码 [visual tool](https://github.com/zrwusa/vivid-algorithm)
169
+
170
+ ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/binary-tree-array-to-binary-tree.webp)
171
+
172
+ ### Binary Tree DFS (二叉搜索树深度遍历)
173
+
174
+ [试一下](https://vivid-algorithm.vercel.app/)
175
+
176
+ ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/binary-tree-dfs-in-order.webp)
177
+
178
+ ### AVL Tree(AVL树)
179
+
180
+ [试一下](https://vivid-algorithm.vercel.app/)
181
+
182
+ ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/avl-tree-test.webp)
183
+
184
+ ### Tree Multi Map
185
+
186
+ [试一下](https://vivid-algorithm.vercel.app/)
187
+
188
+ ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/tree-multiset-test.webp)
189
+
190
+ ### Matrix
191
+
192
+ [试一下](https://vivid-algorithm.vercel.app/algorithm/graph/)
193
+
194
+ ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/matrix-cut-off-tree-for-golf.webp)
195
+
196
+ ### 有向图
197
+
198
+ [试一下](https://vivid-algorithm.vercel.app/algorithm/graph/)
199
+
200
+ ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/directed-graph-test.webp)
201
+
202
+ ### 地图
203
+
204
+ [试一下](https://vivid-algorithm.vercel.app/algorithm/graph/)
205
+
206
+ ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/map-graph-test.webp)
207
+
208
+ ## 代码片段
209
+
210
+ ### 二叉搜索树 (BST) 代码示例
211
+
212
+ #### TS
213
+
214
+ ```ts
215
+ import {BST, BSTNode} from 'data-structure-typed';
216
+
217
+ const bst = new BST<number>();
218
+ bst.add(11);
219
+ bst.add(3);
220
+ bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]);
221
+ bst.size === 16; // true
222
+ bst.has(6); // true
223
+ const node6 = bst.getNode(6); // BSTNode
224
+ bst.getHeight(6) === 2; // true
225
+ bst.getHeight() === 5; // true
226
+ bst.getDepth(6) === 3; // true
227
+
228
+ bst.getLeftMost()?.key === 1; // true
229
+
230
+ bst.delete(6);
231
+ bst.get(6); // undefined
232
+ bst.isAVLBalanced(); // true
233
+ bst.bfs()[0] === 11; // true
234
+ bst.print()
235
+ // ______________11_____
236
+ // / \
237
+ // ___3_______ _13_____
238
+ // / \ / \
239
+ // 1_ _____8____ 12 _15__
240
+ // \ / \ / \
241
+ // 2 4_ _10 14 16
242
+ // \ /
243
+ // 5_ 9
244
+ // \
245
+ // 7
246
+
247
+ const objBST = new BST<number, {height: number, age: number}>();
248
+
249
+ objBST.add(11, { "name": "Pablo", "age": 15 });
250
+ objBST.add(3, { "name": "Kirk", "age": 1 });
251
+
252
+ objBST.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], [
253
+ { "name": "Alice", "age": 15 },
254
+ { "name": "Bob", "age": 1 },
255
+ { "name": "Charlie", "age": 8 },
256
+ { "name": "David", "age": 13 },
257
+ { "name": "Emma", "age": 16 },
258
+ { "name": "Frank", "age": 2 },
259
+ { "name": "Grace", "age": 6 },
260
+ { "name": "Hannah", "age": 9 },
261
+ { "name": "Isaac", "age": 12 },
262
+ { "name": "Jack", "age": 14 },
263
+ { "name": "Katie", "age": 4 },
264
+ { "name": "Liam", "age": 7 },
265
+ { "name": "Mia", "age": 10 },
266
+ { "name": "Noah", "age": 5 }
267
+ ]
268
+ );
269
+
270
+ objBST.delete(11);
271
+ ```
272
+
273
+ #### JS
274
+
275
+ ```js
276
+ const {BST, BSTNode} = require('data-structure-typed');
277
+
278
+ const bst = new BST();
279
+ bst.add(11);
280
+ bst.add(3);
281
+ bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]);
282
+ bst.size === 16; // true
283
+ bst.has(6); // true
284
+ const node6 = bst.getNode(6);
285
+ bst.getHeight(6) === 2; // true
286
+ bst.getHeight() === 5; // true
287
+ bst.getDepth(6) === 3; // true
288
+ const leftMost = bst.getLeftMost();
289
+ leftMost?.key === 1; // true
290
+
291
+ bst.delete(6);
292
+ bst.get(6); // undefined
293
+ bst.isAVLBalanced(); // true or false
294
+ const bfsIDs = bst.bfs();
295
+ bfsIDs[0] === 11; // true
296
+ ```
297
+
298
+ ### AVL树 代码示例
299
+
300
+ ```ts
301
+ import {AVLTree} from 'data-structure-typed';
302
+
303
+ const avlTree = new AVLTree<number>();
304
+ avlTree.addMany([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5])
305
+ avlTree.isAVLBalanced(); // true
306
+ avlTree.delete(10);
307
+ avlTree.isAVLBalanced(); // true
308
+ ```
309
+
310
+ ### 红黑树 代码示例
311
+
312
+ ```ts
313
+ import {RedBlackTree} from 'data-structure-typed';
314
+
315
+ const rbTree = new RedBlackTree<number>();
316
+ rbTree.addMany([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5])
317
+ rbTree.isAVLBalanced(); // true
318
+ rbTree.delete(10);
319
+ rbTree.isAVLBalanced(); // true
320
+ rbTree.print()
321
+ // ___6________
322
+ // / \
323
+ // ___4_ ___11________
324
+ // / \ / \
325
+ // _2_ 5 _8_ ____14__
326
+ // / \ / \ / \
327
+ // 1 3 7 9 12__ 15__
328
+ // \ \
329
+ // 13 16
330
+ ```
331
+
332
+ ### 有向图代码示例
333
+
334
+ ```ts
335
+ import {DirectedGraph} from 'data-structure-typed';
336
+
337
+ const graph = new DirectedGraph<string>();
338
+
339
+ graph.addVertex('A');
340
+ graph.addVertex('B');
341
+
342
+ graph.hasVertex('A'); // true
343
+ graph.hasVertex('B'); // true
344
+ graph.hasVertex('C'); // false
345
+
346
+ graph.addEdge('A', 'B');
347
+ graph.hasEdge('A', 'B'); // true
348
+ graph.hasEdge('B', 'A'); // false
349
+
350
+ graph.deleteEdgeSrcToDest('A', 'B');
351
+ graph.hasEdge('A', 'B'); // false
352
+
353
+ graph.addVertex('C');
354
+
355
+ graph.addEdge('A', 'B');
356
+ graph.addEdge('B', 'C');
357
+
358
+ const topologicalOrderKeys = graph.topologicalSort(); // ['A', 'B', 'C']
359
+ ```
360
+
361
+ ### 无向图代码示例
362
+
363
+ ```ts
364
+ import {UndirectedGraph} from 'data-structure-typed';
365
+
366
+ const graph = new UndirectedGraph<string>();
367
+ graph.addVertex('A');
368
+ graph.addVertex('B');
369
+ graph.addVertex('C');
370
+ graph.addVertex('D');
371
+ graph.deleteVertex('C');
372
+ graph.addEdge('A', 'B');
373
+ graph.addEdge('B', 'D');
374
+
375
+ const dijkstraResult = graph.dijkstra('A');
376
+ Array.from(dijkstraResult?.seen ?? []).map(vertex => vertex.key) // ['A', 'B', 'D']
377
+
378
+
379
+ ```
380
+
381
+ ### 不同数据结构之间互相转换
382
+
383
+ ```js
384
+ const orgArr = [6, 1, 2, 7, 5, 3, 4, 9, 8];
385
+ const orgStrArr = ["trie", "trial", "trick", "trip", "tree", "trend", "triangle", "track", "trace", "transmit"];
386
+ const entries = [[6, 6], [1, 1], [2, 2], [7, 7], [5, 5], [3, 3], [4, 4], [9, 9], [8, 8]];
387
+
388
+ const queue = new Queue(orgArr);
389
+ queue.print();
390
+ // [6, 1, 2, 7, 5, 3, 4, 9, 8]
391
+
392
+ const deque = new Deque(orgArr);
393
+ deque.print();
394
+ // [6, 1, 2, 7, 5, 3, 4, 9, 8]
395
+
396
+ const sList = new SinglyLinkedList(orgArr);
397
+ sList.print();
398
+ // [6, 1, 2, 7, 5, 3, 4, 9, 8]
399
+
400
+ const dList = new DoublyLinkedList(orgArr);
401
+ dList.print();
402
+ // [6, 1, 2, 7, 5, 3, 4, 9, 8]
403
+
404
+ const stack = new Stack(orgArr);
405
+ stack.print();
406
+ // [6, 1, 2, 7, 5, 3, 4, 9, 8]
407
+
408
+ const minHeap = new MinHeap(orgArr);
409
+ minHeap.print();
410
+ // [1, 5, 2, 7, 6, 3, 4, 9, 8]
411
+
412
+ const maxPQ = new MaxPriorityQueue(orgArr);
413
+ maxPQ.print();
414
+ // [9, 8, 4, 7, 5, 2, 3, 1, 6]
415
+
416
+ const biTree = new BinaryTree(entries);
417
+ biTree.print();
418
+ // ___6___
419
+ // / \
420
+ // ___1_ _2_
421
+ // / \ / \
422
+ // _7_ 5 3 4
423
+ // / \
424
+ // 9 8
425
+
426
+ const bst = new BST(entries);
427
+ bst.print();
428
+ // _____5___
429
+ // / \
430
+ // _2_ _7_
431
+ // / \ / \
432
+ // 1 3_ 6 8_
433
+ // \ \
434
+ // 4 9
435
+
436
+
437
+ const rbTree = new RedBlackTree(entries);
438
+ rbTree.print();
439
+ // ___4___
440
+ // / \
441
+ // _2_ _6___
442
+ // / \ / \
443
+ // 1 3 5 _8_
444
+ // / \
445
+ // 7 9
446
+
447
+
448
+ const avl = new AVLTree(entries);
449
+ avl.print();
450
+ // ___4___
451
+ // / \
452
+ // _2_ _6___
453
+ // / \ / \
454
+ // 1 3 5 _8_
455
+ // / \
456
+ // 7 9
457
+
458
+ const treeMulti = new TreeMultimap(entries);
459
+ treeMulti.print();
460
+ // ___4___
461
+ // / \
462
+ // _2_ _6___
463
+ // / \ / \
464
+ // 1 3 5 _8_
465
+ // / \
466
+ // 7 9
467
+
468
+ const hm = new HashMap(entries);
469
+ hm.print()
470
+ // [[6, 6], [1, 1], [2, 2], [7, 7], [5, 5], [3, 3], [4, 4], [9, 9], [8, 8]]
471
+
472
+ const rbTreeH = new RedBlackTree(hm);
473
+ rbTreeH.print();
474
+ // ___4___
475
+ // / \
476
+ // _2_ _6___
477
+ // / \ / \
478
+ // 1 3 5 _8_
479
+ // / \
480
+ // 7 9
481
+
482
+ const pq = new MinPriorityQueue(orgArr);
483
+ pq.print();
484
+ // [1, 5, 2, 7, 6, 3, 4, 9, 8]
485
+
486
+ const bst1 = new BST(pq);
487
+ bst1.print();
488
+ // _____5___
489
+ // / \
490
+ // _2_ _7_
491
+ // / \ / \
492
+ // 1 3_ 6 8_
493
+ // \ \
494
+ // 4 9
495
+
496
+ const dq1 = new Deque(orgArr);
497
+ dq1.print();
498
+ // [6, 1, 2, 7, 5, 3, 4, 9, 8]
499
+ const rbTree1 = new RedBlackTree(dq1);
500
+ rbTree1.print();
501
+ // _____5___
502
+ // / \
503
+ // _2___ _7___
504
+ // / \ / \
505
+ // 1 _4 6 _9
506
+ // / /
507
+ // 3 8
508
+
509
+
510
+ const trie2 = new Trie(orgStrArr);
511
+ trie2.print();
512
+ // ['trie', 'trial', 'triangle', 'trick', 'trip', 'tree', 'trend', 'track', 'trace', 'transmit']
513
+ const heap2 = new Heap(trie2, { comparator: (a, b) => Number(a) - Number(b) });
514
+ heap2.print();
515
+ // ['transmit', 'trace', 'tree', 'trend', 'track', 'trial', 'trip', 'trie', 'trick', 'triangle']
516
+ const dq2 = new Deque(heap2);
517
+ dq2.print();
518
+ // ['transmit', 'trace', 'tree', 'trend', 'track', 'trial', 'trip', 'trie', 'trick', 'triangle']
519
+ const entries2 = dq2.map((el, i) => [i, el]);
520
+ const avl2 = new AVLTree(entries2);
521
+ avl2.print();
522
+ // ___3_______
523
+ // / \
524
+ // _1_ ___7_
525
+ // / \ / \
526
+ // 0 2 _5_ 8_
527
+ // / \ \
528
+ // 4 6 9
529
+ ```
530
+
531
+ ## API 文档 & 演示
532
+
533
+ [API 文档](https://data-structure-typed-docs.vercel.app)
534
+
535
+ [在线演示](https://vivid-algorithm.vercel.app)
536
+
537
+ <a href="https://github.com/zrwusa/vivid-algorithm" target="_blank">演示项目代码仓库</a>
538
+
539
+ ## 包含的数据结构
540
+
541
+ <table style="display: table; width:100%; table-layout: fixed;">
542
+ <thead>
543
+ <tr>
544
+ <th>Data Structure</th>
545
+ <th>Unit Test</th>
546
+ <th>Performance Test</th>
547
+ <th>API Docs</th>
548
+ </tr>
549
+ </thead>
550
+ <tbody>
551
+ <tr>
552
+ <td>Binary Tree</td>
553
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
554
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
555
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/BinaryTree.html"><span>View</span></a></td>
556
+ </tr>
557
+ <tr>
558
+ <td>Binary Search Tree (BST)</td>
559
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
560
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
561
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/BST.html"><span>View</span></a></td>
562
+ </tr>
563
+ <tr>
564
+ <td>AVL Tree</td>
565
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
566
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
567
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/AVLTree.html"><span>View</span></a></td>
568
+ </tr>
569
+ <tr>
570
+ <td>Red Black Tree</td>
571
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
572
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
573
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/RedBlackTree.html"><span>View</span></a></td>
574
+ </tr>
575
+ <tr>
576
+ <td>Tree Multimap</td>
577
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
578
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
579
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/TreeMultimap.html"><span>View</span></a></td>
580
+ </tr>
581
+ <tr>
582
+ <td>Heap</td>
583
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
584
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
585
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/Heap.html"><span>View</span></a></td>
586
+ </tr>
587
+ <tr>
588
+ <td>Priority Queue</td>
589
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
590
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
591
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/PriorityQueue.html"><span>View</span></a></td>
592
+ </tr>
593
+ <tr>
594
+ <td>Max Priority Queue</td>
595
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
596
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
597
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/MaxPriorityQueue.html"><span>View</span></a></td>
598
+ </tr>
599
+ <tr>
600
+ <td>Min Priority Queue</td>
601
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
602
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
603
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/MinPriorityQueue.html"><span>View</span></a></td>
604
+ </tr>
605
+ <tr>
606
+ <td>Trie</td>
607
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
608
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
609
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/Trie.html"><span>View</span></a></td>
610
+ </tr>
611
+ <tr>
612
+ <td>Graph</td>
613
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
614
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
615
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/AbstractGraph.html"><span>View</span></a></td>
616
+ </tr>
617
+ <tr>
618
+ <td>Directed Graph</td>
619
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
620
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
621
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/DirectedGraph.html"><span>View</span></a></td>
622
+ </tr>
623
+ <tr>
624
+ <td>Undirected Graph</td>
625
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
626
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
627
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/UndirectedGraph.html"><span>View</span></a></td>
628
+ </tr>
629
+ <tr>
630
+ <td>Queue</td>
631
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
632
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
633
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/Queue.html"><span>View</span></a></td>
634
+ </tr>
635
+ <tr>
636
+ <td>Deque</td>
637
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
638
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
639
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/Deque.html"><span>View</span></a></td>
640
+ </tr>
641
+ <tr>
642
+ <td>Hash Map</td>
643
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
644
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
645
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/HashMap.html"><span>View</span></a></td>
646
+ </tr>
647
+ <tr>
648
+ <td>Linked List</td>
649
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
650
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
651
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/SinglyLinkedList.html"><span>View</span></a></td>
652
+ </tr>
653
+ <tr>
654
+ <td>Singly Linked List</td>
655
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
656
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
657
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/SinglyLinkedList.html"><span>View</span></a></td>
658
+ </tr>
659
+ <tr>
660
+ <td>Doubly Linked List</td>
661
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
662
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
663
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/DoublyLinkedList.html"><span>View</span></a></td>
664
+ </tr>
665
+ <tr>
666
+ <td>Stack</td>
667
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
668
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
669
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/Stack.html"><span>View</span></a></td>
670
+ </tr>
671
+ <tr>
672
+ <td>Segment Tree</td>
673
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
674
+ <td></td>
675
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/SegmentTree.html"><span>View</span></a></td>
676
+ </tr>
677
+ <tr>
678
+ <td>Binary Indexed Tree</td>
679
+ <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
680
+ <td></td>
681
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/BinaryIndexedTree.html"><span>View</span></a></td>
682
+ </tr>
683
+ </tbody>
684
+ </table>
685
+
686
+ ## 不同编程语言中的数据结构对应关系
687
+
688
+ <table style="display: table; width:100%; table-layout: fixed;">
689
+ <thead>
690
+ <tr>
691
+ <th>Data Structure Typed</th>
692
+ <th>C++ STL</th>
693
+ <th>java.util</th>
694
+ <th>Python collections</th>
695
+ </tr>
696
+ </thead>
697
+ <tbody>
698
+ <tr>
699
+ <td>Heap&lt;E&gt;</td>
700
+ <td>priority_queue&lt;T&gt;</td>
701
+ <td>PriorityQueue&lt;E&gt;</td>
702
+ <td>heapq</td>
703
+ </tr>
704
+ <tr>
705
+ <td>Deque&lt;E&gt;</td>
706
+ <td>deque&lt;T&gt;</td>
707
+ <td>ArrayDeque&lt;E&gt;</td>
708
+ <td>deque</td>
709
+ </tr>
710
+ <tr>
711
+ <td>Queue&lt;E&gt;</td>
712
+ <td>queue&lt;T&gt;</td>
713
+ <td>Queue&lt;E&gt;</td>
714
+ <td>-</td>
715
+ </tr>
716
+ <tr>
717
+ <td>HashMap&lt;K, V&gt;</td>
718
+ <td>unordered_map&lt;K, V&gt;</td>
719
+ <td>HashMap&lt;K, V&gt;</td>
720
+ <td>defaultdict</td>
721
+ </tr>
722
+ <tr>
723
+ <td>DoublyLinkedList&lt;E&gt;</td>
724
+ <td>list&lt;T&gt;</td>
725
+ <td>LinkedList&lt;E&gt;</td>
726
+ <td>-</td>
727
+ </tr>
728
+ <tr>
729
+ <td>SinglyLinkedList&lt;E&gt;</td>
730
+ <td>-</td>
731
+ <td>-</td>
732
+ <td>-</td>
733
+ </tr>
734
+ <tr>
735
+ <td>BinaryTree&lt;K, V&gt;</td>
736
+ <td>-</td>
737
+ <td>-</td>
738
+ <td>-</td>
739
+ </tr>
740
+ <tr>
741
+ <td>BST&lt;K, V&gt;</td>
742
+ <td>-</td>
743
+ <td>-</td>
744
+ <td>-</td>
745
+ </tr>
746
+ <tr>
747
+ <td>RedBlackTree&lt;E&gt;</td>
748
+ <td>set&lt;T&gt;</td>
749
+ <td>TreeSet&lt;E&gt;</td>
750
+ <td>-</td>
751
+ </tr>
752
+ <tr>
753
+ <td>RedBlackTree&lt;K, V&gt;</td>
754
+ <td>map&lt;K, V&gt;</td>
755
+ <td>TreeMap&lt;K, V&gt;</td>
756
+ <td>-</td>
757
+ </tr>
758
+ <tr>
759
+ <td>TreeMultimap&lt;K, V&gt;</td>
760
+ <td>multimap&lt;K, V&gt;</td>
761
+ <td>-</td>
762
+ <td>-</td>
763
+ </tr>
764
+ <tr>
765
+ <td>TreeMultimap&lt;E&gt;</td>
766
+ <td>multiset&lt;T&gt;</td>
767
+ <td>-</td>
768
+ <td>-</td>
769
+ </tr>
770
+ <tr>
771
+ <td>Trie</td>
772
+ <td>-</td>
773
+ <td>-</td>
774
+ <td>-</td>
775
+ </tr>
776
+ <tr>
777
+ <td>DirectedGraph&lt;V, E&gt;</td>
778
+ <td>-</td>
779
+ <td>-</td>
780
+ <td>-</td>
781
+ </tr>
782
+ <tr>
783
+ <td>UndirectedGraph&lt;V, E&gt;</td>
784
+ <td>-</td>
785
+ <td>-</td>
786
+ <td>-</td>
787
+ </tr>
788
+ <tr>
789
+ <td>PriorityQueue&lt;E&gt;</td>
790
+ <td>priority_queue&lt;T&gt;</td>
791
+ <td>PriorityQueue&lt;E&gt;</td>
792
+ <td>-</td>
793
+ </tr>
794
+ <tr>
795
+ <td>Array&lt;E&gt;</td>
796
+ <td>vector&lt;T&gt;</td>
797
+ <td>ArrayList&lt;E&gt;</td>
798
+ <td>list</td>
799
+ </tr>
800
+ <tr>
801
+ <td>Stack&lt;E&gt;</td>
802
+ <td>stack&lt;T&gt;</td>
803
+ <td>Stack&lt;E&gt;</td>
804
+ <td>-</td>
805
+ </tr>
806
+ <tr>
807
+ <td>HashMap&lt;E&gt;</td>
808
+ <td>unordered_set&lt;T&gt;</td>
809
+ <td>HashSet&lt;E&gt;</td>
810
+ <td>set</td>
811
+ </tr>
812
+ <tr>
813
+ <td>-</td>
814
+ <td>unordered_multiset</td>
815
+ <td>-</td>
816
+ <td>Counter</td>
817
+ </tr>
818
+ <tr>
819
+ <td>LinkedHashMap&lt;K, V&gt;</td>
820
+ <td>-</td>
821
+ <td>LinkedHashMap&lt;K, V&gt;</td>
822
+ <td>OrderedDict</td>
823
+ </tr>
824
+ <tr>
825
+ <td>-</td>
826
+ <td>unordered_multimap&lt;K, V&gt;</td>
827
+ <td>-</td>
828
+ <td>-</td>
829
+ </tr>
830
+ <tr>
831
+ <td>-</td>
832
+ <td>bitset&lt;N&gt;</td>
833
+ <td>-</td>
834
+ <td>-</td>
835
+ </tr>
836
+ </tbody>
837
+ </table>
838
+
839
+ ## 基准测试
840
+
841
+ [//]: # (No deletion!!! Start of Replace Section)
842
+ <div class="json-to-html-collapse clearfix 0">
843
+ <div class='collapsible level0' ><span class='json-to-html-label'>avl-tree</span></div>
844
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>10,000 add randomly</td><td>72.48</td><td>13.80</td><td>0.03</td></tr><tr><td>10,000 add & delete randomly</td><td>144.14</td><td>6.94</td><td>0.03</td></tr><tr><td>10,000 addMany</td><td>69.71</td><td>14.35</td><td>0.02</td></tr><tr><td>10,000 get</td><td>54.21</td><td>18.45</td><td>0.01</td></tr></table></div>
845
+ </div><div class="json-to-html-collapse clearfix 0">
846
+ <div class='collapsible level0' ><span class='json-to-html-label'>binary-tree</span></div>
847
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>1,000 add randomly</td><td>15.84</td><td>63.14</td><td>0.00</td></tr><tr><td>1,000 add & delete randomly</td><td>24.62</td><td>40.62</td><td>0.00</td></tr><tr><td>1,000 addMany</td><td>17.85</td><td>56.01</td><td>0.00</td></tr><tr><td>1,000 get</td><td>20.83</td><td>48.00</td><td>0.00</td></tr><tr><td>1,000 has</td><td>20.78</td><td>48.13</td><td>0.00</td></tr><tr><td>1,000 dfs</td><td>186.06</td><td>5.37</td><td>0.02</td></tr><tr><td>1,000 bfs</td><td>66.58</td><td>15.02</td><td>0.02</td></tr><tr><td>1,000 morris</td><td>298.23</td><td>3.35</td><td>0.02</td></tr></table></div>
848
+ </div><div class="json-to-html-collapse clearfix 0">
849
+ <div class='collapsible level0' ><span class='json-to-html-label'>bst</span></div>
850
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>10,000 add randomly</td><td>55.04</td><td>18.17</td><td>0.01</td></tr><tr><td>10,000 add & delete randomly</td><td>129.85</td><td>7.70</td><td>0.01</td></tr><tr><td>10,000 addMany</td><td>50.40</td><td>19.84</td><td>0.01</td></tr><tr><td>10,000 get</td><td>63.39</td><td>15.78</td><td>0.01</td></tr></table></div>
851
+ </div><div class="json-to-html-collapse clearfix 0">
852
+ <div class='collapsible level0' ><span class='json-to-html-label'>rb-tree</span></div>
853
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>100,000 add</td><td>113.25</td><td>8.83</td><td>0.02</td></tr><tr><td>100,000 add & delete randomly</td><td>305.28</td><td>3.28</td><td>0.03</td></tr><tr><td>100,000 getNode</td><td>73.20</td><td>13.66</td><td>0.03</td></tr><tr><td>100,000 add & iterator</td><td>159.80</td><td>6.26</td><td>0.06</td></tr></table></div>
854
+ </div><div class="json-to-html-collapse clearfix 0">
855
+ <div class='collapsible level0' ><span class='json-to-html-label'>comparison</span></div>
856
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>SRC PQ 10,000 add</td><td>0.17</td><td>5872.02</td><td>4.08e-5</td></tr><tr><td>CJS PQ 10,000 add</td><td>0.20</td><td>4961.22</td><td>1.14e-4</td></tr><tr><td>MJS PQ 10,000 add</td><td>0.74</td><td>1351.47</td><td>2.98e-4</td></tr><tr><td>SRC PQ 10,000 add & pop</td><td>4.62</td><td>216.49</td><td>0.00</td></tr><tr><td>CJS PQ 10,000 add & pop</td><td>4.36</td><td>229.40</td><td>0.00</td></tr><tr><td>MJS PQ 10,000 add & pop</td><td>3.92</td><td>255.23</td><td>0.00</td></tr></table></div>
857
+ </div><div class="json-to-html-collapse clearfix 0">
858
+ <div class='collapsible level0' ><span class='json-to-html-label'>directed-graph</span></div>
859
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>1,000 addVertex</td><td>0.12</td><td>8557.70</td><td>2.46e-5</td></tr><tr><td>1,000 addEdge</td><td>7.37</td><td>135.70</td><td>0.00</td></tr><tr><td>1,000 getVertex</td><td>0.05</td><td>1.91e+4</td><td>1.12e-5</td></tr><tr><td>1,000 getEdge</td><td>22.75</td><td>43.96</td><td>0.00</td></tr><tr><td>tarjan</td><td>196.98</td><td>5.08</td><td>0.01</td></tr><tr><td>tarjan all</td><td>217.25</td><td>4.60</td><td>0.03</td></tr><tr><td>topologicalSort</td><td>177.30</td><td>5.64</td><td>0.02</td></tr></table></div>
860
+ </div><div class="json-to-html-collapse clearfix 0">
861
+ <div class='collapsible level0' ><span class='json-to-html-label'>hash-map</span></div>
862
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>1,000,000 set</td><td>153.74</td><td>6.50</td><td>0.07</td></tr><tr><td>1,000,000 Map set</td><td>330.02</td><td>3.03</td><td>0.16</td></tr><tr><td>1,000,000 Set add</td><td>258.64</td><td>3.87</td><td>0.06</td></tr><tr><td>1,000,000 set & get</td><td>138.80</td><td>7.20</td><td>0.06</td></tr><tr><td>1,000,000 Map set & get</td><td>352.63</td><td>2.84</td><td>0.05</td></tr><tr><td>1,000,000 Set add & has</td><td>217.97</td><td>4.59</td><td>0.02</td></tr><tr><td>1,000,000 ObjKey set & get</td><td>414.87</td><td>2.41</td><td>0.06</td></tr><tr><td>1,000,000 Map ObjKey set & get</td><td>389.17</td><td>2.57</td><td>0.07</td></tr><tr><td>1,000,000 Set ObjKey add & has</td><td>352.67</td><td>2.84</td><td>0.03</td></tr></table></div>
863
+ </div><div class="json-to-html-collapse clearfix 0">
864
+ <div class='collapsible level0' ><span class='json-to-html-label'>heap</span></div>
865
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>100,000 add & pop</td><td>90.67</td><td>11.03</td><td>0.02</td></tr><tr><td>100,000 add & dfs</td><td>40.30</td><td>24.81</td><td>0.01</td></tr><tr><td>10,000 fib add & pop</td><td>414.94</td><td>2.41</td><td>0.02</td></tr></table></div>
866
+ </div><div class="json-to-html-collapse clearfix 0">
867
+ <div class='collapsible level0' ><span class='json-to-html-label'>doubly-linked-list</span></div>
868
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>1,000,000 push</td><td>290.62</td><td>3.44</td><td>0.10</td></tr><tr><td>1,000,000 unshift</td><td>253.88</td><td>3.94</td><td>0.10</td></tr><tr><td>1,000,000 unshift & shift</td><td>259.65</td><td>3.85</td><td>0.14</td></tr><tr><td>1,000,000 insertBefore</td><td>463.16</td><td>2.16</td><td>0.10</td></tr></table></div>
869
+ </div><div class="json-to-html-collapse clearfix 0">
870
+ <div class='collapsible level0' ><span class='json-to-html-label'>singly-linked-list</span></div>
871
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>1,000,000 push & shift</td><td>250.27</td><td>4.00</td><td>0.08</td></tr><tr><td>10,000 push & pop</td><td>261.13</td><td>3.83</td><td>0.03</td></tr><tr><td>10,000 insertBefore</td><td>282.46</td><td>3.54</td><td>0.02</td></tr></table></div>
872
+ </div><div class="json-to-html-collapse clearfix 0">
873
+ <div class='collapsible level0' ><span class='json-to-html-label'>max-priority-queue</span></div>
874
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>10,000 refill & poll</td><td>10.49</td><td>95.29</td><td>0.00</td></tr></table></div>
875
+ </div><div class="json-to-html-collapse clearfix 0">
876
+ <div class='collapsible level0' ><span class='json-to-html-label'>priority-queue</span></div>
877
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>100,000 add & pop</td><td>110.63</td><td>9.04</td><td>0.01</td></tr></table></div>
878
+ </div><div class="json-to-html-collapse clearfix 0">
879
+ <div class='collapsible level0' ><span class='json-to-html-label'>deque</span></div>
880
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>1,000,000 push</td><td>15.89</td><td>62.92</td><td>0.00</td></tr><tr><td>1,000,000 push & pop</td><td>26.45</td><td>37.81</td><td>0.01</td></tr><tr><td>1,000,000 push & shift</td><td>27.52</td><td>36.34</td><td>0.00</td></tr><tr><td>1,000,000 unshift & shift</td><td>28.82</td><td>34.70</td><td>0.01</td></tr></table></div>
881
+ </div><div class="json-to-html-collapse clearfix 0">
882
+ <div class='collapsible level0' ><span class='json-to-html-label'>queue</span></div>
883
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>1,000,000 push</td><td>51.21</td><td>19.53</td><td>0.02</td></tr><tr><td>1,000,000 push & shift</td><td>105.56</td><td>9.47</td><td>0.05</td></tr></table></div>
884
+ </div><div class="json-to-html-collapse clearfix 0">
885
+ <div class='collapsible level0' ><span class='json-to-html-label'>stack</span></div>
886
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>1,000,000 push</td><td>43.57</td><td>22.95</td><td>0.01</td></tr><tr><td>1,000,000 push & pop</td><td>55.18</td><td>18.12</td><td>0.01</td></tr></table></div>
887
+ </div><div class="json-to-html-collapse clearfix 0">
888
+ <div class='collapsible level0' ><span class='json-to-html-label'>trie</span></div>
889
+ <div class="content"><table style="display: table; width:100%; table-layout: fixed;"><tr><th>test name</th><th>time taken (ms)</th><th>executions per sec</th><th>sample deviation</th></tr><tr><td>100,000 push</td><td>54.08</td><td>18.49</td><td>0.01</td></tr><tr><td>100,000 getWords</td><td>77.77</td><td>12.86</td><td>0.02</td></tr></table></div>
890
+ </div>
891
+
892
+ [//]: # (No deletion!!! End of Replace Section)
893
+
894
+ ## 内建的经典算法
895
+
896
+ <table style="display: table; width:100%; table-layout: fixed;">
897
+ <thead>
898
+ <tr>
899
+ <th>算法</th>
900
+ <th>功能描述</th>
901
+ <th>迭代类型</th>
902
+ </tr>
903
+ </thead>
904
+ <tbody>
905
+ <tr>
906
+ <td>二叉树深度优先搜索(DFS)</td>
907
+ <td>以深度优先的方式遍历二叉树,从根节点开始,首先访问左子树,然后是右子树,使用递归。</td>
908
+ <td>递归 + 迭代</td>
909
+ </tr>
910
+ <tr>
911
+ <td>二叉树广度优先搜索(BFS)</td>
912
+ <td>以广度优先的方式遍历二叉树,从根节点开始,逐层从左到右访问节点。</td>
913
+ <td>迭代</td>
914
+ </tr>
915
+ <tr>
916
+ <td>图的深度优先搜索</td>
917
+ <td>以深度优先的方式遍历图,从给定节点开始,尽可能深地沿一条路径探索,然后回溯以探索其他路径。用于寻找连通分量、路径等。</td>
918
+ <td>递归 + 迭代</td>
919
+ </tr>
920
+ <tr>
921
+ <td>二叉树Morris遍历</td>
922
+ <td>Morris遍历是一种中序遍历二叉树的算法,空间复杂度为O(1)。它允许在没有额外栈或递归的情况下遍历树。</td>
923
+ <td>迭代</td>
924
+ </tr>
925
+ <tr>
926
+ <td>图的广度优先搜索</td>
927
+ <td>以广度优先的方式遍历图,从给定节点开始,首先访问与起始节点直接相连的节点,然后逐层扩展。用于寻找最短路径等。</td>
928
+ <td>递归 + 迭代</td>
929
+ </tr>
930
+ <tr>
931
+ <td>图的Tarjan算法</td>
932
+ <td>在图中找到强连通分量,通常使用深度优先搜索实现。</td>
933
+ <td>递归</td>
934
+ </tr>
935
+ <tr>
936
+ <td>图的Bellman-Ford算法</td>
937
+ <td>从单一源点找到最短路径,可以处理负权边</td>
938
+ <td>迭代</td>
939
+ </tr>
940
+ <tr>
941
+ <td>图的Dijkstra算法</td>
942
+ <td>从单一源点找到最短路径,不能处理负权边</td>
943
+ <td>迭代</td>
944
+ </tr>
945
+ <tr>
946
+ <td>图的Floyd-Warshall算法</td>
947
+ <td>找到所有节点对之间的最短路径</td>
948
+ <td>迭代</td>
949
+ </tr>
950
+ <tr>
951
+ <td>图的getCycles</td>
952
+ <td>在图中找到所有循环或检测循环的存在。</td>
953
+ <td>递归</td>
954
+ </tr>
955
+ <tr>
956
+ <td>图的getCutVertexes</td>
957
+ <td>在图中找到切点,这些是移除后会增加图中连通分量数量的节点。</td>
958
+ <td>递归</td>
959
+ </tr>
960
+ <tr>
961
+ <td>图的getSCCs</td>
962
+ <td>在图中找到强连通分量,这些是任意两个节点都可以相互到达的子图。</td>
963
+ <td>递归</td>
964
+ </tr>
965
+ <tr>
966
+ <td>图的getBridges</td>
967
+ <td>在图中找到桥,这些是移除后会增加图中连通分量数量的边。</td>
968
+ <td>递归</td>
969
+ </tr>
970
+ <tr>
971
+ <td>图的拓扑排序</td>
972
+ <td>对有向无环图(DAG)进行拓扑排序,以找到节点的线性顺序,使得所有有向边都从较早的节点指向较晚的节点。</td>
973
+ <td>递归</td>
974
+ </tr>
975
+ </tbody>
976
+ </table>
977
+
978
+
979
+ ## 软件工程标准
980
+
981
+ <table style="display: table; width:100%; table-layout: fixed;">
982
+ <tr>
983
+ <th>原则</th>
984
+ <th>描述</th>
985
+ </tr>
986
+ <tr>
987
+ <td>实用性</td>
988
+ <td>遵循ES6和ESNext标准,提供统一且考虑周到的可选参数,简化方法名称。</td>
989
+ </tr>
990
+ <tr>
991
+ <td>可扩展性</td>
992
+ <td>遵循OOP(面向对象编程)原则,允许所有数据结构继承。</td>
993
+ </tr>
994
+ <tr>
995
+ <td>模块化</td>
996
+ <td>包括数据结构模块化和独立的NPM包。</td>
997
+ </tr>
998
+ <tr>
999
+ <td>效率</td>
1000
+ <td>所有方法都提供时间和空间复杂度,可与原生JS性能相媲美。</td>
1001
+ </tr>
1002
+ <tr>
1003
+ <td>可维护性</td>
1004
+ <td>遵循开源社区开发标准,完整文档,持续集成,并遵循TDD(测试驱动开发)模式。</td>
1005
+ </tr>
1006
+ <tr>
1007
+ <td>可测试性</td>
1008
+ <td>自动化和定制单元测试、性能测试和集成测试。</td>
1009
+ </tr>
1010
+ <tr>
1011
+ <td>可移植性</td>
1012
+ <td>计划移植到Java、Python和C++,目前已完成80%。</td>
1013
+ </tr>
1014
+ <tr>
1015
+ <td>可复用性</td>
1016
+ <td>完全解耦,最小化副作用,遵循OOP。</td>
1017
+ </tr>
1018
+ <tr>
1019
+ <td>安全性</td>
1020
+ <td>精心设计的成员变量和方法的安全性。读写分离。数据结构软件不需要考虑其他安全方面。</td>
1021
+ </tr>
1022
+ <tr>
1023
+ <td>可扩展性</td>
1024
+ <td>数据结构软件不涉及负载问题。</td>
1025
+ </tr>
1026
+ </table>
1027
+
1028
+