data-structure-typed 1.41.7 → 1.41.8
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/README.md +14 -11
- package/benchmark/report.html +14 -11
- package/benchmark/report.json +156 -205
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.d.ts +5 -2
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.js +15 -2
- package/dist/cjs/src/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/mjs/src/data-structures/binary-tree/rb-tree.d.ts +5 -2
- package/dist/mjs/src/data-structures/binary-tree/rb-tree.js +15 -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 +1 -1
- package/src/data-structures/binary-tree/binary-tree.ts +1 -1
- package/src/data-structures/binary-tree/bst.ts +1 -1
- package/src/data-structures/binary-tree/rb-tree.ts +18 -2
- package/test/performance/data-structures/binary-tree/avl-tree.test.ts +6 -6
- package/test/performance/data-structures/binary-tree/binary-tree.test.ts +7 -7
- package/test/performance/data-structures/binary-tree/bst.test.ts +6 -6
- package/test/performance/data-structures/binary-tree/rb-tree.test.ts +32 -0
- package/test/performance/data-structures/graph/directed-graph.test.ts +4 -4
- package/test/performance/data-structures/heap/heap.test.ts +7 -7
- package/test/performance/data-structures/linked-list/doubly-linked-list.test.ts +6 -6
- package/test/performance/data-structures/linked-list/singly-linked-list.test.ts +7 -7
- package/test/performance/data-structures/priority-queue/max-priority-queue.test.ts +1 -1
- package/test/performance/data-structures/queue/deque.test.ts +2 -2
- package/test/performance/data-structures/queue/queue.test.ts +2 -2
- package/test/performance/data-structures/trie/trie.test.ts +2 -2
- package/test/performance/reportor.ts +5 -6
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +103 -103
- package/test/unit/data-structures/graph/undirected-graph.test.ts +6 -7
|
@@ -11,11 +11,11 @@ describe('RedBlackTree', () => {
|
|
|
11
11
|
tree = new RedBlackTree();
|
|
12
12
|
});
|
|
13
13
|
|
|
14
|
-
describe('
|
|
15
|
-
test('should
|
|
16
|
-
tree.
|
|
17
|
-
tree.
|
|
18
|
-
tree.
|
|
14
|
+
describe('add and getNode', () => {
|
|
15
|
+
test('should add and find a node in the tree', () => {
|
|
16
|
+
tree.add(10);
|
|
17
|
+
tree.add(20);
|
|
18
|
+
tree.add(5);
|
|
19
19
|
|
|
20
20
|
expect(tree.getNode(10)).toBeInstanceOf(RBTreeNode);
|
|
21
21
|
expect(tree.getNode(20)).toBeInstanceOf(RBTreeNode);
|
|
@@ -23,9 +23,9 @@ describe('RedBlackTree', () => {
|
|
|
23
23
|
expect(tree.getNode(15)).toBe(null);
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
-
test('should
|
|
27
|
-
tree.
|
|
28
|
-
tree.
|
|
26
|
+
test('should add and find nodes with negative keys', () => {
|
|
27
|
+
tree.add(-10);
|
|
28
|
+
tree.add(-20);
|
|
29
29
|
|
|
30
30
|
expect(tree.getNode(-10)).toBeInstanceOf(RBTreeNode);
|
|
31
31
|
expect(tree.getNode(-20)).toBeInstanceOf(RBTreeNode);
|
|
@@ -34,18 +34,18 @@ describe('RedBlackTree', () => {
|
|
|
34
34
|
|
|
35
35
|
describe('deleteNode', () => {
|
|
36
36
|
test('should delete a node from the tree', () => {
|
|
37
|
-
tree.
|
|
38
|
-
tree.
|
|
39
|
-
tree.
|
|
37
|
+
tree.add(10);
|
|
38
|
+
tree.add(20);
|
|
39
|
+
tree.add(5);
|
|
40
40
|
tree.delete(20);
|
|
41
41
|
|
|
42
42
|
expect(tree.getNode(20)).toBe(null);
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
test('should handle deleting a non-existent node', () => {
|
|
46
|
-
tree.
|
|
47
|
-
tree.
|
|
48
|
-
tree.
|
|
46
|
+
tree.add(10);
|
|
47
|
+
tree.add(20);
|
|
48
|
+
tree.add(5);
|
|
49
49
|
tree.delete(15);
|
|
50
50
|
|
|
51
51
|
expect(tree.getNode(15)).toBe(null);
|
|
@@ -54,11 +54,11 @@ describe('RedBlackTree', () => {
|
|
|
54
54
|
|
|
55
55
|
describe('minimum', () => {
|
|
56
56
|
test('should find the minimum node in the tree', () => {
|
|
57
|
-
tree.
|
|
58
|
-
tree.
|
|
59
|
-
tree.
|
|
60
|
-
tree.
|
|
61
|
-
tree.
|
|
57
|
+
tree.add(10);
|
|
58
|
+
tree.add(20);
|
|
59
|
+
tree.add(5);
|
|
60
|
+
tree.add(15);
|
|
61
|
+
tree.add(3);
|
|
62
62
|
|
|
63
63
|
const minNode = tree.getLeftMost(tree.root);
|
|
64
64
|
expect(minNode.key).toBe(3);
|
|
@@ -72,11 +72,11 @@ describe('RedBlackTree', () => {
|
|
|
72
72
|
|
|
73
73
|
describe('getRightMost', () => {
|
|
74
74
|
test('should find the getRightMost node in the tree', () => {
|
|
75
|
-
tree.
|
|
76
|
-
tree.
|
|
77
|
-
tree.
|
|
78
|
-
tree.
|
|
79
|
-
tree.
|
|
75
|
+
tree.add(10);
|
|
76
|
+
tree.add(20);
|
|
77
|
+
tree.add(5);
|
|
78
|
+
tree.add(15);
|
|
79
|
+
tree.add(25);
|
|
80
80
|
|
|
81
81
|
const maxNode = tree.getRightMost(tree.root);
|
|
82
82
|
expect(maxNode.key).toBe(25);
|
|
@@ -90,11 +90,11 @@ describe('RedBlackTree', () => {
|
|
|
90
90
|
|
|
91
91
|
describe('getSuccessor', () => {
|
|
92
92
|
test('should find the getSuccessor of a node', () => {
|
|
93
|
-
tree.
|
|
94
|
-
tree.
|
|
95
|
-
tree.
|
|
96
|
-
tree.
|
|
97
|
-
tree.
|
|
93
|
+
tree.add(10);
|
|
94
|
+
tree.add(20);
|
|
95
|
+
tree.add(5);
|
|
96
|
+
tree.add(15);
|
|
97
|
+
tree.add(25);
|
|
98
98
|
|
|
99
99
|
const node = tree.getNode(15);
|
|
100
100
|
const successorNode = tree.getSuccessor(node);
|
|
@@ -103,8 +103,8 @@ describe('RedBlackTree', () => {
|
|
|
103
103
|
});
|
|
104
104
|
|
|
105
105
|
test('should handle a node with no getSuccessor', () => {
|
|
106
|
-
tree.
|
|
107
|
-
tree.
|
|
106
|
+
tree.add(10);
|
|
107
|
+
tree.add(5);
|
|
108
108
|
|
|
109
109
|
const node = tree.getNode(10);
|
|
110
110
|
const successorNode = tree.getSuccessor(node);
|
|
@@ -115,11 +115,11 @@ describe('RedBlackTree', () => {
|
|
|
115
115
|
|
|
116
116
|
describe('getPredecessor', () => {
|
|
117
117
|
test('should find the getPredecessor of a node', () => {
|
|
118
|
-
tree.
|
|
119
|
-
tree.
|
|
120
|
-
tree.
|
|
121
|
-
tree.
|
|
122
|
-
tree.
|
|
118
|
+
tree.add(10);
|
|
119
|
+
tree.add(20);
|
|
120
|
+
tree.add(5);
|
|
121
|
+
tree.add(15);
|
|
122
|
+
tree.add(25);
|
|
123
123
|
|
|
124
124
|
const node = tree.getNode(20);
|
|
125
125
|
const predecessorNode = tree.getPredecessor(node);
|
|
@@ -128,8 +128,8 @@ describe('RedBlackTree', () => {
|
|
|
128
128
|
});
|
|
129
129
|
|
|
130
130
|
test('should handle a node with no getPredecessor', () => {
|
|
131
|
-
tree.
|
|
132
|
-
tree.
|
|
131
|
+
tree.add(10);
|
|
132
|
+
tree.add(20);
|
|
133
133
|
|
|
134
134
|
const node = tree.getNode(20);
|
|
135
135
|
const predecessorNode = tree.getPredecessor(node);
|
|
@@ -146,69 +146,69 @@ describe('RedBlackTree', () => {
|
|
|
146
146
|
tree = new RedBlackTree();
|
|
147
147
|
});
|
|
148
148
|
|
|
149
|
-
it('should
|
|
150
|
-
tree.
|
|
149
|
+
it('should add nodes into the tree', () => {
|
|
150
|
+
tree.add(10);
|
|
151
151
|
expect(tree.getNode(10)).toBeDefined();
|
|
152
|
-
tree.
|
|
152
|
+
tree.add(20);
|
|
153
153
|
expect(tree.getNode(20)).toBeDefined();
|
|
154
|
-
tree.
|
|
154
|
+
tree.add(5);
|
|
155
155
|
expect(tree.getNode(5)).toBeDefined();
|
|
156
156
|
});
|
|
157
157
|
|
|
158
158
|
it('should delete nodes from the tree', () => {
|
|
159
|
-
tree.
|
|
160
|
-
tree.
|
|
161
|
-
tree.
|
|
159
|
+
tree.add(10);
|
|
160
|
+
tree.add(20);
|
|
161
|
+
tree.add(5);
|
|
162
162
|
tree.delete(20);
|
|
163
163
|
expect(tree.getNode(20)).toBe(null);
|
|
164
164
|
});
|
|
165
165
|
|
|
166
166
|
it('should get the successor of a node', () => {
|
|
167
|
-
tree.
|
|
168
|
-
tree.
|
|
167
|
+
tree.add(10);
|
|
168
|
+
tree.add(20);
|
|
169
169
|
const node = tree.getNode(10);
|
|
170
170
|
const successor = tree.getSuccessor(node);
|
|
171
171
|
expect(successor?.key).toBe(20);
|
|
172
172
|
});
|
|
173
173
|
|
|
174
174
|
it('should get the predecessor of a node', () => {
|
|
175
|
-
tree.
|
|
176
|
-
tree.
|
|
175
|
+
tree.add(10);
|
|
176
|
+
tree.add(20);
|
|
177
177
|
const node = tree.getNode(20);
|
|
178
178
|
const predecessor = tree.getPredecessor(node);
|
|
179
179
|
expect(predecessor?.key).toBe(10);
|
|
180
180
|
});
|
|
181
181
|
|
|
182
182
|
it('should rotate nodes to the left', () => {
|
|
183
|
-
tree.
|
|
184
|
-
tree.
|
|
185
|
-
tree.
|
|
183
|
+
tree.add(10);
|
|
184
|
+
tree.add(20);
|
|
185
|
+
tree.add(5);
|
|
186
186
|
const node = tree.getNode(10);
|
|
187
|
-
tree.
|
|
187
|
+
tree.add(15);
|
|
188
188
|
// Verify that rotation has occurred
|
|
189
189
|
expect(node.left.key).toBe(5);
|
|
190
190
|
expect(node.right.key).toBe(20);
|
|
191
191
|
});
|
|
192
192
|
|
|
193
193
|
it('should rotate nodes to the right', () => {
|
|
194
|
-
tree.
|
|
195
|
-
tree.
|
|
196
|
-
tree.
|
|
194
|
+
tree.add(10);
|
|
195
|
+
tree.add(20);
|
|
196
|
+
tree.add(5);
|
|
197
197
|
const node = tree.getNode(20);
|
|
198
|
-
tree.
|
|
198
|
+
tree.add(25);
|
|
199
199
|
// Verify that rotation has occurred
|
|
200
200
|
expect(node.left.key).toBe(0);
|
|
201
201
|
expect(node.right.key).toBe(25);
|
|
202
202
|
});
|
|
203
203
|
|
|
204
204
|
it('should all node attributes fully conform to the red-black tree standards.', () => {
|
|
205
|
-
tree.
|
|
206
|
-
tree.
|
|
207
|
-
tree.
|
|
208
|
-
tree.
|
|
209
|
-
tree.
|
|
210
|
-
tree.
|
|
211
|
-
tree.
|
|
205
|
+
tree.add(10);
|
|
206
|
+
tree.add(20);
|
|
207
|
+
tree.add(5);
|
|
208
|
+
tree.add(15);
|
|
209
|
+
tree.add(21);
|
|
210
|
+
tree.add(6);
|
|
211
|
+
tree.add(2);
|
|
212
212
|
|
|
213
213
|
let node10F = tree.getNode(10);
|
|
214
214
|
let node20F = tree.getNode(20);
|
|
@@ -344,31 +344,31 @@ describe('RedBlackTree', () => {
|
|
|
344
344
|
});
|
|
345
345
|
|
|
346
346
|
it('should fix the tree after insertion', () => {
|
|
347
|
-
tree.
|
|
348
|
-
tree.
|
|
349
|
-
tree.
|
|
350
|
-
tree.
|
|
347
|
+
tree.add(1);
|
|
348
|
+
tree.add(2);
|
|
349
|
+
tree.add(5);
|
|
350
|
+
tree.add(15);
|
|
351
351
|
const node15F = tree.getNode(15);
|
|
352
352
|
expect(node15F.left).toBe(NIL);
|
|
353
353
|
expect(node15F.right).toBe(NIL);
|
|
354
354
|
expect(node15F.parent).toBe(tree.getNode(5));
|
|
355
355
|
|
|
356
|
-
tree.
|
|
357
|
-
tree.
|
|
358
|
-
tree.
|
|
359
|
-
tree.
|
|
360
|
-
tree.
|
|
361
|
-
tree.
|
|
356
|
+
tree.add(25);
|
|
357
|
+
tree.add(10);
|
|
358
|
+
tree.add(8);
|
|
359
|
+
tree.add(28);
|
|
360
|
+
tree.add(111);
|
|
361
|
+
tree.add(12);
|
|
362
362
|
tree.delete(2);
|
|
363
|
-
tree.
|
|
364
|
-
tree.
|
|
365
|
-
tree.
|
|
366
|
-
tree.
|
|
363
|
+
tree.add(22);
|
|
364
|
+
tree.add(50);
|
|
365
|
+
tree.add(155);
|
|
366
|
+
tree.add(225);
|
|
367
367
|
const node225F = tree.getNode(225);
|
|
368
368
|
expect(node225F.left).toBe(NIL);
|
|
369
369
|
expect(node225F.right).toBe(NIL);
|
|
370
370
|
expect(node225F.parent.key).toBe(155);
|
|
371
|
-
tree.
|
|
371
|
+
tree.add(7);
|
|
372
372
|
|
|
373
373
|
const node15S = tree.getNode(15);
|
|
374
374
|
expect(node15S.left.key).toBe(8);
|
|
@@ -382,9 +382,9 @@ describe('RedBlackTree', () => {
|
|
|
382
382
|
const node15T = tree.getNode(15);
|
|
383
383
|
expect(node15T).toBe(null);
|
|
384
384
|
|
|
385
|
-
tree.
|
|
386
|
-
tree.
|
|
387
|
-
tree.
|
|
385
|
+
tree.add(23);
|
|
386
|
+
tree.add(33);
|
|
387
|
+
tree.add(15);
|
|
388
388
|
|
|
389
389
|
const nodeLM = tree.getLeftMost();
|
|
390
390
|
expect(nodeLM.key).toBe(1);
|
|
@@ -402,33 +402,33 @@ describe('RedBlackTree', () => {
|
|
|
402
402
|
expect(node225S.right).toBe(NIL);
|
|
403
403
|
expect(node225S.parent.key).toBe(155);
|
|
404
404
|
expect(tree.getNode(0)).toBe(null);
|
|
405
|
-
tree.
|
|
406
|
-
tree.
|
|
407
|
-
tree.
|
|
408
|
-
tree.
|
|
409
|
-
tree.
|
|
410
|
-
tree.
|
|
411
|
-
tree.
|
|
412
|
-
tree.
|
|
413
|
-
tree.
|
|
414
|
-
tree.
|
|
415
|
-
tree.
|
|
416
|
-
tree.
|
|
417
|
-
tree.
|
|
418
|
-
tree.
|
|
419
|
-
tree.
|
|
420
|
-
tree.
|
|
421
|
-
tree.
|
|
422
|
-
tree.
|
|
423
|
-
tree.
|
|
424
|
-
tree.
|
|
405
|
+
tree.add(1);
|
|
406
|
+
tree.add(2);
|
|
407
|
+
tree.add(3);
|
|
408
|
+
tree.add(4);
|
|
409
|
+
tree.add(5);
|
|
410
|
+
tree.add(6);
|
|
411
|
+
tree.add(7);
|
|
412
|
+
tree.add(8);
|
|
413
|
+
tree.add(9);
|
|
414
|
+
tree.add(10);
|
|
415
|
+
tree.add(11);
|
|
416
|
+
tree.add(12);
|
|
417
|
+
tree.add(13);
|
|
418
|
+
tree.add(14);
|
|
419
|
+
tree.add(15);
|
|
420
|
+
tree.add(16);
|
|
421
|
+
tree.add(17);
|
|
422
|
+
tree.add(18);
|
|
423
|
+
tree.add(19);
|
|
424
|
+
tree.add(110);
|
|
425
425
|
|
|
426
426
|
isDebug && tree.print();
|
|
427
427
|
});
|
|
428
428
|
|
|
429
429
|
it('should fix the tree after insertion and deletion', () => {
|
|
430
430
|
for (let i = 0; i < 100; i++) {
|
|
431
|
-
tree.
|
|
431
|
+
tree.add(getRandomInt(-100, 1000));
|
|
432
432
|
tree.delete(getRandomInt(-100, 1000));
|
|
433
433
|
}
|
|
434
434
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {UndirectedEdge, UndirectedGraph, UndirectedVertex} from '../../../../src';
|
|
2
|
-
import saltyVertexes
|
|
3
|
-
import saltyEdges
|
|
2
|
+
import saltyVertexes from './salty-vertexes.json';
|
|
3
|
+
import saltyEdges from './salty-edges.json';
|
|
4
4
|
|
|
5
5
|
describe('UndirectedGraph Operation Test', () => {
|
|
6
6
|
let graph: UndirectedGraph;
|
|
@@ -151,18 +151,17 @@ describe('UndirectedGraph', () => {
|
|
|
151
151
|
|
|
152
152
|
it('xxx', () => {
|
|
153
153
|
// const start = performance.now();
|
|
154
|
-
const graph = new UndirectedGraph<{
|
|
154
|
+
const graph = new UndirectedGraph<{name: string}, number>();
|
|
155
155
|
for (const v of saltyVertexes) {
|
|
156
156
|
graph.addVertex(v.name, v);
|
|
157
157
|
}
|
|
158
158
|
for (const e of saltyEdges) {
|
|
159
|
-
const [s,d] = e;
|
|
160
|
-
graph.addEdge(
|
|
159
|
+
const [s, d] = e;
|
|
160
|
+
graph.addEdge(s.name, d.name, d.weight);
|
|
161
161
|
}
|
|
162
162
|
// const result = graph.getAllPathsBetween('Intersection_1','Intersection_5');
|
|
163
163
|
// console.log('---xxx', performance.now() - start, result)
|
|
164
164
|
// const result = graph.dijkstra('Intersection_1','Intersection_5', true, true);
|
|
165
165
|
// console.log('---xxx', performance.now() - start, result)
|
|
166
|
-
|
|
167
|
-
})
|
|
166
|
+
});
|
|
168
167
|
});
|