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.
- package/CHANGELOG.md +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +6 -3
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +30 -8
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.js +2 -2
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +5 -4
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +42 -44
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multiset.js +2 -2
- package/dist/cjs/data-structures/binary-tree/tree-multiset.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/hash/tree-map.js.map +1 -1
- package/dist/cjs/data-structures/hash/tree-set.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
- package/dist/cjs/data-structures/matrix/vector2d.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +6 -3
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +29 -8
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +1 -1
- package/dist/mjs/data-structures/binary-tree/bst.js +2 -2
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +5 -4
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +43 -45
- package/dist/mjs/data-structures/binary-tree/tree-multiset.js +2 -2
- package/dist/umd/data-structure-typed.min.js +1 -1
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +9 -9
- package/src/data-structures/binary-tree/avl-tree.ts +3 -2
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +1 -1
- package/src/data-structures/binary-tree/binary-tree.ts +65 -17
- package/src/data-structures/binary-tree/bst.ts +7 -4
- package/src/data-structures/binary-tree/rb-tree.ts +47 -68
- package/src/data-structures/binary-tree/tree-multiset.ts +4 -3
- package/src/data-structures/graph/abstract-graph.ts +11 -12
- package/src/data-structures/graph/directed-graph.ts +7 -6
- package/src/data-structures/graph/undirected-graph.ts +7 -6
- package/src/data-structures/hash/hash-map.ts +1 -1
- package/src/data-structures/hash/tree-map.ts +1 -2
- package/src/data-structures/hash/tree-set.ts +1 -2
- package/src/data-structures/heap/heap.ts +2 -2
- package/src/data-structures/heap/max-heap.ts +1 -1
- package/src/data-structures/heap/min-heap.ts +1 -1
- package/src/data-structures/linked-list/doubly-linked-list.ts +1 -1
- package/src/data-structures/linked-list/singly-linked-list.ts +1 -1
- package/src/data-structures/matrix/matrix.ts +1 -1
- package/src/data-structures/matrix/vector2d.ts +1 -2
- package/src/data-structures/priority-queue/max-priority-queue.ts +1 -1
- package/src/data-structures/priority-queue/min-priority-queue.ts +1 -1
- package/src/data-structures/priority-queue/priority-queue.ts +1 -1
- package/src/data-structures/queue/deque.ts +3 -4
- package/src/data-structures/queue/queue.ts +1 -1
- package/src/types/data-structures/matrix/navigator.ts +1 -1
- package/src/types/utils/utils.ts +1 -1
- package/src/types/utils/validate-type.ts +2 -2
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +6 -6
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +11 -11
- package/test/unit/data-structures/binary-tree/bst.test.ts +22 -20
- package/test/unit/data-structures/binary-tree/overall.test.ts +2 -2
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +53 -17
- package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +8 -8
- package/test/utils/big-o.js +10 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { RedBlackTree,
|
|
2
|
-
import {getRandomInt} from
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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
|
-
|
|
240
|
-
|
|
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.
|
|
26
|
+
const nodeId10 = treeMultiset.getNode(10);
|
|
27
27
|
expect(nodeId10?.key).toBe(10);
|
|
28
28
|
|
|
29
|
-
const nodeVal9 = treeMultiset.
|
|
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.
|
|
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.
|
|
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.
|
|
266
|
+
const nodeId10 = treeMultiset.getNode(10);
|
|
267
267
|
expect(nodeId10?.key).toBe(10);
|
|
268
268
|
|
|
269
|
-
const nodeVal9 = treeMultiset.
|
|
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.
|
|
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.
|
|
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);
|
package/test/utils/big-o.js
CHANGED
|
@@ -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;
|