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.
Files changed (196) hide show
  1. package/CHANGELOG.md +2 -1
  2. package/README.md +30 -28
  3. package/README_zh-CN.md +1 -1
  4. package/SPECIFICATION.md +56 -0
  5. package/SPONSOR-zh-CN.md +90 -0
  6. package/SPONSOR.md +54 -0
  7. package/benchmark/report.html +13 -13
  8. package/benchmark/report.json +149 -161
  9. package/dist/cjs/data-structures/base/iterable-base.d.ts +120 -9
  10. package/dist/cjs/data-structures/base/iterable-base.js +143 -7
  11. package/dist/cjs/data-structures/base/iterable-base.js.map +1 -1
  12. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +72 -47
  13. package/dist/cjs/data-structures/binary-tree/avl-tree.js +101 -72
  14. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  15. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.d.ts +22 -0
  16. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js +22 -0
  17. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js.map +1 -1
  18. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +244 -199
  19. package/dist/cjs/data-structures/binary-tree/binary-tree.js +484 -376
  20. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  21. package/dist/cjs/data-structures/binary-tree/bst.d.ts +92 -79
  22. package/dist/cjs/data-structures/binary-tree/bst.js +68 -76
  23. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  24. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +127 -57
  25. package/dist/cjs/data-structures/binary-tree/rb-tree.js +152 -99
  26. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  27. package/dist/cjs/data-structures/binary-tree/segment-tree.d.ts +99 -6
  28. package/dist/cjs/data-structures/binary-tree/segment-tree.js +127 -10
  29. package/dist/cjs/data-structures/binary-tree/segment-tree.js.map +1 -1
  30. package/dist/cjs/data-structures/binary-tree/tree-multimap.d.ts +72 -58
  31. package/dist/cjs/data-structures/binary-tree/tree-multimap.js +102 -85
  32. package/dist/cjs/data-structures/binary-tree/tree-multimap.js.map +1 -1
  33. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +1 -78
  34. package/dist/cjs/data-structures/graph/abstract-graph.js +3 -189
  35. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  36. package/dist/cjs/data-structures/graph/directed-graph.d.ts +73 -0
  37. package/dist/cjs/data-structures/graph/directed-graph.js +131 -0
  38. package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
  39. package/dist/cjs/data-structures/graph/map-graph.d.ts +8 -0
  40. package/dist/cjs/data-structures/graph/map-graph.js +14 -0
  41. package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
  42. package/dist/cjs/data-structures/graph/undirected-graph.d.ts +76 -7
  43. package/dist/cjs/data-structures/graph/undirected-graph.js +151 -18
  44. package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
  45. package/dist/cjs/data-structures/hash/hash-map.d.ts +254 -28
  46. package/dist/cjs/data-structures/hash/hash-map.js +347 -78
  47. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  48. package/dist/cjs/data-structures/heap/heap.d.ts +95 -25
  49. package/dist/cjs/data-structures/heap/heap.js +95 -26
  50. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  51. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +126 -63
  52. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +141 -77
  53. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  54. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +154 -106
  55. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +164 -115
  56. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  57. package/dist/cjs/data-structures/linked-list/skip-linked-list.d.ts +63 -36
  58. package/dist/cjs/data-structures/linked-list/skip-linked-list.js +63 -36
  59. package/dist/cjs/data-structures/linked-list/skip-linked-list.js.map +1 -1
  60. package/dist/cjs/data-structures/matrix/matrix.d.ts +35 -4
  61. package/dist/cjs/data-structures/matrix/matrix.js +50 -11
  62. package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
  63. package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +10 -0
  64. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js +10 -0
  65. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  66. package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +11 -0
  67. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js +11 -0
  68. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  69. package/dist/cjs/data-structures/priority-queue/priority-queue.d.ts +8 -0
  70. package/dist/cjs/data-structures/priority-queue/priority-queue.js +8 -0
  71. package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
  72. package/dist/cjs/data-structures/queue/deque.d.ts +139 -35
  73. package/dist/cjs/data-structures/queue/deque.js +200 -62
  74. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  75. package/dist/cjs/data-structures/queue/queue.d.ts +103 -49
  76. package/dist/cjs/data-structures/queue/queue.js +111 -49
  77. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  78. package/dist/cjs/data-structures/stack/stack.d.ts +51 -21
  79. package/dist/cjs/data-structures/stack/stack.js +58 -22
  80. package/dist/cjs/data-structures/stack/stack.js.map +1 -1
  81. package/dist/cjs/data-structures/tree/tree.d.ts +57 -3
  82. package/dist/cjs/data-structures/tree/tree.js +77 -11
  83. package/dist/cjs/data-structures/tree/tree.js.map +1 -1
  84. package/dist/cjs/data-structures/trie/trie.d.ts +135 -34
  85. package/dist/cjs/data-structures/trie/trie.js +153 -33
  86. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  87. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
  88. package/dist/cjs/types/data-structures/hash/hash-map.d.ts +4 -3
  89. package/dist/cjs/types/utils/utils.d.ts +1 -0
  90. package/dist/mjs/data-structures/base/iterable-base.d.ts +120 -9
  91. package/dist/mjs/data-structures/base/iterable-base.js +143 -7
  92. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +72 -47
  93. package/dist/mjs/data-structures/binary-tree/avl-tree.js +102 -73
  94. package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.d.ts +22 -0
  95. package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.js +22 -0
  96. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +244 -199
  97. package/dist/mjs/data-structures/binary-tree/binary-tree.js +483 -375
  98. package/dist/mjs/data-structures/binary-tree/bst.d.ts +92 -79
  99. package/dist/mjs/data-structures/binary-tree/bst.js +68 -76
  100. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +127 -57
  101. package/dist/mjs/data-structures/binary-tree/rb-tree.js +153 -100
  102. package/dist/mjs/data-structures/binary-tree/segment-tree.d.ts +99 -6
  103. package/dist/mjs/data-structures/binary-tree/segment-tree.js +127 -10
  104. package/dist/mjs/data-structures/binary-tree/tree-multimap.d.ts +72 -58
  105. package/dist/mjs/data-structures/binary-tree/tree-multimap.js +102 -86
  106. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +1 -78
  107. package/dist/mjs/data-structures/graph/abstract-graph.js +3 -188
  108. package/dist/mjs/data-structures/graph/directed-graph.d.ts +73 -0
  109. package/dist/mjs/data-structures/graph/directed-graph.js +131 -0
  110. package/dist/mjs/data-structures/graph/map-graph.d.ts +8 -0
  111. package/dist/mjs/data-structures/graph/map-graph.js +14 -0
  112. package/dist/mjs/data-structures/graph/undirected-graph.d.ts +76 -7
  113. package/dist/mjs/data-structures/graph/undirected-graph.js +152 -19
  114. package/dist/mjs/data-structures/hash/hash-map.d.ts +254 -28
  115. package/dist/mjs/data-structures/hash/hash-map.js +353 -84
  116. package/dist/mjs/data-structures/heap/heap.d.ts +95 -25
  117. package/dist/mjs/data-structures/heap/heap.js +95 -26
  118. package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +126 -63
  119. package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +144 -80
  120. package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +154 -106
  121. package/dist/mjs/data-structures/linked-list/singly-linked-list.js +166 -117
  122. package/dist/mjs/data-structures/linked-list/skip-linked-list.d.ts +63 -36
  123. package/dist/mjs/data-structures/linked-list/skip-linked-list.js +63 -36
  124. package/dist/mjs/data-structures/matrix/matrix.d.ts +35 -4
  125. package/dist/mjs/data-structures/matrix/matrix.js +50 -11
  126. package/dist/mjs/data-structures/priority-queue/max-priority-queue.d.ts +10 -0
  127. package/dist/mjs/data-structures/priority-queue/max-priority-queue.js +10 -0
  128. package/dist/mjs/data-structures/priority-queue/min-priority-queue.d.ts +11 -0
  129. package/dist/mjs/data-structures/priority-queue/min-priority-queue.js +11 -0
  130. package/dist/mjs/data-structures/priority-queue/priority-queue.d.ts +8 -0
  131. package/dist/mjs/data-structures/priority-queue/priority-queue.js +8 -0
  132. package/dist/mjs/data-structures/queue/deque.d.ts +139 -35
  133. package/dist/mjs/data-structures/queue/deque.js +205 -67
  134. package/dist/mjs/data-structures/queue/queue.d.ts +103 -49
  135. package/dist/mjs/data-structures/queue/queue.js +111 -49
  136. package/dist/mjs/data-structures/stack/stack.d.ts +51 -21
  137. package/dist/mjs/data-structures/stack/stack.js +58 -22
  138. package/dist/mjs/data-structures/tree/tree.d.ts +57 -3
  139. package/dist/mjs/data-structures/tree/tree.js +80 -14
  140. package/dist/mjs/data-structures/trie/trie.d.ts +135 -34
  141. package/dist/mjs/data-structures/trie/trie.js +156 -36
  142. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +1 -1
  143. package/dist/mjs/types/data-structures/hash/hash-map.d.ts +4 -3
  144. package/dist/mjs/types/utils/utils.d.ts +1 -0
  145. package/dist/umd/data-structure-typed.js +3121 -1583
  146. package/dist/umd/data-structure-typed.min.js +3 -3
  147. package/dist/umd/data-structure-typed.min.js.map +1 -1
  148. package/package.json +61 -55
  149. package/src/data-structures/base/iterable-base.ts +184 -19
  150. package/src/data-structures/binary-tree/avl-tree.ts +134 -100
  151. package/src/data-structures/binary-tree/binary-indexed-tree.ts +22 -0
  152. package/src/data-structures/binary-tree/binary-tree.ts +674 -671
  153. package/src/data-structures/binary-tree/bst.ts +127 -136
  154. package/src/data-structures/binary-tree/rb-tree.ts +199 -166
  155. package/src/data-structures/binary-tree/segment-tree.ts +145 -11
  156. package/src/data-structures/binary-tree/tree-multimap.ts +138 -115
  157. package/src/data-structures/graph/abstract-graph.ts +4 -211
  158. package/src/data-structures/graph/directed-graph.ts +152 -0
  159. package/src/data-structures/graph/map-graph.ts +15 -0
  160. package/src/data-structures/graph/undirected-graph.ts +171 -19
  161. package/src/data-structures/hash/hash-map.ts +389 -96
  162. package/src/data-structures/heap/heap.ts +97 -26
  163. package/src/data-structures/linked-list/doubly-linked-list.ts +156 -83
  164. package/src/data-structures/linked-list/singly-linked-list.ts +174 -120
  165. package/src/data-structures/linked-list/skip-linked-list.ts +63 -37
  166. package/src/data-structures/matrix/matrix.ts +52 -12
  167. package/src/data-structures/priority-queue/max-priority-queue.ts +10 -0
  168. package/src/data-structures/priority-queue/min-priority-queue.ts +11 -0
  169. package/src/data-structures/priority-queue/priority-queue.ts +8 -0
  170. package/src/data-structures/queue/deque.ts +225 -70
  171. package/src/data-structures/queue/queue.ts +118 -49
  172. package/src/data-structures/stack/stack.ts +63 -23
  173. package/src/data-structures/tree/tree.ts +89 -15
  174. package/src/data-structures/trie/trie.ts +173 -38
  175. package/src/types/data-structures/binary-tree/binary-tree.ts +1 -1
  176. package/src/types/data-structures/hash/hash-map.ts +4 -3
  177. package/src/types/utils/utils.ts +2 -0
  178. package/test/performance/data-structures/graph/directed-graph.test.ts +4 -4
  179. package/test/performance/data-structures/queue/deque.test.ts +26 -25
  180. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +37 -0
  181. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +46 -17
  182. package/test/unit/data-structures/binary-tree/bst.test.ts +65 -1
  183. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +38 -1
  184. package/test/unit/data-structures/binary-tree/tree-multimap.test.ts +37 -32
  185. package/test/unit/data-structures/graph/abstract-graph.test.ts +11 -0
  186. package/test/unit/data-structures/graph/directed-graph.test.ts +190 -5
  187. package/test/unit/data-structures/graph/undirected-graph.test.ts +263 -18
  188. package/test/unit/data-structures/hash/hash-map.test.ts +376 -353
  189. package/test/unit/data-structures/heap/heap.test.ts +18 -1
  190. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +24 -5
  191. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +20 -2
  192. package/test/unit/data-structures/linked-list/skip-list.test.ts +1 -1
  193. package/test/unit/data-structures/queue/deque.test.ts +65 -5
  194. package/test/unit/data-structures/queue/queue.test.ts +24 -5
  195. package/test/unit/data-structures/stack/stack.test.ts +17 -0
  196. 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 subTreeTraverse, null should be ignored', () => {
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', () => {
@@ -77,6 +77,17 @@ class MyGraph<
77
77
  return true;
78
78
  }
79
79
 
80
+ isEmpty(): boolean {
81
+ return true;
82
+ }
83
+
84
+ clear(): void {
85
+ }
86
+
87
+ clone(): any {
88
+ return {};
89
+ }
90
+
80
91
  protected _addEdge(edge: EO): boolean {
81
92
  return edge ? true : true;
82
93
  }
@@ -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(true, true, true, true)?.dfnMap.size).toBe(3);
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 cutVertexes = graph.getCutVertexes();
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(cutVertexes.length).toBe(4);
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
+ });