data-structure-typed 1.39.0 → 1.39.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.
- package/CHANGELOG.md +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +86 -32
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +8 -8
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +6 -6
- package/dist/cjs/data-structures/binary-tree/bst.js +2 -2
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
- package/dist/cjs/data-structures/binary-tree/tree-multiset.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.js +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/map-graph.d.ts +1 -1
- package/dist/cjs/data-structures/graph/map-graph.js +1 -1
- package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/hash/tree-map.js.map +1 -1
- package/dist/cjs/data-structures/hash/tree-set.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
- package/dist/cjs/data-structures/matrix/matrix2d.d.ts +1 -2
- package/dist/cjs/data-structures/matrix/matrix2d.js +3 -7
- package/dist/cjs/data-structures/matrix/matrix2d.js.map +1 -1
- package/dist/cjs/data-structures/matrix/vector2d.d.ts +0 -1
- package/dist/cjs/data-structures/matrix/vector2d.js +0 -1
- package/dist/cjs/data-structures/matrix/vector2d.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/interfaces/binary-tree.d.ts +2 -2
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
- package/dist/cjs/types/helpers.d.ts +1 -4
- package/dist/cjs/types/helpers.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +86 -32
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +8 -8
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +6 -6
- package/dist/mjs/data-structures/binary-tree/bst.js +2 -2
- package/dist/mjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
- package/dist/mjs/data-structures/graph/abstract-graph.d.ts +1 -1
- package/dist/mjs/data-structures/graph/abstract-graph.js +1 -1
- package/dist/mjs/data-structures/graph/map-graph.d.ts +1 -1
- package/dist/mjs/data-structures/graph/map-graph.js +1 -1
- package/dist/mjs/data-structures/matrix/matrix2d.d.ts +1 -2
- package/dist/mjs/data-structures/matrix/matrix2d.js +3 -7
- package/dist/mjs/data-structures/matrix/vector2d.d.ts +0 -1
- package/dist/mjs/data-structures/matrix/vector2d.js +0 -1
- package/dist/mjs/interfaces/binary-tree.d.ts +2 -2
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
- package/dist/mjs/types/helpers.d.ts +1 -4
- 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 -5
- package/src/data-structures/binary-tree/avl-tree.ts +5 -4
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +1 -1
- package/src/data-structures/binary-tree/binary-tree.ts +37 -93
- package/src/data-structures/binary-tree/bst.ts +11 -17
- package/src/data-structures/binary-tree/rb-tree.ts +2 -1
- package/src/data-structures/binary-tree/tree-multiset.ts +4 -3
- package/src/data-structures/graph/abstract-graph.ts +12 -11
- package/src/data-structures/graph/directed-graph.ts +2 -1
- package/src/data-structures/graph/map-graph.ts +2 -2
- package/src/data-structures/graph/undirected-graph.ts +5 -4
- package/src/data-structures/hash/hash-map.ts +1 -1
- package/src/data-structures/hash/tree-map.ts +1 -2
- package/src/data-structures/hash/tree-set.ts +1 -2
- package/src/data-structures/heap/heap.ts +2 -2
- package/src/data-structures/heap/max-heap.ts +1 -1
- package/src/data-structures/heap/min-heap.ts +1 -1
- package/src/data-structures/linked-list/singly-linked-list.ts +1 -1
- package/src/data-structures/matrix/matrix.ts +1 -1
- package/src/data-structures/matrix/matrix2d.ts +1 -3
- package/src/data-structures/matrix/vector2d.ts +1 -4
- package/src/data-structures/priority-queue/max-priority-queue.ts +1 -1
- package/src/data-structures/priority-queue/min-priority-queue.ts +1 -1
- package/src/data-structures/priority-queue/priority-queue.ts +1 -1
- package/src/data-structures/queue/deque.ts +4 -5
- package/src/data-structures/queue/queue.ts +1 -1
- package/src/interfaces/binary-tree.ts +2 -2
- package/src/types/data-structures/binary-tree/binary-tree.ts +0 -4
- package/src/types/data-structures/matrix/navigator.ts +1 -1
- package/src/types/helpers.ts +1 -7
- package/src/types/utils/utils.ts +1 -1
- package/src/types/utils/validate-type.ts +2 -2
- package/test/integration/bst.test.ts +1 -1
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +142 -2
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +270 -48
- package/test/unit/data-structures/binary-tree/bst.test.ts +394 -4
- package/test/unit/data-structures/binary-tree/overall.test.ts +1 -1
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +73 -7
- package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +242 -187
- package/test/unit/data-structures/graph/directed-graph.test.ts +34 -4
- package/test/unit/data-structures/graph/map-graph.test.ts +82 -1
- package/test/unit/data-structures/graph/undirected-graph.test.ts +82 -0
- package/test/unit/data-structures/heap/heap.test.ts +2 -2
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +1 -1
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +3 -3
- package/test/unit/data-structures/matrix/matrix2d.test.ts +207 -0
- package/test/unit/data-structures/matrix/navigator.test.ts +166 -1
- package/test/unit/data-structures/matrix/vector2d.test.ts +171 -0
- package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +2 -2
- package/test/unit/data-structures/queue/deque.test.ts +264 -1
- package/test/unit/data-structures/queue/queue.test.ts +3 -1
- package/test/utils/big-o.ts +1 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {CP, TreeMultiset, TreeMultisetNode} from '../../../../src';
|
|
1
|
+
import {CP, IterationType, TreeMultiset, TreeMultisetNode} from '../../../../src';
|
|
2
2
|
import {isDebugTest} from '../../../config';
|
|
3
3
|
|
|
4
4
|
const isDebug = isDebugTest;
|
|
5
|
+
|
|
5
6
|
describe('TreeMultiset operations test', () => {
|
|
6
7
|
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
7
8
|
const treeMultiset = new TreeMultiset();
|
|
@@ -206,7 +207,7 @@ describe('TreeMultiset operations test', () => {
|
|
|
206
207
|
});
|
|
207
208
|
|
|
208
209
|
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
209
|
-
const objTreeMultiset = new TreeMultiset<{
|
|
210
|
+
const objTreeMultiset = new TreeMultiset<{key: number; keyA: number}>();
|
|
210
211
|
expect(objTreeMultiset).toBeInstanceOf(TreeMultiset);
|
|
211
212
|
objTreeMultiset.add(11, {key: 11, keyA: 11});
|
|
212
213
|
objTreeMultiset.add(3, {key: 3, keyA: 3});
|
|
@@ -239,196 +240,250 @@ describe('TreeMultiset operations test', () => {
|
|
|
239
240
|
expect(objTreeMultiset.count).toBe(16);
|
|
240
241
|
|
|
241
242
|
expect(objTreeMultiset.has(6)).toBe(true);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
242
245
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
246
|
+
describe('TreeMultiset operations test recursively', () => {
|
|
247
|
+
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
248
|
+
const treeMultiset = new TreeMultiset({iterationType: IterationType.RECURSIVE});
|
|
249
|
+
|
|
250
|
+
expect(treeMultiset instanceof TreeMultiset);
|
|
251
|
+
treeMultiset.add(11, 11);
|
|
252
|
+
treeMultiset.add(3, 3);
|
|
253
|
+
const idAndValues = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
|
|
254
|
+
treeMultiset.addMany(idAndValues, idAndValues);
|
|
255
|
+
expect(treeMultiset.root instanceof TreeMultisetNode);
|
|
256
|
+
|
|
257
|
+
if (treeMultiset.root) expect(treeMultiset.root.key == 11);
|
|
258
|
+
|
|
259
|
+
expect(treeMultiset.size).toBe(16);
|
|
260
|
+
expect(treeMultiset.count).toBe(18);
|
|
261
|
+
|
|
262
|
+
expect(treeMultiset.has(6));
|
|
263
|
+
|
|
264
|
+
expect(treeMultiset.getHeight(6)).toBe(3);
|
|
265
|
+
expect(treeMultiset.getDepth(6)).toBe(1);
|
|
266
|
+
const nodeId10 = treeMultiset.get(10);
|
|
267
|
+
expect(nodeId10?.key).toBe(10);
|
|
268
|
+
|
|
269
|
+
const nodeVal9 = treeMultiset.get(9, node => node.val);
|
|
270
|
+
expect(nodeVal9?.key).toBe(9);
|
|
271
|
+
|
|
272
|
+
const nodesByCount1 = treeMultiset.getNodes(1, node => node.count);
|
|
273
|
+
expect(nodesByCount1.length).toBe(14);
|
|
274
|
+
|
|
275
|
+
const nodesByCount2 = treeMultiset.getNodes(2, node => node.count);
|
|
276
|
+
expect(nodesByCount2.length).toBe(2);
|
|
277
|
+
const leftMost = treeMultiset.getLeftMost();
|
|
278
|
+
expect(leftMost?.key).toBe(1);
|
|
279
|
+
|
|
280
|
+
const node15 = treeMultiset.get(15);
|
|
281
|
+
const minNodeBySpecificNode = node15 && treeMultiset.getLeftMost(node15);
|
|
282
|
+
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
283
|
+
|
|
284
|
+
let subTreeSum = 0;
|
|
285
|
+
node15 && treeMultiset.subTreeTraverse((node: TreeMultisetNode<number>) => (subTreeSum += node.key), 15);
|
|
286
|
+
expect(subTreeSum).toBe(70);
|
|
287
|
+
let lesserSum = 0;
|
|
288
|
+
treeMultiset.lesserOrGreaterTraverse((node: TreeMultisetNode<number>) => (lesserSum += node.key), CP.lt, 10);
|
|
289
|
+
expect(lesserSum).toBe(45);
|
|
290
|
+
|
|
291
|
+
expect(node15 instanceof TreeMultisetNode);
|
|
292
|
+
if (node15 instanceof TreeMultisetNode) {
|
|
293
|
+
const subTreeAdd = treeMultiset.subTreeTraverse((node: TreeMultisetNode<number>) => (node.count += 1), 15);
|
|
294
|
+
expect(subTreeAdd);
|
|
295
|
+
}
|
|
296
|
+
const node11 = treeMultiset.get(11);
|
|
297
|
+
expect(node11 instanceof TreeMultisetNode);
|
|
298
|
+
if (node11 instanceof TreeMultisetNode) {
|
|
299
|
+
const allGreaterNodesAdded = treeMultiset.lesserOrGreaterTraverse(node => (node.count += 2), CP.gt, 11);
|
|
300
|
+
expect(allGreaterNodesAdded);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const dfsInorderNodes = treeMultiset.dfs(node => node, 'in');
|
|
304
|
+
expect(dfsInorderNodes[0].key).toBe(1);
|
|
305
|
+
expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
|
|
306
|
+
expect(treeMultiset.isPerfectlyBalanced()).toBe(false);
|
|
307
|
+
|
|
308
|
+
treeMultiset.perfectlyBalance();
|
|
309
|
+
|
|
310
|
+
expect(treeMultiset.isPerfectlyBalanced()).toBe(true);
|
|
311
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
312
|
+
|
|
313
|
+
const bfsNodesAfterBalanced = treeMultiset.bfs(node => node);
|
|
314
|
+
expect(bfsNodesAfterBalanced[0].key).toBe(8);
|
|
315
|
+
expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
|
|
316
|
+
|
|
317
|
+
const removed11 = treeMultiset.delete(11, undefined, true);
|
|
318
|
+
expect(removed11 instanceof Array);
|
|
319
|
+
expect(removed11[0]);
|
|
320
|
+
expect(removed11[0].deleted);
|
|
321
|
+
|
|
322
|
+
if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
|
|
323
|
+
|
|
324
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
325
|
+
|
|
326
|
+
expect(treeMultiset.getHeight(15)).toBe(1);
|
|
327
|
+
|
|
328
|
+
const removed1 = treeMultiset.delete(1, undefined, true);
|
|
329
|
+
expect(removed1 instanceof Array);
|
|
330
|
+
expect(removed1[0]);
|
|
331
|
+
expect(removed1[0].deleted);
|
|
332
|
+
if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
|
|
333
|
+
|
|
334
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
335
|
+
|
|
336
|
+
expect(treeMultiset.getHeight()).toBe(4);
|
|
337
|
+
|
|
338
|
+
const removed4 = treeMultiset.delete(4, undefined, true);
|
|
339
|
+
expect(removed4 instanceof Array);
|
|
340
|
+
expect(removed4[0]);
|
|
341
|
+
expect(removed4[0].deleted);
|
|
342
|
+
if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
|
|
343
|
+
|
|
344
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
345
|
+
expect(treeMultiset.getHeight()).toBe(4);
|
|
346
|
+
|
|
347
|
+
const removed10 = treeMultiset.delete(10, undefined, true);
|
|
348
|
+
expect(removed10 instanceof Array);
|
|
349
|
+
expect(removed10[0]);
|
|
350
|
+
expect(removed10[0].deleted);
|
|
351
|
+
if (removed10[0].deleted) expect(removed10[0].deleted.key).toBe(10);
|
|
352
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
353
|
+
|
|
354
|
+
expect(treeMultiset.getHeight()).toBe(3);
|
|
355
|
+
|
|
356
|
+
const removed15 = treeMultiset.delete(15, undefined, true);
|
|
357
|
+
expect(removed15 instanceof Array);
|
|
358
|
+
expect(removed15[0]);
|
|
359
|
+
expect(removed15[0].deleted);
|
|
360
|
+
if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
|
|
361
|
+
|
|
362
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
363
|
+
expect(treeMultiset.getHeight()).toBe(3);
|
|
364
|
+
|
|
365
|
+
const removed5 = treeMultiset.delete(5, undefined, true);
|
|
366
|
+
expect(removed5 instanceof Array);
|
|
367
|
+
expect(removed5[0]);
|
|
368
|
+
expect(removed5[0].deleted);
|
|
369
|
+
if (removed5[0].deleted) expect(removed5[0].deleted.key).toBe(5);
|
|
370
|
+
|
|
371
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
372
|
+
expect(treeMultiset.getHeight()).toBe(3);
|
|
373
|
+
|
|
374
|
+
const removed13 = treeMultiset.delete(13, undefined, true);
|
|
375
|
+
expect(removed13 instanceof Array);
|
|
376
|
+
expect(removed13[0]);
|
|
377
|
+
expect(removed13[0].deleted);
|
|
378
|
+
if (removed13[0].deleted) expect(removed13[0].deleted.key).toBe(13);
|
|
379
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
380
|
+
expect(treeMultiset.getHeight()).toBe(3);
|
|
381
|
+
|
|
382
|
+
const removed3 = treeMultiset.delete(3, undefined, true);
|
|
383
|
+
expect(removed3 instanceof Array);
|
|
384
|
+
expect(removed3[0]);
|
|
385
|
+
expect(removed3[0].deleted);
|
|
386
|
+
if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
|
|
387
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
388
|
+
expect(treeMultiset.getHeight()).toBe(3);
|
|
389
|
+
|
|
390
|
+
const removed8 = treeMultiset.delete(8, undefined, true);
|
|
391
|
+
expect(removed8 instanceof Array);
|
|
392
|
+
expect(removed8[0]);
|
|
393
|
+
expect(removed8[0].deleted);
|
|
394
|
+
if (removed8[0].deleted) expect(removed8[0].deleted.key).toBe(8);
|
|
395
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
396
|
+
expect(treeMultiset.getHeight()).toBe(3);
|
|
397
|
+
|
|
398
|
+
const removed6 = treeMultiset.delete(6, undefined, true);
|
|
399
|
+
expect(removed6 instanceof Array);
|
|
400
|
+
expect(removed6[0]);
|
|
401
|
+
expect(removed6[0].deleted);
|
|
402
|
+
if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
|
|
403
|
+
expect(treeMultiset.delete(6, undefined, true).length).toBe(0);
|
|
404
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
405
|
+
|
|
406
|
+
expect(treeMultiset.getHeight()).toBe(2);
|
|
407
|
+
|
|
408
|
+
const removed7 = treeMultiset.delete(7, undefined, true);
|
|
409
|
+
expect(removed7 instanceof Array);
|
|
410
|
+
expect(removed7[0]);
|
|
411
|
+
expect(removed7[0].deleted);
|
|
412
|
+
if (removed7[0].deleted) expect(removed7[0].deleted.key).toBe(7);
|
|
413
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
414
|
+
expect(treeMultiset.getHeight()).toBe(2);
|
|
415
|
+
|
|
416
|
+
const removed9 = treeMultiset.delete(9, undefined, true);
|
|
417
|
+
expect(removed9 instanceof Array);
|
|
418
|
+
expect(removed9[0]);
|
|
419
|
+
expect(removed9[0].deleted);
|
|
420
|
+
if (removed9[0].deleted) expect(removed9[0].deleted.key).toBe(9);
|
|
421
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
422
|
+
expect(treeMultiset.getHeight()).toBe(2);
|
|
423
|
+
|
|
424
|
+
const removed14 = treeMultiset.delete(14, undefined, true);
|
|
425
|
+
expect(removed14 instanceof Array);
|
|
426
|
+
expect(removed14[0]);
|
|
427
|
+
expect(removed14[0].deleted);
|
|
428
|
+
if (removed14[0].deleted) expect(removed14[0].deleted.key).toBe(14);
|
|
429
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
430
|
+
expect(treeMultiset.getHeight()).toBe(1);
|
|
431
|
+
|
|
432
|
+
expect(treeMultiset.isAVLBalanced()).toBe(true);
|
|
433
|
+
|
|
434
|
+
const bfsIDs = treeMultiset.bfs(node => node.key);
|
|
435
|
+
|
|
436
|
+
expect(bfsIDs[0]).toBe(12);
|
|
437
|
+
expect(bfsIDs[1]).toBe(2);
|
|
438
|
+
expect(bfsIDs[2]).toBe(16);
|
|
439
|
+
|
|
440
|
+
const bfsNodes = treeMultiset.bfs(node => node);
|
|
441
|
+
|
|
442
|
+
expect(bfsNodes[0].key).toBe(12);
|
|
443
|
+
expect(bfsNodes[1].key).toBe(2);
|
|
444
|
+
expect(bfsNodes[2].key).toBe(16);
|
|
445
|
+
|
|
446
|
+
expect(treeMultiset.count).toBe(9);
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
it('should perform various operations on a Binary Search Tree with object values', () => {
|
|
450
|
+
const objTreeMultiset = new TreeMultiset<{key: number; keyA: number}>();
|
|
451
|
+
expect(objTreeMultiset).toBeInstanceOf(TreeMultiset);
|
|
452
|
+
objTreeMultiset.add(11, {key: 11, keyA: 11});
|
|
453
|
+
objTreeMultiset.add(3, {key: 3, keyA: 3});
|
|
454
|
+
const values = [
|
|
455
|
+
{key: 15, keyA: 15},
|
|
456
|
+
{key: 1, keyA: 1},
|
|
457
|
+
{key: 8, keyA: 8},
|
|
458
|
+
{key: 13, keyA: 13},
|
|
459
|
+
{key: 16, keyA: 16},
|
|
460
|
+
{key: 2, keyA: 2},
|
|
461
|
+
{key: 6, keyA: 6},
|
|
462
|
+
{key: 9, keyA: 9},
|
|
463
|
+
{key: 12, keyA: 12},
|
|
464
|
+
{key: 14, keyA: 14},
|
|
465
|
+
{key: 4, keyA: 4},
|
|
466
|
+
{key: 7, keyA: 7},
|
|
467
|
+
{key: 10, keyA: 10},
|
|
468
|
+
{key: 5, keyA: 5}
|
|
469
|
+
];
|
|
470
|
+
|
|
471
|
+
objTreeMultiset.addMany(
|
|
472
|
+
values.map(item => item.key),
|
|
473
|
+
values
|
|
474
|
+
);
|
|
475
|
+
|
|
476
|
+
expect(objTreeMultiset.root).toBeInstanceOf(TreeMultisetNode);
|
|
477
|
+
|
|
478
|
+
if (objTreeMultiset.root) expect(objTreeMultiset.root.key).toBe(11);
|
|
479
|
+
|
|
480
|
+
expect(objTreeMultiset.count).toBe(16);
|
|
481
|
+
|
|
482
|
+
expect(objTreeMultiset.has(6)).toBe(true);
|
|
420
483
|
});
|
|
421
484
|
});
|
|
422
485
|
|
|
423
486
|
describe('TreeMultiset Performance test', function () {
|
|
424
|
-
// const treeMS = new TreeMultiset<TreeMultisetNode<number>>();
|
|
425
|
-
// const inputSize = [100]; // Adjust input sizes as needed
|
|
426
|
-
//
|
|
427
|
-
// // Define a function to calculate the expected O(n log n) time
|
|
428
|
-
// function expectedTime(n: number): number {
|
|
429
|
-
// return n * Math.log(n);
|
|
430
|
-
// }
|
|
431
|
-
|
|
432
487
|
const treeMS = new TreeMultiset<TreeMultisetNode<number>>();
|
|
433
488
|
const inputSize = 100000; // Adjust input sizes as needed
|
|
434
489
|
|
|
@@ -22,22 +22,27 @@ describe('DirectedGraph Operation Test', () => {
|
|
|
22
22
|
const vertex1 = new DirectedVertex('A');
|
|
23
23
|
const vertex2 = new DirectedVertex('B');
|
|
24
24
|
const edge = new DirectedEdge('A', 'B');
|
|
25
|
+
edge.src = edge.src;
|
|
26
|
+
edge.dest = edge.dest;
|
|
25
27
|
|
|
26
28
|
graph.addVertex(vertex1);
|
|
27
29
|
graph.addVertex(vertex2);
|
|
28
30
|
graph.addEdge(edge);
|
|
29
31
|
|
|
32
|
+
expect(graph.outEdgeMap.size).toBe(1);
|
|
33
|
+
expect(graph.inEdgeMap.size).toBe(1);
|
|
30
34
|
expect(graph.hasEdge('A', 'B')).toBe(true);
|
|
31
35
|
expect(graph.hasEdge('B', 'A')).toBe(false);
|
|
32
36
|
});
|
|
33
37
|
|
|
34
38
|
it('should delete edges', () => {
|
|
35
39
|
const vertex1 = new DirectedVertex('A');
|
|
36
|
-
const vertex2 = new DirectedVertex('B');
|
|
40
|
+
// const vertex2 = new DirectedVertex('B');
|
|
41
|
+
graph.createVertex('B');
|
|
37
42
|
const edge = new DirectedEdge('A', 'B');
|
|
38
43
|
|
|
39
44
|
graph.addVertex(vertex1);
|
|
40
|
-
graph.addVertex(
|
|
45
|
+
graph.addVertex('B');
|
|
41
46
|
graph.addEdge(edge);
|
|
42
47
|
|
|
43
48
|
expect(graph.deleteEdge(edge)).toBe(edge);
|
|
@@ -49,16 +54,41 @@ describe('DirectedGraph Operation Test', () => {
|
|
|
49
54
|
const vertexB = new DirectedVertex('B');
|
|
50
55
|
const vertexC = new DirectedVertex('C');
|
|
51
56
|
const edgeAB = new DirectedEdge('A', 'B');
|
|
52
|
-
|
|
57
|
+
graph.createEdge('B', 'C');
|
|
53
58
|
|
|
54
59
|
graph.addVertex(vertexA);
|
|
55
60
|
graph.addVertex(vertexB);
|
|
56
61
|
graph.addVertex(vertexC);
|
|
57
62
|
graph.addEdge(edgeAB);
|
|
58
|
-
graph.addEdge(
|
|
63
|
+
graph.addEdge('B', 'C');
|
|
64
|
+
|
|
65
|
+
expect(graph.getEdgeSrc(edgeAB)).toBe(vertexA);
|
|
59
66
|
|
|
60
67
|
const topologicalOrder = graph.topologicalSort();
|
|
61
68
|
if (topologicalOrder) expect(topologicalOrder).toEqual(['A', 'B', 'C']);
|
|
69
|
+
|
|
70
|
+
graph.deleteEdgesBetween('A', 'B');
|
|
71
|
+
|
|
72
|
+
const topologicalOrder1 = graph.topologicalSort();
|
|
73
|
+
if (topologicalOrder1) expect(topologicalOrder1).toEqual(['B', 'C', 'A']);
|
|
74
|
+
|
|
75
|
+
expect(graph.incomingEdgesOf(vertexC)?.length).toBe(1);
|
|
76
|
+
expect(graph.degreeOf(vertexA)).toBe(0);
|
|
77
|
+
expect(graph.inDegreeOf(vertexC)).toBe(1);
|
|
78
|
+
expect(graph.outDegreeOf(vertexC)).toBe(0);
|
|
79
|
+
expect(graph.edgesOf(vertexC)?.length).toBe(1);
|
|
80
|
+
|
|
81
|
+
expect(graph.tarjan(true, true, true, true)?.dfnMap.size).toBe(3);
|
|
82
|
+
expect(graph.bellmanFord(vertexC, true, true, true)?.paths.length).toBe(3);
|
|
83
|
+
expect(graph.getMinPathBetween('B', 'C', true)?.length).toBe(2);
|
|
84
|
+
expect(graph.setEdgeWeight('B', 'C', 100)).toBe(true);
|
|
85
|
+
expect(graph.getMinCostBetween('B', 'C', true)).toBe(100);
|
|
86
|
+
expect(graph.getMinCostBetween('B', 'C')).toBe(1);
|
|
87
|
+
expect(graph.getAllPathsBetween('B', 'C')?.length).toBe(1);
|
|
88
|
+
expect(graph.deleteVertex(vertexB)).toBe(true);
|
|
89
|
+
expect(graph.getAllPathsBetween('B', 'C')?.length).toBe(0);
|
|
90
|
+
|
|
91
|
+
expect(graph.removeManyVertices([vertexB, vertexC])).toBe(true);
|
|
62
92
|
});
|
|
63
93
|
});
|
|
64
94
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {MapGraph, MapVertex} from '../../../../src';
|
|
1
|
+
import {MapEdge, MapGraph, MapVertex} from '../../../../src';
|
|
2
2
|
|
|
3
3
|
describe('MapGraph Operation Test', () => {
|
|
4
4
|
it('dijkstra shortest path', () => {
|
|
@@ -43,3 +43,84 @@ describe('MapGraph Operation Test', () => {
|
|
|
43
43
|
expect(surinToSaanenGoatFarmViaDij?.minDist).toBe(25.2);
|
|
44
44
|
});
|
|
45
45
|
});
|
|
46
|
+
|
|
47
|
+
describe('MapGraph', () => {
|
|
48
|
+
let mapGraph: MapGraph;
|
|
49
|
+
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
// Create a new MapGraph instance before each test
|
|
52
|
+
mapGraph = new MapGraph([0, 0], [100, 100]);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Test adding vertices to the graph
|
|
56
|
+
it('should add vertices to the graph', () => {
|
|
57
|
+
const locationA = new MapVertex('A', 10, 20, 'Location A');
|
|
58
|
+
const locationB = new MapVertex('B', 30, 40, 'Location B');
|
|
59
|
+
|
|
60
|
+
mapGraph.addVertex(locationA);
|
|
61
|
+
mapGraph.addVertex(locationB);
|
|
62
|
+
|
|
63
|
+
expect(mapGraph.hasVertex('A')).toBe(true);
|
|
64
|
+
expect(mapGraph.hasVertex('B')).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Test adding edges to the graph
|
|
68
|
+
it('should add edges to the graph', () => {
|
|
69
|
+
const locationA = new MapVertex('A', 10, 20, 'Location A');
|
|
70
|
+
const locationB = new MapVertex('B', 30, 40, 'Location B');
|
|
71
|
+
const edgeAB = new MapEdge('A', 'B', 50, 'Edge from A to B');
|
|
72
|
+
|
|
73
|
+
mapGraph.addVertex(locationA);
|
|
74
|
+
mapGraph.addVertex(locationB);
|
|
75
|
+
mapGraph.addEdge(edgeAB);
|
|
76
|
+
|
|
77
|
+
expect(mapGraph.hasEdge('A', 'B')).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Test getting neighbors of a vertex
|
|
81
|
+
it('should return the neighbors of a vertex', () => {
|
|
82
|
+
const locationA = new MapVertex('A', 10, 20, 'Location A');
|
|
83
|
+
locationA.lat = locationA.lat;
|
|
84
|
+
locationA.long = locationA.long;
|
|
85
|
+
const locationB = mapGraph.createVertex('B', 30, 40, 'Location B');
|
|
86
|
+
|
|
87
|
+
const locationC = new MapVertex('C', 50, 60, 'Location C');
|
|
88
|
+
const edgeAB = new MapEdge('A', 'B', 50, 'Edge from A to B');
|
|
89
|
+
const edgeBC = new MapEdge('B', 'C', 60, 'Edge from B to C');
|
|
90
|
+
|
|
91
|
+
mapGraph.origin = mapGraph.origin;
|
|
92
|
+
mapGraph.bottomRight = mapGraph.bottomRight;
|
|
93
|
+
|
|
94
|
+
mapGraph.addVertex(locationA);
|
|
95
|
+
mapGraph.addVertex(locationB);
|
|
96
|
+
mapGraph.addVertex(locationC);
|
|
97
|
+
mapGraph.addEdge(edgeAB);
|
|
98
|
+
mapGraph.addEdge(edgeBC);
|
|
99
|
+
|
|
100
|
+
const neighborsOfA = mapGraph.getNeighbors('A');
|
|
101
|
+
const neighborsOfB = mapGraph.getNeighbors('B');
|
|
102
|
+
|
|
103
|
+
expect(neighborsOfA).toEqual([locationB]);
|
|
104
|
+
expect(neighborsOfB).toEqual([locationC]);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Test finding the shortest path between locations
|
|
108
|
+
it('should find the shortest path between two locations', () => {
|
|
109
|
+
const locationA = new MapVertex('A', 10, 20, 'Location A');
|
|
110
|
+
const locationB = new MapVertex('B', 30, 40, 'Location B');
|
|
111
|
+
const locationC = new MapVertex('C', 50, 60, 'Location C');
|
|
112
|
+
const edgeAB = new MapEdge('A', 'B', 50, 'Edge from A to B');
|
|
113
|
+
const edgeBC = new MapEdge('B', 'C', 60, 'Edge from B to C');
|
|
114
|
+
|
|
115
|
+
mapGraph.addVertex(locationA);
|
|
116
|
+
mapGraph.addVertex(locationB);
|
|
117
|
+
mapGraph.addVertex(locationC);
|
|
118
|
+
mapGraph.addEdge(edgeAB);
|
|
119
|
+
mapGraph.addEdge(edgeBC);
|
|
120
|
+
|
|
121
|
+
const shortestPath = mapGraph.dijkstra('A', 'C');
|
|
122
|
+
|
|
123
|
+
expect(shortestPath?.minPath.length).toEqual(0);
|
|
124
|
+
expect(shortestPath?.distMap.size).toBe(3);
|
|
125
|
+
});
|
|
126
|
+
});
|