data-structure-typed 1.49.3 → 1.49.5
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 +70 -69
- package/README_zh-CN.md +44 -49
- package/benchmark/report.html +16 -16
- package/benchmark/report.json +187 -187
- package/dist/cjs/data-structures/base/iterable-base.d.ts +1 -1
- package/dist/cjs/data-structures/base/iterable-base.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +2 -14
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +19 -49
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multimap.d.ts +0 -16
- package/dist/cjs/data-structures/binary-tree/tree-multimap.js +1 -43
- package/dist/cjs/data-structures/binary-tree/tree-multimap.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +2 -11
- package/dist/cjs/data-structures/graph/abstract-graph.js +3 -19
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/directed-graph.js +4 -0
- package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/map-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.d.ts +1 -1
- package/dist/cjs/data-structures/hash/hash-map.js +2 -2
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.js +2 -3
- 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/singly-linked-list.d.ts +2 -2
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/matrix/index.d.ts +0 -2
- package/dist/cjs/data-structures/matrix/index.js +0 -2
- package/dist/cjs/data-structures/matrix/index.js.map +1 -1
- package/dist/cjs/data-structures/matrix/matrix.d.ts +128 -10
- package/dist/cjs/data-structures/matrix/matrix.js +400 -15
- package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +2 -2
- package/dist/cjs/data-structures/queue/deque.js +5 -7
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.d.ts +1 -1
- package/dist/cjs/types/data-structures/base/base.d.ts +1 -1
- package/dist/cjs/types/data-structures/heap/heap.d.ts +1 -1
- package/dist/cjs/types/data-structures/priority-queue/priority-queue.d.ts +1 -1
- package/dist/cjs/utils/utils.d.ts +1 -0
- package/dist/cjs/utils/utils.js +6 -1
- package/dist/cjs/utils/utils.js.map +1 -1
- package/dist/mjs/data-structures/base/iterable-base.d.ts +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +2 -1
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +2 -14
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +20 -50
- package/dist/mjs/data-structures/binary-tree/bst.js +2 -1
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +2 -1
- package/dist/mjs/data-structures/binary-tree/tree-multimap.d.ts +0 -16
- package/dist/mjs/data-structures/binary-tree/tree-multimap.js +3 -44
- package/dist/mjs/data-structures/graph/abstract-graph.d.ts +2 -11
- package/dist/mjs/data-structures/graph/abstract-graph.js +4 -20
- package/dist/mjs/data-structures/graph/directed-graph.js +4 -0
- package/dist/mjs/data-structures/hash/hash-map.d.ts +1 -1
- package/dist/mjs/data-structures/hash/hash-map.js +2 -2
- package/dist/mjs/data-structures/heap/heap.js +2 -3
- package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +2 -2
- package/dist/mjs/data-structures/linked-list/singly-linked-list.js +1 -1
- package/dist/mjs/data-structures/matrix/index.d.ts +0 -2
- package/dist/mjs/data-structures/matrix/index.js +0 -2
- package/dist/mjs/data-structures/matrix/matrix.d.ts +128 -10
- package/dist/mjs/data-structures/matrix/matrix.js +399 -16
- package/dist/mjs/data-structures/queue/deque.d.ts +2 -2
- package/dist/mjs/data-structures/queue/deque.js +7 -9
- package/dist/mjs/data-structures/queue/queue.d.ts +1 -1
- package/dist/mjs/data-structures/queue/queue.js +1 -1
- package/dist/mjs/types/data-structures/base/base.d.ts +1 -1
- package/dist/mjs/types/data-structures/heap/heap.d.ts +1 -1
- package/dist/mjs/types/data-structures/priority-queue/priority-queue.d.ts +1 -1
- package/dist/mjs/utils/utils.d.ts +1 -0
- package/dist/mjs/utils/utils.js +4 -0
- package/dist/umd/data-structure-typed.js +361 -542
- package/dist/umd/data-structure-typed.min.js +2 -2
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +4 -3
- package/src/data-structures/base/index.ts +1 -1
- package/src/data-structures/base/iterable-base.ts +7 -10
- package/src/data-structures/binary-tree/avl-tree.ts +15 -8
- package/src/data-structures/binary-tree/binary-tree.ts +57 -74
- package/src/data-structures/binary-tree/bst.ts +16 -13
- package/src/data-structures/binary-tree/rb-tree.ts +16 -10
- package/src/data-structures/binary-tree/tree-multimap.ts +11 -48
- package/src/data-structures/graph/abstract-graph.ts +14 -24
- package/src/data-structures/graph/directed-graph.ts +8 -6
- package/src/data-structures/graph/map-graph.ts +6 -1
- package/src/data-structures/graph/undirected-graph.ts +4 -7
- package/src/data-structures/hash/hash-map.ts +18 -16
- package/src/data-structures/heap/heap.ts +7 -10
- package/src/data-structures/heap/max-heap.ts +2 -1
- package/src/data-structures/heap/min-heap.ts +2 -1
- package/src/data-structures/linked-list/singly-linked-list.ts +3 -5
- package/src/data-structures/matrix/index.ts +0 -2
- package/src/data-structures/matrix/matrix.ts +442 -13
- package/src/data-structures/priority-queue/min-priority-queue.ts +11 -10
- package/src/data-structures/queue/deque.ts +18 -39
- package/src/data-structures/queue/queue.ts +1 -1
- package/src/interfaces/binary-tree.ts +7 -2
- package/src/types/common.ts +4 -4
- package/src/types/data-structures/base/base.ts +14 -3
- package/src/types/data-structures/base/index.ts +1 -1
- package/src/types/data-structures/graph/abstract-graph.ts +4 -2
- package/src/types/data-structures/hash/hash-map.ts +3 -3
- package/src/types/data-structures/heap/heap.ts +2 -2
- package/src/types/data-structures/priority-queue/priority-queue.ts +2 -2
- package/src/utils/utils.ts +7 -1
- package/test/integration/avl-tree.test.ts +18 -1
- package/test/integration/bst.test.ts +2 -2
- package/test/performance/data-structures/binary-tree/rb-tree.test.ts +1 -1
- package/test/performance/data-structures/comparison/comparison.test.ts +18 -23
- package/test/performance/data-structures/hash/hash-map.test.ts +3 -4
- package/test/performance/data-structures/linked-list/doubly-linked-list.test.ts +16 -28
- package/test/performance/data-structures/linked-list/singly-linked-list.test.ts +4 -12
- package/test/performance/data-structures/queue/deque.test.ts +11 -12
- package/test/performance/data-structures/queue/queue.test.ts +15 -14
- package/test/performance/data-structures/stack/stack.test.ts +11 -11
- package/test/performance/reportor.ts +14 -15
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +14 -3
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +65 -15
- package/test/unit/data-structures/binary-tree/bst.test.ts +52 -26
- package/test/unit/data-structures/binary-tree/overall.test.ts +16 -18
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +17 -6
- package/test/unit/data-structures/binary-tree/tree-multimap.test.ts +37 -21
- package/test/unit/data-structures/graph/abstract-graph.test.ts +11 -0
- package/test/unit/data-structures/graph/directed-graph.test.ts +112 -40
- package/test/unit/data-structures/graph/undirected-graph.test.ts +63 -33
- package/test/unit/data-structures/hash/hash-map.test.ts +64 -23
- package/test/unit/data-structures/hash/hash-table.test.ts +0 -4
- package/test/unit/data-structures/heap/heap.test.ts +0 -1
- package/test/unit/data-structures/heap/min-heap.test.ts +6 -5
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +30 -4
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +3 -4
- package/test/unit/data-structures/matrix/matrix.test.ts +345 -52
- package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +1 -1
- package/test/unit/data-structures/priority-queue/priority-queue.test.ts +0 -1
- package/test/unit/data-structures/queue/deque.test.ts +0 -6
- package/test/unit/data-structures/queue/queue.test.ts +1 -1
- package/test/unit/data-structures/stack/stack.test.ts +3 -4
- package/test/unit/unrestricted-interconversion.test.ts +50 -44
- package/test/utils/big-o.ts +14 -14
- package/test/utils/performanc.ts +1 -1
- package/typedoc.json +30 -0
- package/dist/cjs/data-structures/matrix/matrix2d.d.ts +0 -107
- package/dist/cjs/data-structures/matrix/matrix2d.js +0 -200
- package/dist/cjs/data-structures/matrix/matrix2d.js.map +0 -1
- package/dist/cjs/data-structures/matrix/vector2d.d.ts +0 -200
- package/dist/cjs/data-structures/matrix/vector2d.js +0 -291
- package/dist/cjs/data-structures/matrix/vector2d.js.map +0 -1
- package/dist/mjs/data-structures/matrix/matrix2d.d.ts +0 -107
- package/dist/mjs/data-structures/matrix/matrix2d.js +0 -196
- package/dist/mjs/data-structures/matrix/vector2d.d.ts +0 -200
- package/dist/mjs/data-structures/matrix/vector2d.js +0 -289
- package/src/data-structures/matrix/matrix2d.ts +0 -211
- package/src/data-structures/matrix/vector2d.ts +0 -315
- package/test/unit/data-structures/matrix/matrix2d.test.ts +0 -345
- package/test/unit/data-structures/matrix/vector2d.test.ts +0 -171
|
@@ -265,7 +265,22 @@ describe('BinaryTree', () => {
|
|
|
265
265
|
tree.clear();
|
|
266
266
|
tree.addMany([-10, -10, -10, 9, 9, 20, null, null, 15, 7, 8, null, 2, null, 6, null, null, 8, 8, 8]);
|
|
267
267
|
|
|
268
|
-
expect(tree.bfs(node => node ? node.key : null, undefined, undefined, true)).toEqual([
|
|
268
|
+
expect(tree.bfs(node => (node ? node.key : null), undefined, undefined, true)).toEqual([
|
|
269
|
+
-10,
|
|
270
|
+
9,
|
|
271
|
+
20,
|
|
272
|
+
null,
|
|
273
|
+
null,
|
|
274
|
+
15,
|
|
275
|
+
7,
|
|
276
|
+
8,
|
|
277
|
+
null,
|
|
278
|
+
2,
|
|
279
|
+
null,
|
|
280
|
+
6,
|
|
281
|
+
null,
|
|
282
|
+
null
|
|
283
|
+
]);
|
|
269
284
|
});
|
|
270
285
|
});
|
|
271
286
|
|
|
@@ -525,18 +540,12 @@ describe('BinaryTree', () => {
|
|
|
525
540
|
tree.add([3, 'B']);
|
|
526
541
|
tree.add([7, 'C']);
|
|
527
542
|
|
|
528
|
-
const nodes = tree.getNodes('B',
|
|
543
|
+
const nodes = tree.getNodes('B', node => node.value);
|
|
529
544
|
|
|
530
545
|
expect(nodes.length).toBe(1);
|
|
531
546
|
expect(nodes[0].key).toBe(3);
|
|
532
547
|
|
|
533
|
-
const nodesRec = tree.getNodes(
|
|
534
|
-
'B',
|
|
535
|
-
(node) => node.value,
|
|
536
|
-
false,
|
|
537
|
-
tree.root,
|
|
538
|
-
IterationType.RECURSIVE
|
|
539
|
-
);
|
|
548
|
+
const nodesRec = tree.getNodes('B', node => node.value, false, tree.root, IterationType.RECURSIVE);
|
|
540
549
|
|
|
541
550
|
expect(nodesRec.length).toBe(1);
|
|
542
551
|
expect(nodesRec[0].key).toBe(3);
|
|
@@ -548,9 +557,17 @@ describe('BinaryTree', () => {
|
|
|
548
557
|
tree.add([7, 'C']);
|
|
549
558
|
|
|
550
559
|
tree.iterationType = IterationType.ITERATIVE;
|
|
551
|
-
expect([...tree]).toEqual([
|
|
560
|
+
expect([...tree]).toEqual([
|
|
561
|
+
[3, 'B'],
|
|
562
|
+
[5, 'A'],
|
|
563
|
+
[7, 'C']
|
|
564
|
+
]);
|
|
552
565
|
tree.iterationType = IterationType.RECURSIVE;
|
|
553
|
-
expect([...tree]).toEqual([
|
|
566
|
+
expect([...tree]).toEqual([
|
|
567
|
+
[3, 'B'],
|
|
568
|
+
[5, 'A'],
|
|
569
|
+
[7, 'C']
|
|
570
|
+
]);
|
|
554
571
|
tree.iterationType = IterationType.ITERATIVE;
|
|
555
572
|
|
|
556
573
|
const result = tree.morris();
|
|
@@ -600,13 +617,20 @@ describe('BinaryTree iterative methods test', () => {
|
|
|
600
617
|
test('filter should return a new tree with filtered elements', () => {
|
|
601
618
|
const filteredTree = binaryTree.filter((value, key) => key > 1);
|
|
602
619
|
expect(filteredTree.size).toBe(2);
|
|
603
|
-
expect([...filteredTree]).toEqual([
|
|
620
|
+
expect([...filteredTree]).toEqual([
|
|
621
|
+
[3, 'c'],
|
|
622
|
+
[2, 'b']
|
|
623
|
+
]);
|
|
604
624
|
});
|
|
605
625
|
|
|
606
626
|
test('map should return a new tree with modified elements', () => {
|
|
607
627
|
const mappedTree = binaryTree.map((value, key) => (key * 2).toString());
|
|
608
628
|
expect(mappedTree.size).toBe(3);
|
|
609
|
-
expect([...mappedTree]).toEqual([
|
|
629
|
+
expect([...mappedTree]).toEqual([
|
|
630
|
+
[1, '2'],
|
|
631
|
+
[2, '4'],
|
|
632
|
+
[3, '6']
|
|
633
|
+
]);
|
|
610
634
|
});
|
|
611
635
|
|
|
612
636
|
test('reduce should accumulate values', () => {
|
|
@@ -621,7 +645,11 @@ describe('BinaryTree iterative methods test', () => {
|
|
|
621
645
|
}
|
|
622
646
|
|
|
623
647
|
expect(entries.length).toBe(3);
|
|
624
|
-
expect(entries).toEqual([
|
|
648
|
+
expect(entries).toEqual([
|
|
649
|
+
[2, 'b'],
|
|
650
|
+
[1, 'a'],
|
|
651
|
+
[3, 'c']
|
|
652
|
+
]);
|
|
625
653
|
});
|
|
626
654
|
|
|
627
655
|
test('should clone work well', () => {
|
|
@@ -639,4 +667,26 @@ describe('BinaryTree iterative methods test', () => {
|
|
|
639
667
|
const values = binaryTree.values();
|
|
640
668
|
expect([...values]).toEqual(['b', 'a', 'c']);
|
|
641
669
|
});
|
|
642
|
-
|
|
670
|
+
|
|
671
|
+
test('should iterative method return undefined when the node is null', () => {
|
|
672
|
+
const tree = new BinaryTree();
|
|
673
|
+
tree.addMany([-10, -10, -10, 9, 9, 20, null, null, 15, 7, 8, null, 2, null, 6, null, null, 8, 8, 8]);
|
|
674
|
+
const bfsResult = tree.bfs(undefined, undefined, undefined, true);
|
|
675
|
+
expect(bfsResult).toEqual([
|
|
676
|
+
-10,
|
|
677
|
+
9,
|
|
678
|
+
20,
|
|
679
|
+
undefined,
|
|
680
|
+
undefined,
|
|
681
|
+
15,
|
|
682
|
+
7,
|
|
683
|
+
8,
|
|
684
|
+
undefined,
|
|
685
|
+
2,
|
|
686
|
+
undefined,
|
|
687
|
+
6,
|
|
688
|
+
undefined,
|
|
689
|
+
undefined
|
|
690
|
+
]);
|
|
691
|
+
});
|
|
692
|
+
});
|
|
@@ -9,7 +9,22 @@ describe('BST operations test', () => {
|
|
|
9
9
|
expect(bst).toBeInstanceOf(BST);
|
|
10
10
|
bst.add([11, 11]);
|
|
11
11
|
bst.add([3, 3]);
|
|
12
|
-
const idsAndValues: [number, number][] = [
|
|
12
|
+
const idsAndValues: [number, number][] = [
|
|
13
|
+
[15, 15],
|
|
14
|
+
[1, 1],
|
|
15
|
+
[8, 8],
|
|
16
|
+
[13, 13],
|
|
17
|
+
[16, 16],
|
|
18
|
+
[2, 2],
|
|
19
|
+
[6, 6],
|
|
20
|
+
[9, 9],
|
|
21
|
+
[12, 12],
|
|
22
|
+
[14, 14],
|
|
23
|
+
[4, 4],
|
|
24
|
+
[7, 7],
|
|
25
|
+
[10, 10],
|
|
26
|
+
[5, 5]
|
|
27
|
+
];
|
|
13
28
|
bst.addMany(idsAndValues, undefined, false);
|
|
14
29
|
expect(bst.root).toBeInstanceOf(BSTNode);
|
|
15
30
|
|
|
@@ -194,22 +209,26 @@ describe('BST operations test', () => {
|
|
|
194
209
|
objBST.add([11, { name: '11', age: 11 }]);
|
|
195
210
|
objBST.add([3, { name: '3', age: 3 }]);
|
|
196
211
|
|
|
197
|
-
objBST.addMany(
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
212
|
+
objBST.addMany(
|
|
213
|
+
[15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5],
|
|
214
|
+
[
|
|
215
|
+
{ name: 'Alice', age: 15 },
|
|
216
|
+
{ name: 'Bob', age: 1 },
|
|
217
|
+
{ name: 'Charlie', age: 8 },
|
|
218
|
+
{ name: 'David', age: 13 },
|
|
219
|
+
{ name: 'Emma', age: 16 },
|
|
220
|
+
{ name: 'Frank', age: 2 },
|
|
221
|
+
{ name: 'Grace', age: 6 },
|
|
222
|
+
{ name: 'Hannah', age: 9 },
|
|
223
|
+
{ name: 'Isaac', age: 12 },
|
|
224
|
+
{ name: 'Jack', age: 14 },
|
|
225
|
+
{ name: 'Katie', age: 4 },
|
|
226
|
+
{ name: 'Liam', age: 7 },
|
|
227
|
+
{ name: 'Mia', age: 10 },
|
|
228
|
+
{ name: 'Noah', age: 5 }
|
|
229
|
+
],
|
|
230
|
+
false
|
|
231
|
+
);
|
|
213
232
|
|
|
214
233
|
expect(objBST.root).toBeInstanceOf(BSTNode);
|
|
215
234
|
|
|
@@ -596,11 +615,7 @@ describe('BST operations test recursively', () => {
|
|
|
596
615
|
[5, { key: 5, keyA: 5 }]
|
|
597
616
|
];
|
|
598
617
|
|
|
599
|
-
objBST.addMany(
|
|
600
|
-
entries,
|
|
601
|
-
undefined,
|
|
602
|
-
false
|
|
603
|
-
);
|
|
618
|
+
objBST.addMany(entries, undefined, false);
|
|
604
619
|
|
|
605
620
|
expect(objBST.root).toBeInstanceOf(BSTNode);
|
|
606
621
|
|
|
@@ -878,13 +893,20 @@ describe('BST iterative methods test', () => {
|
|
|
878
893
|
test('filter should return a new tree with filtered elements', () => {
|
|
879
894
|
const filteredTree = bst.filter((value, key) => key > 1);
|
|
880
895
|
expect(filteredTree.size).toBe(2);
|
|
881
|
-
expect([...filteredTree]).toEqual([
|
|
896
|
+
expect([...filteredTree]).toEqual([
|
|
897
|
+
[2, 'b'],
|
|
898
|
+
[3, 'c']
|
|
899
|
+
]);
|
|
882
900
|
});
|
|
883
901
|
|
|
884
902
|
test('map should return a new tree with modified elements', () => {
|
|
885
903
|
const mappedTree = bst.map((value, key) => (key * 2).toString());
|
|
886
904
|
expect(mappedTree.size).toBe(3);
|
|
887
|
-
expect([...mappedTree]).toEqual([
|
|
905
|
+
expect([...mappedTree]).toEqual([
|
|
906
|
+
[1, '2'],
|
|
907
|
+
[2, '4'],
|
|
908
|
+
[3, '6']
|
|
909
|
+
]);
|
|
888
910
|
});
|
|
889
911
|
|
|
890
912
|
test('reduce should accumulate values', () => {
|
|
@@ -899,7 +921,11 @@ describe('BST iterative methods test', () => {
|
|
|
899
921
|
}
|
|
900
922
|
|
|
901
923
|
expect(entries.length).toBe(3);
|
|
902
|
-
expect(entries).toEqual([
|
|
924
|
+
expect(entries).toEqual([
|
|
925
|
+
[1, 'a'],
|
|
926
|
+
[2, 'b'],
|
|
927
|
+
[3, 'c']
|
|
928
|
+
]);
|
|
903
929
|
});
|
|
904
930
|
|
|
905
931
|
test('should clone work well', () => {
|
|
@@ -917,4 +943,4 @@ describe('BST iterative methods test', () => {
|
|
|
917
943
|
const values = bst.values();
|
|
918
944
|
expect([...values]).toEqual(['a', 'b', 'c']);
|
|
919
945
|
});
|
|
920
|
-
});
|
|
946
|
+
});
|
|
@@ -33,24 +33,22 @@ describe('Overall BinaryTree Test', () => {
|
|
|
33
33
|
objBST.add([11, { key: 11, keyA: 11 }]);
|
|
34
34
|
objBST.add([3, { key: 3, keyA: 3 }]);
|
|
35
35
|
|
|
36
|
-
objBST.addMany(
|
|
37
|
-
[
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
]
|
|
53
|
-
);
|
|
36
|
+
objBST.addMany([
|
|
37
|
+
[15, { key: 15, keyA: 15 }],
|
|
38
|
+
[1, { key: 1, keyA: 1 }],
|
|
39
|
+
[8, { key: 8, keyA: 8 }],
|
|
40
|
+
[13, { key: 13, keyA: 13 }],
|
|
41
|
+
[16, { key: 16, keyA: 16 }],
|
|
42
|
+
[2, { key: 2, keyA: 2 }],
|
|
43
|
+
[6, { key: 6, keyA: 6 }],
|
|
44
|
+
[9, { key: 9, keyA: 9 }],
|
|
45
|
+
[12, { key: 12, keyA: 12 }],
|
|
46
|
+
[14, { key: 14, keyA: 14 }],
|
|
47
|
+
[4, { key: 4, keyA: 4 }],
|
|
48
|
+
[7, { key: 7, keyA: 7 }],
|
|
49
|
+
[10, { key: 10, keyA: 10 }],
|
|
50
|
+
[5, { key: 5, keyA: 5 }]
|
|
51
|
+
]);
|
|
54
52
|
|
|
55
53
|
objBST.delete(11);
|
|
56
54
|
|
|
@@ -501,9 +501,9 @@ describe('RedBlackTree', () => {
|
|
|
501
501
|
expect(tree.isAVLBalanced()).toBe(true);
|
|
502
502
|
|
|
503
503
|
tree.clear();
|
|
504
|
-
tree.addMany([10, 20, 30, 40, 50, 60])
|
|
504
|
+
tree.addMany([10, 20, 30, 40, 50, 60]);
|
|
505
505
|
expect(tree.isAVLBalanced()).toBe(false);
|
|
506
|
-
})
|
|
506
|
+
});
|
|
507
507
|
});
|
|
508
508
|
|
|
509
509
|
describe('RedBlackTree iterative methods test', () => {
|
|
@@ -537,13 +537,20 @@ describe('RedBlackTree iterative methods test', () => {
|
|
|
537
537
|
test('filter should return a new tree with filtered elements', () => {
|
|
538
538
|
const filteredTree = rbTree.filter((value, key) => key > 1);
|
|
539
539
|
expect(filteredTree.size).toBe(2);
|
|
540
|
-
expect([...filteredTree]).toEqual([
|
|
540
|
+
expect([...filteredTree]).toEqual([
|
|
541
|
+
[2, 'b'],
|
|
542
|
+
[3, 'c']
|
|
543
|
+
]);
|
|
541
544
|
});
|
|
542
545
|
|
|
543
546
|
test('map should return a new tree with modified elements', () => {
|
|
544
547
|
const mappedTree = rbTree.map((value, key) => (key * 2).toString());
|
|
545
548
|
expect(mappedTree.size).toBe(3);
|
|
546
|
-
expect([...mappedTree]).toEqual([
|
|
549
|
+
expect([...mappedTree]).toEqual([
|
|
550
|
+
[1, '2'],
|
|
551
|
+
[2, '4'],
|
|
552
|
+
[3, '6']
|
|
553
|
+
]);
|
|
547
554
|
});
|
|
548
555
|
|
|
549
556
|
test('reduce should accumulate values', () => {
|
|
@@ -558,6 +565,10 @@ describe('RedBlackTree iterative methods test', () => {
|
|
|
558
565
|
}
|
|
559
566
|
|
|
560
567
|
expect(entries.length).toBe(3);
|
|
561
|
-
expect(entries).toEqual([
|
|
568
|
+
expect(entries).toEqual([
|
|
569
|
+
[1, 'a'],
|
|
570
|
+
[2, 'b'],
|
|
571
|
+
[3, 'c']
|
|
572
|
+
]);
|
|
562
573
|
});
|
|
563
|
-
});
|
|
574
|
+
});
|
|
@@ -15,21 +15,30 @@ describe('TreeMultimap count', () => {
|
|
|
15
15
|
let tm: TreeMultimap<number>;
|
|
16
16
|
beforeEach(() => {
|
|
17
17
|
tm = new TreeMultimap<number>();
|
|
18
|
-
|
|
19
|
-
})
|
|
18
|
+
});
|
|
20
19
|
it('Should added isolated node count ', () => {
|
|
21
|
-
tm.addMany([
|
|
20
|
+
tm.addMany([
|
|
21
|
+
[1, 1],
|
|
22
|
+
[2, 2],
|
|
23
|
+
[3, 3],
|
|
24
|
+
[4, 4],
|
|
25
|
+
[5, 5]
|
|
26
|
+
]);
|
|
22
27
|
const newNode = new TreeMultimapNode(3, 33, 10);
|
|
23
28
|
tm.add(newNode);
|
|
24
|
-
expect(tm.count).toBe(15)
|
|
25
|
-
})
|
|
29
|
+
expect(tm.count).toBe(15);
|
|
30
|
+
});
|
|
26
31
|
|
|
27
32
|
it('Should count', () => {
|
|
28
|
-
tm.addMany([
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
tm.addMany([
|
|
34
|
+
[1, 1],
|
|
35
|
+
[2, 2],
|
|
36
|
+
[3, 3]
|
|
37
|
+
]);
|
|
38
|
+
tm.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 1);
|
|
39
|
+
expect(tm.count).toBe(7);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
33
42
|
|
|
34
43
|
describe('TreeMultimap operations test1', () => {
|
|
35
44
|
it('should perform various operations on a Binary Search Tree with numeric values1', () => {
|
|
@@ -256,7 +265,7 @@ describe('TreeMultimap operations test1', () => {
|
|
|
256
265
|
expect(objTreeMultimap).toBeInstanceOf(TreeMultimap);
|
|
257
266
|
objTreeMultimap.add([11, { key: 11, keyA: 11 }]);
|
|
258
267
|
objTreeMultimap.add([3, { key: 3, keyA: 3 }]);
|
|
259
|
-
const values: [number, { key: number
|
|
268
|
+
const values: [number, { key: number; keyA: number }][] = [
|
|
260
269
|
[15, { key: 15, keyA: 15 }],
|
|
261
270
|
[1, { key: 1, keyA: 1 }],
|
|
262
271
|
[8, { key: 8, keyA: 8 }],
|
|
@@ -273,9 +282,7 @@ describe('TreeMultimap operations test1', () => {
|
|
|
273
282
|
[5, { key: 5, keyA: 5 }]
|
|
274
283
|
];
|
|
275
284
|
|
|
276
|
-
objTreeMultimap.addMany(
|
|
277
|
-
values
|
|
278
|
-
);
|
|
285
|
+
objTreeMultimap.addMany(values);
|
|
279
286
|
|
|
280
287
|
expect(objTreeMultimap.root).toBeInstanceOf(TreeMultimapNode);
|
|
281
288
|
|
|
@@ -529,9 +536,7 @@ describe('TreeMultimap operations test recursively1', () => {
|
|
|
529
536
|
[5, { key: 5, keyA: 5 }]
|
|
530
537
|
];
|
|
531
538
|
|
|
532
|
-
objTreeMultimap.addMany(
|
|
533
|
-
values
|
|
534
|
-
);
|
|
539
|
+
objTreeMultimap.addMany(values);
|
|
535
540
|
|
|
536
541
|
expect(objTreeMultimap.root).toBeInstanceOf(TreeMultimapNode);
|
|
537
542
|
|
|
@@ -632,13 +637,20 @@ describe('TreeMultimap iterative methods test', () => {
|
|
|
632
637
|
test('filter should return a new tree with filtered elements', () => {
|
|
633
638
|
const filteredTree = treeMM.filter((value, key) => key > 1);
|
|
634
639
|
expect(filteredTree.size).toBe(2);
|
|
635
|
-
expect([...filteredTree]).toEqual([
|
|
640
|
+
expect([...filteredTree]).toEqual([
|
|
641
|
+
[2, 'b'],
|
|
642
|
+
[3, 'c']
|
|
643
|
+
]);
|
|
636
644
|
});
|
|
637
645
|
|
|
638
646
|
test('map should return a new tree with modified elements', () => {
|
|
639
647
|
const mappedTree = treeMM.map((value, key) => (key * 2).toString());
|
|
640
648
|
expect(mappedTree.size).toBe(3);
|
|
641
|
-
expect([...mappedTree]).toEqual([
|
|
649
|
+
expect([...mappedTree]).toEqual([
|
|
650
|
+
[1, '2'],
|
|
651
|
+
[2, '4'],
|
|
652
|
+
[3, '6']
|
|
653
|
+
]);
|
|
642
654
|
});
|
|
643
655
|
|
|
644
656
|
test('reduce should accumulate values', () => {
|
|
@@ -653,11 +665,15 @@ describe('TreeMultimap iterative methods test', () => {
|
|
|
653
665
|
}
|
|
654
666
|
|
|
655
667
|
expect(entries.length).toBe(3);
|
|
656
|
-
expect(entries).toEqual([
|
|
668
|
+
expect(entries).toEqual([
|
|
669
|
+
[1, 'a'],
|
|
670
|
+
[2, 'b'],
|
|
671
|
+
[3, 'c']
|
|
672
|
+
]);
|
|
657
673
|
});
|
|
658
674
|
|
|
659
675
|
test('should clone work well', () => {
|
|
660
|
-
expect(treeMM.count).toBe(21)
|
|
676
|
+
expect(treeMM.count).toBe(21);
|
|
661
677
|
const cloned = treeMM.clone();
|
|
662
678
|
expect(cloned.root?.left?.key).toBe(1);
|
|
663
679
|
expect(cloned.root?.right?.value).toBe('c');
|
|
@@ -66,6 +66,17 @@ class MyGraph<
|
|
|
66
66
|
return edge ? undefined : undefined;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
+
deleteVertex(vertexOrKey: VertexKey | VO): boolean {
|
|
70
|
+
let vertexKey: VertexKey;
|
|
71
|
+
if (this.isVertexKey(vertexOrKey)) {
|
|
72
|
+
vertexKey = vertexOrKey;
|
|
73
|
+
} else {
|
|
74
|
+
vertexKey = vertexOrKey.key;
|
|
75
|
+
}
|
|
76
|
+
this._vertexMap.delete(vertexKey);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
|
|
69
80
|
protected _addEdge(edge: EO): boolean {
|
|
70
81
|
return edge ? true : true;
|
|
71
82
|
}
|
|
@@ -378,11 +378,61 @@ describe('Inherit from DirectedGraph and perform operations test2.', () => {
|
|
|
378
378
|
|
|
379
379
|
expect(predecessor).toBeInstanceOf(Array);
|
|
380
380
|
expect(predecessor.length).toBe(9);
|
|
381
|
-
expect(predecessor[0]).toEqual([
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
381
|
+
expect(predecessor[0]).toEqual([
|
|
382
|
+
vertex2,
|
|
383
|
+
undefined,
|
|
384
|
+
vertex2,
|
|
385
|
+
undefined,
|
|
386
|
+
vertex3,
|
|
387
|
+
undefined,
|
|
388
|
+
vertex4,
|
|
389
|
+
undefined,
|
|
390
|
+
undefined
|
|
391
|
+
]);
|
|
392
|
+
expect(predecessor[1]).toEqual([
|
|
393
|
+
undefined,
|
|
394
|
+
vertex1,
|
|
395
|
+
undefined,
|
|
396
|
+
vertex1,
|
|
397
|
+
vertex3,
|
|
398
|
+
undefined,
|
|
399
|
+
vertex4,
|
|
400
|
+
undefined,
|
|
401
|
+
vertex1
|
|
402
|
+
]);
|
|
403
|
+
expect(predecessor[5]).toEqual([
|
|
404
|
+
undefined,
|
|
405
|
+
undefined,
|
|
406
|
+
undefined,
|
|
407
|
+
undefined,
|
|
408
|
+
undefined,
|
|
409
|
+
undefined,
|
|
410
|
+
undefined,
|
|
411
|
+
undefined,
|
|
412
|
+
undefined
|
|
413
|
+
]);
|
|
414
|
+
expect(predecessor[7]).toEqual([
|
|
415
|
+
undefined,
|
|
416
|
+
undefined,
|
|
417
|
+
undefined,
|
|
418
|
+
undefined,
|
|
419
|
+
undefined,
|
|
420
|
+
undefined,
|
|
421
|
+
undefined,
|
|
422
|
+
undefined,
|
|
423
|
+
undefined
|
|
424
|
+
]);
|
|
425
|
+
expect(predecessor[8]).toEqual([
|
|
426
|
+
vertex7,
|
|
427
|
+
vertex7,
|
|
428
|
+
vertex7,
|
|
429
|
+
vertex7,
|
|
430
|
+
vertex7,
|
|
431
|
+
undefined,
|
|
432
|
+
undefined,
|
|
433
|
+
undefined,
|
|
434
|
+
vertex7
|
|
435
|
+
]);
|
|
386
436
|
}
|
|
387
437
|
|
|
388
438
|
const dijkstraRes12tt = myGraph.dijkstra(1, 2, true, true);
|
|
@@ -622,7 +672,10 @@ describe('DirectedGraph iterative Methods', () => {
|
|
|
622
672
|
|
|
623
673
|
test('filter should return vertexMap that satisfy the condition', () => {
|
|
624
674
|
const filtered = graph.filter((value, vertex) => vertex === 'A' || vertex === 'B');
|
|
625
|
-
expect(filtered).toEqual([
|
|
675
|
+
expect(filtered).toEqual([
|
|
676
|
+
['A', undefined],
|
|
677
|
+
['B', undefined]
|
|
678
|
+
]);
|
|
626
679
|
});
|
|
627
680
|
|
|
628
681
|
test('map should apply a function to each vertex and return a new array', () => {
|
|
@@ -635,42 +688,55 @@ describe('DirectedGraph iterative Methods', () => {
|
|
|
635
688
|
expect(concatenated).toBe(vertexMap.join(''));
|
|
636
689
|
});
|
|
637
690
|
|
|
638
|
-
test('Removing an edge of a DirectedGraph should
|
|
691
|
+
test('Removing an edge of a DirectedGraph should delete additional edges', () => {
|
|
639
692
|
const dg = new DirectedGraph();
|
|
640
|
-
dg.addVertex('hello')
|
|
641
|
-
dg.addVertex('hi')
|
|
642
|
-
dg.addVertex('hey')
|
|
643
|
-
dg.addEdge('hello', 'hi')
|
|
644
|
-
dg.addEdge('hello', 'hey')
|
|
645
|
-
expect(dg.getEdge('hello', 'hi')?.src).toBe('hello')
|
|
646
|
-
expect(dg.getEdge('hello', 'hi')?.dest).toBe('hi')
|
|
647
|
-
expect(dg.getEdge('hello', 'hey')?.src).toBe('hello')
|
|
648
|
-
expect(dg.getEdge('hello', 'hey')?.dest).toBe('hey')
|
|
649
|
-
dg.deleteEdge('hello', 'hi')
|
|
650
|
-
expect(dg.getEdge('hello', 'hi')).toBe(undefined)
|
|
651
|
-
expect(dg.getEdge('hello', 'hey')).toBeInstanceOf(DirectedEdge)
|
|
693
|
+
dg.addVertex('hello');
|
|
694
|
+
dg.addVertex('hi');
|
|
695
|
+
dg.addVertex('hey');
|
|
696
|
+
dg.addEdge('hello', 'hi');
|
|
697
|
+
dg.addEdge('hello', 'hey');
|
|
698
|
+
expect(dg.getEdge('hello', 'hi')?.src).toBe('hello');
|
|
699
|
+
expect(dg.getEdge('hello', 'hi')?.dest).toBe('hi');
|
|
700
|
+
expect(dg.getEdge('hello', 'hey')?.src).toBe('hello');
|
|
701
|
+
expect(dg.getEdge('hello', 'hey')?.dest).toBe('hey');
|
|
702
|
+
dg.deleteEdge('hello', 'hi');
|
|
703
|
+
expect(dg.getEdge('hello', 'hi')).toBe(undefined);
|
|
704
|
+
expect(dg.getEdge('hello', 'hey')).toBeInstanceOf(DirectedEdge);
|
|
705
|
+
expect(dg.incomingEdgesOf('Hi')).toEqual([]);
|
|
652
706
|
});
|
|
653
707
|
|
|
654
|
-
test('Removing a vertex
|
|
708
|
+
test('Removing a vertex of a DirectedGraph should delete additional edges', () => {
|
|
709
|
+
const graph = new DirectedGraph();
|
|
710
|
+
|
|
711
|
+
graph.addVertex('Hello');
|
|
712
|
+
graph.addVertex('Hi');
|
|
713
|
+
|
|
714
|
+
graph.addEdge('Hello', 'Hi');
|
|
715
|
+
graph.deleteVertex('Hello');
|
|
716
|
+
|
|
717
|
+
expect(graph.incomingEdgesOf('Hi')).toEqual([]);
|
|
718
|
+
});
|
|
719
|
+
|
|
720
|
+
test('Removing a vertex from a DirectedGraph should remove its edges', () => {
|
|
655
721
|
const dg = new DirectedGraph();
|
|
656
|
-
dg.addVertex('hello')
|
|
657
|
-
dg.addVertex('world')
|
|
658
|
-
dg.addVertex('earth')
|
|
722
|
+
dg.addVertex('hello');
|
|
723
|
+
dg.addVertex('world');
|
|
724
|
+
dg.addVertex('earth');
|
|
659
725
|
|
|
660
|
-
dg.addEdge('hello', 'world')
|
|
661
|
-
dg.addEdge('hello', 'earth')
|
|
662
|
-
dg.addEdge('world', 'earth')
|
|
726
|
+
dg.addEdge('hello', 'world');
|
|
727
|
+
dg.addEdge('hello', 'earth');
|
|
728
|
+
dg.addEdge('world', 'earth');
|
|
663
729
|
|
|
664
730
|
expect(dg.getEdge('hello', 'world')?.src).toBe('hello');
|
|
665
|
-
expect(dg.edgeSet().length).toBe(3)
|
|
666
|
-
expect(dg.edgeSet()[0].dest).toBe('world')
|
|
731
|
+
expect(dg.edgeSet().length).toBe(3);
|
|
732
|
+
expect(dg.edgeSet()[0].dest).toBe('world');
|
|
667
733
|
|
|
668
|
-
dg.deleteVertex('hello')
|
|
669
|
-
expect(dg.edgeSet().length).toBe(1)
|
|
670
|
-
expect(dg.edgeSet()?.[0].src).toBe('world')
|
|
734
|
+
dg.deleteVertex('hello');
|
|
735
|
+
expect(dg.edgeSet().length).toBe(1);
|
|
736
|
+
expect(dg.edgeSet()?.[0].src).toBe('world');
|
|
671
737
|
|
|
672
738
|
expect(dg.getEdge('hello', 'world')).toBe(undefined);
|
|
673
|
-
})
|
|
739
|
+
});
|
|
674
740
|
});
|
|
675
741
|
|
|
676
742
|
describe('DirectedGraph getCycles', () => {
|
|
@@ -689,8 +755,8 @@ describe('DirectedGraph getCycles', () => {
|
|
|
689
755
|
graph.addEdge('E', 'B');
|
|
690
756
|
const cycles = graph.getCycles();
|
|
691
757
|
expect(cycles.length).toBe(1);
|
|
692
|
-
expect(cycles[0]).toEqual([
|
|
693
|
-
})
|
|
758
|
+
expect(cycles[0]).toEqual(['B', 'D', 'E']);
|
|
759
|
+
});
|
|
694
760
|
|
|
695
761
|
test('should simple cycles graph getCycles return correct result', () => {
|
|
696
762
|
const graph = new DirectedGraph();
|
|
@@ -706,8 +772,11 @@ describe('DirectedGraph getCycles', () => {
|
|
|
706
772
|
graph.addEdge('A', 'D');
|
|
707
773
|
graph.addEdge('D', 'C');
|
|
708
774
|
const cycles = graph.getCycles();
|
|
709
|
-
expect(cycles.length).toBe(2)
|
|
710
|
-
expect(cycles).toEqual([
|
|
775
|
+
expect(cycles.length).toBe(2);
|
|
776
|
+
expect(cycles).toEqual([
|
|
777
|
+
['A', 'B', 'C'],
|
|
778
|
+
['A', 'D', 'C']
|
|
779
|
+
]);
|
|
711
780
|
});
|
|
712
781
|
|
|
713
782
|
test('should 3 cycles graph getCycles return correct result', () => {
|
|
@@ -733,8 +802,11 @@ describe('DirectedGraph getCycles', () => {
|
|
|
733
802
|
graph.addEdge('G', 'A');
|
|
734
803
|
|
|
735
804
|
const cycles = graph.getCycles();
|
|
736
|
-
expect(cycles.length).toBe(3)
|
|
737
|
-
expect(cycles).toEqual([
|
|
805
|
+
expect(cycles.length).toBe(3);
|
|
806
|
+
expect(cycles).toEqual([
|
|
807
|
+
['A', 'C', 'G'],
|
|
808
|
+
['B', 'D', 'E'],
|
|
809
|
+
['B', 'F', 'E']
|
|
810
|
+
]);
|
|
738
811
|
});
|
|
739
|
-
})
|
|
740
|
-
|
|
812
|
+
});
|