data-structure-typed 1.50.1 → 1.50.3
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/README.md +30 -28
- package/README_zh-CN.md +1 -1
- package/SPECIFICATION.md +56 -0
- package/SPONSOR-zh-CN.md +90 -0
- package/SPONSOR.md +54 -0
- package/benchmark/report.html +13 -13
- package/benchmark/report.json +149 -161
- package/dist/cjs/data-structures/base/iterable-base.d.ts +120 -9
- package/dist/cjs/data-structures/base/iterable-base.js +143 -7
- package/dist/cjs/data-structures/base/iterable-base.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +72 -47
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +101 -72
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.d.ts +22 -0
- package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js +22 -0
- 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 +244 -199
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +484 -376
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +92 -79
- package/dist/cjs/data-structures/binary-tree/bst.js +68 -76
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +127 -57
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +152 -99
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/segment-tree.d.ts +99 -6
- package/dist/cjs/data-structures/binary-tree/segment-tree.js +127 -10
- package/dist/cjs/data-structures/binary-tree/segment-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multimap.d.ts +72 -58
- package/dist/cjs/data-structures/binary-tree/tree-multimap.js +102 -85
- package/dist/cjs/data-structures/binary-tree/tree-multimap.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +1 -78
- package/dist/cjs/data-structures/graph/abstract-graph.js +3 -189
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/directed-graph.d.ts +73 -0
- package/dist/cjs/data-structures/graph/directed-graph.js +131 -0
- package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/map-graph.d.ts +8 -0
- package/dist/cjs/data-structures/graph/map-graph.js +14 -0
- package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/undirected-graph.d.ts +76 -7
- package/dist/cjs/data-structures/graph/undirected-graph.js +151 -18
- package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.d.ts +254 -28
- package/dist/cjs/data-structures/hash/hash-map.js +347 -78
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.d.ts +95 -25
- package/dist/cjs/data-structures/heap/heap.js +95 -26
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +126 -63
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +141 -77
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +154 -106
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js +164 -115
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/skip-linked-list.d.ts +63 -36
- package/dist/cjs/data-structures/linked-list/skip-linked-list.js +63 -36
- package/dist/cjs/data-structures/linked-list/skip-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/matrix/matrix.d.ts +35 -4
- package/dist/cjs/data-structures/matrix/matrix.js +50 -11
- package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +10 -0
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.js +10 -0
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +11 -0
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js +11 -0
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/priority-queue.d.ts +8 -0
- package/dist/cjs/data-structures/priority-queue/priority-queue.js +8 -0
- package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +139 -35
- package/dist/cjs/data-structures/queue/deque.js +200 -62
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.d.ts +103 -49
- package/dist/cjs/data-structures/queue/queue.js +111 -49
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/data-structures/stack/stack.d.ts +51 -21
- package/dist/cjs/data-structures/stack/stack.js +58 -22
- package/dist/cjs/data-structures/stack/stack.js.map +1 -1
- package/dist/cjs/data-structures/tree/tree.d.ts +57 -3
- package/dist/cjs/data-structures/tree/tree.js +77 -11
- package/dist/cjs/data-structures/tree/tree.js.map +1 -1
- package/dist/cjs/data-structures/trie/trie.d.ts +135 -34
- package/dist/cjs/data-structures/trie/trie.js +153 -33
- package/dist/cjs/data-structures/trie/trie.js.map +1 -1
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
- package/dist/cjs/types/data-structures/hash/hash-map.d.ts +4 -3
- package/dist/cjs/types/utils/utils.d.ts +1 -0
- package/dist/mjs/data-structures/base/iterable-base.d.ts +120 -9
- package/dist/mjs/data-structures/base/iterable-base.js +143 -7
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +72 -47
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +102 -73
- package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.d.ts +22 -0
- package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.js +22 -0
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +244 -199
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +483 -375
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +92 -79
- package/dist/mjs/data-structures/binary-tree/bst.js +68 -76
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +127 -57
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +153 -100
- package/dist/mjs/data-structures/binary-tree/segment-tree.d.ts +99 -6
- package/dist/mjs/data-structures/binary-tree/segment-tree.js +127 -10
- package/dist/mjs/data-structures/binary-tree/tree-multimap.d.ts +72 -58
- package/dist/mjs/data-structures/binary-tree/tree-multimap.js +102 -86
- package/dist/mjs/data-structures/graph/abstract-graph.d.ts +1 -78
- package/dist/mjs/data-structures/graph/abstract-graph.js +3 -188
- package/dist/mjs/data-structures/graph/directed-graph.d.ts +73 -0
- package/dist/mjs/data-structures/graph/directed-graph.js +131 -0
- package/dist/mjs/data-structures/graph/map-graph.d.ts +8 -0
- package/dist/mjs/data-structures/graph/map-graph.js +14 -0
- package/dist/mjs/data-structures/graph/undirected-graph.d.ts +76 -7
- package/dist/mjs/data-structures/graph/undirected-graph.js +152 -19
- package/dist/mjs/data-structures/hash/hash-map.d.ts +254 -28
- package/dist/mjs/data-structures/hash/hash-map.js +353 -84
- package/dist/mjs/data-structures/heap/heap.d.ts +95 -25
- package/dist/mjs/data-structures/heap/heap.js +95 -26
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +126 -63
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +144 -80
- package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +154 -106
- package/dist/mjs/data-structures/linked-list/singly-linked-list.js +166 -117
- package/dist/mjs/data-structures/linked-list/skip-linked-list.d.ts +63 -36
- package/dist/mjs/data-structures/linked-list/skip-linked-list.js +63 -36
- package/dist/mjs/data-structures/matrix/matrix.d.ts +35 -4
- package/dist/mjs/data-structures/matrix/matrix.js +50 -11
- package/dist/mjs/data-structures/priority-queue/max-priority-queue.d.ts +10 -0
- package/dist/mjs/data-structures/priority-queue/max-priority-queue.js +10 -0
- package/dist/mjs/data-structures/priority-queue/min-priority-queue.d.ts +11 -0
- package/dist/mjs/data-structures/priority-queue/min-priority-queue.js +11 -0
- package/dist/mjs/data-structures/priority-queue/priority-queue.d.ts +8 -0
- package/dist/mjs/data-structures/priority-queue/priority-queue.js +8 -0
- package/dist/mjs/data-structures/queue/deque.d.ts +139 -35
- package/dist/mjs/data-structures/queue/deque.js +205 -67
- package/dist/mjs/data-structures/queue/queue.d.ts +103 -49
- package/dist/mjs/data-structures/queue/queue.js +111 -49
- package/dist/mjs/data-structures/stack/stack.d.ts +51 -21
- package/dist/mjs/data-structures/stack/stack.js +58 -22
- package/dist/mjs/data-structures/tree/tree.d.ts +57 -3
- package/dist/mjs/data-structures/tree/tree.js +80 -14
- package/dist/mjs/data-structures/trie/trie.d.ts +135 -34
- package/dist/mjs/data-structures/trie/trie.js +156 -36
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
- package/dist/mjs/types/data-structures/hash/hash-map.d.ts +4 -3
- package/dist/mjs/types/utils/utils.d.ts +1 -0
- package/dist/umd/data-structure-typed.js +3121 -1583
- package/dist/umd/data-structure-typed.min.js +3 -3
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +61 -55
- package/src/data-structures/base/iterable-base.ts +184 -19
- package/src/data-structures/binary-tree/avl-tree.ts +134 -100
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +22 -0
- package/src/data-structures/binary-tree/binary-tree.ts +674 -671
- package/src/data-structures/binary-tree/bst.ts +127 -136
- package/src/data-structures/binary-tree/rb-tree.ts +199 -166
- package/src/data-structures/binary-tree/segment-tree.ts +145 -11
- package/src/data-structures/binary-tree/tree-multimap.ts +138 -115
- package/src/data-structures/graph/abstract-graph.ts +4 -211
- package/src/data-structures/graph/directed-graph.ts +152 -0
- package/src/data-structures/graph/map-graph.ts +15 -0
- package/src/data-structures/graph/undirected-graph.ts +171 -19
- package/src/data-structures/hash/hash-map.ts +389 -96
- package/src/data-structures/heap/heap.ts +97 -26
- package/src/data-structures/linked-list/doubly-linked-list.ts +156 -83
- package/src/data-structures/linked-list/singly-linked-list.ts +174 -120
- package/src/data-structures/linked-list/skip-linked-list.ts +63 -37
- package/src/data-structures/matrix/matrix.ts +52 -12
- package/src/data-structures/priority-queue/max-priority-queue.ts +10 -0
- package/src/data-structures/priority-queue/min-priority-queue.ts +11 -0
- package/src/data-structures/priority-queue/priority-queue.ts +8 -0
- package/src/data-structures/queue/deque.ts +225 -70
- package/src/data-structures/queue/queue.ts +118 -49
- package/src/data-structures/stack/stack.ts +63 -23
- package/src/data-structures/tree/tree.ts +89 -15
- package/src/data-structures/trie/trie.ts +173 -38
- package/src/types/data-structures/binary-tree/binary-tree.ts +1 -1
- package/src/types/data-structures/hash/hash-map.ts +4 -3
- package/src/types/utils/utils.ts +2 -0
- package/test/performance/data-structures/graph/directed-graph.test.ts +4 -4
- package/test/performance/data-structures/queue/deque.test.ts +26 -25
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +37 -0
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +46 -17
- package/test/unit/data-structures/binary-tree/bst.test.ts +65 -1
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +38 -1
- package/test/unit/data-structures/binary-tree/tree-multimap.test.ts +37 -32
- package/test/unit/data-structures/graph/abstract-graph.test.ts +11 -0
- package/test/unit/data-structures/graph/directed-graph.test.ts +190 -5
- package/test/unit/data-structures/graph/undirected-graph.test.ts +263 -18
- package/test/unit/data-structures/hash/hash-map.test.ts +376 -353
- package/test/unit/data-structures/heap/heap.test.ts +18 -1
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +24 -5
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +20 -2
- package/test/unit/data-structures/linked-list/skip-list.test.ts +1 -1
- package/test/unit/data-structures/queue/deque.test.ts +65 -5
- package/test/unit/data-structures/queue/queue.test.ts +24 -5
- package/test/unit/data-structures/stack/stack.test.ts +17 -0
- package/test/unit/data-structures/trie/trie.test.ts +17 -0
|
@@ -795,6 +795,70 @@ describe('BST operations test recursively', () => {
|
|
|
795
795
|
expect(bfsNodes[1].key).toBe(12);
|
|
796
796
|
expect(bfsNodes[2].key).toBe(16);
|
|
797
797
|
});
|
|
798
|
+
|
|
799
|
+
it('should delete', () => {
|
|
800
|
+
const numBST = new BST<number>();
|
|
801
|
+
numBST.addMany([2, 4, 5, 3, 1]);
|
|
802
|
+
expect(numBST.size).toBe(5);
|
|
803
|
+
numBST.delete(1);
|
|
804
|
+
expect(numBST.size).toBe(4);
|
|
805
|
+
|
|
806
|
+
numBST.delete(2);
|
|
807
|
+
numBST.delete(3);
|
|
808
|
+
numBST.delete(4);
|
|
809
|
+
numBST.delete(5);
|
|
810
|
+
expect(numBST.size).toBe(0);
|
|
811
|
+
numBST.delete(5);
|
|
812
|
+
expect(numBST.size).toBe(0);
|
|
813
|
+
});
|
|
814
|
+
|
|
815
|
+
it('should the clone method', () => {
|
|
816
|
+
function checkTreeStructure(bst: BST<string, number>) {
|
|
817
|
+
expect(bst.size).toBe(4);
|
|
818
|
+
expect(bst.root?.key).toBe('2');
|
|
819
|
+
expect(bst.root?.left?.key).toBe('1');
|
|
820
|
+
expect(bst.root?.left?.left?.key).toBe(undefined);
|
|
821
|
+
expect(bst.root?.left?.right?.key).toBe(undefined);
|
|
822
|
+
expect(bst.root?.right?.key).toBe('4');
|
|
823
|
+
expect(bst.root?.right?.left?.key).toBe(undefined);
|
|
824
|
+
expect(bst.root?.right?.right?.key).toBe('5');
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
const bst = new BST<string, number>();
|
|
828
|
+
bst.addMany([
|
|
829
|
+
['2', 2],
|
|
830
|
+
['4', 4],
|
|
831
|
+
['5', 5],
|
|
832
|
+
['3', 3],
|
|
833
|
+
['1', 1]
|
|
834
|
+
]);
|
|
835
|
+
expect(bst.size).toBe(5);
|
|
836
|
+
expect(bst.root?.key).toBe('3');
|
|
837
|
+
expect(bst.root?.left?.key).toBe('1');
|
|
838
|
+
expect(bst.root?.left?.left?.key).toBe(undefined);
|
|
839
|
+
expect(bst.root?.left?.right?.key).toBe('2');
|
|
840
|
+
expect(bst.root?.right?.key).toBe('4');
|
|
841
|
+
expect(bst.root?.right?.left?.key).toBe(undefined);
|
|
842
|
+
expect(bst.root?.right?.right?.key).toBe('5');
|
|
843
|
+
bst.delete('3');
|
|
844
|
+
checkTreeStructure(bst);
|
|
845
|
+
const cloned = bst.clone();
|
|
846
|
+
checkTreeStructure(cloned);
|
|
847
|
+
bst.delete('2');
|
|
848
|
+
bst.delete('1');
|
|
849
|
+
bst.delete('4');
|
|
850
|
+
bst.delete('5');
|
|
851
|
+
expect(bst.size).toBe(0);
|
|
852
|
+
|
|
853
|
+
cloned.delete('1');
|
|
854
|
+
expect(bst.size).toBe(0);
|
|
855
|
+
expect(cloned.size).toBe(3);
|
|
856
|
+
cloned.delete('2');
|
|
857
|
+
cloned.delete('3');
|
|
858
|
+
cloned.delete('4');
|
|
859
|
+
cloned.delete('5');
|
|
860
|
+
expect(cloned.size).toBe(0);
|
|
861
|
+
});
|
|
798
862
|
});
|
|
799
863
|
|
|
800
864
|
describe('BST isBST', function () {
|
|
@@ -865,7 +929,7 @@ describe('BST Performance test', function () {
|
|
|
865
929
|
// expect(bst.lastKey()).toBe(9);
|
|
866
930
|
});
|
|
867
931
|
|
|
868
|
-
it('should
|
|
932
|
+
it('should dfs as sub tree traversal, null should be ignored', () => {
|
|
869
933
|
const bst = new BST();
|
|
870
934
|
bst.addMany([4, 2, 6, 1, 3, 5, 7]);
|
|
871
935
|
expect(bst.dfs(node => node.key, 'pre', bst.getNode(6), IterationType.ITERATIVE)).toEqual([6, 5, 7]);
|
|
@@ -138,9 +138,46 @@ describe('RedBlackTree', () => {
|
|
|
138
138
|
expect(predecessorNode).toBe(tree.getNode(10));
|
|
139
139
|
});
|
|
140
140
|
});
|
|
141
|
+
|
|
142
|
+
it('should the clone method', () => {
|
|
143
|
+
function checkTreeStructure(rbTree: RedBlackTree<string, number>) {
|
|
144
|
+
expect(rbTree.size).toBe(4);
|
|
145
|
+
expect(rbTree.root?.key).toBe('2');
|
|
146
|
+
expect(rbTree.root?.left?.key).toBe('1');
|
|
147
|
+
expect(rbTree.root?.left?.left?.key).toBe(NaN);
|
|
148
|
+
expect(rbTree.root?.left?.right?.key).toBe(NaN);
|
|
149
|
+
expect(rbTree.root?.right?.key).toBe('4');
|
|
150
|
+
expect(rbTree.root?.right?.left?.key).toBe(NaN);
|
|
151
|
+
expect(rbTree.root?.right?.right?.key).toBe('5');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const rbTree = new RedBlackTree<string, number>();
|
|
155
|
+
rbTree.addMany([
|
|
156
|
+
['2', 2],
|
|
157
|
+
['4', 4],
|
|
158
|
+
['5', 5],
|
|
159
|
+
['3', 3],
|
|
160
|
+
['1', 1]
|
|
161
|
+
]);
|
|
162
|
+
expect(rbTree.size).toBe(5);
|
|
163
|
+
expect(rbTree.root?.key).toBe('2');
|
|
164
|
+
expect(rbTree.root?.left?.key).toBe('1');
|
|
165
|
+
expect(rbTree.root?.left?.left?.key).toBe(NaN);
|
|
166
|
+
expect(rbTree.root?.left?.right?.key).toBe(NaN);
|
|
167
|
+
expect(rbTree.root?.right?.key).toBe('4');
|
|
168
|
+
expect(rbTree.root?.right?.left?.key).toBe('3');
|
|
169
|
+
expect(rbTree.root?.right?.right?.key).toBe('5');
|
|
170
|
+
rbTree.delete('3');
|
|
171
|
+
checkTreeStructure(rbTree);
|
|
172
|
+
const cloned = rbTree.clone();
|
|
173
|
+
checkTreeStructure(cloned);
|
|
174
|
+
cloned.delete('1');
|
|
175
|
+
expect(rbTree.size).toBe(4);
|
|
176
|
+
expect(cloned.size).toBe(3);
|
|
177
|
+
});
|
|
141
178
|
});
|
|
142
179
|
|
|
143
|
-
describe('RedBlackTree', () => {
|
|
180
|
+
describe('RedBlackTree 2', () => {
|
|
144
181
|
let tree: RedBlackTree<number>;
|
|
145
182
|
|
|
146
183
|
beforeEach(() => {
|
|
@@ -555,38 +555,6 @@ describe('TreeMultimap Performance test', function () {
|
|
|
555
555
|
beforeEach(() => {
|
|
556
556
|
treeMS.clear();
|
|
557
557
|
});
|
|
558
|
-
it(`Observe the time consumption of TreeMultimap.add fitting O(n log n)`, function () {
|
|
559
|
-
// // Create a benchmark suite
|
|
560
|
-
// const suite = new Benchmark.Suite();
|
|
561
|
-
// // Define a function to generate a random array of a given size
|
|
562
|
-
// function generateRandomArray(size: number): number[] {
|
|
563
|
-
// const arr: number[] = [];
|
|
564
|
-
// for (let i = 0; i < size; i++) {
|
|
565
|
-
// arr.push(Math.floor(Math.random() * size));
|
|
566
|
-
// }
|
|
567
|
-
// return arr;
|
|
568
|
-
// }
|
|
569
|
-
// const inputArray = generateRandomArray(inputSize[0]);
|
|
570
|
-
//
|
|
571
|
-
// suite.add(`TreeMultimap addMany (n=${inputSize[0]})`, () => {
|
|
572
|
-
// treeMS.addMany([...inputArray]);
|
|
573
|
-
// });
|
|
574
|
-
//
|
|
575
|
-
// // Run the benchmarks
|
|
576
|
-
// suite
|
|
577
|
-
// .on('cycle', (event: any) => {
|
|
578
|
-
// const benchmark = event.target;
|
|
579
|
-
// const n = parseInt(benchmark.name.split('=')[1]);
|
|
580
|
-
// const observedTime = benchmark.times.elapsed;
|
|
581
|
-
// const expected = expectedTime(n);
|
|
582
|
-
// console.log(`Input size (n): ${n}, Observed time: ${observedTime.toFixed(2)}ms, Expected time: ${expected.toFixed(2)}ms`);
|
|
583
|
-
// })
|
|
584
|
-
// .on('complete', () => {
|
|
585
|
-
// console.log(`Benchmark (n=${inputSize[0]}) completed.`);
|
|
586
|
-
// done(); // Call done to indicate the test is complete
|
|
587
|
-
// })
|
|
588
|
-
// .run({async: true});
|
|
589
|
-
});
|
|
590
558
|
|
|
591
559
|
it(`Observe the time consumption of TreeMultimap.dfs be good`, function () {
|
|
592
560
|
const startDFS = performance.now();
|
|
@@ -604,6 +572,43 @@ describe('TreeMultimap Performance test', function () {
|
|
|
604
572
|
treeMS.lesserOrGreaterTraverse(node => (node.count += 1), CP.lt, inputSize / 2);
|
|
605
573
|
isDebug && console.log('---lesserOrGreaterTraverse', performance.now() - startL);
|
|
606
574
|
});
|
|
575
|
+
|
|
576
|
+
it('should the clone method', () => {
|
|
577
|
+
function checkTreeStructure(treeMultimap: TreeMultimap<string, number>) {
|
|
578
|
+
expect(treeMultimap.size).toBe(4);
|
|
579
|
+
expect(treeMultimap.root?.key).toBe('2');
|
|
580
|
+
expect(treeMultimap.root?.left?.key).toBe('1');
|
|
581
|
+
expect(treeMultimap.root?.left?.left?.key).toBe(undefined);
|
|
582
|
+
expect(treeMultimap.root?.left?.right?.key).toBe(undefined);
|
|
583
|
+
expect(treeMultimap.root?.right?.key).toBe('4');
|
|
584
|
+
expect(treeMultimap.root?.right?.left?.key).toBe(undefined);
|
|
585
|
+
expect(treeMultimap.root?.right?.right?.key).toBe('5');
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
const treeMultimap = new TreeMultimap<string, number>();
|
|
589
|
+
treeMultimap.addMany([
|
|
590
|
+
['2', 2],
|
|
591
|
+
['4', 4],
|
|
592
|
+
['5', 5],
|
|
593
|
+
['3', 3],
|
|
594
|
+
['1', 1]
|
|
595
|
+
]);
|
|
596
|
+
expect(treeMultimap.size).toBe(5);
|
|
597
|
+
expect(treeMultimap.root?.key).toBe('2');
|
|
598
|
+
expect(treeMultimap.root?.left?.key).toBe('1');
|
|
599
|
+
expect(treeMultimap.root?.left?.left?.key).toBe(undefined);
|
|
600
|
+
expect(treeMultimap.root?.left?.right?.key).toBe(undefined);
|
|
601
|
+
expect(treeMultimap.root?.right?.key).toBe('4');
|
|
602
|
+
expect(treeMultimap.root?.right?.left?.key).toBe('3');
|
|
603
|
+
expect(treeMultimap.root?.right?.right?.key).toBe('5');
|
|
604
|
+
treeMultimap.delete('3');
|
|
605
|
+
checkTreeStructure(treeMultimap);
|
|
606
|
+
const cloned = treeMultimap.clone();
|
|
607
|
+
checkTreeStructure(cloned);
|
|
608
|
+
cloned.delete('1');
|
|
609
|
+
expect(treeMultimap.size).toBe(4);
|
|
610
|
+
expect(cloned.size).toBe(3);
|
|
611
|
+
});
|
|
607
612
|
});
|
|
608
613
|
|
|
609
614
|
describe('TreeMultimap iterative methods test', () => {
|
|
@@ -78,7 +78,7 @@ describe('DirectedGraph Operation Test', () => {
|
|
|
78
78
|
expect(graph.outDegreeOf(vertexC)).toBe(0);
|
|
79
79
|
expect(graph.edgesOf(vertexC)?.length).toBe(1);
|
|
80
80
|
|
|
81
|
-
expect(graph.tarjan(
|
|
81
|
+
expect(graph.tarjan().dfnMap.size).toBe(3);
|
|
82
82
|
expect(graph.bellmanFord(vertexC, true, true, true)?.paths.length).toBe(3);
|
|
83
83
|
expect(graph.getMinPathBetween('B', 'C', true)?.length).toBe(2);
|
|
84
84
|
expect(graph.setEdgeWeight('B', 'C', 100)).toBe(true);
|
|
@@ -634,14 +634,14 @@ describe('cycles, strongly connected components, bridges, articular points in Di
|
|
|
634
634
|
graph.addEdge('H', 'F');
|
|
635
635
|
const cycles = graph.getCycles();
|
|
636
636
|
const scCs = graph.getSCCs();
|
|
637
|
-
const bridges = graph.getBridges();
|
|
638
|
-
const
|
|
637
|
+
// const bridges = graph.getBridges();
|
|
638
|
+
// const cutVertices = graph.getCutVertices();
|
|
639
639
|
const dfnMap = graph.getDFNMap();
|
|
640
640
|
const lowMap = graph.getLowMap();
|
|
641
641
|
expect(cycles.length).toBe(2);
|
|
642
642
|
expect(scCs.size).toBe(5);
|
|
643
|
-
expect(bridges.length).toBe(4);
|
|
644
|
-
expect(
|
|
643
|
+
// expect(bridges.length).toBe(4);
|
|
644
|
+
// expect(cutVertices.length).toBe(4);
|
|
645
645
|
expect(dfnMap.size).toBe(8);
|
|
646
646
|
expect(lowMap.size).toBe(8);
|
|
647
647
|
});
|
|
@@ -810,3 +810,188 @@ describe('DirectedGraph getCycles', () => {
|
|
|
810
810
|
]);
|
|
811
811
|
});
|
|
812
812
|
});
|
|
813
|
+
|
|
814
|
+
describe('DirectedGraph tarjan', () => {
|
|
815
|
+
test('should simple cycles graph tarjan cycles return correct result', () => {
|
|
816
|
+
const graph = new DirectedGraph();
|
|
817
|
+
|
|
818
|
+
graph.addVertex('A');
|
|
819
|
+
graph.addVertex('B');
|
|
820
|
+
graph.addVertex('C');
|
|
821
|
+
graph.addVertex('D');
|
|
822
|
+
|
|
823
|
+
graph.addEdge('A', 'B');
|
|
824
|
+
graph.addEdge('B', 'C');
|
|
825
|
+
graph.addEdge('C', 'A');
|
|
826
|
+
graph.addEdge('A', 'D');
|
|
827
|
+
graph.addEdge('D', 'C');
|
|
828
|
+
const cycles = graph.getCycles();
|
|
829
|
+
expect(cycles.length).toBe(2);
|
|
830
|
+
expect(cycles).toEqual([
|
|
831
|
+
['A', 'B', 'C'],
|
|
832
|
+
['A', 'D', 'C']
|
|
833
|
+
]);
|
|
834
|
+
});
|
|
835
|
+
|
|
836
|
+
function getAsVerticesArrays(vss: Map<number, DirectedVertex<any>[]>) {
|
|
837
|
+
return [...vss.values()].map(vs => vs.map(vertex => vertex.key));
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
function createExampleGraph1() {
|
|
841
|
+
const graph = new DirectedGraph();
|
|
842
|
+
graph.addVertex('A');
|
|
843
|
+
graph.addVertex('B');
|
|
844
|
+
graph.addVertex('C');
|
|
845
|
+
graph.addVertex('D');
|
|
846
|
+
graph.addVertex('E');
|
|
847
|
+
graph.addEdge('A', 'B');
|
|
848
|
+
graph.addEdge('A', 'C');
|
|
849
|
+
graph.addEdge('B', 'D');
|
|
850
|
+
graph.addEdge('C', 'D');
|
|
851
|
+
graph.addEdge('D', 'E');
|
|
852
|
+
graph.addEdge('E', 'B');
|
|
853
|
+
return graph;
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
test('should tarjan cycles return correct result', () => {
|
|
857
|
+
const graph = createExampleGraph1();
|
|
858
|
+
const cycles = graph.getCycles();
|
|
859
|
+
expect(cycles.length).toBe(1);
|
|
860
|
+
expect(cycles).toEqual([['B', 'D', 'E']]);
|
|
861
|
+
});
|
|
862
|
+
|
|
863
|
+
test('should tarjan SCCs return correct result', () => {
|
|
864
|
+
const graph = createExampleGraph1();
|
|
865
|
+
const sccs = graph.tarjan().SCCs;
|
|
866
|
+
expect(sccs.size).toBe(3);
|
|
867
|
+
expect(getAsVerticesArrays(sccs)).toEqual([['E', 'D', 'B'], ['C'], ['A']]);
|
|
868
|
+
});
|
|
869
|
+
|
|
870
|
+
function createExampleGraph2() {
|
|
871
|
+
const graph = createExampleGraph1();
|
|
872
|
+
graph.addVertex('F');
|
|
873
|
+
graph.addVertex('G');
|
|
874
|
+
graph.addEdge('B', 'F');
|
|
875
|
+
graph.addEdge('F', 'E');
|
|
876
|
+
graph.addEdge('C', 'G');
|
|
877
|
+
graph.addEdge('G', 'A');
|
|
878
|
+
return graph;
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
test('should 3 cycles graph tarjan cycles return correct result', () => {
|
|
882
|
+
const graph = createExampleGraph2();
|
|
883
|
+
const cycles = graph.getCycles();
|
|
884
|
+
expect(cycles.length).toBe(3);
|
|
885
|
+
expect(cycles).toEqual([
|
|
886
|
+
['A', 'C', 'G'],
|
|
887
|
+
['B', 'D', 'E'],
|
|
888
|
+
['B', 'F', 'E']
|
|
889
|
+
]);
|
|
890
|
+
});
|
|
891
|
+
|
|
892
|
+
test('should 3 cycles graph tarjan SCCs return correct result', () => {
|
|
893
|
+
const graph = createExampleGraph2();
|
|
894
|
+
const sccs = graph.tarjan().SCCs;
|
|
895
|
+
expect(sccs.size).toBe(2);
|
|
896
|
+
expect(getAsVerticesArrays(sccs)).toEqual([
|
|
897
|
+
['F', 'E', 'D', 'B'],
|
|
898
|
+
['G', 'C', 'A']
|
|
899
|
+
]);
|
|
900
|
+
});
|
|
901
|
+
|
|
902
|
+
function createExampleGraph3() {
|
|
903
|
+
const graph = new DirectedGraph();
|
|
904
|
+
graph.addVertex('A');
|
|
905
|
+
graph.addVertex('B');
|
|
906
|
+
graph.addVertex('C');
|
|
907
|
+
graph.addVertex('D');
|
|
908
|
+
graph.addVertex('E');
|
|
909
|
+
graph.addVertex('F');
|
|
910
|
+
graph.addVertex('G');
|
|
911
|
+
graph.addEdge('A', 'B');
|
|
912
|
+
graph.addEdge('B', 'C');
|
|
913
|
+
graph.addEdge('C', 'D');
|
|
914
|
+
graph.addEdge('D', 'B');
|
|
915
|
+
graph.addEdge('A', 'E');
|
|
916
|
+
graph.addEdge('E', 'F');
|
|
917
|
+
graph.addEdge('F', 'G');
|
|
918
|
+
graph.addEdge('G', 'E');
|
|
919
|
+
return graph;
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
test('should cuttable graph tarjan cycles return correct result', () => {
|
|
923
|
+
const graph = createExampleGraph3();
|
|
924
|
+
const cycles = graph.getCycles();
|
|
925
|
+
expect(cycles.length).toBe(2);
|
|
926
|
+
expect(cycles).toEqual([
|
|
927
|
+
['B', 'C', 'D'],
|
|
928
|
+
['E', 'F', 'G']
|
|
929
|
+
]);
|
|
930
|
+
});
|
|
931
|
+
|
|
932
|
+
test('should cuttable graph tarjan SCCs return correct result', () => {
|
|
933
|
+
const graph = createExampleGraph3();
|
|
934
|
+
const sccs = graph.tarjan().SCCs;
|
|
935
|
+
expect(sccs.size).toBe(3);
|
|
936
|
+
expect(getAsVerticesArrays(sccs)).toEqual([['D', 'C', 'B'], ['G', 'F', 'E'], ['A']]);
|
|
937
|
+
});
|
|
938
|
+
|
|
939
|
+
function createExampleGraph4() {
|
|
940
|
+
const graph = createExampleGraph3();
|
|
941
|
+
graph.addVertex('H');
|
|
942
|
+
graph.addVertex('I');
|
|
943
|
+
graph.addVertex('J');
|
|
944
|
+
graph.addVertex('K');
|
|
945
|
+
graph.addEdge('C', 'H');
|
|
946
|
+
graph.addEdge('H', 'I');
|
|
947
|
+
graph.addEdge('I', 'D');
|
|
948
|
+
graph.addEdge('H', 'J');
|
|
949
|
+
graph.addEdge('J', 'K');
|
|
950
|
+
graph.addEdge('K', 'H');
|
|
951
|
+
return graph;
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
test('should more cuttable graph tarjan cycles return correct result', () => {
|
|
955
|
+
const graph = createExampleGraph4();
|
|
956
|
+
const cycles = graph.getCycles();
|
|
957
|
+
expect(cycles.length).toBe(4);
|
|
958
|
+
expect(cycles).toEqual([
|
|
959
|
+
['B', 'C', 'D'],
|
|
960
|
+
['B', 'C', 'H', 'I', 'D'],
|
|
961
|
+
['E', 'F', 'G'],
|
|
962
|
+
['H', 'J', 'K']
|
|
963
|
+
]);
|
|
964
|
+
});
|
|
965
|
+
|
|
966
|
+
test('should more cuttable graph tarjan SCCs return correct result', () => {
|
|
967
|
+
const graph = createExampleGraph4();
|
|
968
|
+
const sccs = graph.tarjan().SCCs;
|
|
969
|
+
expect(sccs.size).toBe(3);
|
|
970
|
+
expect(getAsVerticesArrays(sccs)).toEqual([['K', 'J', 'I', 'H', 'D', 'C', 'B'], ['G', 'F', 'E'], ['A']]);
|
|
971
|
+
});
|
|
972
|
+
|
|
973
|
+
function createExampleGraph5() {
|
|
974
|
+
const graph = createExampleGraph4();
|
|
975
|
+
graph.addEdge('F', 'H');
|
|
976
|
+
return graph;
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
test('should uncuttable graph tarjan cycles return correct result', () => {
|
|
980
|
+
const graph = createExampleGraph5();
|
|
981
|
+
const cycles = graph.getCycles();
|
|
982
|
+
expect(cycles.length).toBe(4);
|
|
983
|
+
expect(cycles).toEqual([
|
|
984
|
+
['B', 'C', 'D'],
|
|
985
|
+
['B', 'C', 'H', 'I', 'D'],
|
|
986
|
+
['E', 'F', 'G'],
|
|
987
|
+
['H', 'J', 'K']
|
|
988
|
+
]);
|
|
989
|
+
});
|
|
990
|
+
|
|
991
|
+
test('should uncuttable graph tarjan SCCs return correct result', () => {
|
|
992
|
+
const graph = createExampleGraph5();
|
|
993
|
+
const sccs = graph.tarjan().SCCs;
|
|
994
|
+
expect(sccs.size).toBe(3);
|
|
995
|
+
expect(getAsVerticesArrays(sccs)).toEqual([['K', 'J', 'I', 'H', 'D', 'C', 'B'], ['G', 'F', 'E'], ['A']]);
|
|
996
|
+
});
|
|
997
|
+
});
|