data-structure-typed 1.50.0 → 1.50.2

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 +2 -1
  2. package/README.md +204 -212
  3. package/benchmark/report.html +37 -1
  4. package/benchmark/report.json +370 -22
  5. package/dist/cjs/data-structures/base/iterable-base.d.ts +114 -9
  6. package/dist/cjs/data-structures/base/iterable-base.js +143 -7
  7. package/dist/cjs/data-structures/base/iterable-base.js.map +1 -1
  8. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +43 -46
  9. package/dist/cjs/data-structures/binary-tree/avl-tree.js +68 -71
  10. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  11. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +244 -199
  12. package/dist/cjs/data-structures/binary-tree/binary-tree.js +484 -376
  13. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  14. package/dist/cjs/data-structures/binary-tree/bst.d.ts +54 -74
  15. package/dist/cjs/data-structures/binary-tree/bst.js +30 -71
  16. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  17. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +78 -60
  18. package/dist/cjs/data-structures/binary-tree/rb-tree.js +84 -89
  19. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  20. package/dist/cjs/data-structures/binary-tree/tree-multimap.d.ts +37 -56
  21. package/dist/cjs/data-structures/binary-tree/tree-multimap.js +64 -85
  22. package/dist/cjs/data-structures/binary-tree/tree-multimap.js.map +1 -1
  23. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +1 -0
  24. package/dist/cjs/data-structures/graph/abstract-graph.js +3 -0
  25. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  26. package/dist/cjs/data-structures/graph/directed-graph.d.ts +14 -0
  27. package/dist/cjs/data-structures/graph/directed-graph.js +26 -0
  28. package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
  29. package/dist/cjs/data-structures/graph/map-graph.d.ts +8 -0
  30. package/dist/cjs/data-structures/graph/map-graph.js +14 -0
  31. package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
  32. package/dist/cjs/data-structures/graph/undirected-graph.d.ts +16 -0
  33. package/dist/cjs/data-structures/graph/undirected-graph.js +25 -0
  34. package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
  35. package/dist/cjs/data-structures/hash/hash-map.d.ts +121 -15
  36. package/dist/cjs/data-structures/hash/hash-map.js +160 -25
  37. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  38. package/dist/cjs/data-structures/heap/heap.d.ts +66 -6
  39. package/dist/cjs/data-structures/heap/heap.js +66 -6
  40. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  41. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +67 -50
  42. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +70 -64
  43. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  44. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +128 -103
  45. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +130 -112
  46. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  47. package/dist/cjs/data-structures/linked-list/skip-linked-list.d.ts +63 -36
  48. package/dist/cjs/data-structures/linked-list/skip-linked-list.js +63 -36
  49. package/dist/cjs/data-structures/linked-list/skip-linked-list.js.map +1 -1
  50. package/dist/cjs/data-structures/matrix/matrix.d.ts +35 -4
  51. package/dist/cjs/data-structures/matrix/matrix.js +50 -11
  52. package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
  53. package/dist/cjs/data-structures/queue/deque.d.ts +49 -19
  54. package/dist/cjs/data-structures/queue/deque.js +101 -47
  55. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  56. package/dist/cjs/data-structures/queue/queue.d.ts +39 -5
  57. package/dist/cjs/data-structures/queue/queue.js +47 -5
  58. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  59. package/dist/cjs/data-structures/stack/stack.d.ts +16 -0
  60. package/dist/cjs/data-structures/stack/stack.js +22 -0
  61. package/dist/cjs/data-structures/stack/stack.js.map +1 -1
  62. package/dist/cjs/data-structures/trie/trie.d.ts +38 -1
  63. package/dist/cjs/data-structures/trie/trie.js +41 -0
  64. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  65. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
  66. package/dist/cjs/types/data-structures/hash/hash-map.d.ts +4 -3
  67. package/dist/cjs/types/utils/utils.d.ts +1 -0
  68. package/dist/mjs/data-structures/base/iterable-base.d.ts +114 -9
  69. package/dist/mjs/data-structures/base/iterable-base.js +143 -7
  70. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +43 -46
  71. package/dist/mjs/data-structures/binary-tree/avl-tree.js +68 -71
  72. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +244 -199
  73. package/dist/mjs/data-structures/binary-tree/binary-tree.js +483 -375
  74. package/dist/mjs/data-structures/binary-tree/bst.d.ts +54 -74
  75. package/dist/mjs/data-structures/binary-tree/bst.js +30 -71
  76. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +78 -60
  77. package/dist/mjs/data-structures/binary-tree/rb-tree.js +84 -89
  78. package/dist/mjs/data-structures/binary-tree/tree-multimap.d.ts +37 -56
  79. package/dist/mjs/data-structures/binary-tree/tree-multimap.js +64 -85
  80. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +1 -0
  81. package/dist/mjs/data-structures/graph/abstract-graph.js +3 -0
  82. package/dist/mjs/data-structures/graph/directed-graph.d.ts +14 -0
  83. package/dist/mjs/data-structures/graph/directed-graph.js +26 -0
  84. package/dist/mjs/data-structures/graph/map-graph.d.ts +8 -0
  85. package/dist/mjs/data-structures/graph/map-graph.js +14 -0
  86. package/dist/mjs/data-structures/graph/undirected-graph.d.ts +16 -0
  87. package/dist/mjs/data-structures/graph/undirected-graph.js +25 -0
  88. package/dist/mjs/data-structures/hash/hash-map.d.ts +121 -15
  89. package/dist/mjs/data-structures/hash/hash-map.js +160 -25
  90. package/dist/mjs/data-structures/heap/heap.d.ts +66 -6
  91. package/dist/mjs/data-structures/heap/heap.js +66 -6
  92. package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +67 -50
  93. package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +70 -64
  94. package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +128 -103
  95. package/dist/mjs/data-structures/linked-list/singly-linked-list.js +130 -112
  96. package/dist/mjs/data-structures/linked-list/skip-linked-list.d.ts +63 -36
  97. package/dist/mjs/data-structures/linked-list/skip-linked-list.js +63 -36
  98. package/dist/mjs/data-structures/matrix/matrix.d.ts +35 -4
  99. package/dist/mjs/data-structures/matrix/matrix.js +50 -11
  100. package/dist/mjs/data-structures/queue/deque.d.ts +49 -19
  101. package/dist/mjs/data-structures/queue/deque.js +101 -47
  102. package/dist/mjs/data-structures/queue/queue.d.ts +39 -5
  103. package/dist/mjs/data-structures/queue/queue.js +47 -5
  104. package/dist/mjs/data-structures/stack/stack.d.ts +16 -0
  105. package/dist/mjs/data-structures/stack/stack.js +22 -0
  106. package/dist/mjs/data-structures/trie/trie.d.ts +38 -1
  107. package/dist/mjs/data-structures/trie/trie.js +41 -0
  108. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
  109. package/dist/mjs/types/data-structures/hash/hash-map.d.ts +4 -3
  110. package/dist/mjs/types/utils/utils.d.ts +1 -0
  111. package/dist/umd/data-structure-typed.js +1730 -1042
  112. package/dist/umd/data-structure-typed.min.js +3 -3
  113. package/dist/umd/data-structure-typed.min.js.map +1 -1
  114. package/package.json +16 -40
  115. package/src/data-structures/base/iterable-base.ts +172 -19
  116. package/src/data-structures/binary-tree/avl-tree.ts +97 -97
  117. package/src/data-structures/binary-tree/binary-tree.ts +674 -671
  118. package/src/data-structures/binary-tree/bst.ts +89 -131
  119. package/src/data-structures/binary-tree/rb-tree.ts +127 -155
  120. package/src/data-structures/binary-tree/tree-multimap.ts +96 -112
  121. package/src/data-structures/graph/abstract-graph.ts +4 -0
  122. package/src/data-structures/graph/directed-graph.ts +30 -0
  123. package/src/data-structures/graph/map-graph.ts +15 -0
  124. package/src/data-structures/graph/undirected-graph.ts +28 -0
  125. package/src/data-structures/hash/hash-map.ts +175 -34
  126. package/src/data-structures/heap/heap.ts +66 -6
  127. package/src/data-structures/linked-list/doubly-linked-list.ts +72 -66
  128. package/src/data-structures/linked-list/singly-linked-list.ts +132 -114
  129. package/src/data-structures/linked-list/skip-linked-list.ts +63 -37
  130. package/src/data-structures/matrix/matrix.ts +52 -12
  131. package/src/data-structures/queue/deque.ts +108 -49
  132. package/src/data-structures/queue/queue.ts +51 -5
  133. package/src/data-structures/stack/stack.ts +24 -0
  134. package/src/data-structures/trie/trie.ts +45 -1
  135. package/src/types/data-structures/binary-tree/binary-tree.ts +1 -1
  136. package/src/types/data-structures/hash/hash-map.ts +4 -3
  137. package/src/types/utils/utils.ts +2 -0
  138. package/test/performance/data-structures/graph/directed-graph.test.ts +3 -3
  139. package/test/performance/data-structures/queue/deque.test.ts +26 -25
  140. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +37 -0
  141. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +46 -17
  142. package/test/unit/data-structures/binary-tree/bst.test.ts +65 -1
  143. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +38 -1
  144. package/test/unit/data-structures/binary-tree/tree-multimap.test.ts +37 -32
  145. package/test/unit/data-structures/graph/abstract-graph.test.ts +8 -0
  146. package/test/unit/data-structures/graph/directed-graph.test.ts +249 -0
  147. package/test/unit/data-structures/hash/hash-map.test.ts +376 -353
  148. package/test/unit/data-structures/heap/heap.test.ts +18 -1
  149. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +24 -5
  150. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +20 -2
  151. package/test/unit/data-structures/linked-list/skip-list.test.ts +1 -1
  152. package/test/unit/data-structures/queue/deque.test.ts +71 -10
  153. package/test/unit/data-structures/queue/queue.test.ts +23 -6
  154. package/test/unit/data-structures/stack/stack.test.ts +17 -0
  155. package/test/unit/data-structures/trie/trie.test.ts +17 -0
  156. package/test/unit/unrestricted-interconversion.test.ts +143 -10
@@ -32,12 +32,20 @@ export class Queue<E = any> extends IterableElementBase<E> {
32
32
 
33
33
  protected _elements: E[] = [];
34
34
 
35
+ /**
36
+ * The elements function returns the elements of this set.
37
+ * @return An array of the elements in the stack
38
+ */
35
39
  get elements(): E[] {
36
40
  return this._elements;
37
41
  }
38
42
 
39
43
  protected _offset: number = 0;
40
44
 
45
+ /**
46
+ * The offset function returns the offset of the current page.
47
+ * @return The value of the private variable _offset
48
+ */
41
49
  get offset(): number {
42
50
  return this._offset;
43
51
  }
@@ -142,6 +150,26 @@ export class Queue<E = any> extends IterableElementBase<E> {
142
150
  return first;
143
151
  }
144
152
 
153
+ /**
154
+ * The delete function removes an element from the list.
155
+ * @param element: E Specify the element to be deleted
156
+ * @return A boolean value indicating whether the element was successfully deleted or not
157
+ */
158
+ delete(element: E): boolean {
159
+ const index = this.elements.indexOf(element);
160
+ return this.deleteAt(index);
161
+ }
162
+
163
+ /**
164
+ * The deleteAt function deletes the element at a given index.
165
+ * @param index: number Determine the index of the element to be deleted
166
+ * @return A boolean value
167
+ */
168
+ deleteAt(index: number): boolean {
169
+ const spliced = this.elements.splice(index, 1);
170
+ return spliced.length === 1;
171
+ }
172
+
145
173
  /**
146
174
  * Time Complexity: O(1) - constant time as it retrieves the value at the current offset.
147
175
  * Space Complexity: O(1) - no additional space is used.
@@ -219,7 +247,7 @@ export class Queue<E = any> extends IterableElementBase<E> {
219
247
  *
220
248
  * @param index
221
249
  */
222
- getAt(index: number): E | undefined {
250
+ at(index: number): E | undefined {
223
251
  return this.elements[index];
224
252
  }
225
253
 
@@ -264,13 +292,14 @@ export class Queue<E = any> extends IterableElementBase<E> {
264
292
  }
265
293
 
266
294
  /**
267
- * Time Complexity: O(n) - where n is the number of elements in the queue. It creates a shallow copy of the internal array.
268
- * Space Complexity: O(n) - the space required is proportional to the number of elements in the queue.
295
+ * Time Complexity: O(n)
296
+ * Space Complexity: O(n)
297
+ * where n is the number of elements in the queue. It creates a shallow copy of the internal array. the space required is proportional to the number of elements in the queue.
269
298
  */
270
299
 
271
300
  /**
272
- * Time Complexity: O(n) - where n is the number of elements in the queue. It creates a shallow copy of the internal array.
273
- * Space Complexity: O(n) - the space required is proportional to the number of elements in the queue.
301
+ * Time Complexity: O(n)
302
+ * Space Complexity: O(n)
274
303
  *
275
304
  * The `clone()` function returns a new Queue object with the same elements as the original Queue.
276
305
  * @returns The `clone()` method is returning a new instance of the `Queue` class.
@@ -390,4 +419,21 @@ export class LinkedListQueue<E = any> extends SinglyLinkedList<E> {
390
419
  peek(): E | undefined {
391
420
  return this.first;
392
421
  }
422
+
423
+ /**
424
+ * Time Complexity: O(n)
425
+ * Space Complexity: O(n)
426
+ */
427
+
428
+ /**
429
+ * Time Complexity: O(n)
430
+ * Space Complexity: O(n)
431
+ * The `clone` function returns a new instance of the `LinkedListQueue` class with the same values as
432
+ * the current instance.
433
+ * @returns The `clone()` method is returning a new instance of `LinkedListQueue` with the same
434
+ * values as the original `LinkedListQueue`.
435
+ */
436
+ clone(): LinkedListQueue<E> {
437
+ return new LinkedListQueue<E>(this.values());
438
+ }
393
439
  }
@@ -32,6 +32,10 @@ export class Stack<E = any> extends IterableElementBase<E> {
32
32
 
33
33
  protected _elements: E[] = [];
34
34
 
35
+ /**
36
+ * The elements function returns the elements of this set.
37
+ * @return An array of elements
38
+ */
35
39
  get elements(): E[] {
36
40
  return this._elements;
37
41
  }
@@ -125,6 +129,26 @@ export class Stack<E = any> extends IterableElementBase<E> {
125
129
  return this.elements.pop();
126
130
  }
127
131
 
132
+ /**
133
+ * The delete function removes an element from the stack.
134
+ * @param element: E Specify the element to be deleted
135
+ * @return A boolean value indicating whether the element was successfully deleted or not
136
+ */
137
+ delete(element: E): boolean {
138
+ const index = this.elements.indexOf(element);
139
+ return this.deleteAt(index);
140
+ }
141
+
142
+ /**
143
+ * The deleteAt function deletes the element at a given index.
144
+ * @param index: number Determine the index of the element to be deleted
145
+ * @return A boolean value
146
+ */
147
+ deleteAt(index: number): boolean {
148
+ const spliced = this.elements.splice(index, 1);
149
+ return spliced.length === 1;
150
+ }
151
+
128
152
  /**
129
153
  * Time Complexity: O(n)
130
154
  * Space Complexity: O(n)
@@ -37,7 +37,13 @@ export class TrieNode {
37
37
  * 10. IP Routing: Used in certain types of IP routing algorithms.
38
38
  * 11. Text Word Frequency Count: Counting and storing the frequency of words in a large amount of text data."
39
39
  */
40
- export class Trie extends IterableElementBase<string> {
40
+ export class Trie extends IterableElementBase<string, Trie> {
41
+ /**
42
+ * The constructor function for the Trie class.
43
+ * @param words: Iterable string Initialize the trie with a set of words
44
+ * @param options?: TrieOptions Allow the user to pass in options for the trie
45
+ * @return This
46
+ */
41
47
  constructor(words: Iterable<string> = [], options?: TrieOptions) {
42
48
  super();
43
49
  if (options) {
@@ -51,18 +57,31 @@ export class Trie extends IterableElementBase<string> {
51
57
 
52
58
  protected _size: number = 0;
53
59
 
60
+ /**
61
+ * The size function returns the size of the stack.
62
+ * @return The number of elements in the list
63
+ */
54
64
  get size(): number {
55
65
  return this._size;
56
66
  }
57
67
 
58
68
  protected _caseSensitive: boolean = true;
59
69
 
70
+ /**
71
+ * The caseSensitive function is a getter that returns the value of the private _caseSensitive property.
72
+ *
73
+ * @return The value of the _casesensitive private variable
74
+ */
60
75
  get caseSensitive(): boolean {
61
76
  return this._caseSensitive;
62
77
  }
63
78
 
64
79
  protected _root: TrieNode = new TrieNode('');
65
80
 
81
+ /**
82
+ * The root function returns the root node of the tree.
83
+ * @return The root node
84
+ */
66
85
  get root() {
67
86
  return this._root;
68
87
  }
@@ -124,6 +143,14 @@ export class Trie extends IterableElementBase<string> {
124
143
  return cur.isEnd;
125
144
  }
126
145
 
146
+ /**
147
+ * The isEmpty function checks if the size of the queue is 0.
148
+ * @return True if the size of the queue is 0
149
+ */
150
+ isEmpty(): boolean {
151
+ return this.size === 0;
152
+ }
153
+
127
154
  /**
128
155
  * Time Complexity: O(M), where M is the length of the word being deleted.
129
156
  * Space Complexity: O(M) - Due to the recursive DFS approach.
@@ -351,6 +378,23 @@ export class Trie extends IterableElementBase<string> {
351
378
  return words;
352
379
  }
353
380
 
381
+ /**
382
+ * Time Complexity: O(n)
383
+ * Space Complexity: O(n)
384
+ */
385
+
386
+ /**
387
+ * Time Complexity: O(n)
388
+ * Space Complexity: O(n)
389
+ *
390
+ * The `clone` function returns a new instance of the Trie class with the same values and case
391
+ * sensitivity as the original Trie.
392
+ * @returns A new instance of the Trie class is being returned.
393
+ */
394
+ clone(): Trie {
395
+ return new Trie(this.values(), { caseSensitive: this.caseSensitive });
396
+ }
397
+
354
398
  /**
355
399
  * Time Complexity: O(n)
356
400
  * Space Complexity: O(n)
@@ -3,7 +3,7 @@ import { IterationType } from "../../common";
3
3
 
4
4
  export type BinaryTreeNodeNested<K, V> = BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, BinaryTreeNode<K, V, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
5
5
 
6
- export type BinaryTreeNested<K, V, N extends BinaryTreeNode<K, V, N>> = BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, BinaryTree<K, V, N, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
6
+ export type BinaryTreeNested<K, V, NODE extends BinaryTreeNode<K, V, NODE>> = BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, BinaryTree<K, V, NODE, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7
7
 
8
8
  export type BinaryTreeOptions<K> = {
9
9
  iterationType?: IterationType,
@@ -5,14 +5,15 @@ export type HashMapLinkedNode<K, V> = {
5
5
  prev: HashMapLinkedNode<K, V>;
6
6
  };
7
7
 
8
- export type LinkedHashMapOptions<K> = {
8
+ export type LinkedHashMapOptions<K, V, R> = {
9
9
  hashFn?: (key: K) => string;
10
10
  objHashFn?: (key: K) => object;
11
+ toEntryFn?: (rawElement: R) => [K, V];
11
12
  };
12
13
 
13
- export type HashMapOptions<K, V, T> = {
14
+ export type HashMapOptions<K, V, R> = {
14
15
  hashFn?: (key: K) => string;
15
- toEntryFn?: (rawElement: T) => [K, V];
16
+ toEntryFn?: (rawElement: R) => [K, V];
16
17
  };
17
18
 
18
19
  export type HashMapStoreItem<K, V> = { key: K; value: V };
@@ -4,3 +4,5 @@ export type TrlFn = (...args: any[]) => any;
4
4
  export type TrlAsyncFn = (...args: any[]) => any;
5
5
 
6
6
  export type SpecifyOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
7
+
8
+ export type Any = string | number | boolean | object | null | undefined | symbol;
@@ -28,9 +28,9 @@ suite
28
28
  .add(`tarjan`, () => {
29
29
  graph.tarjan(true);
30
30
  })
31
- .add(`tarjan all`, () => {
32
- graph.tarjan(true, true, true, true);
33
- })
31
+ // .add(`tarjan all`, () => {
32
+ // graph.tarjan(true, true, true, true);
33
+ // })
34
34
  .add(`topologicalSort`, () => {
35
35
  graph.topologicalSort('key');
36
36
  });
@@ -1,11 +1,12 @@
1
1
  import { Deque } from '../../../../src';
2
2
  import { Deque as CDeque } from 'js-sdsl';
3
3
  import * as Benchmark from 'benchmark';
4
- import { getRandomInt, magnitude } from '../../../utils';
4
+ import { magnitude } from '../../../utils';
5
5
  import { isCompetitor } from '../../../config';
6
6
 
7
7
  export const suite = new Benchmark.Suite();
8
- const { MILLION, HUNDRED_THOUSAND, TEN_THOUSAND } = magnitude;
8
+ const { MILLION, HUNDRED_THOUSAND } = magnitude;
9
+ // const randomIndicesTenThousand = new Array(TEN_THOUSAND).fill(getRandomInt(0, TEN_THOUSAND - 1));
9
10
 
10
11
  suite.add(`${MILLION.toLocaleString()} push`, () => {
11
12
  const deque = new Deque<number>();
@@ -14,45 +15,45 @@ suite.add(`${MILLION.toLocaleString()} push`, () => {
14
15
 
15
16
  if (isCompetitor) {
16
17
  suite.add(`CPT ${MILLION.toLocaleString()} push`, () => {
17
- const _deque = new CDeque<number>();
18
- for (let i = 0; i < MILLION; i++) _deque.pushBack(i);
18
+ const deque = new CDeque<number>();
19
+ for (let i = 0; i < MILLION; i++) deque.pushBack(i);
19
20
  });
20
21
  }
21
22
 
22
23
  suite
23
- .add(`${TEN_THOUSAND.toLocaleString()} push & delete`, () => {
24
- const _deque = new Deque<number>();
25
-
26
- for (let i = 0; i < TEN_THOUSAND; i++) _deque.push(i);
27
- for (let i = 0; i < TEN_THOUSAND; i++) _deque.delete(getRandomInt(0, TEN_THOUSAND - 1));
28
- })
24
+ // .add(`${TEN_THOUSAND.toLocaleString()} push & delete`, () => {
25
+ // const deque = new Deque<number>();
26
+ //
27
+ // for (let i = 0; i < TEN_THOUSAND; i++) deque.push(i);
28
+ // for (let i = 0; i < TEN_THOUSAND; i++) deque.delete(randomIndicesTenThousand[i]);
29
+ // })
29
30
  .add(`${MILLION.toLocaleString()} push & pop`, () => {
30
- const _deque = new Deque<number>();
31
+ const deque = new Deque<number>();
31
32
 
32
- for (let i = 0; i < MILLION; i++) _deque.push(i);
33
- for (let i = 0; i < MILLION; i++) _deque.pop();
33
+ for (let i = 0; i < MILLION; i++) deque.push(i);
34
+ for (let i = 0; i < MILLION; i++) deque.pop();
34
35
  })
35
36
  .add(`${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => {
36
- const _deque = new Deque<number>();
37
+ const deque = new Deque<number>();
37
38
 
38
- for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.push(i);
39
- for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.shift();
39
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) deque.push(i);
40
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) deque.shift();
40
41
  })
41
42
  .add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => {
42
- const _deque = new Array<number>();
43
+ const array = new Array<number>();
43
44
 
44
- for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.push(i);
45
- for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.shift();
45
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) array.push(i);
46
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) array.shift();
46
47
  })
47
48
  .add(`${HUNDRED_THOUSAND.toLocaleString()} unshift & shift`, () => {
48
- const _deque = new Deque<number>();
49
+ const deque = new Deque<number>();
49
50
 
50
- for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.unshift(i);
51
- for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.shift();
51
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) deque.unshift(i);
52
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) deque.shift();
52
53
  })
53
54
  .add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} unshift & shift`, () => {
54
- const _deque = new Array<number>();
55
+ const array = new Array<number>();
55
56
 
56
- for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.unshift(i);
57
- for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.shift();
57
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) array.unshift(i);
58
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) array.shift();
58
59
  });
@@ -235,6 +235,43 @@ describe('AVLTree APIs test', () => {
235
235
  const bfsRes = avl.bfs(node => node.key);
236
236
  expect(bfsRes[0]).toBe(2);
237
237
  });
238
+
239
+ it('should the clone method', () => {
240
+ function checkTreeStructure(avl: AVLTree<string, number>) {
241
+ expect(avl.size).toBe(4);
242
+ expect(avl.root?.key).toBe('2');
243
+ expect(avl.root?.left?.key).toBe('1');
244
+ expect(avl.root?.left?.left?.key).toBe(undefined);
245
+ expect(avl.root?.left?.right?.key).toBe(undefined);
246
+ expect(avl.root?.right?.key).toBe('4');
247
+ expect(avl.root?.right?.left?.key).toBe(undefined);
248
+ expect(avl.root?.right?.right?.key).toBe('5');
249
+ }
250
+
251
+ const avl = new AVLTree<string, number>();
252
+ avl.addMany([
253
+ ['2', 2],
254
+ ['4', 4],
255
+ ['5', 5],
256
+ ['3', 3],
257
+ ['1', 1]
258
+ ]);
259
+ expect(avl.size).toBe(5);
260
+ expect(avl.root?.key).toBe('2');
261
+ expect(avl.root?.left?.key).toBe('1');
262
+ expect(avl.root?.left?.left?.key).toBe(undefined);
263
+ expect(avl.root?.left?.right?.key).toBe(undefined);
264
+ expect(avl.root?.right?.key).toBe('4');
265
+ expect(avl.root?.right?.left?.key).toBe('3');
266
+ expect(avl.root?.right?.right?.key).toBe('5');
267
+ avl.delete('3');
268
+ checkTreeStructure(avl);
269
+ const cloned = avl.clone();
270
+ checkTreeStructure(cloned);
271
+ cloned.delete('1');
272
+ expect(avl.size).toBe(4);
273
+ expect(cloned.size).toBe(3);
274
+ });
238
275
  });
239
276
 
240
277
  describe('AVLTree', () => {
@@ -152,6 +152,51 @@ describe('BinaryTree', () => {
152
152
  expect(tree.has('3', node => node.value?.toString())).toBe(true);
153
153
  });
154
154
 
155
+ it('should the clone method work fine', () => {
156
+ expect(tree.isEmpty()).toBe(true);
157
+ tree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
158
+ expect(tree.root?.key).toBe(4);
159
+ expect(tree.root?.left?.key).toBe(2);
160
+ expect(tree.root?.left?.left).toBe(null);
161
+ expect(tree.root?.left?.right?.key).toBe(1);
162
+ expect(tree.root?.right?.key).toBe(6);
163
+ expect(tree.root?.right?.left?.key).toBe(3);
164
+ expect(tree.root?.right?.right).toBe(null);
165
+
166
+ const cloned = tree.clone();
167
+ expect(cloned.root?.key).toBe(4);
168
+ expect(cloned.root?.left?.key).toBe(2);
169
+ expect(cloned.root?.left?.left).toBe(null);
170
+ expect(cloned.root?.left?.right?.key).toBe(1);
171
+ expect(cloned.root?.right?.key).toBe(6);
172
+ expect(cloned.root?.right?.left?.key).toBe(3);
173
+ expect(cloned.root?.right?.right).toBe(null);
174
+ expect(cloned.dfs(node => node.key, 'pre', cloned.getNode(6), IterationType.ITERATIVE)).toEqual([6, 3, 7]);
175
+ expect(
176
+ cloned.dfs(node => (node ? node.key : null), 'pre', cloned.getNode(6), IterationType.ITERATIVE, true)
177
+ ).toEqual([6, 3, 7, null]);
178
+ expect(
179
+ cloned.dfs(node => (node ? node.key : node), 'pre', cloned.getNode(6), IterationType.ITERATIVE, true)
180
+ ).toEqual([6, 3, 7, null]);
181
+ expect(
182
+ cloned.dfs(node => (node ? node.key : null), 'pre', cloned.getNode(6), IterationType.RECURSIVE, true)
183
+ ).toEqual([6, 3, 7, null]);
184
+ cloned.delete(6);
185
+ cloned.delete(3);
186
+ cloned.delete(7);
187
+ cloned.delete(1);
188
+ cloned.delete(5);
189
+ cloned.delete(4);
190
+ cloned.delete(2);
191
+ // cloned.delete(null);
192
+ // cloned.delete(null);
193
+ // cloned.delete(null);
194
+ expect(tree.size).toBe(10);
195
+ expect(cloned.size).toBe(3);
196
+ // expect(cloned.size).toBe(0);
197
+ // expect(cloned.isEmpty()).toBe(true);
198
+ });
199
+
155
200
  it('should be a balance tree after malicious manipulation', () => {
156
201
  tree.add(3);
157
202
  tree.add(12);
@@ -238,22 +283,6 @@ describe('BinaryTree', () => {
238
283
  expect(tree.getNodes(tree.getNodeByKey(2), undefined, false, tree.root)).toEqual([tree.getNodeByKey(2)]);
239
284
  });
240
285
 
241
- // it('should subTreeTraverse', () => {
242
- // tree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
243
- // expect(tree.subTreeTraverse(node => node.key, tree.getNode(6), IterationType.ITERATIVE)).toEqual([6, 3, 7]);
244
- // expect(tree.subTreeTraverse(node => node.key, tree.getNode(6), IterationType.ITERATIVE, false)).toEqual([6, 3, 7]);
245
- // expect(tree.subTreeTraverse(node => node.key, tree.getNode(6), IterationType.RECURSIVE)).toEqual([6, 3, 7]);
246
- // expect(
247
- // tree.subTreeTraverse(node => (node ? node.key : null), tree.getNode(6), IterationType.ITERATIVE, true)
248
- // ).toEqual([6, 3, 7, null]);
249
- // expect(
250
- // tree.subTreeTraverse(node => (node ? node.key : node), tree.getNode(6), IterationType.ITERATIVE, true)
251
- // ).toEqual([6, 3, 7, null]);
252
- // expect(
253
- // tree.subTreeTraverse(node => (node ? node.key : null), tree.getNode(6), IterationType.RECURSIVE, true)
254
- // ).toEqual([6, 3, 7, null]);
255
- // });
256
-
257
286
  it('should sub tree traverse', () => {
258
287
  tree.addMany([4, 2, 6, null, 1, 3, null, 5, null, 7]);
259
288
  expect(tree.dfs(node => node.key, 'pre', tree.getNode(6), IterationType.ITERATIVE)).toEqual([6, 3, 7]);
@@ -613,7 +642,7 @@ describe('BinaryTree', () => {
613
642
  tree.delete(5);
614
643
  tree.delete(7);
615
644
  tree.delete(3);
616
- expect(tree.root).toBe(null);
645
+ expect(tree.root).toBe(undefined);
617
646
  expect(tree.getHeight()).toBe(-1);
618
647
  });
619
648
  });
@@ -795,6 +795,70 @@ describe('BST operations test recursively', () => {
795
795
  expect(bfsNodes[1].key).toBe(12);
796
796
  expect(bfsNodes[2].key).toBe(16);
797
797
  });
798
+
799
+ it('should delete', () => {
800
+ const numBST = new BST<number>();
801
+ numBST.addMany([2, 4, 5, 3, 1]);
802
+ expect(numBST.size).toBe(5);
803
+ numBST.delete(1);
804
+ expect(numBST.size).toBe(4);
805
+
806
+ numBST.delete(2);
807
+ numBST.delete(3);
808
+ numBST.delete(4);
809
+ numBST.delete(5);
810
+ expect(numBST.size).toBe(0);
811
+ numBST.delete(5);
812
+ expect(numBST.size).toBe(0);
813
+ });
814
+
815
+ it('should the clone method', () => {
816
+ function checkTreeStructure(bst: BST<string, number>) {
817
+ expect(bst.size).toBe(4);
818
+ expect(bst.root?.key).toBe('2');
819
+ expect(bst.root?.left?.key).toBe('1');
820
+ expect(bst.root?.left?.left?.key).toBe(undefined);
821
+ expect(bst.root?.left?.right?.key).toBe(undefined);
822
+ expect(bst.root?.right?.key).toBe('4');
823
+ expect(bst.root?.right?.left?.key).toBe(undefined);
824
+ expect(bst.root?.right?.right?.key).toBe('5');
825
+ }
826
+
827
+ const bst = new BST<string, number>();
828
+ bst.addMany([
829
+ ['2', 2],
830
+ ['4', 4],
831
+ ['5', 5],
832
+ ['3', 3],
833
+ ['1', 1]
834
+ ]);
835
+ expect(bst.size).toBe(5);
836
+ expect(bst.root?.key).toBe('3');
837
+ expect(bst.root?.left?.key).toBe('1');
838
+ expect(bst.root?.left?.left?.key).toBe(undefined);
839
+ expect(bst.root?.left?.right?.key).toBe('2');
840
+ expect(bst.root?.right?.key).toBe('4');
841
+ expect(bst.root?.right?.left?.key).toBe(undefined);
842
+ expect(bst.root?.right?.right?.key).toBe('5');
843
+ bst.delete('3');
844
+ checkTreeStructure(bst);
845
+ const cloned = bst.clone();
846
+ checkTreeStructure(cloned);
847
+ bst.delete('2');
848
+ bst.delete('1');
849
+ bst.delete('4');
850
+ bst.delete('5');
851
+ expect(bst.size).toBe(0);
852
+
853
+ cloned.delete('1');
854
+ expect(bst.size).toBe(0);
855
+ expect(cloned.size).toBe(3);
856
+ cloned.delete('2');
857
+ cloned.delete('3');
858
+ cloned.delete('4');
859
+ cloned.delete('5');
860
+ expect(cloned.size).toBe(0);
861
+ });
798
862
  });
799
863
 
800
864
  describe('BST isBST', function () {
@@ -865,7 +929,7 @@ describe('BST Performance test', function () {
865
929
  // expect(bst.lastKey()).toBe(9);
866
930
  });
867
931
 
868
- it('should subTreeTraverse, null should be ignored', () => {
932
+ it('should dfs as sub tree traversal, null should be ignored', () => {
869
933
  const bst = new BST();
870
934
  bst.addMany([4, 2, 6, 1, 3, 5, 7]);
871
935
  expect(bst.dfs(node => node.key, 'pre', bst.getNode(6), IterationType.ITERATIVE)).toEqual([6, 5, 7]);
@@ -138,9 +138,46 @@ describe('RedBlackTree', () => {
138
138
  expect(predecessorNode).toBe(tree.getNode(10));
139
139
  });
140
140
  });
141
+
142
+ it('should the clone method', () => {
143
+ function checkTreeStructure(rbTree: RedBlackTree<string, number>) {
144
+ expect(rbTree.size).toBe(4);
145
+ expect(rbTree.root?.key).toBe('2');
146
+ expect(rbTree.root?.left?.key).toBe('1');
147
+ expect(rbTree.root?.left?.left?.key).toBe(NaN);
148
+ expect(rbTree.root?.left?.right?.key).toBe(NaN);
149
+ expect(rbTree.root?.right?.key).toBe('4');
150
+ expect(rbTree.root?.right?.left?.key).toBe(NaN);
151
+ expect(rbTree.root?.right?.right?.key).toBe('5');
152
+ }
153
+
154
+ const rbTree = new RedBlackTree<string, number>();
155
+ rbTree.addMany([
156
+ ['2', 2],
157
+ ['4', 4],
158
+ ['5', 5],
159
+ ['3', 3],
160
+ ['1', 1]
161
+ ]);
162
+ expect(rbTree.size).toBe(5);
163
+ expect(rbTree.root?.key).toBe('2');
164
+ expect(rbTree.root?.left?.key).toBe('1');
165
+ expect(rbTree.root?.left?.left?.key).toBe(NaN);
166
+ expect(rbTree.root?.left?.right?.key).toBe(NaN);
167
+ expect(rbTree.root?.right?.key).toBe('4');
168
+ expect(rbTree.root?.right?.left?.key).toBe('3');
169
+ expect(rbTree.root?.right?.right?.key).toBe('5');
170
+ rbTree.delete('3');
171
+ checkTreeStructure(rbTree);
172
+ const cloned = rbTree.clone();
173
+ checkTreeStructure(cloned);
174
+ cloned.delete('1');
175
+ expect(rbTree.size).toBe(4);
176
+ expect(cloned.size).toBe(3);
177
+ });
141
178
  });
142
179
 
143
- describe('RedBlackTree', () => {
180
+ describe('RedBlackTree 2', () => {
144
181
  let tree: RedBlackTree<number>;
145
182
 
146
183
  beforeEach(() => {