data-structure-typed 1.40.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 +2 -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 +14 -3
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +52 -10
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +2 -2
- package/dist/cjs/data-structures/binary-tree/bst.js +3 -3
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +96 -9
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +377 -12
- 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/cjs/types/data-structures/binary-tree/rb-tree.d.ts +3 -7
- package/dist/cjs/types/data-structures/binary-tree/rb-tree.js +11 -6
- package/dist/cjs/types/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +14 -3
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +51 -10
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +2 -2
- package/dist/mjs/data-structures/binary-tree/bst.js +3 -3
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +96 -9
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +382 -13
- package/dist/mjs/data-structures/binary-tree/tree-multiset.js +2 -2
- package/dist/mjs/types/data-structures/binary-tree/rb-tree.d.ts +3 -7
- package/dist/mjs/types/data-structures/binary-tree/rb-tree.js +11 -6
- 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 +87 -17
- package/src/data-structures/binary-tree/bst.ts +10 -7
- package/src/data-structures/binary-tree/rb-tree.ts +396 -349
- 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/binary-tree/rb-tree.ts +6 -6
- 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 +248 -79
- package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +8 -8
- package/test/utils/big-o.js +10 -0
|
@@ -1,109 +1,278 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {RBTreeNode, RedBlackTree, SN} from '../../../../src';
|
|
2
|
+
import {getRandomInt} from '../../../utils';
|
|
2
3
|
|
|
3
|
-
describe('
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
describe('RedBlackTree', () => {
|
|
5
|
+
let tree: RedBlackTree;
|
|
6
|
+
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
tree = new RedBlackTree();
|
|
7
9
|
});
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
describe('insert and getNode', () => {
|
|
12
|
+
test('should insert and find a node in the tree', () => {
|
|
13
|
+
tree.insert(10);
|
|
14
|
+
tree.insert(20);
|
|
15
|
+
tree.insert(5);
|
|
16
|
+
|
|
17
|
+
expect(tree.getNode(10)).toBeInstanceOf(RBTreeNode);
|
|
18
|
+
expect(tree.getNode(20)).toBeInstanceOf(RBTreeNode);
|
|
19
|
+
expect(tree.getNode(5)).toBeInstanceOf(RBTreeNode);
|
|
20
|
+
expect(tree.getNode(15)).toBe(null);
|
|
21
|
+
});
|
|
12
22
|
|
|
13
|
-
|
|
14
|
-
|
|
23
|
+
test('should insert and find nodes with negative keys', () => {
|
|
24
|
+
tree.insert(-10);
|
|
25
|
+
tree.insert(-20);
|
|
26
|
+
|
|
27
|
+
expect(tree.getNode(-10)).toBeInstanceOf(RBTreeNode);
|
|
28
|
+
expect(tree.getNode(-20)).toBeInstanceOf(RBTreeNode);
|
|
29
|
+
});
|
|
15
30
|
});
|
|
16
31
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
32
|
+
describe('deleteNode', () => {
|
|
33
|
+
test('should delete a node from the tree', () => {
|
|
34
|
+
tree.insert(10);
|
|
35
|
+
tree.insert(20);
|
|
36
|
+
tree.insert(5);
|
|
37
|
+
tree.delete(20);
|
|
38
|
+
|
|
39
|
+
expect(tree.getNode(20)).toBe(null);
|
|
40
|
+
});
|
|
20
41
|
|
|
21
|
-
node
|
|
22
|
-
|
|
42
|
+
test('should handle deleting a non-existent node', () => {
|
|
43
|
+
tree.insert(10);
|
|
44
|
+
tree.insert(20);
|
|
45
|
+
tree.insert(5);
|
|
46
|
+
tree.delete(15);
|
|
47
|
+
|
|
48
|
+
expect(tree.getNode(15)).toBe(null);
|
|
49
|
+
});
|
|
23
50
|
});
|
|
24
51
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
52
|
+
describe('minimum', () => {
|
|
53
|
+
test('should find the minimum node in the tree', () => {
|
|
54
|
+
tree.insert(10);
|
|
55
|
+
tree.insert(20);
|
|
56
|
+
tree.insert(5);
|
|
57
|
+
tree.insert(15);
|
|
58
|
+
tree.insert(3);
|
|
28
59
|
|
|
29
|
-
|
|
60
|
+
const minNode = tree.getLeftMost(tree.root);
|
|
61
|
+
expect(minNode.key).toBe(3);
|
|
62
|
+
});
|
|
30
63
|
|
|
31
|
-
|
|
32
|
-
|
|
64
|
+
test('should handle an empty tree', () => {
|
|
65
|
+
const minNode = tree.getLeftMost(tree.root);
|
|
66
|
+
expect(minNode).toBe(SN);
|
|
67
|
+
});
|
|
33
68
|
});
|
|
34
69
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
70
|
+
describe('getRightMost', () => {
|
|
71
|
+
test('should find the getRightMost node in the tree', () => {
|
|
72
|
+
tree.insert(10);
|
|
73
|
+
tree.insert(20);
|
|
74
|
+
tree.insert(5);
|
|
75
|
+
tree.insert(15);
|
|
76
|
+
tree.insert(25);
|
|
38
77
|
|
|
39
|
-
|
|
78
|
+
const maxNode = tree.getRightMost(tree.root);
|
|
79
|
+
expect(maxNode.key).toBe(25);
|
|
80
|
+
});
|
|
40
81
|
|
|
41
|
-
|
|
42
|
-
|
|
82
|
+
test('should handle an empty tree', () => {
|
|
83
|
+
const maxNode = tree.getRightMost(tree.root);
|
|
84
|
+
expect(maxNode).toBe(SN);
|
|
85
|
+
});
|
|
43
86
|
});
|
|
44
87
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
88
|
+
describe('getSuccessor', () => {
|
|
89
|
+
test('should find the getSuccessor of a node', () => {
|
|
90
|
+
tree.insert(10);
|
|
91
|
+
tree.insert(20);
|
|
92
|
+
tree.insert(5);
|
|
93
|
+
tree.insert(15);
|
|
94
|
+
tree.insert(25);
|
|
95
|
+
|
|
96
|
+
const node = tree.getNode(15);
|
|
97
|
+
const successorNode = tree.getSuccessor(node);
|
|
48
98
|
|
|
49
|
-
|
|
99
|
+
expect(successorNode.key).toBe(20);
|
|
100
|
+
});
|
|
50
101
|
|
|
51
|
-
|
|
52
|
-
|
|
102
|
+
test('should handle a node with no getSuccessor', () => {
|
|
103
|
+
tree.insert(10);
|
|
104
|
+
tree.insert(5);
|
|
105
|
+
|
|
106
|
+
const node = tree.getNode(10);
|
|
107
|
+
const successorNode = tree.getSuccessor(node);
|
|
108
|
+
// TODO not sure if it should be null or SN
|
|
109
|
+
expect(successorNode).toBe(null);
|
|
110
|
+
});
|
|
53
111
|
});
|
|
54
112
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
113
|
+
describe('getPredecessor', () => {
|
|
114
|
+
test('should find the getPredecessor of a node', () => {
|
|
115
|
+
tree.insert(10);
|
|
116
|
+
tree.insert(20);
|
|
117
|
+
tree.insert(5);
|
|
118
|
+
tree.insert(15);
|
|
119
|
+
tree.insert(25);
|
|
120
|
+
|
|
121
|
+
const node = tree.getNode(20);
|
|
122
|
+
const predecessorNode = tree.getPredecessor(node);
|
|
59
123
|
|
|
60
|
-
|
|
61
|
-
|
|
124
|
+
expect(predecessorNode.key).toBe(15);
|
|
125
|
+
});
|
|
62
126
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
127
|
+
test('should handle a node with no getPredecessor', () => {
|
|
128
|
+
tree.insert(10);
|
|
129
|
+
tree.insert(20);
|
|
130
|
+
|
|
131
|
+
const node = tree.getNode(20);
|
|
132
|
+
const predecessorNode = tree.getPredecessor(node);
|
|
133
|
+
// TODO not sure if it should be SN or something else.
|
|
134
|
+
expect(predecessorNode).toBe(tree.getNode(10));
|
|
135
|
+
});
|
|
66
136
|
});
|
|
67
137
|
});
|
|
68
138
|
|
|
69
|
-
describe('
|
|
70
|
-
let tree:
|
|
139
|
+
describe('RedBlackTree', () => {
|
|
140
|
+
let tree: RedBlackTree;
|
|
71
141
|
|
|
72
142
|
beforeEach(() => {
|
|
73
|
-
tree = new
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
tree.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
143
|
+
tree = new RedBlackTree();
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('should insert nodes into the tree', () => {
|
|
147
|
+
tree.insert(10);
|
|
148
|
+
expect(tree.getNode(10)).toBeDefined();
|
|
149
|
+
tree.insert(20);
|
|
150
|
+
expect(tree.getNode(20)).toBeDefined();
|
|
151
|
+
tree.insert(5);
|
|
152
|
+
expect(tree.getNode(5)).toBeDefined();
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('should delete nodes from the tree', () => {
|
|
156
|
+
tree.insert(10);
|
|
157
|
+
tree.insert(20);
|
|
158
|
+
tree.insert(5);
|
|
159
|
+
tree.delete(20);
|
|
160
|
+
expect(tree.getNode(20)).toBe(null);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('should get the successor of a node', () => {
|
|
164
|
+
tree.insert(10);
|
|
165
|
+
tree.insert(20);
|
|
166
|
+
const node = tree.getNode(10);
|
|
167
|
+
const successor = tree.getSuccessor(node);
|
|
168
|
+
expect(successor?.key).toBe(20);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('should get the predecessor of a node', () => {
|
|
172
|
+
tree.insert(10);
|
|
173
|
+
tree.insert(20);
|
|
174
|
+
const node = tree.getNode(20);
|
|
175
|
+
const predecessor = tree.getPredecessor(node);
|
|
176
|
+
expect(predecessor?.key).toBe(10);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('should rotate nodes to the left', () => {
|
|
180
|
+
tree.insert(10);
|
|
181
|
+
tree.insert(20);
|
|
182
|
+
tree.insert(5);
|
|
183
|
+
const node = tree.getNode(10);
|
|
184
|
+
tree.insert(15);
|
|
185
|
+
// Verify that rotation has occurred
|
|
186
|
+
expect(node.left.key).toBe(5);
|
|
187
|
+
expect(node.right.key).toBe(20);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('should rotate nodes to the right', () => {
|
|
191
|
+
tree.insert(10);
|
|
192
|
+
tree.insert(20);
|
|
193
|
+
tree.insert(5);
|
|
194
|
+
const node = tree.getNode(20);
|
|
195
|
+
tree.insert(25);
|
|
196
|
+
// Verify that rotation has occurred
|
|
197
|
+
expect(node.left.key).toBe(0);
|
|
198
|
+
expect(node.right.key).toBe(25);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('should fix the tree after deletion', () => {
|
|
202
|
+
tree.insert(10);
|
|
203
|
+
tree.insert(20);
|
|
204
|
+
tree.insert(5);
|
|
205
|
+
tree.insert(15);
|
|
206
|
+
tree.delete(15);
|
|
207
|
+
// Verify that the tree is still valid
|
|
208
|
+
// You can add assertions to check the Red-Black Tree properties
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it('should fix the tree after insertion', () => {
|
|
212
|
+
tree.insert(1);
|
|
213
|
+
tree.insert(2);
|
|
214
|
+
tree.insert(5);
|
|
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
|
+
tree.insert(25);
|
|
222
|
+
tree.insert(10);
|
|
223
|
+
tree.insert(8);
|
|
224
|
+
tree.insert(28);
|
|
225
|
+
tree.insert(111);
|
|
226
|
+
tree.insert(12);
|
|
227
|
+
tree.delete(2);
|
|
228
|
+
tree.insert(22);
|
|
229
|
+
tree.insert(50);
|
|
230
|
+
tree.insert(155);
|
|
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);
|
|
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);
|
|
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
|
+
|
|
250
|
+
tree.insert(23);
|
|
251
|
+
tree.insert(33);
|
|
252
|
+
tree.insert(15);
|
|
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
|
+
});
|
|
271
|
+
|
|
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
|
+
}
|
|
108
277
|
});
|
|
109
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;
|