data-structure-typed 1.51.7 → 1.51.9
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 +13 -13
- package/benchmark/report.html +1 -37
- package/benchmark/report.json +15 -387
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +103 -74
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +116 -93
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +82 -62
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +90 -71
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +318 -233
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +492 -392
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +204 -251
- package/dist/cjs/data-structures/binary-tree/bst.js +256 -358
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +74 -85
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +111 -119
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +92 -76
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +105 -93
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +10 -15
- package/dist/cjs/data-structures/graph/abstract-graph.js +10 -15
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.d.ts +31 -38
- package/dist/cjs/data-structures/hash/hash-map.js +40 -55
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.d.ts +1 -3
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +2 -3
- package/dist/cjs/data-structures/queue/deque.js +2 -3
- 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/data-structures/trie/trie.d.ts +1 -1
- package/dist/cjs/data-structures/trie/trie.js +1 -1
- package/dist/cjs/data-structures/trie/trie.js.map +1 -1
- package/dist/cjs/interfaces/binary-tree.d.ts +7 -7
- package/dist/cjs/types/common.d.ts +2 -3
- package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +4 -3
- package/dist/cjs/types/data-structures/binary-tree/avl-tree.d.ts +4 -3
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +6 -5
- package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +6 -5
- package/dist/cjs/types/data-structures/binary-tree/rb-tree.d.ts +4 -3
- package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +4 -3
- package/dist/cjs/types/utils/utils.d.ts +10 -1
- package/dist/cjs/utils/utils.d.ts +2 -1
- package/dist/cjs/utils/utils.js +27 -1
- package/dist/cjs/utils/utils.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +103 -74
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +116 -93
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +82 -62
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +90 -71
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +318 -233
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +493 -393
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +204 -251
- package/dist/mjs/data-structures/binary-tree/bst.js +252 -357
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +74 -85
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +111 -119
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +92 -76
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +105 -93
- package/dist/mjs/data-structures/graph/abstract-graph.d.ts +10 -15
- package/dist/mjs/data-structures/graph/abstract-graph.js +10 -15
- package/dist/mjs/data-structures/hash/hash-map.d.ts +31 -38
- package/dist/mjs/data-structures/hash/hash-map.js +41 -55
- package/dist/mjs/data-structures/heap/heap.d.ts +1 -3
- package/dist/mjs/data-structures/queue/deque.d.ts +2 -3
- package/dist/mjs/data-structures/queue/deque.js +2 -3
- package/dist/mjs/data-structures/trie/trie.d.ts +1 -1
- package/dist/mjs/data-structures/trie/trie.js +1 -1
- package/dist/mjs/interfaces/binary-tree.d.ts +7 -7
- package/dist/mjs/types/common.d.ts +2 -3
- package/dist/mjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +4 -3
- package/dist/mjs/types/data-structures/binary-tree/avl-tree.d.ts +4 -3
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +6 -5
- package/dist/mjs/types/data-structures/binary-tree/bst.d.ts +6 -5
- package/dist/mjs/types/data-structures/binary-tree/rb-tree.d.ts +4 -3
- package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.d.ts +4 -3
- package/dist/mjs/types/utils/utils.d.ts +10 -1
- package/dist/mjs/utils/utils.d.ts +2 -1
- package/dist/mjs/utils/utils.js +25 -0
- package/dist/umd/data-structure-typed.js +1427 -1343
- package/dist/umd/data-structure-typed.min.js +4 -4
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +6 -6
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +142 -100
- package/src/data-structures/binary-tree/avl-tree.ts +109 -80
- package/src/data-structures/binary-tree/binary-tree.ts +556 -433
- package/src/data-structures/binary-tree/bst.ts +286 -375
- package/src/data-structures/binary-tree/rb-tree.ts +132 -125
- package/src/data-structures/binary-tree/tree-multi-map.ts +129 -102
- package/src/data-structures/graph/abstract-graph.ts +10 -10
- package/src/data-structures/hash/hash-map.ts +42 -49
- package/src/data-structures/heap/heap.ts +1 -1
- package/src/data-structures/queue/deque.ts +2 -2
- package/src/data-structures/queue/queue.ts +1 -1
- package/src/data-structures/trie/trie.ts +2 -2
- package/src/interfaces/binary-tree.ts +11 -9
- package/src/types/common.ts +2 -3
- package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +4 -3
- package/src/types/data-structures/binary-tree/avl-tree.ts +4 -3
- package/src/types/data-structures/binary-tree/binary-tree.ts +7 -6
- package/src/types/data-structures/binary-tree/bst.ts +6 -5
- package/src/types/data-structures/binary-tree/rb-tree.ts +4 -3
- package/src/types/data-structures/binary-tree/tree-multi-map.ts +4 -3
- package/src/types/utils/utils.ts +14 -1
- package/src/utils/utils.ts +20 -1
- package/test/integration/all-in-one.test.ts +2 -2
- package/test/integration/avl-tree.test.ts +2 -2
- package/test/integration/bst.test.ts +3 -3
- package/test/integration/index.html +95 -11
- package/test/performance/reportor.ts +2 -3
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +75 -7
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +2 -2
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +56 -0
- package/test/unit/data-structures/binary-tree/bst.test.ts +6 -6
- package/test/unit/data-structures/binary-tree/overall.test.ts +24 -20
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +6 -6
- package/test/unit/data-structures/graph/directed-graph.test.ts +2 -2
- package/test/unit/utils/utils.test.ts +5 -0
- package/test/utils/big-o.ts +12 -6
- package/test/utils/console.ts +1 -1
- package/tsconfig-base.json +1 -0
|
@@ -28,7 +28,7 @@ describe('AVLTreeMultiMap count', () => {
|
|
|
28
28
|
[3, 3]
|
|
29
29
|
]);
|
|
30
30
|
tm.add([2, 2], undefined, 10);
|
|
31
|
-
tm.lesserOrGreaterTraverse(node => (node.count += 2),
|
|
31
|
+
tm.lesserOrGreaterTraverse(node => (node.count += 2), 1, 1);
|
|
32
32
|
tm.delete(2);
|
|
33
33
|
expect(tm.count).toBe(12);
|
|
34
34
|
expect(tm.getComputedCount()).toBe(16);
|
|
@@ -37,7 +37,7 @@ describe('AVLTreeMultiMap count', () => {
|
|
|
37
37
|
|
|
38
38
|
describe('AVLTreeMultiMap operations test1', () => {
|
|
39
39
|
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
40
|
-
const treeMultimap = new AVLTreeMultiMap();
|
|
40
|
+
const treeMultimap = new AVLTreeMultiMap<number>();
|
|
41
41
|
|
|
42
42
|
expect(treeMultimap instanceof AVLTreeMultiMap);
|
|
43
43
|
treeMultimap.add([11, 11]);
|
|
@@ -94,7 +94,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
94
94
|
node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'PRE', 15);
|
|
95
95
|
expect(subTreeSum).toBe(31);
|
|
96
96
|
let lesserSum = 0;
|
|
97
|
-
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key),
|
|
97
|
+
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), -1, 10);
|
|
98
98
|
expect(lesserSum).toBe(45);
|
|
99
99
|
|
|
100
100
|
expect(node15 instanceof AVLTreeMultiMapNode);
|
|
@@ -105,7 +105,7 @@ describe('AVLTreeMultiMap operations test1', () => {
|
|
|
105
105
|
const node11 = treeMultimap.getNode(11);
|
|
106
106
|
expect(node11 instanceof AVLTreeMultiMapNode);
|
|
107
107
|
if (node11 instanceof AVLTreeMultiMapNode) {
|
|
108
|
-
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2),
|
|
108
|
+
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
|
|
109
109
|
expect(allGreaterNodesAdded);
|
|
110
110
|
}
|
|
111
111
|
|
|
@@ -348,7 +348,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
348
348
|
node15 && treeMultimap.dfs(node => (subTreeSum += node.key), 'PRE', 15);
|
|
349
349
|
expect(subTreeSum).toBe(31);
|
|
350
350
|
let lesserSum = 0;
|
|
351
|
-
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key),
|
|
351
|
+
treeMultimap.lesserOrGreaterTraverse((node: AVLTreeMultiMapNode<number>) => (lesserSum += node.key), -1, 10);
|
|
352
352
|
expect(lesserSum).toBe(45);
|
|
353
353
|
|
|
354
354
|
expect(node15 instanceof AVLTreeMultiMapNode);
|
|
@@ -359,7 +359,7 @@ describe('AVLTreeMultiMap operations test recursively1', () => {
|
|
|
359
359
|
const node11 = treeMultimap.getNode(11);
|
|
360
360
|
expect(node11 instanceof AVLTreeMultiMapNode);
|
|
361
361
|
if (node11 instanceof AVLTreeMultiMapNode) {
|
|
362
|
-
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2),
|
|
362
|
+
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
|
|
363
363
|
expect(allGreaterNodesAdded);
|
|
364
364
|
}
|
|
365
365
|
|
|
@@ -564,7 +564,7 @@ describe('AVLTreeMultiMap Performance test', function () {
|
|
|
564
564
|
}
|
|
565
565
|
isDebug && console.log('---add', performance.now() - start);
|
|
566
566
|
const startL = performance.now();
|
|
567
|
-
treeMS.lesserOrGreaterTraverse(node => (node.count += 1),
|
|
567
|
+
treeMS.lesserOrGreaterTraverse(node => (node.count += 1), -1, inputSize / 2);
|
|
568
568
|
isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
|
|
569
569
|
});
|
|
570
570
|
|
|
@@ -689,3 +689,71 @@ describe('AVLTreeMultiMap iterative methods test', () => {
|
|
|
689
689
|
expect([...values]).toEqual(['a', 'b', 'c']);
|
|
690
690
|
});
|
|
691
691
|
});
|
|
692
|
+
|
|
693
|
+
describe('AVLTree toEntryFn', () => {
|
|
694
|
+
it('should toEntryFn 1', () => {
|
|
695
|
+
const tree = new AVLTreeMultiMap<number, number, { obj: { id: number } }>([], {
|
|
696
|
+
toEntryFn: ele => [ele.obj.id, ele.obj.id]
|
|
697
|
+
});
|
|
698
|
+
tree.add({ obj: { id: 1 } });
|
|
699
|
+
tree.add({ obj: { id: 2 } });
|
|
700
|
+
tree.add({ obj: { id: 3 } });
|
|
701
|
+
tree.add({ obj: { id: 4 } });
|
|
702
|
+
tree.add({ obj: { id: 5 } });
|
|
703
|
+
|
|
704
|
+
const expected = [1, 2, 3, 4, 5];
|
|
705
|
+
|
|
706
|
+
expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
707
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
708
|
+
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
709
|
+
});
|
|
710
|
+
|
|
711
|
+
it('should toEntryFn 2', () => {
|
|
712
|
+
const tree = new AVLTreeMultiMap<number, number, { obj: { id: number } }>(
|
|
713
|
+
[{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
|
|
714
|
+
{
|
|
715
|
+
toEntryFn: ele => [ele.obj.id, ele.obj.id]
|
|
716
|
+
}
|
|
717
|
+
);
|
|
718
|
+
|
|
719
|
+
const expected = [1, 2, 3, 4, 5];
|
|
720
|
+
|
|
721
|
+
expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
722
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
723
|
+
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
724
|
+
});
|
|
725
|
+
|
|
726
|
+
it('should toEntryFn throw error', () => {
|
|
727
|
+
expect(
|
|
728
|
+
() =>
|
|
729
|
+
new AVLTreeMultiMap<{ obj: { id: number } }, number>([
|
|
730
|
+
{ obj: { id: 1 } },
|
|
731
|
+
{ obj: { id: 2 } },
|
|
732
|
+
{ obj: { id: 3 } },
|
|
733
|
+
{ obj: { id: 4 } },
|
|
734
|
+
{ obj: { id: 5 } }
|
|
735
|
+
])
|
|
736
|
+
).toThrowError(
|
|
737
|
+
'When comparing two object types, it is necessary to customize a [comparator] function of options parameter during the instantiation of the data structure.'
|
|
738
|
+
);
|
|
739
|
+
});
|
|
740
|
+
|
|
741
|
+
it('should toEntryFn 3', () => {
|
|
742
|
+
const tree = new AVLTreeMultiMap<{ obj: { id: number } }, number>(
|
|
743
|
+
[{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
|
|
744
|
+
{ comparator: (a, b) => a.obj.id - b.obj.id }
|
|
745
|
+
);
|
|
746
|
+
|
|
747
|
+
const expected = [
|
|
748
|
+
{ obj: { id: 1 } },
|
|
749
|
+
{ obj: { id: 2 } },
|
|
750
|
+
{ obj: { id: 3 } },
|
|
751
|
+
{ obj: { id: 4 } },
|
|
752
|
+
{ obj: { id: 5 } }
|
|
753
|
+
];
|
|
754
|
+
|
|
755
|
+
expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
756
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
757
|
+
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
758
|
+
});
|
|
759
|
+
});
|
|
@@ -28,7 +28,7 @@ describe('AVL Tree Test', () => {
|
|
|
28
28
|
expect(subTreeSum).toBe(70);
|
|
29
29
|
|
|
30
30
|
let lesserSum = 0;
|
|
31
|
-
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
31
|
+
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
|
|
32
32
|
expect(lesserSum).toBe(45);
|
|
33
33
|
|
|
34
34
|
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
@@ -136,7 +136,7 @@ describe('AVL Tree Test recursively', () => {
|
|
|
136
136
|
expect(subTreeSum).toBe(70);
|
|
137
137
|
|
|
138
138
|
let lesserSum = 0;
|
|
139
|
-
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
139
|
+
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
|
|
140
140
|
expect(lesserSum).toBe(45);
|
|
141
141
|
|
|
142
142
|
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
@@ -403,6 +403,62 @@ describe('BinaryTree Morris Traversal', () => {
|
|
|
403
403
|
});
|
|
404
404
|
});
|
|
405
405
|
|
|
406
|
+
describe('BinaryTree toEntryFn', () => {
|
|
407
|
+
it('should toEntryFn 1', () => {
|
|
408
|
+
const tree = new BinaryTree<number, number, { obj: { id: number } }>([], {
|
|
409
|
+
toEntryFn: ele => [ele.obj.id, ele.obj.id]
|
|
410
|
+
});
|
|
411
|
+
tree.add({ obj: { id: 1 } });
|
|
412
|
+
tree.add({ obj: { id: 2 } });
|
|
413
|
+
tree.add({ obj: { id: 3 } });
|
|
414
|
+
tree.add({ obj: { id: 4 } });
|
|
415
|
+
tree.add({ obj: { id: 5 } });
|
|
416
|
+
|
|
417
|
+
const expected = [4, 2, 5, 1, 3];
|
|
418
|
+
|
|
419
|
+
expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
420
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
421
|
+
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
it('should toEntryFn 2', () => {
|
|
425
|
+
const tree = new BinaryTree<number, number, { obj: { id: number } }>(
|
|
426
|
+
[{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
|
|
427
|
+
{
|
|
428
|
+
toEntryFn: ele => [ele.obj.id, ele.obj.id]
|
|
429
|
+
}
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
const expected = [4, 2, 5, 1, 3];
|
|
433
|
+
|
|
434
|
+
expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
435
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
436
|
+
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
it('should toEntryFn 3', () => {
|
|
440
|
+
const tree = new BinaryTree<{ obj: { id: number } }, number>([
|
|
441
|
+
{ obj: { id: 1 } },
|
|
442
|
+
{ obj: { id: 2 } },
|
|
443
|
+
{ obj: { id: 3 } },
|
|
444
|
+
{ obj: { id: 4 } },
|
|
445
|
+
{ obj: { id: 5 } }
|
|
446
|
+
]);
|
|
447
|
+
|
|
448
|
+
const expected = [
|
|
449
|
+
{ obj: { id: 4 } },
|
|
450
|
+
{ obj: { id: 2 } },
|
|
451
|
+
{ obj: { id: 5 } },
|
|
452
|
+
{ obj: { id: 1 } },
|
|
453
|
+
{ obj: { id: 3 } }
|
|
454
|
+
];
|
|
455
|
+
|
|
456
|
+
expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
457
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
458
|
+
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
459
|
+
});
|
|
460
|
+
});
|
|
461
|
+
|
|
406
462
|
describe('BinaryTree traversals', () => {
|
|
407
463
|
const tree = new BinaryTree<number>();
|
|
408
464
|
|
|
@@ -58,7 +58,7 @@ describe('BST operations test', () => {
|
|
|
58
58
|
expect(subTreeSum).toBe(70);
|
|
59
59
|
|
|
60
60
|
let lesserSum = 0;
|
|
61
|
-
bst.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
61
|
+
bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
|
|
62
62
|
expect(lesserSum).toBe(45);
|
|
63
63
|
|
|
64
64
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
@@ -261,7 +261,7 @@ describe('BST operations test', () => {
|
|
|
261
261
|
expect(subTreeSum).toBe(70);
|
|
262
262
|
|
|
263
263
|
let lesserSum = 0;
|
|
264
|
-
objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
264
|
+
objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
|
|
265
265
|
expect(lesserSum).toBe(45);
|
|
266
266
|
|
|
267
267
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
@@ -448,7 +448,7 @@ describe('BST operations test recursively', () => {
|
|
|
448
448
|
expect(subTreeSum).toBe(70);
|
|
449
449
|
|
|
450
450
|
let lesserSum = 0;
|
|
451
|
-
bst.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
451
|
+
bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
|
|
452
452
|
expect(lesserSum).toBe(45);
|
|
453
453
|
|
|
454
454
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
@@ -649,7 +649,7 @@ describe('BST operations test recursively', () => {
|
|
|
649
649
|
expect(subTreeSum).toBe(70);
|
|
650
650
|
|
|
651
651
|
let lesserSum = 0;
|
|
652
|
-
objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
652
|
+
objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
|
|
653
653
|
expect(lesserSum).toBe(45);
|
|
654
654
|
|
|
655
655
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
@@ -869,7 +869,7 @@ describe('BST isBST', function () {
|
|
|
869
869
|
});
|
|
870
870
|
|
|
871
871
|
test('isBST when variant is Max', () => {
|
|
872
|
-
const bst = new BST<number, number>([1, 2, 3, 9, 8, 5, 6, 7, 4], {
|
|
872
|
+
const bst = new BST<number, number>([1, 2, 3, 9, 8, 5, 6, 7, 4], { comparator: (a, b) => b - a });
|
|
873
873
|
bst.addMany([1, 2, 3, 9, 8, 5, 6, 7, 4]);
|
|
874
874
|
expect(bst.isBST()).toBe(true);
|
|
875
875
|
});
|
|
@@ -902,7 +902,7 @@ describe('BST Performance test', function () {
|
|
|
902
902
|
node => {
|
|
903
903
|
node.key - 1;
|
|
904
904
|
},
|
|
905
|
-
|
|
905
|
+
-1,
|
|
906
906
|
inputSize / 2
|
|
907
907
|
);
|
|
908
908
|
isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
|
|
@@ -2,7 +2,7 @@ import { AVLTree, BST, RedBlackTree, TreeMultiMap } from '../../../../src';
|
|
|
2
2
|
|
|
3
3
|
describe('Overall BinaryTree Test', () => {
|
|
4
4
|
it('should perform various operations on BinaryTree', () => {
|
|
5
|
-
const bst = new BST();
|
|
5
|
+
const bst = new BST<number>();
|
|
6
6
|
bst.add(11);
|
|
7
7
|
bst.add(3);
|
|
8
8
|
bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], undefined, false);
|
|
@@ -64,16 +64,19 @@ describe('Overall BinaryTree Test', () => {
|
|
|
64
64
|
it('Should clone a BST works fine', () => {
|
|
65
65
|
const bst = new BST<number>([3, 6, 7, 1, 9], {
|
|
66
66
|
iterationType: 'RECURSIVE',
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
comparator: (a, b) => {
|
|
68
|
+
if (a > b) return -1;
|
|
69
|
+
if (a < b) return 1;
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
69
72
|
});
|
|
70
73
|
expect(bst.size).toBe(5);
|
|
71
74
|
expect(bst.root?.key).toBe(6);
|
|
72
|
-
expect(bst.root?.left?.key).toBe(
|
|
73
|
-
expect(bst.root?.left?.
|
|
74
|
-
expect(bst.root?.right?.key).toBe(
|
|
75
|
-
expect(bst.root?.right?.
|
|
76
|
-
expect(bst.getNodeByKey(
|
|
75
|
+
expect(bst.root?.left?.key).toBe(9);
|
|
76
|
+
expect(bst.root?.left?.right?.key).toBe(7);
|
|
77
|
+
expect(bst.root?.right?.key).toBe(3);
|
|
78
|
+
expect(bst.root?.right?.right?.key).toBe(1);
|
|
79
|
+
expect(bst.getNodeByKey(9)?.right?.key).toBe(7);
|
|
77
80
|
expect(bst.getHeight()).toBe(2);
|
|
78
81
|
expect(bst.has(9)).toBe(true);
|
|
79
82
|
expect(bst.has(7)).toBe(true);
|
|
@@ -82,31 +85,34 @@ describe('Overall BinaryTree Test', () => {
|
|
|
82
85
|
expect(bst.size).toBe(4);
|
|
83
86
|
expect(bst.root?.key).toBe(6);
|
|
84
87
|
expect(bst.root?.left?.key).toBe(9);
|
|
85
|
-
expect(bst.root?.right?.key).toBe(
|
|
86
|
-
expect(bst.root?.right?.
|
|
88
|
+
expect(bst.root?.right?.key).toBe(3);
|
|
89
|
+
expect(bst.root?.right?.right?.key).toBe(1);
|
|
87
90
|
expect(bst.getNodeByKey(6)?.left?.key).toBe(9);
|
|
88
91
|
expect(bst.getHeight()).toBe(2);
|
|
89
92
|
expect(bst.has(9)).toBe(true);
|
|
90
93
|
expect(bst.has(7)).toBe(false);
|
|
91
|
-
expect(bst.bfs()).toEqual([6, 9,
|
|
94
|
+
expect(bst.bfs()).toEqual([6, 9, 3, 1]);
|
|
92
95
|
const clonedBST = bst.clone();
|
|
93
96
|
expect(clonedBST.size).toBe(4);
|
|
94
97
|
expect(clonedBST.root?.key).toBe(6);
|
|
95
98
|
expect(clonedBST.root?.left?.key).toBe(9);
|
|
96
|
-
expect(clonedBST.root?.right?.key).toBe(
|
|
97
|
-
expect(clonedBST.root?.right?.
|
|
99
|
+
expect(clonedBST.root?.right?.key).toBe(3);
|
|
100
|
+
expect(clonedBST.root?.right?.right?.key).toBe(1);
|
|
98
101
|
expect(clonedBST.getNodeByKey(6)?.left?.key).toBe(9);
|
|
99
102
|
expect(clonedBST.getHeight()).toBe(2);
|
|
100
103
|
expect(clonedBST.has(9)).toBe(true);
|
|
101
104
|
expect(clonedBST.has(7)).toBe(false);
|
|
102
|
-
expect(clonedBST.bfs()).toEqual([6, 9,
|
|
105
|
+
expect(clonedBST.bfs()).toEqual([6, 9, 3, 1]);
|
|
103
106
|
});
|
|
104
107
|
|
|
105
108
|
it('Should clone a AVLTree works fine', () => {
|
|
106
109
|
const avl = new AVLTree<number>([3, 6, 7, 1, 9], {
|
|
107
110
|
iterationType: 'RECURSIVE',
|
|
108
|
-
|
|
109
|
-
|
|
111
|
+
comparator: (a, b) => {
|
|
112
|
+
if (a > b) return -1;
|
|
113
|
+
if (a < b) return 1;
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
110
116
|
});
|
|
111
117
|
expect(avl.size).toBe(5);
|
|
112
118
|
avl.add(2);
|
|
@@ -148,8 +154,7 @@ describe('Overall BinaryTree Test', () => {
|
|
|
148
154
|
|
|
149
155
|
it('Should clone a TreeMultiMap works fine', () => {
|
|
150
156
|
const tmm = new TreeMultiMap<number>([3, 6, 7, 1, 9], {
|
|
151
|
-
iterationType: 'RECURSIVE'
|
|
152
|
-
extractor: key => key
|
|
157
|
+
iterationType: 'RECURSIVE'
|
|
153
158
|
});
|
|
154
159
|
expect(tmm.size).toBe(5);
|
|
155
160
|
tmm.add(2);
|
|
@@ -197,8 +202,7 @@ describe('Overall BinaryTree Test', () => {
|
|
|
197
202
|
|
|
198
203
|
it('Should clone a RedBlackTree works fine', () => {
|
|
199
204
|
const rbTree = new RedBlackTree<number>([3, 6, 7, 1, 9], {
|
|
200
|
-
iterationType: 'RECURSIVE'
|
|
201
|
-
extractor: key => key
|
|
205
|
+
iterationType: 'RECURSIVE'
|
|
202
206
|
});
|
|
203
207
|
expect(rbTree.size).toBe(5);
|
|
204
208
|
rbTree.add(2);
|
|
@@ -32,7 +32,7 @@ describe('TreeMultiMap count', () => {
|
|
|
32
32
|
[2, 2],
|
|
33
33
|
[3, 3]
|
|
34
34
|
]);
|
|
35
|
-
tmm.lesserOrGreaterTraverse(node => (node.count += 2),
|
|
35
|
+
tmm.lesserOrGreaterTraverse(node => (node.count += 2), 1, 1);
|
|
36
36
|
expect(tmm.getComputedCount()).toBe(7);
|
|
37
37
|
expect(tmm.count).toBe(3);
|
|
38
38
|
});
|
|
@@ -93,7 +93,7 @@ describe('TreeMultiMap operations test1', () => {
|
|
|
93
93
|
});
|
|
94
94
|
|
|
95
95
|
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
96
|
-
const tmm = new TreeMultiMap();
|
|
96
|
+
const tmm = new TreeMultiMap<number, number>();
|
|
97
97
|
|
|
98
98
|
expect(tmm instanceof TreeMultiMap);
|
|
99
99
|
|
|
@@ -152,7 +152,7 @@ describe('TreeMultiMap operations test1', () => {
|
|
|
152
152
|
node15 && tmm.dfs(node => (subTreeSum += node.key), 'PRE', 15);
|
|
153
153
|
expect(subTreeSum).toBe(45);
|
|
154
154
|
let lesserSum = 0;
|
|
155
|
-
tmm.lesserOrGreaterTraverse(
|
|
155
|
+
tmm.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
|
|
156
156
|
expect(lesserSum).toBe(45);
|
|
157
157
|
|
|
158
158
|
expect(node15 instanceof TreeMultiMapNode);
|
|
@@ -163,7 +163,7 @@ describe('TreeMultiMap operations test1', () => {
|
|
|
163
163
|
const node11 = tmm.getNode(11);
|
|
164
164
|
expect(node11 instanceof TreeMultiMapNode);
|
|
165
165
|
if (node11 instanceof TreeMultiMapNode) {
|
|
166
|
-
const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2),
|
|
166
|
+
const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
|
|
167
167
|
expect(allGreaterNodesAdded);
|
|
168
168
|
}
|
|
169
169
|
|
|
@@ -414,7 +414,7 @@ describe('TreeMultiMap operations test recursively1', () => {
|
|
|
414
414
|
lesserSum += node.key;
|
|
415
415
|
return node.key;
|
|
416
416
|
},
|
|
417
|
-
|
|
417
|
+
-1,
|
|
418
418
|
10
|
|
419
419
|
);
|
|
420
420
|
expect(lesserSum).toBe(45);
|
|
@@ -427,7 +427,7 @@ describe('TreeMultiMap operations test recursively1', () => {
|
|
|
427
427
|
const node11 = tmm.getNode(11);
|
|
428
428
|
expect(node11 instanceof TreeMultiMapNode);
|
|
429
429
|
if (node11 instanceof TreeMultiMapNode) {
|
|
430
|
-
const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2),
|
|
430
|
+
const allGreaterNodesAdded = tmm.lesserOrGreaterTraverse(node => (node.count += 2), 1, 11);
|
|
431
431
|
expect(allGreaterNodesAdded);
|
|
432
432
|
}
|
|
433
433
|
|
|
@@ -132,11 +132,11 @@ class MyDirectedGraph<
|
|
|
132
132
|
VO extends MyVertex<V> = MyVertex<V>,
|
|
133
133
|
EO extends MyEdge<E> = MyEdge<E>
|
|
134
134
|
> extends DirectedGraph<V, E, VO, EO> {
|
|
135
|
-
createVertex(key: VertexKey, value: V): VO {
|
|
135
|
+
override createVertex(key: VertexKey, value: V): VO {
|
|
136
136
|
return new MyVertex(key, value) as VO;
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
-
createEdge(src: VertexKey, dest: VertexKey, weight?: number, value?: E): EO {
|
|
139
|
+
override createEdge(src: VertexKey, dest: VertexKey, weight?: number, value?: E): EO {
|
|
140
140
|
return new MyEdge(src, dest, weight ?? 1, value) as EO;
|
|
141
141
|
}
|
|
142
142
|
|
package/test/utils/big-o.ts
CHANGED
|
@@ -206,14 +206,20 @@ export function logBigOMetrics(target: any, propertyKey: string, descriptor: Pro
|
|
|
206
206
|
return descriptor;
|
|
207
207
|
}
|
|
208
208
|
|
|
209
|
-
export const logPerf = function (
|
|
209
|
+
export const logPerf = function (
|
|
210
|
+
label: string = 'function running cost',
|
|
211
|
+
fn: (...args: any[]) => any,
|
|
212
|
+
args: any[],
|
|
213
|
+
thisArg?: any
|
|
214
|
+
) {
|
|
210
215
|
const start = performance.now();
|
|
216
|
+
let result: any;
|
|
211
217
|
if (thisArg) {
|
|
212
|
-
if (args && args.length > 0) fn.apply(thisArg, args);
|
|
213
|
-
else fn.apply(thisArg);
|
|
218
|
+
if (args && args.length > 0) result = fn.apply(thisArg, args);
|
|
219
|
+
else result = fn.apply(thisArg);
|
|
214
220
|
} else {
|
|
215
|
-
if (args && args.length > 0) fn(...args);
|
|
216
|
-
else fn();
|
|
221
|
+
if (args && args.length > 0) result = fn(...args);
|
|
222
|
+
else result = fn();
|
|
217
223
|
}
|
|
218
|
-
console.log(
|
|
224
|
+
console.log(`${(performance.now() - start).toFixed(2)} ms, ${label}, ${result}`);
|
|
219
225
|
};
|
package/test/utils/console.ts
CHANGED
package/tsconfig-base.json
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"strict": true, // Enable strict type checking, including enabling all strict options.
|
|
17
17
|
"traceResolution": false, // Whether to trace the module resolution process.
|
|
18
18
|
"types": ["node", "jest"], // Specifies the name of the type declaration file to include.
|
|
19
|
+
"noImplicitOverride": true,
|
|
19
20
|
"typeRoots": ["node_modules/@types", "src/types", "test/types"]
|
|
20
21
|
},
|
|
21
22
|
"compileOnSave": false, // Whether to automatically compile when saving.
|