data-structure-typed 1.42.4 → 1.42.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 (38) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/CONTRIBUTING.md +66 -5
  3. package/README.md +212 -120
  4. package/benchmark/report.html +12 -12
  5. package/benchmark/report.json +106 -106
  6. package/dist/cjs/src/data-structures/binary-tree/index.d.ts +1 -1
  7. package/dist/cjs/src/data-structures/binary-tree/index.js +1 -1
  8. package/dist/cjs/src/data-structures/binary-tree/{tree-multiset.d.ts → tree-multimap.d.ts} +10 -10
  9. package/dist/cjs/src/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +15 -15
  10. package/dist/cjs/src/data-structures/binary-tree/{tree-multiset.js.map → tree-multimap.js.map} +1 -1
  11. package/dist/cjs/src/types/data-structures/binary-tree/index.d.ts +1 -1
  12. package/dist/cjs/src/types/data-structures/binary-tree/index.js +1 -1
  13. package/dist/cjs/src/types/data-structures/binary-tree/tree-multimap.d.ts +4 -0
  14. package/dist/cjs/src/types/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +1 -1
  15. package/dist/cjs/src/types/data-structures/binary-tree/tree-multimap.js.map +1 -0
  16. package/dist/mjs/src/data-structures/binary-tree/index.d.ts +1 -1
  17. package/dist/mjs/src/data-structures/binary-tree/index.js +1 -1
  18. package/dist/mjs/src/data-structures/binary-tree/{tree-multiset.d.ts → tree-multimap.d.ts} +10 -10
  19. package/dist/mjs/src/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +14 -14
  20. package/dist/mjs/src/types/data-structures/binary-tree/index.d.ts +1 -1
  21. package/dist/mjs/src/types/data-structures/binary-tree/index.js +1 -1
  22. package/dist/mjs/src/types/data-structures/binary-tree/tree-multimap.d.ts +4 -0
  23. package/dist/umd/data-structure-typed.min.js +1 -1
  24. package/dist/umd/data-structure-typed.min.js.map +1 -1
  25. package/package.json +9 -7
  26. package/src/data-structures/binary-tree/index.ts +1 -1
  27. package/src/data-structures/binary-tree/{tree-multiset.ts → tree-multimap.ts} +14 -14
  28. package/src/types/data-structures/binary-tree/index.ts +1 -1
  29. package/src/types/data-structures/binary-tree/tree-multimap.ts +6 -0
  30. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +2 -2
  31. package/test/performance/reportor.ts +2 -2
  32. package/test/unit/data-structures/binary-tree/{tree-multiset.test.ts → tree-multimap.test.ts} +182 -182
  33. package/dist/cjs/src/types/data-structures/binary-tree/tree-multiset.d.ts +0 -4
  34. package/dist/cjs/src/types/data-structures/binary-tree/tree-multiset.js.map +0 -1
  35. package/dist/mjs/src/types/data-structures/binary-tree/tree-multiset.d.ts +0 -4
  36. package/src/types/data-structures/binary-tree/tree-multiset.ts +0 -6
  37. /package/dist/mjs/src/types/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +0 -0
  38. /package/test/performance/data-structures/binary-tree/{tree-multiset.test.ts → tree-multimap.test.ts} +0 -0
package/README.md CHANGED
@@ -27,8 +27,105 @@ Now you can use this library in Node.js and browser environments in CommonJS(req
27
27
 
28
28
  ## Built-in classic algorithms
29
29
 
30
- DFS(Depth-First Search), DFSIterative, BFS(Breadth-First Search), morris, Bellman-Ford Algorithm, Dijkstra's Algorithm,
31
- Floyd-Warshall Algorithm, Tarjan's Algorithm.
30
+ <table>
31
+ <thead>
32
+ <tr>
33
+ <th>Algorithm</th>
34
+ <th>Function Description</th>
35
+ <th>Iteration Type</th>
36
+ </tr>
37
+ </thead>
38
+ <tbody>
39
+ <tr>
40
+ <td>Binary Tree DFS</td>
41
+ <td>Traverse a binary tree in a depth-first manner, starting from the root node, first visiting the left subtree,
42
+ and then the right subtree, using recursion.
43
+ </td>
44
+ <td>Recursion + Iteration</td>
45
+ </tr>
46
+ <tr>
47
+ <td>Binary Tree BFS</td>
48
+ <td>Traverse a binary tree in a breadth-first manner, starting from the root node, visiting nodes level by level
49
+ from left to right.
50
+ </td>
51
+ <td>Iteration</td>
52
+ </tr>
53
+ <tr>
54
+ <td>Graph DFS</td>
55
+ <td>Traverse a graph in a depth-first manner, starting from a given node, exploring along one path as deeply as
56
+ possible, and backtracking to explore other paths. Used for finding connected components, paths, etc.
57
+ </td>
58
+ <td>Recursion + Iteration</td>
59
+ </tr>
60
+ <tr>
61
+ <td>Binary Tree Morris</td>
62
+ <td>Morris traversal is an in-order traversal algorithm for binary trees with O(1) space complexity. It allows tree
63
+ traversal without additional stack or recursion.
64
+ </td>
65
+ <td>Iteration</td>
66
+ </tr>
67
+ <tr>
68
+ <td>Graph BFS</td>
69
+ <td>Traverse a graph in a breadth-first manner, starting from a given node, first visiting nodes directly connected
70
+ to the starting node, and then expanding level by level. Used for finding shortest paths, etc.
71
+ </td>
72
+ <td>Recursion + Iteration</td>
73
+ </tr>
74
+ <tr>
75
+ <td>Graph Tarjan's Algorithm</td>
76
+ <td>Find strongly connected components in a graph, typically implemented using depth-first search.</td>
77
+ <td>Recursion</td>
78
+ </tr>
79
+ <tr>
80
+ <td>Graph Bellman-Ford Algorithm</td>
81
+ <td>Finding the shortest paths from a single source, can handle negative weight edges</td>
82
+ <td>Iteration</td>
83
+ </tr>
84
+ <tr>
85
+ <td>Graph Dijkstra's Algorithm</td>
86
+ <td>Finding the shortest paths from a single source, cannot handle negative weight edges</td>
87
+ <td>Iteration</td>
88
+ </tr>
89
+ <tr>
90
+ <td>Graph Floyd-Warshall Algorithm</td>
91
+ <td>Finding the shortest paths between all pairs of nodes</td>
92
+ <td>Iteration</td>
93
+ </tr>
94
+ <tr>
95
+ <td>Graph getCycles</td>
96
+ <td>Find all cycles in a graph or detect the presence of cycles.</td>
97
+ <td>Recursion</td>
98
+ </tr>
99
+ <tr>
100
+ <td>Graph getCutVertexes</td>
101
+ <td>Find cut vertices in a graph, which are nodes that, when removed, increase the number of connected components in
102
+ the graph.
103
+ </td>
104
+ <td>Recursion</td>
105
+ </tr>
106
+ <tr>
107
+ <td>Graph getSCCs</td>
108
+ <td>Find strongly connected components in a graph, which are subgraphs where any two nodes can reach each other.
109
+ </td>
110
+ <td>Recursion</td>
111
+ </tr>
112
+ <tr>
113
+ <td>Graph getBridges</td>
114
+ <td>Find bridges in a graph, which are edges that, when removed, increase the number of connected components in the
115
+ graph.
116
+ </td>
117
+ <td>Recursion</td>
118
+ </tr>
119
+ <tr>
120
+ <td>Graph topologicalSort</td>
121
+ <td>Perform topological sorting on a directed acyclic graph (DAG) to find a linear order of nodes such that all
122
+ directed edges go from earlier nodes to later nodes.
123
+ </td>
124
+ <td>Recursion</td>
125
+ </tr>
126
+ </tbody>
127
+ </table>
128
+
32
129
 
33
130
  ## Installation and Usage
34
131
 
@@ -47,23 +144,24 @@ yarn add data-structure-typed
47
144
  ```js
48
145
  import {
49
146
  BinaryTree, Graph, Queue, Stack, PriorityQueue, BST, Trie, DoublyLinkedList,
50
- AVLTree, MinHeap, SinglyLinkedList, DirectedGraph, TreeMultiset,
147
+ AVLTree, MinHeap, SinglyLinkedList, DirectedGraph, TreeMultimap,
51
148
  DirectedVertex, AVLTreeNode
52
149
  } from 'data-structure-typed';
53
150
  ```
54
151
 
55
152
  ### CDN
56
153
 
154
+ Copy the line below into the head tag in an HTML document.
57
155
  ```html
58
-
59
156
  <script src='https://cdn.jsdelivr.net/npm/data-structure-typed/dist/umd/data-structure-typed.min.js'></script>
60
157
  ```
61
158
 
159
+ Copy the code below into the script tag of your HTML, and you're good to go with your development work.
62
160
  ```js
63
161
  const {Heap} = dataStructureTyped;
64
162
  const {
65
163
  BinaryTree, Graph, Queue, Stack, PriorityQueue, BST, Trie, DoublyLinkedList,
66
- AVLTree, MinHeap, SinglyLinkedList, DirectedGraph, TreeMultiset,
164
+ AVLTree, MinHeap, SinglyLinkedList, DirectedGraph, TreeMultimap,
67
165
  DirectedVertex, AVLTreeNode
68
166
  } = dataStructureTyped;
69
167
  ```
@@ -71,7 +169,7 @@ const {
71
169
  ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/binary-tree-array-to-binary-tree.webp)
72
170
  ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/binary-tree-dfs-in-order.webp)
73
171
  ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/avl-tree-test.webp)
74
- ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/tree-multiset-test.webp)
172
+ ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/tree-multimap-test.webp)
75
173
  ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/matrix-cut-off-tree-for-golf.webp)
76
174
  ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/directed-graph-test.webp)
77
175
  ![](https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/examples/videos/webp_output/map-graph-test.webp)
@@ -84,7 +182,7 @@ const {
84
182
 
85
183
  <a href="https://github.com/zrwusa/vivid-algorithm" target="_blank">Examples Repository</a>
86
184
 
87
- ## Code Snippet
185
+ ## Code Snippets
88
186
 
89
187
  ### Binary Search Tree (BST) snippet
90
188
 
@@ -99,27 +197,40 @@ bst.add(3);
99
197
  bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]);
100
198
  bst.size === 16; // true
101
199
  bst.has(6); // true
102
- const node6 = bst.get(6); // BSTNode
200
+ const node6 = bst.getNode(6); // BSTNode
103
201
  bst.getHeight(6) === 2; // true
104
202
  bst.getHeight() === 5; // true
105
203
  bst.getDepth(6) === 3; // true
106
204
 
107
- bst.getLeftMost()?.id === 1; // true
205
+ bst.getLeftMost()?.key === 1; // true
108
206
 
109
207
  bst.delete(6);
110
- bst.get(6); // null
208
+ bst.get(6); // undefined
111
209
  bst.isAVLBalanced(); // true
112
210
  bst.bfs()[0] === 11; // true
113
211
 
114
- const objBST = new BST<BSTNode<{id: number, keyA: number}>>();
115
- objBST.add(11, {id: 11, keyA: 11});
116
- objBST.add(3, {id: 3, keyA: 3});
117
-
118
- objBST.addMany([{id: 15, keyA: 15}, {id: 1, keyA: 1}, {id: 8, keyA: 8},
119
- {id: 13, keyA: 13}, {id: 16, keyA: 16}, {id: 2, keyA: 2},
120
- {id: 6, keyA: 6}, {id: 9, keyA: 9}, {id: 12, keyA: 12},
121
- {id: 14, keyA: 14}, {id: 4, keyA: 4}, {id: 7, keyA: 7},
122
- {id: 10, keyA: 10}, {id: 5, keyA: 5}]);
212
+ const objBST = new BST<{height: number, age: number}>();
213
+
214
+ objBST.add(11, { "name": "Pablo", "age": 15 });
215
+ objBST.add(3, { "name": "Kirk", "age": 1 });
216
+
217
+ objBST.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], [
218
+ { "name": "Alice", "age": 15 },
219
+ { "name": "Bob", "age": 1 },
220
+ { "name": "Charlie", "age": 8 },
221
+ { "name": "David", "age": 13 },
222
+ { "name": "Emma", "age": 16 },
223
+ { "name": "Frank", "age": 2 },
224
+ { "name": "Grace", "age": 6 },
225
+ { "name": "Hannah", "age": 9 },
226
+ { "name": "Isaac", "age": 12 },
227
+ { "name": "Jack", "age": 14 },
228
+ { "name": "Katie", "age": 4 },
229
+ { "name": "Liam", "age": 7 },
230
+ { "name": "Mia", "age": 10 },
231
+ { "name": "Noah", "age": 5 }
232
+ ]
233
+ );
123
234
 
124
235
  objBST.delete(11);
125
236
  ```
@@ -133,39 +244,21 @@ const bst = new BST();
133
244
  bst.add(11);
134
245
  bst.add(3);
135
246
  bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]);
136
- bst.size === 16; // true
137
- bst.has(6); // true
138
- const node6 = bst.get(6);
139
- bst.getHeight(6) === 2; // true
140
- bst.getHeight() === 5; // true
141
- bst.getDepth(6) === 3; // true
247
+ bst.size === 16; // true
248
+ bst.has(6); // true
249
+ const node6 = bst.getNode(6);
250
+ bst.getHeight(6) === 2; // true
251
+ bst.getHeight() === 5; // true
252
+ bst.getDepth(6) === 3; // true
142
253
  const leftMost = bst.getLeftMost();
143
- leftMost?.id === 1; // true
144
- expect(leftMost?.id).toBe(1);
254
+ leftMost?.key === 1; // true
255
+
145
256
  bst.delete(6);
146
- bst.get(6); // null
147
- bst.isAVLBalanced(); // true or false
257
+ bst.get(6); // undefined
258
+ bst.isAVLBalanced(); // true or false
148
259
  const bfsIDs = bst.bfs();
149
- bfsIDs[0] === 11; // true
150
- expect(bfsIDs[0]).toBe(11);
260
+ bfsIDs[0] === 11; // true
151
261
 
152
- const objBST = new BST();
153
- objBST.add(11, {id: 11, keyA: 11});
154
- objBST.add(3, {id: 3, keyA: 3});
155
-
156
- objBST.addMany([{id: 15, keyA: 15}, {id: 1, keyA: 1}, {id: 8, keyA: 8},
157
- {id: 13, keyA: 13}, {id: 16, keyA: 16}, {id: 2, keyA: 2},
158
- {id: 6, keyA: 6}, {id: 9, keyA: 9}, {id: 12, keyA: 12},
159
- {id: 14, keyA: 14}, {id: 4, keyA: 4}, {id: 7, keyA: 7},
160
- {id: 10, keyA: 10}, {id: 5, keyA: 5}]);
161
-
162
- objBST.delete(11);
163
-
164
- const avlTree = new AVLTree();
165
- avlTree.addMany([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5])
166
- avlTree.isAVLBalanced(); // true
167
- avlTree.delete(10);
168
- avlTree.isAVLBalanced(); // true
169
262
  ```
170
263
 
171
264
  ### AVLTree snippet
@@ -222,7 +315,7 @@ graph.addVertex('C');
222
315
  graph.addEdge('A', 'B');
223
316
  graph.addEdge('B', 'C');
224
317
 
225
- const topologicalOrderIds = graph.topologicalSort(); // ['A', 'B', 'C']
318
+ const topologicalOrderKeys = graph.topologicalSort(); // ['A', 'B', 'C']
226
319
  ```
227
320
 
228
321
  ### Undirected Graph snippet
@@ -242,7 +335,7 @@ graph.addEdge('A', 'B');
242
335
  graph.addEdge('B', 'D');
243
336
 
244
337
  const dijkstraResult = graph.dijkstra('A');
245
- Array.from(dijkstraResult?.seen ?? []).map(vertex => vertex.id) // ['A', 'B', 'D']
338
+ Array.from(dijkstraResult?.seen ?? []).map(vertex => vertex.key) // ['A', 'B', 'D']
246
339
  ```
247
340
 
248
341
  ## Data Structures
@@ -290,7 +383,7 @@ Array.from(dijkstraResult?.seen ?? []).map(vertex => vertex.id) // ['A', 'B', 'D
290
383
  <td>Tree Multiset</td>
291
384
  <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
292
385
  <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
293
- <td><a href="https://data-structure-typed-docs.vercel.app/classes/TreeMultiset.html"><span>TreeMultiset</span></a></td>
386
+ <td><a href="https://data-structure-typed-docs.vercel.app/classes/TreeMultimap.html"><span>TreeMultimap</span></a></td>
294
387
  <td><img src="https://raw.githubusercontent.com/zrwusa/assets/master/images/data-structure-typed/assets/tick.svg" alt=""></td>
295
388
  </tr>
296
389
  <tr>
@@ -444,12 +537,6 @@ Array.from(dijkstraResult?.seen ?? []).map(vertex => vertex.id) // ['A', 'B', 'D
444
537
  </tr>
445
538
  </thead>
446
539
  <tbody>
447
- <tr>
448
- <td>Array&lt;E&gt;</td>
449
- <td>vector&lt;T&gt;</td>
450
- <td>ArrayList&lt;E&gt;</td>
451
- <td>list</td>
452
- </tr>
453
540
  <tr>
454
541
  <td>DoublyLinkedList&lt;E&gt;</td>
455
542
  <td>list&lt;T&gt;</td>
@@ -463,30 +550,23 @@ Array.from(dijkstraResult?.seen ?? []).map(vertex => vertex.id) // ['A', 'B', 'D
463
550
  <td>-</td>
464
551
  </tr>
465
552
  <tr>
466
- <td>Set&lt;E&gt;</td>
467
- <td>set&lt;T&gt;</td>
468
- <td>HashSet&lt;E&gt;</td>
469
- <td>set</td>
470
- </tr>
471
- <tr>
472
- <td>Map&lt;K, V&gt;</td>
473
- <td>map&lt;K, V&gt;</td>
474
- <td>HashMap&lt;K, V&gt;</td>
475
- <td>dict</td>
476
- </tr>
477
- <tr>
478
- <td>Map&lt;K, V&gt;</td>
479
- <td>-</td>
480
- <td>-</td>
481
- <td>OrderedDict</td>
553
+ <td>Array&lt;E&gt;</td>
554
+ <td>vector&lt;T&gt;</td>
555
+ <td>ArrayList&lt;E&gt;</td>
556
+ <td>list</td>
482
557
  </tr>
483
-
484
558
  <tr>
485
559
  <td>Queue&lt;E&gt;</td>
486
560
  <td>queue&lt;T&gt;</td>
487
561
  <td>Queue&lt;E&gt;</td>
488
562
  <td>-</td>
489
563
  </tr>
564
+ <tr>
565
+ <td>Deque&lt;E&gt;</td>
566
+ <td>deque&lt;T&gt;</td>
567
+ <td>-</td>
568
+ <td>-</td>
569
+ </tr>
490
570
  <tr>
491
571
  <td>PriorityQueue&lt;E&gt;</td>
492
572
  <td>priority_queue&lt;T&gt;</td>
@@ -494,7 +574,7 @@ Array.from(dijkstraResult?.seen ?? []).map(vertex => vertex.id) // ['A', 'B', 'D
494
574
  <td>-</td>
495
575
  </tr>
496
576
  <tr>
497
- <td>Heap&lt;V&gt;</td>
577
+ <td>Heap&lt;E&gt;</td>
498
578
  <td>priority_queue&lt;T&gt;</td>
499
579
  <td>PriorityQueue&lt;E&gt;</td>
500
580
  <td>heapq</td>
@@ -506,15 +586,21 @@ Array.from(dijkstraResult?.seen ?? []).map(vertex => vertex.id) // ['A', 'B', 'D
506
586
  <td>-</td>
507
587
  </tr>
508
588
  <tr>
509
- <td>Deque&lt;E&gt;</td>
510
- <td>deque&lt;T&gt;</td>
511
- <td>-</td>
512
- <td>-</td>
589
+ <td>Set&lt;E&gt;</td>
590
+ <td>set&lt;T&gt;</td>
591
+ <td>HashSet&lt;E&gt;</td>
592
+ <td>set</td>
593
+ </tr>
594
+ <tr>
595
+ <td>Map&lt;K, V&gt;</td>
596
+ <td>map&lt;K, V&gt;</td>
597
+ <td>HashMap&lt;K, V&gt;</td>
598
+ <td>dict</td>
513
599
  </tr>
514
600
  <tr>
515
- <td>Trie</td>
516
- <td>-</td>
517
601
  <td>-</td>
602
+ <td>unordered_set&lt;T&gt;</td>
603
+ <td>HashSet&lt;E&gt;</td>
518
604
  <td>-</td>
519
605
  </tr>
520
606
  <tr>
@@ -524,93 +610,99 @@ Array.from(dijkstraResult?.seen ?? []).map(vertex => vertex.id) // ['A', 'B', 'D
524
610
  <td>defaultdict</td>
525
611
  </tr>
526
612
  <tr>
527
- <td>-</td>
528
- <td>multiset&lt;T&gt;</td>
613
+ <td>Map&lt;K, V&gt;</td>
529
614
  <td>-</td>
530
615
  <td>-</td>
616
+ <td>OrderedDict</td>
531
617
  </tr>
532
618
  <tr>
619
+ <td>BinaryTree&lt;K, V&gt;</td>
533
620
  <td>-</td>
534
- <td>multimap&lt;K, V&gt;</td>
535
621
  <td>-</td>
536
622
  <td>-</td>
537
623
  </tr>
538
624
  <tr>
539
- <td>BinaryTree&lt;K, V&gt;</td>
625
+ <td>BST&lt;K, V&gt;</td>
540
626
  <td>-</td>
541
627
  <td>-</td>
542
628
  <td>-</td>
543
629
  </tr>
544
630
  <tr>
545
- <td>BST&lt;K, V&gt;</td>
546
- <td>-</td>
631
+ <td>TreeMultimap&lt;K, V&gt;</td>
632
+ <td>multimap&lt;K, V&gt;</td>
547
633
  <td>-</td>
548
634
  <td>-</td>
549
635
  </tr>
550
636
  <tr>
551
- <td>DirectedGraph&lt;V, E&gt;</td>
552
- <td>-</td>
637
+ <td>AVLTree&lt;E&gt;</td>
553
638
  <td>-</td>
639
+ <td>TreeSet&lt;E&gt;</td>
554
640
  <td>-</td>
555
641
  </tr>
556
642
  <tr>
557
- <td>UndirectedGraph&lt;V, E&gt;</td>
643
+ <td>AVLTree&lt;K, V&gt;</td>
558
644
  <td>-</td>
645
+ <td>TreeMap&lt;K, V&gt;</td>
559
646
  <td>-</td>
647
+ </tr>
648
+ <tr>
649
+ <td>AVLTree&lt;E&gt;</td>
650
+ <td>set</td>
651
+ <td>TreeSet&lt;E&gt;</td>
560
652
  <td>-</td>
561
653
  </tr>
562
654
  <tr>
655
+ <td>Trie</td>
656
+ <td>-</td>
563
657
  <td>-</td>
564
- <td>unordered_multiset</td>
565
658
  <td>-</td>
566
- <td>Counter</td>
567
659
  </tr>
568
660
  <tr>
569
661
  <td>-</td>
662
+ <td>multiset&lt;T&gt;</td>
570
663
  <td>-</td>
571
- <td>LinkedHashSet&lt;E&gt;</td>
572
664
  <td>-</td>
573
665
  </tr>
574
666
  <tr>
667
+ <td>DirectedGraph&lt;V, E&gt;</td>
575
668
  <td>-</td>
576
669
  <td>-</td>
577
- <td>LinkedHashMap&lt;K, V&gt;</td>
578
670
  <td>-</td>
579
671
  </tr>
580
672
  <tr>
581
- <td>AVLTree&lt;E&gt;</td>
673
+ <td>UndirectedGraph&lt;V, E&gt;</td>
674
+ <td>-</td>
582
675
  <td>-</td>
583
- <td>TreeSet&lt;E&gt;</td>
584
676
  <td>-</td>
585
677
  </tr>
586
678
  <tr>
587
- <td>AVLTree&lt;K, V&gt;</td>
588
679
  <td>-</td>
589
- <td>TreeMap&lt;K, V&gt;</td>
680
+ <td>unordered_multiset</td>
590
681
  <td>-</td>
682
+ <td>Counter</td>
591
683
  </tr>
592
684
  <tr>
593
- <td>AVLTree&lt;E&gt;</td>
594
- <td>set</td>
595
- <td>TreeSet&lt;E&gt;</td>
685
+ <td>-</td>
686
+ <td>-</td>
687
+ <td>LinkedHashSet&lt;E&gt;</td>
596
688
  <td>-</td>
597
689
  </tr>
598
690
  <tr>
599
691
  <td>-</td>
600
- <td>unordered_multimap&lt;K, V&gt;</td>
601
692
  <td>-</td>
693
+ <td>LinkedHashMap&lt;K, V&gt;</td>
602
694
  <td>-</td>
603
695
  </tr>
604
696
  <tr>
605
697
  <td>-</td>
606
- <td>bitset&lt;N&gt;</td>
698
+ <td>unordered_multimap&lt;K, V&gt;</td>
607
699
  <td>-</td>
608
700
  <td>-</td>
609
701
  </tr>
610
702
  <tr>
611
703
  <td>-</td>
612
- <td>unordered_set&lt;T&gt;</td>
613
- <td>HashSet&lt;E&gt;</td>
704
+ <td>bitset&lt;N&gt;</td>
705
+ <td>-</td>
614
706
  <td>-</td>
615
707
  </tr>
616
708
  </tbody>
@@ -627,49 +719,49 @@ Opt for concise and clear method names, avoiding excessive length while ensuring
627
719
 
628
720
  ### Object-oriented programming(OOP)
629
721
 
630
- By strictly adhering to object-oriented design (BinaryTree -> BST -> AVLTree -> TreeMultiset), you can seamlessly
722
+ By strictly adhering to object-oriented design (BinaryTree -> BST -> AVLTree -> TreeMultimap), you can seamlessly
631
723
  inherit the existing data structures to implement the customized ones you need. Object-oriented design stands as the
632
724
  optimal approach to data structure design.
633
725
 
634
726
  ## Benchmark
635
727
 
636
- [//]: # (Start of Replace Section)
728
+ [//]: # (No deletion!!! Start of Replace Section)
637
729
  <div class="json-to-html-collapse clearfix 0">
638
730
  <div class='collapsible level0' ><span class='json-to-html-label'>avl-tree</span></div>
639
- <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>30.33</td><td>32.97</td><td>3.56e-4</td></tr><tr><td>10,000 add & delete randomly</td><td>66.10</td><td>15.13</td><td>0.00</td></tr><tr><td>10,000 addMany</td><td>39.44</td><td>25.35</td><td>3.62e-4</td></tr><tr><td>10,000 get</td><td>27.06</td><td>36.96</td><td>2.52e-4</td></tr></table></div>
731
+ <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>30.52</td><td>32.76</td><td>3.28e-4</td></tr><tr><td>10,000 add & delete randomly</td><td>66.96</td><td>14.94</td><td>0.00</td></tr><tr><td>10,000 addMany</td><td>39.78</td><td>25.14</td><td>3.67e-4</td></tr><tr><td>10,000 get</td><td>27.38</td><td>36.52</td><td>0.00</td></tr></table></div>
640
732
  </div><div class="json-to-html-collapse clearfix 0">
641
733
  <div class='collapsible level0' ><span class='json-to-html-label'>binary-tree</span></div>
642
- <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>12.90</td><td>77.52</td><td>1.09e-4</td></tr><tr><td>1,000 add & delete randomly</td><td>16.13</td><td>61.99</td><td>1.61e-4</td></tr><tr><td>1,000 addMany</td><td>10.74</td><td>93.09</td><td>1.00e-4</td></tr><tr><td>1,000 get</td><td>18.09</td><td>55.28</td><td>1.90e-4</td></tr><tr><td>1,000 dfs</td><td>71.12</td><td>14.06</td><td>7.83e-4</td></tr><tr><td>1,000 bfs</td><td>57.24</td><td>17.47</td><td>4.17e-4</td></tr><tr><td>1,000 morris</td><td>37.29</td><td>26.81</td><td>3.77e-4</td></tr></table></div>
734
+ <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>10.50</td><td>95.20</td><td>2.30e-4</td></tr><tr><td>1,000 add & delete randomly</td><td>16.18</td><td>61.81</td><td>2.48e-4</td></tr><tr><td>1,000 addMany</td><td>10.80</td><td>92.62</td><td>1.83e-4</td></tr><tr><td>1,000 get</td><td>18.03</td><td>55.45</td><td>1.41e-4</td></tr><tr><td>1,000 dfs</td><td>157.86</td><td>6.33</td><td>0.00</td></tr><tr><td>1,000 bfs</td><td>56.68</td><td>17.64</td><td>0.00</td></tr><tr><td>1,000 morris</td><td>37.21</td><td>26.88</td><td>2.79e-4</td></tr></table></div>
643
735
  </div><div class="json-to-html-collapse clearfix 0">
644
736
  <div class='collapsible level0' ><span class='json-to-html-label'>bst</span></div>
645
- <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>31.58</td><td>31.67</td><td>0.00</td></tr><tr><td>10,000 add & delete randomly</td><td>71.09</td><td>14.07</td><td>8.99e-4</td></tr><tr><td>10,000 addMany</td><td>29.68</td><td>33.69</td><td>0.00</td></tr><tr><td>10,000 get</td><td>28.55</td><td>35.03</td><td>0.00</td></tr></table></div>
737
+ <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>27.61</td><td>36.21</td><td>4.73e-4</td></tr><tr><td>10,000 add & delete randomly</td><td>62.93</td><td>15.89</td><td>5.86e-4</td></tr><tr><td>10,000 addMany</td><td>28.70</td><td>34.84</td><td>0.00</td></tr><tr><td>10,000 get</td><td>27.67</td><td>36.14</td><td>2.92e-4</td></tr></table></div>
646
738
  </div><div class="json-to-html-collapse clearfix 0">
647
739
  <div class='collapsible level0' ><span class='json-to-html-label'>rb-tree</span></div>
648
- <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 randomly</td><td>84.64</td><td>11.82</td><td>0.01</td></tr><tr><td>100,000 add & 1000 delete randomly</td><td>81.32</td><td>12.30</td><td>0.01</td></tr><tr><td>100,000 getNode</td><td>61.18</td><td>16.35</td><td>0.00</td></tr></table></div>
740
+ <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 randomly</td><td>87.51</td><td>11.43</td><td>0.01</td></tr><tr><td>100,000 add & delete randomly</td><td>189.06</td><td>5.29</td><td>0.01</td></tr><tr><td>100,000 getNode</td><td>35.33</td><td>28.31</td><td>8.93e-4</td></tr></table></div>
649
741
  </div><div class="json-to-html-collapse clearfix 0">
650
742
  <div class='collapsible level0' ><span class='json-to-html-label'>directed-graph</span></div>
651
- <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.10</td><td>9637.47</td><td>3.79e-6</td></tr><tr><td>1,000 addEdge</td><td>6.09</td><td>164.18</td><td>1.31e-4</td></tr><tr><td>1,000 getVertex</td><td>0.05</td><td>2.14e+4</td><td>1.35e-6</td></tr><tr><td>1,000 getEdge</td><td>23.91</td><td>41.82</td><td>0.01</td></tr><tr><td>tarjan</td><td>218.65</td><td>4.57</td><td>0.01</td></tr><tr><td>tarjan all</td><td>221.67</td><td>4.51</td><td>0.00</td></tr><tr><td>topologicalSort</td><td>184.34</td><td>5.42</td><td>0.02</td></tr></table></div>
743
+ <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.10</td><td>9899.91</td><td>8.58e-7</td></tr><tr><td>1,000 addEdge</td><td>6.06</td><td>165.02</td><td>1.68e-4</td></tr><tr><td>1,000 getVertex</td><td>0.05</td><td>2.17e+4</td><td>4.22e-7</td></tr><tr><td>1,000 getEdge</td><td>23.05</td><td>43.38</td><td>0.00</td></tr><tr><td>tarjan</td><td>222.59</td><td>4.49</td><td>0.01</td></tr><tr><td>tarjan all</td><td>226.89</td><td>4.41</td><td>0.01</td></tr><tr><td>topologicalSort</td><td>187.34</td><td>5.34</td><td>0.01</td></tr></table></div>
652
744
  </div><div class="json-to-html-collapse clearfix 0">
653
745
  <div class='collapsible level0' ><span class='json-to-html-label'>heap</span></div>
654
- <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 & pop</td><td>4.63</td><td>215.77</td><td>4.49e-5</td></tr><tr><td>10,000 fib add & pop</td><td>355.19</td><td>2.82</td><td>0.00</td></tr></table></div>
746
+ <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 & pop</td><td>4.66</td><td>214.54</td><td>9.38e-5</td></tr><tr><td>10,000 fib add & pop</td><td>364.30</td><td>2.74</td><td>0.01</td></tr></table></div>
655
747
  </div><div class="json-to-html-collapse clearfix 0">
656
748
  <div class='collapsible level0' ><span class='json-to-html-label'>doubly-linked-list</span></div>
657
- <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 unshift</td><td>213.53</td><td>4.68</td><td>0.02</td></tr><tr><td>1,000,000 unshift & shift</td><td>162.97</td><td>6.14</td><td>0.02</td></tr><tr><td>1,000,000 insertBefore</td><td>335.19</td><td>2.98</td><td>0.09</td></tr></table></div>
749
+ <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 unshift</td><td>243.61</td><td>4.10</td><td>0.07</td></tr><tr><td>1,000,000 unshift & shift</td><td>173.32</td><td>5.77</td><td>0.03</td></tr><tr><td>1,000,000 insertBefore</td><td>315.86</td><td>3.17</td><td>0.04</td></tr></table></div>
658
750
  </div><div class="json-to-html-collapse clearfix 0">
659
751
  <div class='collapsible level0' ><span class='json-to-html-label'>singly-linked-list</span></div>
660
- <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 push & pop</td><td>231.35</td><td>4.32</td><td>0.02</td></tr><tr><td>10,000 insertBefore</td><td>251.49</td><td>3.98</td><td>0.01</td></tr></table></div>
752
+ <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 push & pop</td><td>228.06</td><td>4.38</td><td>0.03</td></tr><tr><td>10,000 insertBefore</td><td>252.07</td><td>3.97</td><td>0.01</td></tr></table></div>
661
753
  </div><div class="json-to-html-collapse clearfix 0">
662
754
  <div class='collapsible level0' ><span class='json-to-html-label'>max-priority-queue</span></div>
663
- <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>11.48</td><td>87.14</td><td>1.91e-4</td></tr></table></div>
755
+ <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>11.53</td><td>86.71</td><td>2.27e-4</td></tr></table></div>
664
756
  </div><div class="json-to-html-collapse clearfix 0">
665
757
  <div class='collapsible level0' ><span class='json-to-html-label'>deque</span></div>
666
- <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>215.14</td><td>4.65</td><td>0.05</td></tr><tr><td>1,000,000 shift</td><td>25.15</td><td>39.76</td><td>0.00</td></tr></table></div>
758
+ <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>227.24</td><td>4.40</td><td>0.07</td></tr><tr><td>1,000,000 shift</td><td>25.60</td><td>39.07</td><td>0.00</td></tr></table></div>
667
759
  </div><div class="json-to-html-collapse clearfix 0">
668
760
  <div class='collapsible level0' ><span class='json-to-html-label'>queue</span></div>
669
- <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>44.15</td><td>22.65</td><td>0.01</td></tr><tr><td>1,000,000 push & shift</td><td>80.87</td><td>12.37</td><td>0.00</td></tr></table></div>
761
+ <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>45.98</td><td>21.75</td><td>0.01</td></tr><tr><td>1,000,000 push & shift</td><td>81.12</td><td>12.33</td><td>0.00</td></tr></table></div>
670
762
  </div><div class="json-to-html-collapse clearfix 0">
671
763
  <div class='collapsible level0' ><span class='json-to-html-label'>trie</span></div>
672
- <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>61.38</td><td>16.29</td><td>0.01</td></tr><tr><td>100,000 getWords</td><td>104.27</td><td>9.59</td><td>0.02</td></tr></table></div>
764
+ <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>59.40</td><td>16.83</td><td>0.01</td></tr><tr><td>100,000 getWords</td><td>90.07</td><td>11.10</td><td>0.00</td></tr></table></div>
673
765
  </div>
674
766
 
675
- [//]: # (End of Replace Section)
767
+ [//]: # (No deletion!!! End of Replace Section)