data-structure-typed 1.41.0 → 1.41.1

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 (76) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  3. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js.map +1 -1
  4. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +6 -3
  5. package/dist/cjs/data-structures/binary-tree/binary-tree.js +30 -8
  6. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  7. package/dist/cjs/data-structures/binary-tree/bst.d.ts +1 -1
  8. package/dist/cjs/data-structures/binary-tree/bst.js +2 -2
  9. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  10. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +5 -4
  11. package/dist/cjs/data-structures/binary-tree/rb-tree.js +42 -44
  12. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  13. package/dist/cjs/data-structures/binary-tree/tree-multiset.js +2 -2
  14. package/dist/cjs/data-structures/binary-tree/tree-multiset.js.map +1 -1
  15. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  16. package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
  17. package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
  18. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  19. package/dist/cjs/data-structures/hash/tree-map.js.map +1 -1
  20. package/dist/cjs/data-structures/hash/tree-set.js.map +1 -1
  21. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  22. package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
  23. package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
  24. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  25. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  26. package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
  27. package/dist/cjs/data-structures/matrix/vector2d.js.map +1 -1
  28. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  29. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  30. package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
  31. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  32. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  33. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +6 -3
  34. package/dist/mjs/data-structures/binary-tree/binary-tree.js +29 -8
  35. package/dist/mjs/data-structures/binary-tree/bst.d.ts +1 -1
  36. package/dist/mjs/data-structures/binary-tree/bst.js +2 -2
  37. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +5 -4
  38. package/dist/mjs/data-structures/binary-tree/rb-tree.js +43 -45
  39. package/dist/mjs/data-structures/binary-tree/tree-multiset.js +2 -2
  40. package/dist/umd/data-structure-typed.min.js +1 -1
  41. package/dist/umd/data-structure-typed.min.js.map +1 -1
  42. package/package.json +9 -9
  43. package/src/data-structures/binary-tree/avl-tree.ts +3 -2
  44. package/src/data-structures/binary-tree/binary-indexed-tree.ts +1 -1
  45. package/src/data-structures/binary-tree/binary-tree.ts +65 -17
  46. package/src/data-structures/binary-tree/bst.ts +7 -4
  47. package/src/data-structures/binary-tree/rb-tree.ts +47 -68
  48. package/src/data-structures/binary-tree/tree-multiset.ts +4 -3
  49. package/src/data-structures/graph/abstract-graph.ts +11 -12
  50. package/src/data-structures/graph/directed-graph.ts +7 -6
  51. package/src/data-structures/graph/undirected-graph.ts +7 -6
  52. package/src/data-structures/hash/hash-map.ts +1 -1
  53. package/src/data-structures/hash/tree-map.ts +1 -2
  54. package/src/data-structures/hash/tree-set.ts +1 -2
  55. package/src/data-structures/heap/heap.ts +2 -2
  56. package/src/data-structures/heap/max-heap.ts +1 -1
  57. package/src/data-structures/heap/min-heap.ts +1 -1
  58. package/src/data-structures/linked-list/doubly-linked-list.ts +1 -1
  59. package/src/data-structures/linked-list/singly-linked-list.ts +1 -1
  60. package/src/data-structures/matrix/matrix.ts +1 -1
  61. package/src/data-structures/matrix/vector2d.ts +1 -2
  62. package/src/data-structures/priority-queue/max-priority-queue.ts +1 -1
  63. package/src/data-structures/priority-queue/min-priority-queue.ts +1 -1
  64. package/src/data-structures/priority-queue/priority-queue.ts +1 -1
  65. package/src/data-structures/queue/deque.ts +3 -4
  66. package/src/data-structures/queue/queue.ts +1 -1
  67. package/src/types/data-structures/matrix/navigator.ts +1 -1
  68. package/src/types/utils/utils.ts +1 -1
  69. package/src/types/utils/validate-type.ts +2 -2
  70. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +6 -6
  71. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +11 -11
  72. package/test/unit/data-structures/binary-tree/bst.test.ts +22 -20
  73. package/test/unit/data-structures/binary-tree/overall.test.ts +2 -2
  74. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +53 -17
  75. package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +8 -8
  76. package/test/utils/big-o.js +10 -0
@@ -1,5 +1,5 @@
1
- import { RedBlackTree, RBTreeNode } from '../../../../src';
2
- import {getRandomInt} from "../../../utils";
1
+ import {RBTreeNode, RedBlackTree, SN} from '../../../../src';
2
+ import {getRandomInt} from '../../../utils';
3
3
 
4
4
  describe('RedBlackTree', () => {
5
5
  let tree: RedBlackTree;
@@ -17,7 +17,7 @@ describe('RedBlackTree', () => {
17
17
  expect(tree.getNode(10)).toBeInstanceOf(RBTreeNode);
18
18
  expect(tree.getNode(20)).toBeInstanceOf(RBTreeNode);
19
19
  expect(tree.getNode(5)).toBeInstanceOf(RBTreeNode);
20
- expect(tree.getNode(15)).toBe(tree.NIL);
20
+ expect(tree.getNode(15)).toBe(null);
21
21
  });
22
22
 
23
23
  test('should insert and find nodes with negative keys', () => {
@@ -36,7 +36,7 @@ describe('RedBlackTree', () => {
36
36
  tree.insert(5);
37
37
  tree.delete(20);
38
38
 
39
- expect(tree.getNode(20)).toBe(tree.NIL);
39
+ expect(tree.getNode(20)).toBe(null);
40
40
  });
41
41
 
42
42
  test('should handle deleting a non-existent node', () => {
@@ -45,7 +45,7 @@ describe('RedBlackTree', () => {
45
45
  tree.insert(5);
46
46
  tree.delete(15);
47
47
 
48
- expect(tree.getNode(15)).toBe(tree.NIL);
48
+ expect(tree.getNode(15)).toBe(null);
49
49
  });
50
50
  });
51
51
 
@@ -63,7 +63,7 @@ describe('RedBlackTree', () => {
63
63
 
64
64
  test('should handle an empty tree', () => {
65
65
  const minNode = tree.getLeftMost(tree.root);
66
- expect(minNode).toBe(tree.NIL);
66
+ expect(minNode).toBe(SN);
67
67
  });
68
68
  });
69
69
 
@@ -81,7 +81,7 @@ describe('RedBlackTree', () => {
81
81
 
82
82
  test('should handle an empty tree', () => {
83
83
  const maxNode = tree.getRightMost(tree.root);
84
- expect(maxNode).toBe(tree.NIL);
84
+ expect(maxNode).toBe(SN);
85
85
  });
86
86
  });
87
87
 
@@ -105,7 +105,7 @@ describe('RedBlackTree', () => {
105
105
 
106
106
  const node = tree.getNode(10);
107
107
  const successorNode = tree.getSuccessor(node);
108
- // TODO not sure if it should be null or tree.NIL
108
+ // TODO not sure if it should be null or SN
109
109
  expect(successorNode).toBe(null);
110
110
  });
111
111
  });
@@ -130,13 +130,12 @@ describe('RedBlackTree', () => {
130
130
 
131
131
  const node = tree.getNode(20);
132
132
  const predecessorNode = tree.getPredecessor(node);
133
- // TODO not sure if it should be tree.NIL or something else.
133
+ // TODO not sure if it should be SN or something else.
134
134
  expect(predecessorNode).toBe(tree.getNode(10));
135
135
  });
136
136
  });
137
137
  });
138
138
 
139
-
140
139
  describe('RedBlackTree', () => {
141
140
  let tree: RedBlackTree;
142
141
 
@@ -158,7 +157,7 @@ describe('RedBlackTree', () => {
158
157
  tree.insert(20);
159
158
  tree.insert(5);
160
159
  tree.delete(20);
161
- expect(tree.getNode(20)).toBe(tree.NIL);
160
+ expect(tree.getNode(20)).toBe(null);
162
161
  });
163
162
 
164
163
  it('should get the successor of a node', () => {
@@ -210,14 +209,15 @@ describe('RedBlackTree', () => {
210
209
  });
211
210
 
212
211
  it('should fix the tree after insertion', () => {
213
- for (let i = 0; i < 1000; i++) {
214
- tree.insert(getRandomInt(-100, 1000));
215
- tree.delete(getRandomInt(-100, 1000));
216
- }
217
212
  tree.insert(1);
218
213
  tree.insert(2);
219
214
  tree.insert(5);
220
215
  tree.insert(15);
216
+ const node15F = tree.getNode(15);
217
+ expect(node15F.left).toBe(SN);
218
+ expect(node15F.right).toBe(SN);
219
+ expect(node15F.parent).toBe(tree.getNode(5));
220
+
221
221
  tree.insert(25);
222
222
  tree.insert(10);
223
223
  tree.insert(8);
@@ -229,14 +229,50 @@ describe('RedBlackTree', () => {
229
229
  tree.insert(50);
230
230
  tree.insert(155);
231
231
  tree.insert(225);
232
+ const node225F = tree.getNode(225);
233
+ expect(node225F.left).toBe(SN);
234
+ expect(node225F.right).toBe(SN);
235
+ expect(node225F.parent.key).toBe(155);
232
236
  tree.insert(7);
237
+
238
+ const node15S = tree.getNode(15);
239
+ expect(node15S.left.key).toBe(8);
240
+ expect(node15S.right.key).toBe(28);
241
+ expect(node15S).toBe(tree.root);
242
+ expect(node15S.parent).toBe(null);
233
243
  tree.delete(15);
244
+ expect(tree.root.key).toBe(22);
245
+ expect(tree.root.parent).toBe(null);
246
+
247
+ const node15T = tree.getNode(15);
248
+ expect(node15T).toBe(null);
249
+
234
250
  tree.insert(23);
235
251
  tree.insert(33);
236
252
  tree.insert(15);
237
253
 
254
+ const nodeLM = tree.getLeftMost();
255
+ expect(nodeLM.key).toBe(1);
256
+
257
+ const node50 = tree.getNode(50);
258
+ expect(node50.key).toBe(50);
259
+ expect(node50.left.key).toBe(33);
260
+ expect(node50.right).toBe(SN);
261
+ const node15Fo = tree.getNode(15);
262
+
263
+ expect(node15Fo.key).toBe(15);
264
+ expect(node15Fo.left).toBe(SN);
265
+ const node225S = tree.getNode(225);
266
+ expect(node225S.left).toBe(SN);
267
+ expect(node225S.right).toBe(SN);
268
+ expect(node225S.parent.key).toBe(155);
269
+ expect(tree.getNode(0)).toBe(null);
270
+ });
238
271
 
239
- // Verify that the tree is still a valid Red-Black Tree
240
- // You can add assertions to check the Red-Black Tree properties
272
+ it('should fix the tree after insertion and deletion', () => {
273
+ for (let i = 0; i < 1000; i++) {
274
+ tree.insert(getRandomInt(-100, 1000));
275
+ tree.delete(getRandomInt(-100, 1000));
276
+ }
241
277
  });
242
278
  });
@@ -23,10 +23,10 @@ describe('TreeMultiset operations test', () => {
23
23
 
24
24
  expect(treeMultiset.getHeight(6)).toBe(3);
25
25
  expect(treeMultiset.getDepth(6)).toBe(1);
26
- const nodeId10 = treeMultiset.get(10);
26
+ const nodeId10 = treeMultiset.getNode(10);
27
27
  expect(nodeId10?.key).toBe(10);
28
28
 
29
- const nodeVal9 = treeMultiset.get(9, node => node.value);
29
+ const nodeVal9 = treeMultiset.getNode(9, node => node.value);
30
30
  expect(nodeVal9?.key).toBe(9);
31
31
 
32
32
  const nodesByCount1 = treeMultiset.getNodes(1, node => node.count);
@@ -37,7 +37,7 @@ describe('TreeMultiset operations test', () => {
37
37
  const leftMost = treeMultiset.getLeftMost();
38
38
  expect(leftMost?.key).toBe(1);
39
39
 
40
- const node15 = treeMultiset.get(15);
40
+ const node15 = treeMultiset.getNode(15);
41
41
  const minNodeBySpecificNode = node15 && treeMultiset.getLeftMost(node15);
42
42
  expect(minNodeBySpecificNode?.key).toBe(12);
43
43
 
@@ -53,7 +53,7 @@ describe('TreeMultiset operations test', () => {
53
53
  const subTreeAdd = treeMultiset.subTreeTraverse((node: TreeMultisetNode<number>) => (node.count += 1), 15);
54
54
  expect(subTreeAdd);
55
55
  }
56
- const node11 = treeMultiset.get(11);
56
+ const node11 = treeMultiset.getNode(11);
57
57
  expect(node11 instanceof TreeMultisetNode);
58
58
  if (node11 instanceof TreeMultisetNode) {
59
59
  const allGreaterNodesAdded = treeMultiset.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
@@ -263,10 +263,10 @@ describe('TreeMultiset operations test recursively', () => {
263
263
 
264
264
  expect(treeMultiset.getHeight(6)).toBe(3);
265
265
  expect(treeMultiset.getDepth(6)).toBe(1);
266
- const nodeId10 = treeMultiset.get(10);
266
+ const nodeId10 = treeMultiset.getNode(10);
267
267
  expect(nodeId10?.key).toBe(10);
268
268
 
269
- const nodeVal9 = treeMultiset.get(9, node => node.value);
269
+ const nodeVal9 = treeMultiset.getNode(9, node => node.value);
270
270
  expect(nodeVal9?.key).toBe(9);
271
271
 
272
272
  const nodesByCount1 = treeMultiset.getNodes(1, node => node.count);
@@ -277,7 +277,7 @@ describe('TreeMultiset operations test recursively', () => {
277
277
  const leftMost = treeMultiset.getLeftMost();
278
278
  expect(leftMost?.key).toBe(1);
279
279
 
280
- const node15 = treeMultiset.get(15);
280
+ const node15 = treeMultiset.getNode(15);
281
281
  const minNodeBySpecificNode = node15 && treeMultiset.getLeftMost(node15);
282
282
  expect(minNodeBySpecificNode?.key).toBe(12);
283
283
 
@@ -293,7 +293,7 @@ describe('TreeMultiset operations test recursively', () => {
293
293
  const subTreeAdd = treeMultiset.subTreeTraverse((node: TreeMultisetNode<number>) => (node.count += 1), 15);
294
294
  expect(subTreeAdd);
295
295
  }
296
- const node11 = treeMultiset.get(11);
296
+ const node11 = treeMultiset.getNode(11);
297
297
  expect(node11 instanceof TreeMultisetNode);
298
298
  if (node11 instanceof TreeMultisetNode) {
299
299
  const allGreaterNodesAdded = treeMultiset.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
@@ -23,9 +23,11 @@ exports.bigO = {
23
23
  CUBED: Math.pow(exports.magnitude.SQUARED, 3) / 1000,
24
24
  FACTORIAL: 10000
25
25
  };
26
+
26
27
  function findPotentialN(input) {
27
28
  var longestArray = [];
28
29
  var mostProperties = {};
30
+
29
31
  function recurse(obj) {
30
32
  if (Array.isArray(obj)) {
31
33
  if (obj.length > longestArray.length) {
@@ -41,6 +43,7 @@ function findPotentialN(input) {
41
43
  });
42
44
  }
43
45
  }
46
+
44
47
  if (Array.isArray(input)) {
45
48
  input.forEach(function (item) {
46
49
  recurse(item);
@@ -51,6 +54,7 @@ function findPotentialN(input) {
51
54
  // return [longestArray, mostProperties] : [any[], { [key: string]: any }];
52
55
  return Math.max(longestArray.length, Object.keys(mostProperties).length);
53
56
  }
57
+
54
58
  function linearRegression(x, y) {
55
59
  var n = x.length;
56
60
  var sumX = x.reduce(function (acc, val) {
@@ -87,6 +91,7 @@ function linearRegression(x, y) {
87
91
  var rSquared = 1 - totalVariation / explainedVariation;
88
92
  return {slope: slope, intercept: intercept, rSquared: rSquared};
89
93
  }
94
+
90
95
  function estimateBigO(runtimes, dataSizes) {
91
96
  // Make sure the input runtimes and data sizes have the same length
92
97
  if (runtimes.length !== dataSizes.length) {
@@ -137,7 +142,9 @@ function estimateBigO(runtimes, dataSizes) {
137
142
  return complexities.join(' or ');
138
143
  }
139
144
  }
145
+
140
146
  var methodLogs = new Map();
147
+
141
148
  function logBigOMetricsWrap(fn, args, fnName) {
142
149
  var startTime = performance.now();
143
150
  var result = fn(args);
@@ -169,7 +176,9 @@ function logBigOMetricsWrap(fn, args, fnName) {
169
176
  }
170
177
  return result;
171
178
  }
179
+
172
180
  exports.logBigOMetricsWrap = logBigOMetricsWrap;
181
+
173
182
  function logBigOMetrics(target, propertyKey, descriptor) {
174
183
  var originalMethod = descriptor.value;
175
184
  descriptor.value = function () {
@@ -209,4 +218,5 @@ function logBigOMetrics(target, propertyKey, descriptor) {
209
218
  };
210
219
  return descriptor;
211
220
  }
221
+
212
222
  exports.logBigOMetrics = logBigOMetrics;