data-structure-typed 1.42.4 → 1.42.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/README.md +17 -17
- package/benchmark/report.html +12 -12
- package/benchmark/report.json +106 -106
- package/dist/cjs/src/data-structures/binary-tree/index.d.ts +1 -1
- package/dist/cjs/src/data-structures/binary-tree/index.js +1 -1
- package/dist/cjs/src/data-structures/binary-tree/{tree-multiset.d.ts → tree-multimap.d.ts} +10 -10
- package/dist/cjs/src/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +15 -15
- package/dist/cjs/src/data-structures/binary-tree/{tree-multiset.js.map → tree-multimap.js.map} +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/index.d.ts +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/index.js +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/tree-multimap.d.ts +4 -0
- package/dist/cjs/src/types/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +1 -1
- package/dist/cjs/src/types/data-structures/binary-tree/tree-multimap.js.map +1 -0
- package/dist/mjs/src/data-structures/binary-tree/index.d.ts +1 -1
- package/dist/mjs/src/data-structures/binary-tree/index.js +1 -1
- package/dist/mjs/src/data-structures/binary-tree/{tree-multiset.d.ts → tree-multimap.d.ts} +10 -10
- package/dist/mjs/src/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +14 -14
- package/dist/mjs/src/types/data-structures/binary-tree/index.d.ts +1 -1
- package/dist/mjs/src/types/data-structures/binary-tree/index.js +1 -1
- package/dist/mjs/src/types/data-structures/binary-tree/tree-multimap.d.ts +4 -0
- package/dist/umd/data-structure-typed.min.js +1 -1
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +5 -3
- package/src/data-structures/binary-tree/index.ts +1 -1
- package/src/data-structures/binary-tree/{tree-multiset.ts → tree-multimap.ts} +14 -14
- package/src/types/data-structures/binary-tree/index.ts +1 -1
- package/src/types/data-structures/binary-tree/tree-multimap.ts +6 -0
- package/test/performance/data-structures/binary-tree/rb-tree.test.ts +2 -2
- package/test/unit/data-structures/binary-tree/{tree-multiset.test.ts → tree-multimap.test.ts} +182 -182
- package/dist/cjs/src/types/data-structures/binary-tree/tree-multiset.d.ts +0 -4
- package/dist/cjs/src/types/data-structures/binary-tree/tree-multiset.js.map +0 -1
- package/dist/mjs/src/types/data-structures/binary-tree/tree-multiset.d.ts +0 -4
- package/src/types/data-structures/binary-tree/tree-multiset.ts +0 -6
- /package/dist/mjs/src/types/data-structures/binary-tree/{tree-multiset.js → tree-multimap.js} +0 -0
- /package/test/performance/data-structures/binary-tree/{tree-multiset.test.ts → tree-multimap.test.ts} +0 -0
package/test/unit/data-structures/binary-tree/{tree-multiset.test.ts → tree-multimap.test.ts}
RENAMED
|
@@ -1,216 +1,216 @@
|
|
|
1
|
-
import {CP, IterationType,
|
|
1
|
+
import {CP, IterationType, TreeMultimap, TreeMultimapNode} from '../../../../src';
|
|
2
2
|
import {isDebugTest} from '../../../config';
|
|
3
3
|
|
|
4
4
|
const isDebug = isDebugTest;
|
|
5
5
|
|
|
6
|
-
describe('
|
|
6
|
+
describe('TreeMultimap operations test', () => {
|
|
7
7
|
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
8
|
-
const
|
|
8
|
+
const treeMultimap = new TreeMultimap();
|
|
9
9
|
|
|
10
|
-
expect(
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
expect(treeMultimap instanceof TreeMultimap);
|
|
11
|
+
treeMultimap.add(11, 11);
|
|
12
|
+
treeMultimap.add(3, 3);
|
|
13
13
|
const idAndValues = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
14
|
-
|
|
15
|
-
expect(
|
|
14
|
+
treeMultimap.addMany(idAndValues, idAndValues);
|
|
15
|
+
expect(treeMultimap.root instanceof TreeMultimapNode);
|
|
16
16
|
|
|
17
|
-
if (
|
|
17
|
+
if (treeMultimap.root) expect(treeMultimap.root.key == 11);
|
|
18
18
|
|
|
19
|
-
expect(
|
|
20
|
-
expect(
|
|
19
|
+
expect(treeMultimap.size).toBe(16);
|
|
20
|
+
expect(treeMultimap.count).toBe(18);
|
|
21
21
|
|
|
22
|
-
expect(
|
|
22
|
+
expect(treeMultimap.has(6));
|
|
23
23
|
|
|
24
|
-
expect(
|
|
25
|
-
expect(
|
|
26
|
-
const nodeId10 =
|
|
24
|
+
expect(treeMultimap.getHeight(6)).toBe(3);
|
|
25
|
+
expect(treeMultimap.getDepth(6)).toBe(1);
|
|
26
|
+
const nodeId10 = treeMultimap.getNode(10);
|
|
27
27
|
expect(nodeId10?.key).toBe(10);
|
|
28
28
|
|
|
29
|
-
const nodeVal9 =
|
|
29
|
+
const nodeVal9 = treeMultimap.getNode(9, node => node.value);
|
|
30
30
|
expect(nodeVal9?.key).toBe(9);
|
|
31
31
|
|
|
32
|
-
const nodesByCount1 =
|
|
32
|
+
const nodesByCount1 = treeMultimap.getNodes(1, node => node.count);
|
|
33
33
|
expect(nodesByCount1.length).toBe(14);
|
|
34
34
|
|
|
35
|
-
const nodesByCount2 =
|
|
35
|
+
const nodesByCount2 = treeMultimap.getNodes(2, node => node.count);
|
|
36
36
|
expect(nodesByCount2.length).toBe(2);
|
|
37
|
-
const leftMost =
|
|
37
|
+
const leftMost = treeMultimap.getLeftMost();
|
|
38
38
|
expect(leftMost?.key).toBe(1);
|
|
39
39
|
|
|
40
|
-
const node15 =
|
|
41
|
-
const minNodeBySpecificNode = node15 &&
|
|
40
|
+
const node15 = treeMultimap.getNode(15);
|
|
41
|
+
const minNodeBySpecificNode = node15 && treeMultimap.getLeftMost(node15);
|
|
42
42
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
43
43
|
|
|
44
44
|
let subTreeSum = 0;
|
|
45
|
-
node15 &&
|
|
45
|
+
node15 && treeMultimap.subTreeTraverse((node: TreeMultimapNode<number>) => (subTreeSum += node.key), 15);
|
|
46
46
|
expect(subTreeSum).toBe(70);
|
|
47
47
|
let lesserSum = 0;
|
|
48
|
-
|
|
48
|
+
treeMultimap.lesserOrGreaterTraverse((node: TreeMultimapNode<number>) => (lesserSum += node.key), CP.lt, 10);
|
|
49
49
|
expect(lesserSum).toBe(45);
|
|
50
50
|
|
|
51
|
-
expect(node15 instanceof
|
|
52
|
-
if (node15 instanceof
|
|
53
|
-
const subTreeAdd =
|
|
51
|
+
expect(node15 instanceof TreeMultimapNode);
|
|
52
|
+
if (node15 instanceof TreeMultimapNode) {
|
|
53
|
+
const subTreeAdd = treeMultimap.subTreeTraverse((node: TreeMultimapNode<number>) => (node.count += 1), 15);
|
|
54
54
|
expect(subTreeAdd);
|
|
55
55
|
}
|
|
56
|
-
const node11 =
|
|
57
|
-
expect(node11 instanceof
|
|
58
|
-
if (node11 instanceof
|
|
59
|
-
const allGreaterNodesAdded =
|
|
56
|
+
const node11 = treeMultimap.getNode(11);
|
|
57
|
+
expect(node11 instanceof TreeMultimapNode);
|
|
58
|
+
if (node11 instanceof TreeMultimapNode) {
|
|
59
|
+
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
|
|
60
60
|
expect(allGreaterNodesAdded);
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
const dfsInorderNodes =
|
|
63
|
+
const dfsInorderNodes = treeMultimap.dfs(node => node, 'in');
|
|
64
64
|
expect(dfsInorderNodes[0].key).toBe(1);
|
|
65
65
|
expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
|
|
66
|
-
expect(
|
|
66
|
+
expect(treeMultimap.isPerfectlyBalanced()).toBe(false);
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
treeMultimap.perfectlyBalance();
|
|
69
69
|
|
|
70
|
-
expect(
|
|
71
|
-
expect(
|
|
70
|
+
expect(treeMultimap.isPerfectlyBalanced()).toBe(true);
|
|
71
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
72
72
|
|
|
73
|
-
const bfsNodesAfterBalanced =
|
|
73
|
+
const bfsNodesAfterBalanced = treeMultimap.bfs(node => node);
|
|
74
74
|
expect(bfsNodesAfterBalanced[0].key).toBe(8);
|
|
75
75
|
expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
|
|
76
76
|
|
|
77
|
-
const removed11 =
|
|
77
|
+
const removed11 = treeMultimap.delete(11, undefined, true);
|
|
78
78
|
expect(removed11 instanceof Array);
|
|
79
79
|
expect(removed11[0]);
|
|
80
80
|
expect(removed11[0].deleted);
|
|
81
81
|
|
|
82
82
|
if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
|
|
83
83
|
|
|
84
|
-
expect(
|
|
84
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
85
85
|
|
|
86
|
-
expect(
|
|
86
|
+
expect(treeMultimap.getHeight(15)).toBe(1);
|
|
87
87
|
|
|
88
|
-
const removed1 =
|
|
88
|
+
const removed1 = treeMultimap.delete(1, undefined, true);
|
|
89
89
|
expect(removed1 instanceof Array);
|
|
90
90
|
expect(removed1[0]);
|
|
91
91
|
expect(removed1[0].deleted);
|
|
92
92
|
if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
|
|
93
93
|
|
|
94
|
-
expect(
|
|
94
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
95
95
|
|
|
96
|
-
expect(
|
|
96
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
97
97
|
|
|
98
|
-
const removed4 =
|
|
98
|
+
const removed4 = treeMultimap.delete(4, undefined, true);
|
|
99
99
|
expect(removed4 instanceof Array);
|
|
100
100
|
expect(removed4[0]);
|
|
101
101
|
expect(removed4[0].deleted);
|
|
102
102
|
if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
|
|
103
103
|
|
|
104
|
-
expect(
|
|
105
|
-
expect(
|
|
104
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
105
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
106
106
|
|
|
107
|
-
const removed10 =
|
|
107
|
+
const removed10 = treeMultimap.delete(10, undefined, true);
|
|
108
108
|
expect(removed10 instanceof Array);
|
|
109
109
|
expect(removed10[0]);
|
|
110
110
|
expect(removed10[0].deleted);
|
|
111
111
|
if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
|
|
112
|
-
expect(
|
|
112
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
113
113
|
|
|
114
|
-
expect(
|
|
114
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
115
115
|
|
|
116
|
-
const removed15 =
|
|
116
|
+
const removed15 = treeMultimap.delete(15, undefined, true);
|
|
117
117
|
expect(removed15 instanceof Array);
|
|
118
118
|
expect(removed15[0]);
|
|
119
119
|
expect(removed15[0].deleted);
|
|
120
120
|
if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
|
|
121
121
|
|
|
122
|
-
expect(
|
|
123
|
-
expect(
|
|
122
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
123
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
124
124
|
|
|
125
|
-
const removed5 =
|
|
125
|
+
const removed5 = treeMultimap.delete(5, undefined, true);
|
|
126
126
|
expect(removed5 instanceof Array);
|
|
127
127
|
expect(removed5[0]);
|
|
128
128
|
expect(removed5[0].deleted);
|
|
129
129
|
if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
|
|
130
130
|
|
|
131
|
-
expect(
|
|
132
|
-
expect(
|
|
131
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
132
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
133
133
|
|
|
134
|
-
const removed13 =
|
|
134
|
+
const removed13 = treeMultimap.delete(13, undefined, true);
|
|
135
135
|
expect(removed13 instanceof Array);
|
|
136
136
|
expect(removed13[0]);
|
|
137
137
|
expect(removed13[0].deleted);
|
|
138
138
|
if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
|
|
139
|
-
expect(
|
|
140
|
-
expect(
|
|
139
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
140
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
141
141
|
|
|
142
|
-
const removed3 =
|
|
142
|
+
const removed3 = treeMultimap.delete(3, undefined, true);
|
|
143
143
|
expect(removed3 instanceof Array);
|
|
144
144
|
expect(removed3[0]);
|
|
145
145
|
expect(removed3[0].deleted);
|
|
146
146
|
if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
|
|
147
|
-
expect(
|
|
148
|
-
expect(
|
|
147
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
148
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
149
149
|
|
|
150
|
-
const removed8 =
|
|
150
|
+
const removed8 = treeMultimap.delete(8, undefined, true);
|
|
151
151
|
expect(removed8 instanceof Array);
|
|
152
152
|
expect(removed8[0]);
|
|
153
153
|
expect(removed8[0].deleted);
|
|
154
154
|
if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
|
|
155
|
-
expect(
|
|
156
|
-
expect(
|
|
155
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
156
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
157
157
|
|
|
158
|
-
const removed6 =
|
|
158
|
+
const removed6 = treeMultimap.delete(6, undefined, true);
|
|
159
159
|
expect(removed6 instanceof Array);
|
|
160
160
|
expect(removed6[0]);
|
|
161
161
|
expect(removed6[0].deleted);
|
|
162
162
|
if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
|
|
163
|
-
expect(
|
|
164
|
-
expect(
|
|
163
|
+
expect(treeMultimap.delete(6, undefined, true).length).toBe(0);
|
|
164
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
165
165
|
|
|
166
|
-
expect(
|
|
166
|
+
expect(treeMultimap.getHeight()).toBe(2);
|
|
167
167
|
|
|
168
|
-
const removed7 =
|
|
168
|
+
const removed7 = treeMultimap.delete(7, undefined, true);
|
|
169
169
|
expect(removed7 instanceof Array);
|
|
170
170
|
expect(removed7[0]);
|
|
171
171
|
expect(removed7[0].deleted);
|
|
172
172
|
if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
|
|
173
|
-
expect(
|
|
174
|
-
expect(
|
|
173
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
174
|
+
expect(treeMultimap.getHeight()).toBe(2);
|
|
175
175
|
|
|
176
|
-
const removed9 =
|
|
176
|
+
const removed9 = treeMultimap.delete(9, undefined, true);
|
|
177
177
|
expect(removed9 instanceof Array);
|
|
178
178
|
expect(removed9[0]);
|
|
179
179
|
expect(removed9[0].deleted);
|
|
180
180
|
if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
|
|
181
|
-
expect(
|
|
182
|
-
expect(
|
|
181
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
182
|
+
expect(treeMultimap.getHeight()).toBe(2);
|
|
183
183
|
|
|
184
|
-
const removed14 =
|
|
184
|
+
const removed14 = treeMultimap.delete(14, undefined, true);
|
|
185
185
|
expect(removed14 instanceof Array);
|
|
186
186
|
expect(removed14[0]);
|
|
187
187
|
expect(removed14[0].deleted);
|
|
188
188
|
if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
|
|
189
|
-
expect(
|
|
190
|
-
expect(
|
|
189
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
190
|
+
expect(treeMultimap.getHeight()).toBe(1);
|
|
191
191
|
|
|
192
|
-
expect(
|
|
192
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
193
193
|
|
|
194
|
-
const bfsIDs =
|
|
194
|
+
const bfsIDs = treeMultimap.bfs(node => node.key);
|
|
195
195
|
|
|
196
196
|
expect(bfsIDs[0]).toBe(12);
|
|
197
197
|
expect(bfsIDs[1]).toBe(2);
|
|
198
198
|
expect(bfsIDs[2]).toBe(16);
|
|
199
199
|
|
|
200
|
-
const bfsNodes =
|
|
200
|
+
const bfsNodes = treeMultimap.bfs(node => node);
|
|
201
201
|
|
|
202
202
|
expect(bfsNodes[0].key).toBe(12);
|
|
203
203
|
expect(bfsNodes[1].key).toBe(2);
|
|
204
204
|
expect(bfsNodes[2].key).toBe(16);
|
|
205
205
|
|
|
206
|
-
expect(
|
|
206
|
+
expect(treeMultimap.count).toBe(9);
|
|
207
207
|
});
|
|
208
208
|
|
|
209
209
|
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
210
|
-
const
|
|
211
|
-
expect(
|
|
212
|
-
|
|
213
|
-
|
|
210
|
+
const objTreeMultimap = new TreeMultimap<{key: number; keyA: number}>();
|
|
211
|
+
expect(objTreeMultimap).toBeInstanceOf(TreeMultimap);
|
|
212
|
+
objTreeMultimap.add(11, {key: 11, keyA: 11});
|
|
213
|
+
objTreeMultimap.add(3, {key: 3, keyA: 3});
|
|
214
214
|
const values = [
|
|
215
215
|
{key: 15, keyA: 15},
|
|
216
216
|
{key: 1, keyA: 1},
|
|
@@ -228,229 +228,229 @@ describe('TreeMultiset operations test', () => {
|
|
|
228
228
|
{key: 5, keyA: 5}
|
|
229
229
|
];
|
|
230
230
|
|
|
231
|
-
|
|
231
|
+
objTreeMultimap.addMany(
|
|
232
232
|
values.map(item => item.key),
|
|
233
233
|
values
|
|
234
234
|
);
|
|
235
235
|
|
|
236
|
-
expect(
|
|
236
|
+
expect(objTreeMultimap.root).toBeInstanceOf(TreeMultimapNode);
|
|
237
237
|
|
|
238
|
-
if (
|
|
238
|
+
if (objTreeMultimap.root) expect(objTreeMultimap.root.key).toBe(11);
|
|
239
239
|
|
|
240
|
-
expect(
|
|
240
|
+
expect(objTreeMultimap.count).toBe(16);
|
|
241
241
|
|
|
242
|
-
expect(
|
|
242
|
+
expect(objTreeMultimap.has(6)).toBe(true);
|
|
243
243
|
});
|
|
244
244
|
});
|
|
245
245
|
|
|
246
|
-
describe('
|
|
246
|
+
describe('TreeMultimap operations test recursively', () => {
|
|
247
247
|
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
248
|
-
const
|
|
248
|
+
const treeMultimap = new TreeMultimap({iterationType: IterationType.RECURSIVE});
|
|
249
249
|
|
|
250
|
-
expect(
|
|
251
|
-
|
|
252
|
-
|
|
250
|
+
expect(treeMultimap instanceof TreeMultimap);
|
|
251
|
+
treeMultimap.add(11, 11);
|
|
252
|
+
treeMultimap.add(3, 3);
|
|
253
253
|
const idAndValues = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
254
|
-
|
|
255
|
-
expect(
|
|
254
|
+
treeMultimap.addMany(idAndValues, idAndValues);
|
|
255
|
+
expect(treeMultimap.root instanceof TreeMultimapNode);
|
|
256
256
|
|
|
257
|
-
if (
|
|
257
|
+
if (treeMultimap.root) expect(treeMultimap.root.key == 11);
|
|
258
258
|
|
|
259
|
-
expect(
|
|
260
|
-
expect(
|
|
259
|
+
expect(treeMultimap.size).toBe(16);
|
|
260
|
+
expect(treeMultimap.count).toBe(18);
|
|
261
261
|
|
|
262
|
-
expect(
|
|
262
|
+
expect(treeMultimap.has(6));
|
|
263
263
|
|
|
264
|
-
expect(
|
|
265
|
-
expect(
|
|
266
|
-
const nodeId10 =
|
|
264
|
+
expect(treeMultimap.getHeight(6)).toBe(3);
|
|
265
|
+
expect(treeMultimap.getDepth(6)).toBe(1);
|
|
266
|
+
const nodeId10 = treeMultimap.getNode(10);
|
|
267
267
|
expect(nodeId10?.key).toBe(10);
|
|
268
268
|
|
|
269
|
-
const nodeVal9 =
|
|
269
|
+
const nodeVal9 = treeMultimap.getNode(9, node => node.value);
|
|
270
270
|
expect(nodeVal9?.key).toBe(9);
|
|
271
271
|
|
|
272
|
-
const nodesByCount1 =
|
|
272
|
+
const nodesByCount1 = treeMultimap.getNodes(1, node => node.count);
|
|
273
273
|
expect(nodesByCount1.length).toBe(14);
|
|
274
274
|
|
|
275
|
-
const nodesByCount2 =
|
|
275
|
+
const nodesByCount2 = treeMultimap.getNodes(2, node => node.count);
|
|
276
276
|
expect(nodesByCount2.length).toBe(2);
|
|
277
|
-
const leftMost =
|
|
277
|
+
const leftMost = treeMultimap.getLeftMost();
|
|
278
278
|
expect(leftMost?.key).toBe(1);
|
|
279
279
|
|
|
280
|
-
const node15 =
|
|
281
|
-
const minNodeBySpecificNode = node15 &&
|
|
280
|
+
const node15 = treeMultimap.getNode(15);
|
|
281
|
+
const minNodeBySpecificNode = node15 && treeMultimap.getLeftMost(node15);
|
|
282
282
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
283
283
|
|
|
284
284
|
let subTreeSum = 0;
|
|
285
|
-
node15 &&
|
|
285
|
+
node15 && treeMultimap.subTreeTraverse((node: TreeMultimapNode<number>) => (subTreeSum += node.key), 15);
|
|
286
286
|
expect(subTreeSum).toBe(70);
|
|
287
287
|
let lesserSum = 0;
|
|
288
|
-
|
|
288
|
+
treeMultimap.lesserOrGreaterTraverse((node: TreeMultimapNode<number>) => (lesserSum += node.key), CP.lt, 10);
|
|
289
289
|
expect(lesserSum).toBe(45);
|
|
290
290
|
|
|
291
|
-
expect(node15 instanceof
|
|
292
|
-
if (node15 instanceof
|
|
293
|
-
const subTreeAdd =
|
|
291
|
+
expect(node15 instanceof TreeMultimapNode);
|
|
292
|
+
if (node15 instanceof TreeMultimapNode) {
|
|
293
|
+
const subTreeAdd = treeMultimap.subTreeTraverse((node: TreeMultimapNode<number>) => (node.count += 1), 15);
|
|
294
294
|
expect(subTreeAdd);
|
|
295
295
|
}
|
|
296
|
-
const node11 =
|
|
297
|
-
expect(node11 instanceof
|
|
298
|
-
if (node11 instanceof
|
|
299
|
-
const allGreaterNodesAdded =
|
|
296
|
+
const node11 = treeMultimap.getNode(11);
|
|
297
|
+
expect(node11 instanceof TreeMultimapNode);
|
|
298
|
+
if (node11 instanceof TreeMultimapNode) {
|
|
299
|
+
const allGreaterNodesAdded = treeMultimap.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
|
|
300
300
|
expect(allGreaterNodesAdded);
|
|
301
301
|
}
|
|
302
302
|
|
|
303
|
-
const dfsInorderNodes =
|
|
303
|
+
const dfsInorderNodes = treeMultimap.dfs(node => node, 'in');
|
|
304
304
|
expect(dfsInorderNodes[0].key).toBe(1);
|
|
305
305
|
expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
|
|
306
|
-
expect(
|
|
306
|
+
expect(treeMultimap.isPerfectlyBalanced()).toBe(false);
|
|
307
307
|
|
|
308
|
-
|
|
308
|
+
treeMultimap.perfectlyBalance();
|
|
309
309
|
|
|
310
|
-
expect(
|
|
311
|
-
expect(
|
|
310
|
+
expect(treeMultimap.isPerfectlyBalanced()).toBe(true);
|
|
311
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
312
312
|
|
|
313
|
-
const bfsNodesAfterBalanced =
|
|
313
|
+
const bfsNodesAfterBalanced = treeMultimap.bfs(node => node);
|
|
314
314
|
expect(bfsNodesAfterBalanced[0].key).toBe(8);
|
|
315
315
|
expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
|
|
316
316
|
|
|
317
|
-
const removed11 =
|
|
317
|
+
const removed11 = treeMultimap.delete(11, undefined, true);
|
|
318
318
|
expect(removed11 instanceof Array);
|
|
319
319
|
expect(removed11[0]);
|
|
320
320
|
expect(removed11[0].deleted);
|
|
321
321
|
|
|
322
322
|
if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
|
|
323
323
|
|
|
324
|
-
expect(
|
|
324
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
325
325
|
|
|
326
|
-
expect(
|
|
326
|
+
expect(treeMultimap.getHeight(15)).toBe(1);
|
|
327
327
|
|
|
328
|
-
const removed1 =
|
|
328
|
+
const removed1 = treeMultimap.delete(1, undefined, true);
|
|
329
329
|
expect(removed1 instanceof Array);
|
|
330
330
|
expect(removed1[0]);
|
|
331
331
|
expect(removed1[0].deleted);
|
|
332
332
|
if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
|
|
333
333
|
|
|
334
|
-
expect(
|
|
334
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
335
335
|
|
|
336
|
-
expect(
|
|
336
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
337
337
|
|
|
338
|
-
const removed4 =
|
|
338
|
+
const removed4 = treeMultimap.delete(4, undefined, true);
|
|
339
339
|
expect(removed4 instanceof Array);
|
|
340
340
|
expect(removed4[0]);
|
|
341
341
|
expect(removed4[0].deleted);
|
|
342
342
|
if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
|
|
343
343
|
|
|
344
|
-
expect(
|
|
345
|
-
expect(
|
|
344
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
345
|
+
expect(treeMultimap.getHeight()).toBe(4);
|
|
346
346
|
|
|
347
|
-
const removed10 =
|
|
347
|
+
const removed10 = treeMultimap.delete(10, undefined, true);
|
|
348
348
|
expect(removed10 instanceof Array);
|
|
349
349
|
expect(removed10[0]);
|
|
350
350
|
expect(removed10[0].deleted);
|
|
351
351
|
if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
|
|
352
|
-
expect(
|
|
352
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
353
353
|
|
|
354
|
-
expect(
|
|
354
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
355
355
|
|
|
356
|
-
const removed15 =
|
|
356
|
+
const removed15 = treeMultimap.delete(15, undefined, true);
|
|
357
357
|
expect(removed15 instanceof Array);
|
|
358
358
|
expect(removed15[0]);
|
|
359
359
|
expect(removed15[0].deleted);
|
|
360
360
|
if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
|
|
361
361
|
|
|
362
|
-
expect(
|
|
363
|
-
expect(
|
|
362
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
363
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
364
364
|
|
|
365
|
-
const removed5 =
|
|
365
|
+
const removed5 = treeMultimap.delete(5, undefined, true);
|
|
366
366
|
expect(removed5 instanceof Array);
|
|
367
367
|
expect(removed5[0]);
|
|
368
368
|
expect(removed5[0].deleted);
|
|
369
369
|
if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
|
|
370
370
|
|
|
371
|
-
expect(
|
|
372
|
-
expect(
|
|
371
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
372
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
373
373
|
|
|
374
|
-
const removed13 =
|
|
374
|
+
const removed13 = treeMultimap.delete(13, undefined, true);
|
|
375
375
|
expect(removed13 instanceof Array);
|
|
376
376
|
expect(removed13[0]);
|
|
377
377
|
expect(removed13[0].deleted);
|
|
378
378
|
if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
|
|
379
|
-
expect(
|
|
380
|
-
expect(
|
|
379
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
380
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
381
381
|
|
|
382
|
-
const removed3 =
|
|
382
|
+
const removed3 = treeMultimap.delete(3, undefined, true);
|
|
383
383
|
expect(removed3 instanceof Array);
|
|
384
384
|
expect(removed3[0]);
|
|
385
385
|
expect(removed3[0].deleted);
|
|
386
386
|
if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
|
|
387
|
-
expect(
|
|
388
|
-
expect(
|
|
387
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
388
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
389
389
|
|
|
390
|
-
const removed8 =
|
|
390
|
+
const removed8 = treeMultimap.delete(8, undefined, true);
|
|
391
391
|
expect(removed8 instanceof Array);
|
|
392
392
|
expect(removed8[0]);
|
|
393
393
|
expect(removed8[0].deleted);
|
|
394
394
|
if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
|
|
395
|
-
expect(
|
|
396
|
-
expect(
|
|
395
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
396
|
+
expect(treeMultimap.getHeight()).toBe(3);
|
|
397
397
|
|
|
398
|
-
const removed6 =
|
|
398
|
+
const removed6 = treeMultimap.delete(6, undefined, true);
|
|
399
399
|
expect(removed6 instanceof Array);
|
|
400
400
|
expect(removed6[0]);
|
|
401
401
|
expect(removed6[0].deleted);
|
|
402
402
|
if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
|
|
403
|
-
expect(
|
|
404
|
-
expect(
|
|
403
|
+
expect(treeMultimap.delete(6, undefined, true).length).toBe(0);
|
|
404
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
405
405
|
|
|
406
|
-
expect(
|
|
406
|
+
expect(treeMultimap.getHeight()).toBe(2);
|
|
407
407
|
|
|
408
|
-
const removed7 =
|
|
408
|
+
const removed7 = treeMultimap.delete(7, undefined, true);
|
|
409
409
|
expect(removed7 instanceof Array);
|
|
410
410
|
expect(removed7[0]);
|
|
411
411
|
expect(removed7[0].deleted);
|
|
412
412
|
if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
|
|
413
|
-
expect(
|
|
414
|
-
expect(
|
|
413
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
414
|
+
expect(treeMultimap.getHeight()).toBe(2);
|
|
415
415
|
|
|
416
|
-
const removed9 =
|
|
416
|
+
const removed9 = treeMultimap.delete(9, undefined, true);
|
|
417
417
|
expect(removed9 instanceof Array);
|
|
418
418
|
expect(removed9[0]);
|
|
419
419
|
expect(removed9[0].deleted);
|
|
420
420
|
if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
|
|
421
|
-
expect(
|
|
422
|
-
expect(
|
|
421
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
422
|
+
expect(treeMultimap.getHeight()).toBe(2);
|
|
423
423
|
|
|
424
|
-
const removed14 =
|
|
424
|
+
const removed14 = treeMultimap.delete(14, undefined, true);
|
|
425
425
|
expect(removed14 instanceof Array);
|
|
426
426
|
expect(removed14[0]);
|
|
427
427
|
expect(removed14[0].deleted);
|
|
428
428
|
if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
|
|
429
|
-
expect(
|
|
430
|
-
expect(
|
|
429
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
430
|
+
expect(treeMultimap.getHeight()).toBe(1);
|
|
431
431
|
|
|
432
|
-
expect(
|
|
432
|
+
expect(treeMultimap.isAVLBalanced()).toBe(true);
|
|
433
433
|
|
|
434
|
-
const bfsIDs =
|
|
434
|
+
const bfsIDs = treeMultimap.bfs(node => node.key);
|
|
435
435
|
|
|
436
436
|
expect(bfsIDs[0]).toBe(12);
|
|
437
437
|
expect(bfsIDs[1]).toBe(2);
|
|
438
438
|
expect(bfsIDs[2]).toBe(16);
|
|
439
439
|
|
|
440
|
-
const bfsNodes =
|
|
440
|
+
const bfsNodes = treeMultimap.bfs(node => node);
|
|
441
441
|
|
|
442
442
|
expect(bfsNodes[0].key).toBe(12);
|
|
443
443
|
expect(bfsNodes[1].key).toBe(2);
|
|
444
444
|
expect(bfsNodes[2].key).toBe(16);
|
|
445
445
|
|
|
446
|
-
expect(
|
|
446
|
+
expect(treeMultimap.count).toBe(9);
|
|
447
447
|
});
|
|
448
448
|
|
|
449
449
|
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
450
|
-
const
|
|
451
|
-
expect(
|
|
452
|
-
|
|
453
|
-
|
|
450
|
+
const objTreeMultimap = new TreeMultimap<{key: number; keyA: number}>();
|
|
451
|
+
expect(objTreeMultimap).toBeInstanceOf(TreeMultimap);
|
|
452
|
+
objTreeMultimap.add(11, {key: 11, keyA: 11});
|
|
453
|
+
objTreeMultimap.add(3, {key: 3, keyA: 3});
|
|
454
454
|
const values = [
|
|
455
455
|
{key: 15, keyA: 15},
|
|
456
456
|
{key: 1, keyA: 1},
|
|
@@ -468,29 +468,29 @@ describe('TreeMultiset operations test recursively', () => {
|
|
|
468
468
|
{key: 5, keyA: 5}
|
|
469
469
|
];
|
|
470
470
|
|
|
471
|
-
|
|
471
|
+
objTreeMultimap.addMany(
|
|
472
472
|
values.map(item => item.key),
|
|
473
473
|
values
|
|
474
474
|
);
|
|
475
475
|
|
|
476
|
-
expect(
|
|
476
|
+
expect(objTreeMultimap.root).toBeInstanceOf(TreeMultimapNode);
|
|
477
477
|
|
|
478
|
-
if (
|
|
478
|
+
if (objTreeMultimap.root) expect(objTreeMultimap.root.key).toBe(11);
|
|
479
479
|
|
|
480
|
-
expect(
|
|
480
|
+
expect(objTreeMultimap.count).toBe(16);
|
|
481
481
|
|
|
482
|
-
expect(
|
|
482
|
+
expect(objTreeMultimap.has(6)).toBe(true);
|
|
483
483
|
});
|
|
484
484
|
});
|
|
485
485
|
|
|
486
|
-
describe('
|
|
487
|
-
const treeMS = new
|
|
486
|
+
describe('TreeMultimap Performance test', function () {
|
|
487
|
+
const treeMS = new TreeMultimap<TreeMultimapNode<number>>();
|
|
488
488
|
const inputSize = 100000; // Adjust input sizes as needed
|
|
489
489
|
|
|
490
490
|
beforeEach(() => {
|
|
491
491
|
treeMS.clear();
|
|
492
492
|
});
|
|
493
|
-
it(`Observe the time consumption of
|
|
493
|
+
it(`Observe the time consumption of TreeMultimap.add fitting O(n log n)`, function () {
|
|
494
494
|
// // Create a benchmark suite
|
|
495
495
|
// const suite = new Benchmark.Suite();
|
|
496
496
|
// // Define a function to generate a random array of a given size
|
|
@@ -503,7 +503,7 @@ describe('TreeMultiset Performance test', function () {
|
|
|
503
503
|
// }
|
|
504
504
|
// const inputArray = generateRandomArray(inputSize[0]);
|
|
505
505
|
//
|
|
506
|
-
// suite.add(`
|
|
506
|
+
// suite.add(`TreeMultimap addMany (n=${inputSize[0]})`, () => {
|
|
507
507
|
// treeMS.addMany([...inputArray]);
|
|
508
508
|
// });
|
|
509
509
|
//
|
|
@@ -523,7 +523,7 @@ describe('TreeMultiset Performance test', function () {
|
|
|
523
523
|
// .run({async: true});
|
|
524
524
|
});
|
|
525
525
|
|
|
526
|
-
it(`Observe the time consumption of
|
|
526
|
+
it(`Observe the time consumption of TreeMultimap.dfs be good`, function () {
|
|
527
527
|
const startDFS = performance.now();
|
|
528
528
|
const dfs = treeMS.dfs(node => node);
|
|
529
529
|
isDebug && console.log('---bfs', performance.now() - startDFS, dfs.length);
|