data-structure-typed 1.54.3 → 2.0.1

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 (208) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/benchmark/report.html +26 -2
  3. package/benchmark/report.json +292 -42
  4. package/dist/cjs/data-structures/base/iterable-element-base.d.ts +14 -40
  5. package/dist/cjs/data-structures/base/iterable-element-base.js +14 -11
  6. package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -1
  7. package/dist/cjs/data-structures/base/linear-base.d.ts +277 -0
  8. package/dist/cjs/data-structures/base/linear-base.js +553 -0
  9. package/dist/cjs/data-structures/base/linear-base.js.map +1 -0
  10. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +12 -8
  11. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +50 -37
  12. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  13. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +64 -0
  14. package/dist/cjs/data-structures/binary-tree/avl-tree.js +64 -0
  15. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  16. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +62 -0
  17. package/dist/cjs/data-structures/binary-tree/binary-tree.js +67 -5
  18. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  19. package/dist/cjs/data-structures/binary-tree/bst.d.ts +3 -3
  20. package/dist/cjs/data-structures/binary-tree/bst.js +14 -14
  21. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  22. package/dist/cjs/data-structures/binary-tree/red-black-tree.d.ts +1 -7
  23. package/dist/cjs/data-structures/binary-tree/red-black-tree.js +1 -7
  24. package/dist/cjs/data-structures/binary-tree/red-black-tree.js.map +1 -1
  25. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +175 -14
  26. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +210 -40
  27. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  28. package/dist/cjs/data-structures/graph/abstract-graph.js +16 -16
  29. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  30. package/dist/cjs/data-structures/hash/hash-map.d.ts +46 -0
  31. package/dist/cjs/data-structures/hash/hash-map.js +46 -0
  32. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  33. package/dist/cjs/data-structures/heap/heap.d.ts +3 -11
  34. package/dist/cjs/data-structures/heap/heap.js +0 -10
  35. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  36. package/dist/cjs/data-structures/heap/max-heap.d.ts +2 -2
  37. package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
  38. package/dist/cjs/data-structures/heap/min-heap.d.ts +2 -2
  39. package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
  40. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +65 -94
  41. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +131 -146
  42. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  43. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +145 -75
  44. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +283 -169
  45. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  46. package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +2 -2
  47. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  48. package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +2 -2
  49. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  50. package/dist/cjs/data-structures/priority-queue/priority-queue.d.ts +2 -2
  51. package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
  52. package/dist/cjs/data-structures/queue/deque.d.ts +130 -91
  53. package/dist/cjs/data-structures/queue/deque.js +269 -169
  54. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  55. package/dist/cjs/data-structures/queue/queue.d.ts +131 -40
  56. package/dist/cjs/data-structures/queue/queue.js +181 -50
  57. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  58. package/dist/cjs/data-structures/stack/stack.d.ts +124 -11
  59. package/dist/cjs/data-structures/stack/stack.js +121 -10
  60. package/dist/cjs/data-structures/stack/stack.js.map +1 -1
  61. package/dist/cjs/data-structures/trie/trie.d.ts +4 -3
  62. package/dist/cjs/data-structures/trie/trie.js +3 -0
  63. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  64. package/dist/cjs/types/data-structures/base/base.d.ts +9 -4
  65. package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -1
  66. package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +1 -1
  67. package/dist/cjs/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
  68. package/dist/cjs/types/data-structures/linked-list/singly-linked-list.d.ts +2 -2
  69. package/dist/cjs/types/data-structures/queue/deque.d.ts +2 -3
  70. package/dist/cjs/types/data-structures/queue/queue.d.ts +2 -2
  71. package/dist/esm/data-structures/base/iterable-element-base.d.ts +14 -40
  72. package/dist/esm/data-structures/base/iterable-element-base.js +14 -11
  73. package/dist/esm/data-structures/base/iterable-element-base.js.map +1 -1
  74. package/dist/esm/data-structures/base/linear-base.d.ts +277 -0
  75. package/dist/esm/data-structures/base/linear-base.js +549 -0
  76. package/dist/esm/data-structures/base/linear-base.js.map +1 -0
  77. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.d.ts +12 -8
  78. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js +50 -36
  79. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  80. package/dist/esm/data-structures/binary-tree/avl-tree.d.ts +64 -0
  81. package/dist/esm/data-structures/binary-tree/avl-tree.js +64 -0
  82. package/dist/esm/data-structures/binary-tree/avl-tree.js.map +1 -1
  83. package/dist/esm/data-structures/binary-tree/binary-tree.d.ts +62 -0
  84. package/dist/esm/data-structures/binary-tree/binary-tree.js +67 -5
  85. package/dist/esm/data-structures/binary-tree/binary-tree.js.map +1 -1
  86. package/dist/esm/data-structures/binary-tree/bst.d.ts +3 -3
  87. package/dist/esm/data-structures/binary-tree/bst.js +14 -12
  88. package/dist/esm/data-structures/binary-tree/bst.js.map +1 -1
  89. package/dist/esm/data-structures/binary-tree/red-black-tree.d.ts +1 -7
  90. package/dist/esm/data-structures/binary-tree/red-black-tree.js +1 -7
  91. package/dist/esm/data-structures/binary-tree/red-black-tree.js.map +1 -1
  92. package/dist/esm/data-structures/binary-tree/tree-multi-map.d.ts +175 -14
  93. package/dist/esm/data-structures/binary-tree/tree-multi-map.js +210 -39
  94. package/dist/esm/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  95. package/dist/esm/data-structures/graph/abstract-graph.js +16 -16
  96. package/dist/esm/data-structures/graph/abstract-graph.js.map +1 -1
  97. package/dist/esm/data-structures/hash/hash-map.d.ts +46 -0
  98. package/dist/esm/data-structures/hash/hash-map.js +46 -0
  99. package/dist/esm/data-structures/hash/hash-map.js.map +1 -1
  100. package/dist/esm/data-structures/heap/heap.d.ts +3 -11
  101. package/dist/esm/data-structures/heap/heap.js +0 -10
  102. package/dist/esm/data-structures/heap/heap.js.map +1 -1
  103. package/dist/esm/data-structures/heap/max-heap.d.ts +2 -2
  104. package/dist/esm/data-structures/heap/max-heap.js.map +1 -1
  105. package/dist/esm/data-structures/heap/min-heap.d.ts +2 -2
  106. package/dist/esm/data-structures/heap/min-heap.js.map +1 -1
  107. package/dist/esm/data-structures/linked-list/doubly-linked-list.d.ts +65 -94
  108. package/dist/esm/data-structures/linked-list/doubly-linked-list.js +132 -148
  109. package/dist/esm/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  110. package/dist/esm/data-structures/linked-list/singly-linked-list.d.ts +145 -75
  111. package/dist/esm/data-structures/linked-list/singly-linked-list.js +283 -170
  112. package/dist/esm/data-structures/linked-list/singly-linked-list.js.map +1 -1
  113. package/dist/esm/data-structures/priority-queue/max-priority-queue.d.ts +2 -2
  114. package/dist/esm/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  115. package/dist/esm/data-structures/priority-queue/min-priority-queue.d.ts +2 -2
  116. package/dist/esm/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  117. package/dist/esm/data-structures/priority-queue/priority-queue.d.ts +2 -2
  118. package/dist/esm/data-structures/priority-queue/priority-queue.js.map +1 -1
  119. package/dist/esm/data-structures/queue/deque.d.ts +130 -91
  120. package/dist/esm/data-structures/queue/deque.js +269 -169
  121. package/dist/esm/data-structures/queue/deque.js.map +1 -1
  122. package/dist/esm/data-structures/queue/queue.d.ts +131 -40
  123. package/dist/esm/data-structures/queue/queue.js +182 -51
  124. package/dist/esm/data-structures/queue/queue.js.map +1 -1
  125. package/dist/esm/data-structures/stack/stack.d.ts +124 -11
  126. package/dist/esm/data-structures/stack/stack.js +121 -10
  127. package/dist/esm/data-structures/stack/stack.js.map +1 -1
  128. package/dist/esm/data-structures/trie/trie.d.ts +4 -3
  129. package/dist/esm/data-structures/trie/trie.js +3 -0
  130. package/dist/esm/data-structures/trie/trie.js.map +1 -1
  131. package/dist/esm/types/data-structures/base/base.d.ts +9 -4
  132. package/dist/esm/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -1
  133. package/dist/esm/types/data-structures/binary-tree/tree-multi-map.d.ts +1 -1
  134. package/dist/esm/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
  135. package/dist/esm/types/data-structures/linked-list/singly-linked-list.d.ts +2 -2
  136. package/dist/esm/types/data-structures/queue/deque.d.ts +2 -3
  137. package/dist/esm/types/data-structures/queue/queue.d.ts +2 -2
  138. package/dist/individuals/binary-tree/avl-tree-counter.mjs +4701 -0
  139. package/dist/individuals/binary-tree/avl-tree-multi-map.mjs +4514 -0
  140. package/dist/individuals/binary-tree/avl-tree.mjs +4321 -0
  141. package/dist/individuals/binary-tree/binary-tree.mjs +3097 -0
  142. package/dist/individuals/binary-tree/bst.mjs +3858 -0
  143. package/dist/individuals/binary-tree/red-black-tree.mjs +4391 -0
  144. package/dist/individuals/binary-tree/tree-counter.mjs +4806 -0
  145. package/dist/individuals/binary-tree/tree-multi-map.mjs +4582 -0
  146. package/dist/individuals/graph/directed-graph.mjs +2910 -0
  147. package/dist/individuals/graph/undirected-graph.mjs +2745 -0
  148. package/dist/individuals/hash/hash-map.mjs +1040 -0
  149. package/dist/individuals/heap/heap.mjs +909 -0
  150. package/dist/individuals/heap/max-heap.mjs +671 -0
  151. package/dist/individuals/heap/min-heap.mjs +659 -0
  152. package/dist/individuals/linked-list/doubly-linked-list.mjs +1495 -0
  153. package/dist/individuals/linked-list/singly-linked-list.mjs +1479 -0
  154. package/dist/individuals/priority-queue/max-priority-queue.mjs +768 -0
  155. package/dist/individuals/priority-queue/min-priority-queue.mjs +757 -0
  156. package/dist/individuals/priority-queue/priority-queue.mjs +670 -0
  157. package/dist/individuals/queue/deque.mjs +1262 -0
  158. package/dist/individuals/queue/queue.mjs +1865 -0
  159. package/dist/individuals/stack/stack.mjs +415 -0
  160. package/dist/individuals/trie/trie.mjs +687 -0
  161. package/dist/umd/data-structure-typed.js +1260 -649
  162. package/dist/umd/data-structure-typed.min.js +3 -3
  163. package/dist/umd/data-structure-typed.min.js.map +1 -1
  164. package/package.json +7 -7
  165. package/src/data-structures/base/iterable-element-base.ts +29 -20
  166. package/src/data-structures/base/linear-base.ts +649 -0
  167. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +51 -36
  168. package/src/data-structures/binary-tree/avl-tree.ts +64 -0
  169. package/src/data-structures/binary-tree/binary-tree.ts +5 -5
  170. package/src/data-structures/binary-tree/bst.ts +9 -9
  171. package/src/data-structures/binary-tree/tree-multi-map.ts +214 -40
  172. package/src/data-structures/graph/abstract-graph.ts +16 -16
  173. package/src/data-structures/hash/hash-map.ts +46 -0
  174. package/src/data-structures/heap/heap.ts +3 -14
  175. package/src/data-structures/heap/max-heap.ts +2 -2
  176. package/src/data-structures/heap/min-heap.ts +2 -2
  177. package/src/data-structures/linked-list/doubly-linked-list.ts +144 -160
  178. package/src/data-structures/linked-list/singly-linked-list.ts +307 -185
  179. package/src/data-structures/priority-queue/max-priority-queue.ts +2 -5
  180. package/src/data-structures/priority-queue/min-priority-queue.ts +2 -5
  181. package/src/data-structures/priority-queue/priority-queue.ts +2 -2
  182. package/src/data-structures/queue/deque.ts +286 -183
  183. package/src/data-structures/queue/queue.ts +196 -63
  184. package/src/data-structures/stack/stack.ts +124 -18
  185. package/src/data-structures/trie/trie.ts +7 -3
  186. package/src/types/data-structures/base/base.ts +17 -8
  187. package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +1 -1
  188. package/src/types/data-structures/binary-tree/tree-multi-map.ts +1 -1
  189. package/src/types/data-structures/linked-list/doubly-linked-list.ts +2 -2
  190. package/src/types/data-structures/linked-list/singly-linked-list.ts +2 -2
  191. package/src/types/data-structures/queue/deque.ts +2 -3
  192. package/src/types/data-structures/queue/queue.ts +2 -2
  193. package/test/integration/all-in-one.test.ts +1 -1
  194. package/test/integration/avl-tree.test.ts +1 -1
  195. package/test/integration/bst.test.ts +2 -2
  196. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +168 -0
  197. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +15 -14
  198. package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +1 -1
  199. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +165 -7
  200. package/test/unit/data-structures/graph/directed-graph.test.ts +37 -37
  201. package/test/unit/data-structures/graph/undirected-graph.test.ts +2 -2
  202. package/test/unit/data-structures/hash/hash-map.test.ts +135 -0
  203. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +135 -27
  204. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +183 -12
  205. package/test/unit/data-structures/queue/deque.test.ts +241 -60
  206. package/test/unit/data-structures/queue/queue.test.ts +332 -19
  207. package/test/unit/data-structures/stack/stack.test.ts +165 -0
  208. package/test/unit/unrestricted-interconversion.test.ts +1 -1
@@ -19,7 +19,7 @@ export declare class TreeMultiMapNode<K = any, V = any> extends RedBlackTreeNode
19
19
  * @param {V[]} value - The `value` parameter in the constructor represents an array of values of
20
20
  * type `V`.
21
21
  */
22
- constructor(key: K, value: V[]);
22
+ constructor(key: K, value?: V[]);
23
23
  _left?: TreeMultiMapNode<K, V> | null | undefined;
24
24
  get left(): TreeMultiMapNode<K, V> | null | undefined;
25
25
  set left(v: TreeMultiMapNode<K, V> | null | undefined);
@@ -30,11 +30,169 @@ export declare class TreeMultiMapNode<K = any, V = any> extends RedBlackTreeNode
30
30
  /**
31
31
  *
32
32
  * @example
33
- * // Find elements in a range
34
- * const tmm = new TreeMultiMap<number>([10, 5, 15, 3, 7, 12, 18]);
35
- * console.log(tmm.search(new Range(5, 10))); // [5, 10, 7]
36
- * console.log(tmm.search(new Range(4, 12))); // [5, 10, 12, 7]
37
- * console.log(tmm.search(new Range(15, 20))); // [15, 18]
33
+ * // players ranked by score with their equipment
34
+ * type Equipment = {
35
+ * name: string; // Equipment name
36
+ * quality: 'legendary' | 'epic' | 'rare' | 'common';
37
+ * level: number;
38
+ * };
39
+ *
40
+ * type Player = {
41
+ * name: string;
42
+ * score: number;
43
+ * equipments: Equipment[];
44
+ * };
45
+ *
46
+ * // Mock player data with their scores and equipment
47
+ * const players: Player[] = [
48
+ * {
49
+ * name: 'DragonSlayer',
50
+ * score: 8750,
51
+ * equipments: [
52
+ * { name: 'AWM', quality: 'legendary', level: 85 },
53
+ * { name: 'Level 3 Helmet', quality: 'epic', level: 80 },
54
+ * { name: 'Extended Quickdraw Mag', quality: 'rare', level: 75 },
55
+ * { name: 'Compensator', quality: 'epic', level: 78 },
56
+ * { name: 'Vertical Grip', quality: 'rare', level: 72 }
57
+ * ]
58
+ * },
59
+ * {
60
+ * name: 'ShadowNinja',
61
+ * score: 7200,
62
+ * equipments: [
63
+ * { name: 'M416', quality: 'epic', level: 75 },
64
+ * { name: 'Ghillie Suit', quality: 'rare', level: 70 },
65
+ * { name: 'Red Dot Sight', quality: 'common', level: 65 },
66
+ * { name: 'Extended QuickDraw Mag', quality: 'rare', level: 68 }
67
+ * ]
68
+ * },
69
+ * {
70
+ * name: 'RuneMaster',
71
+ * score: 9100,
72
+ * equipments: [
73
+ * { name: 'KAR98K', quality: 'legendary', level: 90 },
74
+ * { name: 'Level 3 Vest', quality: 'legendary', level: 85 },
75
+ * { name: 'Holographic Sight', quality: 'epic', level: 82 },
76
+ * { name: 'Suppressor', quality: 'legendary', level: 88 },
77
+ * { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
78
+ * ]
79
+ * },
80
+ * {
81
+ * name: 'BattleKing',
82
+ * score: 8500,
83
+ * equipments: [
84
+ * { name: 'AUG', quality: 'epic', level: 82 },
85
+ * { name: 'Red Dot Sight', quality: 'rare', level: 75 },
86
+ * { name: 'Extended Mag', quality: 'common', level: 70 },
87
+ * { name: 'Tactical Stock', quality: 'rare', level: 76 }
88
+ * ]
89
+ * },
90
+ * {
91
+ * name: 'SniperElite',
92
+ * score: 7800,
93
+ * equipments: [
94
+ * { name: 'M24', quality: 'legendary', level: 88 },
95
+ * { name: 'Compensator', quality: 'epic', level: 80 },
96
+ * { name: 'Scope 8x', quality: 'legendary', level: 85 },
97
+ * { name: 'Level 2 Helmet', quality: 'rare', level: 75 }
98
+ * ]
99
+ * },
100
+ * {
101
+ * name: 'RushMaster',
102
+ * score: 7500,
103
+ * equipments: [
104
+ * { name: 'Vector', quality: 'rare', level: 72 },
105
+ * { name: 'Level 2 Helmet', quality: 'common', level: 65 },
106
+ * { name: 'Quickdraw Mag', quality: 'common', level: 60 },
107
+ * { name: 'Laser Sight', quality: 'rare', level: 68 }
108
+ * ]
109
+ * },
110
+ * {
111
+ * name: 'GhostWarrior',
112
+ * score: 8200,
113
+ * equipments: [
114
+ * { name: 'SCAR-L', quality: 'epic', level: 78 },
115
+ * { name: 'Extended Quickdraw Mag', quality: 'rare', level: 70 },
116
+ * { name: 'Holographic Sight', quality: 'epic', level: 75 },
117
+ * { name: 'Suppressor', quality: 'rare', level: 72 },
118
+ * { name: 'Vertical Grip', quality: 'common', level: 65 }
119
+ * ]
120
+ * },
121
+ * {
122
+ * name: 'DeathDealer',
123
+ * score: 7300,
124
+ * equipments: [
125
+ * { name: 'SKS', quality: 'epic', level: 76 },
126
+ * { name: 'Holographic Sight', quality: 'rare', level: 68 },
127
+ * { name: 'Extended Mag', quality: 'common', level: 65 }
128
+ * ]
129
+ * },
130
+ * {
131
+ * name: 'StormRider',
132
+ * score: 8900,
133
+ * equipments: [
134
+ * { name: 'MK14', quality: 'legendary', level: 92 },
135
+ * { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
136
+ * { name: 'Scope 8x', quality: 'epic', level: 80 },
137
+ * { name: 'Suppressor', quality: 'legendary', level: 88 },
138
+ * { name: 'Tactical Stock', quality: 'rare', level: 75 }
139
+ * ]
140
+ * },
141
+ * {
142
+ * name: 'CombatLegend',
143
+ * score: 7600,
144
+ * equipments: [
145
+ * { name: 'UMP45', quality: 'rare', level: 74 },
146
+ * { name: 'Level 2 Vest', quality: 'common', level: 67 },
147
+ * { name: 'Red Dot Sight', quality: 'common', level: 62 },
148
+ * { name: 'Extended Mag', quality: 'rare', level: 70 }
149
+ * ]
150
+ * }
151
+ * ];
152
+ *
153
+ * // Create a TreeMultiMap for player rankings
154
+ * const playerRankings = new TreeMultiMap<number, Equipment, Player>(players, {
155
+ * toEntryFn: ({ score, equipments }) => [score, equipments],
156
+ * isMapMode: false
157
+ * });
158
+ *
159
+ * const topPlayersEquipments = playerRankings.rangeSearch([8900, 10000], node => playerRankings.get(node));
160
+ * console.log(topPlayersEquipments); // [
161
+ * // [
162
+ * // {
163
+ * // name: 'MK14',
164
+ * // quality: 'legendary',
165
+ * // level: 92
166
+ * // },
167
+ * // { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
168
+ * // {
169
+ * // name: 'Scope 8x',
170
+ * // quality: 'epic',
171
+ * // level: 80
172
+ * // },
173
+ * // { name: 'Suppressor', quality: 'legendary', level: 88 },
174
+ * // {
175
+ * // name: 'Tactical Stock',
176
+ * // quality: 'rare',
177
+ * // level: 75
178
+ * // }
179
+ * // ],
180
+ * // [
181
+ * // { name: 'KAR98K', quality: 'legendary', level: 90 },
182
+ * // {
183
+ * // name: 'Level 3 Vest',
184
+ * // quality: 'legendary',
185
+ * // level: 85
186
+ * // },
187
+ * // { name: 'Holographic Sight', quality: 'epic', level: 82 },
188
+ * // {
189
+ * // name: 'Suppressor',
190
+ * // quality: 'legendary',
191
+ * // level: 88
192
+ * // },
193
+ * // { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
194
+ * // ]
195
+ * // ]
38
196
  */
39
197
  export declare class TreeMultiMap<K = any, V = any, R = object, MK = any, MV = any, MR = object> extends RedBlackTree<K, V[], R, MK, MV[], MR> implements IBinaryTree<K, V[], R, MK, MV, MR> {
40
198
  /**
@@ -67,15 +225,18 @@ export declare class TreeMultiMap<K = any, V = any, R = object, MK = any, MV = a
67
225
  * Time Complexity: O(1)
68
226
  * Space Complexity: O(1)
69
227
  *
70
- * The function `createNode` overrides the method to create a new `TreeMultiMapNode` with a specified
71
- * key and an empty array of values.
72
- * @param {K} key - The `key` parameter in the `createNode` method represents the key of the node
73
- * that will be created in the TreeMultiMap data structure.
74
- * @returns A new instance of `TreeMultiMapNode<K, V>` is being returned, with the specified key and
75
- * an empty array as its value.
228
+ * The function `createNode` overrides the creation of a new TreeMultiMapNode with a specified key
229
+ * and value array.
230
+ * @param {K} key - The `key` parameter represents the key of the node being created in the
231
+ * `TreeMultiMap`.
232
+ * @param {V[]} value - The `value` parameter in the `createNode` method represents an array of
233
+ * values associated with a specific key in the TreeMultiMap data structure.
234
+ * @returns A new instance of `TreeMultiMapNode<K, V>` is being returned with the specified key and
235
+ * value. If `_isMapMode` is true, an empty array is passed as the value, otherwise the provided
236
+ * value is used.
76
237
  */
77
- createNode(key: K): TreeMultiMapNode<K, V>;
78
- add(node: K | TreeMultiMapNode<K, V> | [K | null | undefined, V[] | undefined] | null | undefined): boolean;
238
+ createNode(key: K, value?: V[]): TreeMultiMapNode<K, V>;
239
+ add(keyNodeOrEntry: K | TreeMultiMapNode<K, V> | [K | null | undefined, V[] | undefined] | null | undefined): boolean;
79
240
  add(key: K, value: V): boolean;
80
241
  /**
81
242
  * Time Complexity: O(log n)
@@ -37,11 +37,169 @@ export class TreeMultiMapNode extends RedBlackTreeNode {
37
37
  /**
38
38
  *
39
39
  * @example
40
- * // Find elements in a range
41
- * const tmm = new TreeMultiMap<number>([10, 5, 15, 3, 7, 12, 18]);
42
- * console.log(tmm.search(new Range(5, 10))); // [5, 10, 7]
43
- * console.log(tmm.search(new Range(4, 12))); // [5, 10, 12, 7]
44
- * console.log(tmm.search(new Range(15, 20))); // [15, 18]
40
+ * // players ranked by score with their equipment
41
+ * type Equipment = {
42
+ * name: string; // Equipment name
43
+ * quality: 'legendary' | 'epic' | 'rare' | 'common';
44
+ * level: number;
45
+ * };
46
+ *
47
+ * type Player = {
48
+ * name: string;
49
+ * score: number;
50
+ * equipments: Equipment[];
51
+ * };
52
+ *
53
+ * // Mock player data with their scores and equipment
54
+ * const players: Player[] = [
55
+ * {
56
+ * name: 'DragonSlayer',
57
+ * score: 8750,
58
+ * equipments: [
59
+ * { name: 'AWM', quality: 'legendary', level: 85 },
60
+ * { name: 'Level 3 Helmet', quality: 'epic', level: 80 },
61
+ * { name: 'Extended Quickdraw Mag', quality: 'rare', level: 75 },
62
+ * { name: 'Compensator', quality: 'epic', level: 78 },
63
+ * { name: 'Vertical Grip', quality: 'rare', level: 72 }
64
+ * ]
65
+ * },
66
+ * {
67
+ * name: 'ShadowNinja',
68
+ * score: 7200,
69
+ * equipments: [
70
+ * { name: 'M416', quality: 'epic', level: 75 },
71
+ * { name: 'Ghillie Suit', quality: 'rare', level: 70 },
72
+ * { name: 'Red Dot Sight', quality: 'common', level: 65 },
73
+ * { name: 'Extended QuickDraw Mag', quality: 'rare', level: 68 }
74
+ * ]
75
+ * },
76
+ * {
77
+ * name: 'RuneMaster',
78
+ * score: 9100,
79
+ * equipments: [
80
+ * { name: 'KAR98K', quality: 'legendary', level: 90 },
81
+ * { name: 'Level 3 Vest', quality: 'legendary', level: 85 },
82
+ * { name: 'Holographic Sight', quality: 'epic', level: 82 },
83
+ * { name: 'Suppressor', quality: 'legendary', level: 88 },
84
+ * { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
85
+ * ]
86
+ * },
87
+ * {
88
+ * name: 'BattleKing',
89
+ * score: 8500,
90
+ * equipments: [
91
+ * { name: 'AUG', quality: 'epic', level: 82 },
92
+ * { name: 'Red Dot Sight', quality: 'rare', level: 75 },
93
+ * { name: 'Extended Mag', quality: 'common', level: 70 },
94
+ * { name: 'Tactical Stock', quality: 'rare', level: 76 }
95
+ * ]
96
+ * },
97
+ * {
98
+ * name: 'SniperElite',
99
+ * score: 7800,
100
+ * equipments: [
101
+ * { name: 'M24', quality: 'legendary', level: 88 },
102
+ * { name: 'Compensator', quality: 'epic', level: 80 },
103
+ * { name: 'Scope 8x', quality: 'legendary', level: 85 },
104
+ * { name: 'Level 2 Helmet', quality: 'rare', level: 75 }
105
+ * ]
106
+ * },
107
+ * {
108
+ * name: 'RushMaster',
109
+ * score: 7500,
110
+ * equipments: [
111
+ * { name: 'Vector', quality: 'rare', level: 72 },
112
+ * { name: 'Level 2 Helmet', quality: 'common', level: 65 },
113
+ * { name: 'Quickdraw Mag', quality: 'common', level: 60 },
114
+ * { name: 'Laser Sight', quality: 'rare', level: 68 }
115
+ * ]
116
+ * },
117
+ * {
118
+ * name: 'GhostWarrior',
119
+ * score: 8200,
120
+ * equipments: [
121
+ * { name: 'SCAR-L', quality: 'epic', level: 78 },
122
+ * { name: 'Extended Quickdraw Mag', quality: 'rare', level: 70 },
123
+ * { name: 'Holographic Sight', quality: 'epic', level: 75 },
124
+ * { name: 'Suppressor', quality: 'rare', level: 72 },
125
+ * { name: 'Vertical Grip', quality: 'common', level: 65 }
126
+ * ]
127
+ * },
128
+ * {
129
+ * name: 'DeathDealer',
130
+ * score: 7300,
131
+ * equipments: [
132
+ * { name: 'SKS', quality: 'epic', level: 76 },
133
+ * { name: 'Holographic Sight', quality: 'rare', level: 68 },
134
+ * { name: 'Extended Mag', quality: 'common', level: 65 }
135
+ * ]
136
+ * },
137
+ * {
138
+ * name: 'StormRider',
139
+ * score: 8900,
140
+ * equipments: [
141
+ * { name: 'MK14', quality: 'legendary', level: 92 },
142
+ * { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
143
+ * { name: 'Scope 8x', quality: 'epic', level: 80 },
144
+ * { name: 'Suppressor', quality: 'legendary', level: 88 },
145
+ * { name: 'Tactical Stock', quality: 'rare', level: 75 }
146
+ * ]
147
+ * },
148
+ * {
149
+ * name: 'CombatLegend',
150
+ * score: 7600,
151
+ * equipments: [
152
+ * { name: 'UMP45', quality: 'rare', level: 74 },
153
+ * { name: 'Level 2 Vest', quality: 'common', level: 67 },
154
+ * { name: 'Red Dot Sight', quality: 'common', level: 62 },
155
+ * { name: 'Extended Mag', quality: 'rare', level: 70 }
156
+ * ]
157
+ * }
158
+ * ];
159
+ *
160
+ * // Create a TreeMultiMap for player rankings
161
+ * const playerRankings = new TreeMultiMap<number, Equipment, Player>(players, {
162
+ * toEntryFn: ({ score, equipments }) => [score, equipments],
163
+ * isMapMode: false
164
+ * });
165
+ *
166
+ * const topPlayersEquipments = playerRankings.rangeSearch([8900, 10000], node => playerRankings.get(node));
167
+ * console.log(topPlayersEquipments); // [
168
+ * // [
169
+ * // {
170
+ * // name: 'MK14',
171
+ * // quality: 'legendary',
172
+ * // level: 92
173
+ * // },
174
+ * // { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
175
+ * // {
176
+ * // name: 'Scope 8x',
177
+ * // quality: 'epic',
178
+ * // level: 80
179
+ * // },
180
+ * // { name: 'Suppressor', quality: 'legendary', level: 88 },
181
+ * // {
182
+ * // name: 'Tactical Stock',
183
+ * // quality: 'rare',
184
+ * // level: 75
185
+ * // }
186
+ * // ],
187
+ * // [
188
+ * // { name: 'KAR98K', quality: 'legendary', level: 90 },
189
+ * // {
190
+ * // name: 'Level 3 Vest',
191
+ * // quality: 'legendary',
192
+ * // level: 85
193
+ * // },
194
+ * // { name: 'Holographic Sight', quality: 'epic', level: 82 },
195
+ * // {
196
+ * // name: 'Suppressor',
197
+ * // quality: 'legendary',
198
+ * // level: 88
199
+ * // },
200
+ * // { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
201
+ * // ]
202
+ * // ]
45
203
  */
46
204
  export class TreeMultiMap extends RedBlackTree {
47
205
  /**
@@ -56,7 +214,7 @@ export class TreeMultiMap extends RedBlackTree {
56
214
  * additional options for configuring the TreeMultiMap instance.
57
215
  */
58
216
  constructor(keysNodesEntriesOrRaws = [], options) {
59
- super([], { ...options, isMapMode: true });
217
+ super([], { ...options });
60
218
  if (keysNodesEntriesOrRaws) {
61
219
  this.addMany(keysNodesEntriesOrRaws);
62
220
  }
@@ -80,6 +238,7 @@ export class TreeMultiMap extends RedBlackTree {
80
238
  specifyComparable: this._specifyComparable,
81
239
  toEntryFn: this._toEntryFn,
82
240
  isReverse: this._isReverse,
241
+ isMapMode: this._isMapMode,
83
242
  ...options
84
243
  });
85
244
  }
@@ -87,28 +246,30 @@ export class TreeMultiMap extends RedBlackTree {
87
246
  * Time Complexity: O(1)
88
247
  * Space Complexity: O(1)
89
248
  *
90
- * The function `createNode` overrides the method to create a new `TreeMultiMapNode` with a specified
91
- * key and an empty array of values.
92
- * @param {K} key - The `key` parameter in the `createNode` method represents the key of the node
93
- * that will be created in the TreeMultiMap data structure.
94
- * @returns A new instance of `TreeMultiMapNode<K, V>` is being returned, with the specified key and
95
- * an empty array as its value.
249
+ * The function `createNode` overrides the creation of a new TreeMultiMapNode with a specified key
250
+ * and value array.
251
+ * @param {K} key - The `key` parameter represents the key of the node being created in the
252
+ * `TreeMultiMap`.
253
+ * @param {V[]} value - The `value` parameter in the `createNode` method represents an array of
254
+ * values associated with a specific key in the TreeMultiMap data structure.
255
+ * @returns A new instance of `TreeMultiMapNode<K, V>` is being returned with the specified key and
256
+ * value. If `_isMapMode` is true, an empty array is passed as the value, otherwise the provided
257
+ * value is used.
96
258
  */
97
- createNode(key) {
98
- return new TreeMultiMapNode(key, []);
259
+ createNode(key, value = []) {
260
+ return new TreeMultiMapNode(key, this._isMapMode ? [] : value);
99
261
  }
100
262
  /**
101
263
  * Time Complexity: O(log n)
102
264
  * Space Complexity: O(log n)
103
265
  *
104
- * The function `add` in TypeScript overrides the superclass method to add key-value pairs to a
105
- * TreeMultiMapNode, handling different input types and scenarios.
106
- * @param {K | TreeMultiMapNode<K, V> | [K | null | undefined, V[] | undefined] | null | undefined} keyNodeOrEntry - The `keyNodeOrEntry`
107
- * parameter in the `override add` method can be either a `BTNRep` object containing a key, an array
108
- * of values, and a `TreeMultiMapNode`, or just a key.
109
- * @param {V} [value] - The `value` parameter in the `override add` method represents the value that
110
- * you want to add to the TreeMultiMap. If the key is already present in the map, the new value will
111
- * be added to the existing list of values associated with that key. If the key is not present,
266
+ * The function overrides the add method to handle different types of input for a TreeMultiMap data
267
+ * structure.
268
+ * @param [key] - The `key` parameter in the `override add` method represents the key of the entry to
269
+ * be added to the TreeMultiMap. It can be of type `K`, which is the key type of the TreeMultiMap, or
270
+ * it can be a TreeMultiMapNode containing the key and its
271
+ * @param {V[]} [values] - The `values` parameter in the `add` method represents an array of values
272
+ * that you want to add to the TreeMultiMap. It can contain one or more values of type `V`.
112
273
  * @returns The `add` method is returning a boolean value, which indicates whether the operation was
113
274
  * successful or not.
114
275
  */
@@ -118,30 +279,40 @@ export class TreeMultiMap extends RedBlackTree {
118
279
  const _commonAdd = (key, values) => {
119
280
  if (key === undefined || key === null)
120
281
  return false;
121
- const existingValues = this.get(key);
122
- if (existingValues !== undefined && values !== undefined) {
123
- for (const value of values)
124
- existingValues.push(value);
125
- return true;
126
- }
127
- const existingNode = this.getNode(key);
128
- if (this.isRealNode(existingNode)) {
129
- if (existingValues === undefined) {
130
- super.add(key, values);
131
- return true;
132
- }
133
- if (values !== undefined) {
282
+ const _addToValues = () => {
283
+ const existingValues = this.get(key);
284
+ if (existingValues !== undefined && values !== undefined) {
134
285
  for (const value of values)
135
286
  existingValues.push(value);
136
287
  return true;
137
288
  }
289
+ return false;
290
+ };
291
+ const _addByNode = () => {
292
+ const existingNode = this.getNode(key);
293
+ if (this.isRealNode(existingNode)) {
294
+ const existingValues = this.get(existingNode);
295
+ if (existingValues === undefined) {
296
+ super.add(key, values);
297
+ return true;
298
+ }
299
+ if (values !== undefined) {
300
+ for (const value of values)
301
+ existingValues.push(value);
302
+ return true;
303
+ }
304
+ else {
305
+ return false;
306
+ }
307
+ }
138
308
  else {
139
- return false;
309
+ return super.add(key, values);
140
310
  }
311
+ };
312
+ if (this._isMapMode) {
313
+ return _addByNode() || _addToValues();
141
314
  }
142
- else {
143
- return super.add(key, values);
144
- }
315
+ return _addToValues() || _addByNode();
145
316
  };
146
317
  if (this.isEntry(keyNodeOrEntry)) {
147
318
  const [key, values] = keyNodeOrEntry;
@@ -1 +1 @@
1
- {"version":3,"file":"tree-multi-map.js","sourceRoot":"","sources":["../../../../src/data-structures/binary-tree/tree-multi-map.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tree-multi-map.js","sourceRoot":"","sources":["../../../../src/data-structures/binary-tree/tree-multi-map.ts"],"names":[],"mappings":"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"}
@@ -249,7 +249,7 @@ export class AbstractGraph extends IterableEntryBase {
249
249
  isWeight = false;
250
250
  if (isWeight) {
251
251
  const allPaths = this.getAllPathsBetween(v1, v2);
252
- let min = Infinity;
252
+ let min = Number.MAX_SAFE_INTEGER;
253
253
  for (const path of allPaths) {
254
254
  min = Math.min(this.getPathSumWeight(path), min);
255
255
  }
@@ -266,8 +266,8 @@ export class AbstractGraph extends IterableEntryBase {
266
266
  const queue = new Queue([vertex1]);
267
267
  visited.set(vertex1, true);
268
268
  let cost = 0;
269
- while (queue.size > 0) {
270
- for (let i = 0; i < queue.size; i++) {
269
+ while (queue.length > 0) {
270
+ for (let i = 0; i < queue.length; i++) {
271
271
  const cur = queue.shift();
272
272
  if (cur === vertex2) {
273
273
  return cost;
@@ -313,7 +313,7 @@ export class AbstractGraph extends IterableEntryBase {
313
313
  if (isWeight) {
314
314
  if (isDFS) {
315
315
  const allPaths = this.getAllPathsBetween(v1, v2, 10000);
316
- let min = Infinity;
316
+ let min = Number.MAX_SAFE_INTEGER;
317
317
  let minIndex = -1;
318
318
  let index = 0;
319
319
  for (const path of allPaths) {
@@ -377,7 +377,7 @@ export class AbstractGraph extends IterableEntryBase {
377
377
  * @returns The function `dijkstraWithoutHeap` returns an object of type `DijkstraResult<VO>`.
378
378
  */
379
379
  dijkstraWithoutHeap(src, dest = undefined, getMinDist = false, genPaths = false) {
380
- let minDist = Infinity;
380
+ let minDist = Number.MAX_SAFE_INTEGER;
381
381
  let minDest = undefined;
382
382
  let minPath = [];
383
383
  const paths = [];
@@ -393,12 +393,12 @@ export class AbstractGraph extends IterableEntryBase {
393
393
  for (const vertex of vertexMap) {
394
394
  const vertexOrKey = vertex[1];
395
395
  if (vertexOrKey instanceof AbstractVertex)
396
- distMap.set(vertexOrKey, Infinity);
396
+ distMap.set(vertexOrKey, Number.MAX_SAFE_INTEGER);
397
397
  }
398
398
  distMap.set(srcVertex, 0);
399
399
  preMap.set(srcVertex, undefined);
400
400
  const getMinOfNoSeen = () => {
401
- let min = Infinity;
401
+ let min = Number.MAX_SAFE_INTEGER;
402
402
  let minV = undefined;
403
403
  for (const [key, value] of distMap) {
404
404
  if (!seen.has(key)) {
@@ -433,7 +433,7 @@ export class AbstractGraph extends IterableEntryBase {
433
433
  seen.add(cur);
434
434
  if (destVertex && destVertex === cur) {
435
435
  if (getMinDist) {
436
- minDist = distMap.get(destVertex) || Infinity;
436
+ minDist = distMap.get(destVertex) || Number.MAX_SAFE_INTEGER;
437
437
  }
438
438
  if (genPaths) {
439
439
  getPaths(destVertex);
@@ -494,7 +494,7 @@ export class AbstractGraph extends IterableEntryBase {
494
494
  * @returns The function `dijkstra` returns an object of type `DijkstraResult<VO>`.
495
495
  */
496
496
  dijkstra(src, dest = undefined, getMinDist = false, genPaths = false) {
497
- let minDist = Infinity;
497
+ let minDist = Number.MAX_SAFE_INTEGER;
498
498
  let minDest = undefined;
499
499
  let minPath = [];
500
500
  const paths = [];
@@ -509,7 +509,7 @@ export class AbstractGraph extends IterableEntryBase {
509
509
  for (const vertex of vertexMap) {
510
510
  const vertexOrKey = vertex[1];
511
511
  if (vertexOrKey instanceof AbstractVertex)
512
- distMap.set(vertexOrKey, Infinity);
512
+ distMap.set(vertexOrKey, Number.MAX_SAFE_INTEGER);
513
513
  }
514
514
  const heap = new Heap([], { comparator: (a, b) => a.key - b.key });
515
515
  heap.add({ key: 0, value: srcVertex });
@@ -546,7 +546,7 @@ export class AbstractGraph extends IterableEntryBase {
546
546
  seen.add(cur);
547
547
  if (destVertex && destVertex === cur) {
548
548
  if (getMinDist) {
549
- minDist = distMap.get(destVertex) || Infinity;
549
+ minDist = distMap.get(destVertex) || Number.MAX_SAFE_INTEGER;
550
550
  }
551
551
  if (genPaths) {
552
552
  getPaths(destVertex);
@@ -615,7 +615,7 @@ export class AbstractGraph extends IterableEntryBase {
615
615
  const paths = [];
616
616
  const distMap = new Map();
617
617
  const preMap = new Map(); // predecessor
618
- let min = Infinity;
618
+ let min = Number.MAX_SAFE_INTEGER;
619
619
  let minPath = [];
620
620
  // TODO
621
621
  let hasNegativeCycle;
@@ -628,7 +628,7 @@ export class AbstractGraph extends IterableEntryBase {
628
628
  const edgeMap = this.edgeSet();
629
629
  const numOfEdges = edgeMap.length;
630
630
  this._vertexMap.forEach(vertex => {
631
- distMap.set(vertex, Infinity);
631
+ distMap.set(vertex, Number.MAX_SAFE_INTEGER);
632
632
  });
633
633
  distMap.set(srcVertex, 0);
634
634
  for (let i = 1; i < numOfVertices; ++i) {
@@ -640,7 +640,7 @@ export class AbstractGraph extends IterableEntryBase {
640
640
  const sWeight = distMap.get(s);
641
641
  const dWeight = distMap.get(d);
642
642
  if (sWeight !== undefined && dWeight !== undefined) {
643
- if (distMap.get(s) !== Infinity && sWeight + weight < dWeight) {
643
+ if (distMap.get(s) !== Number.MAX_SAFE_INTEGER && sWeight + weight < dWeight) {
644
644
  distMap.set(d, sWeight + weight);
645
645
  if (genPath)
646
646
  preMap.set(d, s);
@@ -685,7 +685,7 @@ export class AbstractGraph extends IterableEntryBase {
685
685
  const weight = edgeMap[j].weight;
686
686
  const sWeight = distMap.get(s);
687
687
  if (sWeight) {
688
- if (sWeight !== Infinity && sWeight + weight < sWeight)
688
+ if (sWeight !== Number.MAX_SAFE_INTEGER && sWeight + weight < sWeight)
689
689
  hasNegativeCycle = true;
690
690
  }
691
691
  }
@@ -734,7 +734,7 @@ export class AbstractGraph extends IterableEntryBase {
734
734
  }
735
735
  for (let i = 0; i < n; i++) {
736
736
  for (let j = 0; j < n; j++) {
737
- costs[i][j] = this.getEdge(idAndVertices[i][1], idAndVertices[j][1])?.weight || Infinity;
737
+ costs[i][j] = this.getEdge(idAndVertices[i][1], idAndVertices[j][1])?.weight || Number.MAX_SAFE_INTEGER;
738
738
  }
739
739
  }
740
740
  for (let k = 0; k < n; k++) {