data-structure-typed 1.36.8 → 1.37.0

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 (85) hide show
  1. package/CHANGELOG.md +3 -1
  2. package/README.md +8 -0
  3. package/dist/data-structures/binary-tree/avl-tree.d.ts +5 -5
  4. package/dist/data-structures/binary-tree/avl-tree.js +6 -6
  5. package/dist/data-structures/binary-tree/avl-tree.js.map +1 -1
  6. package/dist/data-structures/binary-tree/binary-tree.d.ts +18 -95
  7. package/dist/data-structures/binary-tree/binary-tree.js +82 -183
  8. package/dist/data-structures/binary-tree/binary-tree.js.map +1 -1
  9. package/dist/data-structures/binary-tree/bst.d.ts +6 -20
  10. package/dist/data-structures/binary-tree/bst.js +22 -122
  11. package/dist/data-structures/binary-tree/bst.js.map +1 -1
  12. package/dist/data-structures/binary-tree/tree-multiset.d.ts +6 -67
  13. package/dist/data-structures/binary-tree/tree-multiset.js +10 -257
  14. package/dist/data-structures/binary-tree/tree-multiset.js.map +1 -1
  15. package/dist/data-structures/graph/abstract-graph.js +4 -3
  16. package/dist/data-structures/graph/abstract-graph.js.map +1 -1
  17. package/dist/data-structures/hash/hash-map.d.ts +1 -1
  18. package/dist/data-structures/hash/hash-map.js +1 -1
  19. package/dist/data-structures/hash/hash-table.d.ts +3 -3
  20. package/dist/data-structures/hash/hash-table.js +3 -3
  21. package/dist/data-structures/heap/heap.js.map +1 -1
  22. package/dist/data-structures/linked-list/skip-linked-list.d.ts +3 -3
  23. package/dist/data-structures/linked-list/skip-linked-list.js +3 -3
  24. package/dist/data-structures/queue/deque.d.ts +2 -2
  25. package/dist/data-structures/queue/deque.js +2 -2
  26. package/dist/data-structures/queue/queue.js +1 -1
  27. package/dist/data-structures/trie/trie.d.ts +2 -2
  28. package/dist/data-structures/trie/trie.js +2 -2
  29. package/dist/interfaces/binary-tree.d.ts +1 -1
  30. package/lib/data-structures/binary-tree/avl-tree.d.ts +5 -5
  31. package/lib/data-structures/binary-tree/avl-tree.js +6 -6
  32. package/lib/data-structures/binary-tree/binary-tree.d.ts +18 -95
  33. package/lib/data-structures/binary-tree/binary-tree.js +82 -183
  34. package/lib/data-structures/binary-tree/bst.d.ts +6 -20
  35. package/lib/data-structures/binary-tree/bst.js +22 -122
  36. package/lib/data-structures/binary-tree/tree-multiset.d.ts +6 -67
  37. package/lib/data-structures/binary-tree/tree-multiset.js +10 -257
  38. package/lib/data-structures/graph/abstract-graph.js +4 -3
  39. package/lib/data-structures/hash/hash-map.d.ts +1 -1
  40. package/lib/data-structures/hash/hash-map.js +1 -1
  41. package/lib/data-structures/hash/hash-table.d.ts +3 -3
  42. package/lib/data-structures/hash/hash-table.js +3 -3
  43. package/lib/data-structures/linked-list/skip-linked-list.d.ts +3 -3
  44. package/lib/data-structures/linked-list/skip-linked-list.js +3 -3
  45. package/lib/data-structures/queue/deque.d.ts +2 -2
  46. package/lib/data-structures/queue/deque.js +2 -2
  47. package/lib/data-structures/queue/queue.js +1 -1
  48. package/lib/data-structures/trie/trie.d.ts +2 -2
  49. package/lib/data-structures/trie/trie.js +2 -2
  50. package/lib/interfaces/binary-tree.d.ts +1 -1
  51. package/package.json +9 -7
  52. package/src/data-structures/binary-tree/avl-tree.ts +6 -6
  53. package/src/data-structures/binary-tree/binary-tree.ts +85 -274
  54. package/src/data-structures/binary-tree/bst.ts +22 -106
  55. package/src/data-structures/binary-tree/rb-tree.ts +3 -3
  56. package/src/data-structures/binary-tree/tree-multiset.ts +10 -249
  57. package/src/data-structures/graph/abstract-graph.ts +4 -3
  58. package/src/data-structures/hash/hash-map.ts +1 -1
  59. package/src/data-structures/hash/hash-table.ts +3 -3
  60. package/src/data-structures/heap/heap.ts +5 -2
  61. package/src/data-structures/linked-list/skip-linked-list.ts +3 -3
  62. package/src/data-structures/queue/deque.ts +2 -2
  63. package/src/data-structures/queue/queue.ts +1 -1
  64. package/src/data-structures/trie/trie.ts +2 -2
  65. package/src/interfaces/binary-tree.ts +1 -1
  66. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +19 -17
  67. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +2 -2
  68. package/test/unit/data-structures/binary-tree/bst.test.ts +72 -35
  69. package/test/unit/data-structures/binary-tree/overall.test.ts +4 -4
  70. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +1 -1
  71. package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +67 -37
  72. package/test/unit/data-structures/graph/directed-graph.test.ts +1 -1
  73. package/test/unit/data-structures/graph/undirected-graph.test.ts +1 -1
  74. package/test/unit/data-structures/hash/hash-map.test.ts +2 -2
  75. package/test/unit/data-structures/hash/hash-table.test.ts +5 -5
  76. package/test/unit/data-structures/heap/heap.test.ts +15 -12
  77. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +7 -7
  78. package/test/unit/data-structures/linked-list/skip-list.test.ts +2 -2
  79. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +1 -1
  80. package/test/unit/data-structures/queue/deque.test.ts +20 -3
  81. package/test/unit/data-structures/queue/queue.test.ts +42 -0
  82. package/test/unit/data-structures/trie/trie.test.ts +5 -5
  83. package/test/utils/big-o.ts +64 -57
  84. package/umd/bundle.min.js +1 -1
  85. package/umd/bundle.min.js.map +1 -1
@@ -1,5 +1,6 @@
1
- import {TreeMultiset, TreeMultisetNode} from '../../../../src';
1
+ import {CP, TreeMultiset, TreeMultisetNode} from '../../../../src';
2
2
 
3
+ const isDebug = false;
3
4
  describe('TreeMultiset operations test', () => {
4
5
  it('should perform various operations on a Binary Search Tree with numeric values', () => {
5
6
  const treeMultiset = new TreeMultiset();
@@ -39,20 +40,26 @@ describe('TreeMultiset operations test', () => {
39
40
  const minNodeBySpecificNode = node15 && treeMultiset.getLeftMost(node15);
40
41
  expect(minNodeBySpecificNode?.key).toBe(12);
41
42
 
42
- const subTreeSum = node15 && treeMultiset.subTreeSum(15);
43
+ let subTreeSum = 0;
44
+ node15 && treeMultiset.subTreeForeach(15, (node: TreeMultisetNode<number>) => (subTreeSum += node.key));
43
45
  expect(subTreeSum).toBe(70);
44
- const lesserSum = treeMultiset.lesserSum(10);
46
+ let lesserSum = 0;
47
+ treeMultiset.lesserOrGreaterForeach(10, CP.lt, (node: TreeMultisetNode<number>) => (lesserSum += node.key));
45
48
  expect(lesserSum).toBe(45);
46
49
 
47
50
  expect(node15 instanceof TreeMultisetNode);
48
51
  if (node15 instanceof TreeMultisetNode) {
49
- const subTreeAdd = treeMultiset.subTreeAddCount(15, 1);
52
+ const subTreeAdd = treeMultiset.subTreeForeach(15, (node: TreeMultisetNode<number>) => (node.count += 1));
50
53
  expect(subTreeAdd);
51
54
  }
52
55
  const node11 = treeMultiset.get(11);
53
56
  expect(node11 instanceof TreeMultisetNode);
54
57
  if (node11 instanceof TreeMultisetNode) {
55
- const allGreaterNodesAdded = treeMultiset.allGreaterNodesAddCount(11, 2);
58
+ const allGreaterNodesAdded = treeMultiset.lesserOrGreaterForeach(
59
+ 11,
60
+ CP.gt,
61
+ (node: TreeMultisetNode<number>) => (node.count += 2)
62
+ );
56
63
  expect(allGreaterNodesAdded);
57
64
  }
58
65
 
@@ -70,7 +77,7 @@ describe('TreeMultiset operations test', () => {
70
77
  expect(bfsNodesAfterBalanced[0].key).toBe(8);
71
78
  expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
72
79
 
73
- const removed11 = treeMultiset.remove(11, true);
80
+ const removed11 = treeMultiset.delete(11, true);
74
81
  expect(removed11 instanceof Array);
75
82
  expect(removed11[0]);
76
83
  expect(removed11[0].deleted);
@@ -81,7 +88,7 @@ describe('TreeMultiset operations test', () => {
81
88
 
82
89
  expect(treeMultiset.getHeight(15)).toBe(1);
83
90
 
84
- const removed1 = treeMultiset.remove(1, true);
91
+ const removed1 = treeMultiset.delete(1, true);
85
92
  expect(removed1 instanceof Array);
86
93
  expect(removed1[0]);
87
94
  expect(removed1[0].deleted);
@@ -91,7 +98,7 @@ describe('TreeMultiset operations test', () => {
91
98
 
92
99
  expect(treeMultiset.getHeight()).toBe(4);
93
100
 
94
- const removed4 = treeMultiset.remove(4, true);
101
+ const removed4 = treeMultiset.delete(4, true);
95
102
  expect(removed4 instanceof Array);
96
103
  expect(removed4[0]);
97
104
  expect(removed4[0].deleted);
@@ -100,7 +107,7 @@ describe('TreeMultiset operations test', () => {
100
107
  expect(treeMultiset.isAVLBalanced()).toBe(true);
101
108
  expect(treeMultiset.getHeight()).toBe(4);
102
109
 
103
- const removed10 = treeMultiset.remove(10, true);
110
+ const removed10 = treeMultiset.delete(10, true);
104
111
  expect(removed10 instanceof Array);
105
112
  expect(removed10[0]);
106
113
  expect(removed10[0].deleted);
@@ -109,7 +116,7 @@ describe('TreeMultiset operations test', () => {
109
116
 
110
117
  expect(treeMultiset.getHeight()).toBe(3);
111
118
 
112
- const removed15 = treeMultiset.remove(15, true);
119
+ const removed15 = treeMultiset.delete(15, true);
113
120
  expect(removed15 instanceof Array);
114
121
  expect(removed15[0]);
115
122
  expect(removed15[0].deleted);
@@ -118,7 +125,7 @@ describe('TreeMultiset operations test', () => {
118
125
  expect(treeMultiset.isAVLBalanced()).toBe(true);
119
126
  expect(treeMultiset.getHeight()).toBe(3);
120
127
 
121
- const removed5 = treeMultiset.remove(5, true);
128
+ const removed5 = treeMultiset.delete(5, true);
122
129
  expect(removed5 instanceof Array);
123
130
  expect(removed5[0]);
124
131
  expect(removed5[0].deleted);
@@ -127,7 +134,7 @@ describe('TreeMultiset operations test', () => {
127
134
  expect(treeMultiset.isAVLBalanced()).toBe(true);
128
135
  expect(treeMultiset.getHeight()).toBe(3);
129
136
 
130
- const removed13 = treeMultiset.remove(13, true);
137
+ const removed13 = treeMultiset.delete(13, true);
131
138
  expect(removed13 instanceof Array);
132
139
  expect(removed13[0]);
133
140
  expect(removed13[0].deleted);
@@ -135,7 +142,7 @@ describe('TreeMultiset operations test', () => {
135
142
  expect(treeMultiset.isAVLBalanced()).toBe(true);
136
143
  expect(treeMultiset.getHeight()).toBe(3);
137
144
 
138
- const removed3 = treeMultiset.remove(3, true);
145
+ const removed3 = treeMultiset.delete(3, true);
139
146
  expect(removed3 instanceof Array);
140
147
  expect(removed3[0]);
141
148
  expect(removed3[0].deleted);
@@ -143,7 +150,7 @@ describe('TreeMultiset operations test', () => {
143
150
  expect(treeMultiset.isAVLBalanced()).toBe(true);
144
151
  expect(treeMultiset.getHeight()).toBe(3);
145
152
 
146
- const removed8 = treeMultiset.remove(8, true);
153
+ const removed8 = treeMultiset.delete(8, true);
147
154
  expect(removed8 instanceof Array);
148
155
  expect(removed8[0]);
149
156
  expect(removed8[0].deleted);
@@ -151,17 +158,17 @@ describe('TreeMultiset operations test', () => {
151
158
  expect(treeMultiset.isAVLBalanced()).toBe(true);
152
159
  expect(treeMultiset.getHeight()).toBe(3);
153
160
 
154
- const removed6 = treeMultiset.remove(6, true);
161
+ const removed6 = treeMultiset.delete(6, true);
155
162
  expect(removed6 instanceof Array);
156
163
  expect(removed6[0]);
157
164
  expect(removed6[0].deleted);
158
165
  if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
159
- expect(treeMultiset.remove(6, true).length).toBe(0);
166
+ expect(treeMultiset.delete(6, true).length).toBe(0);
160
167
  expect(treeMultiset.isAVLBalanced()).toBe(true);
161
168
 
162
169
  expect(treeMultiset.getHeight()).toBe(2);
163
170
 
164
- const removed7 = treeMultiset.remove(7, true);
171
+ const removed7 = treeMultiset.delete(7, true);
165
172
  expect(removed7 instanceof Array);
166
173
  expect(removed7[0]);
167
174
  expect(removed7[0].deleted);
@@ -169,7 +176,7 @@ describe('TreeMultiset operations test', () => {
169
176
  expect(treeMultiset.isAVLBalanced()).toBe(true);
170
177
  expect(treeMultiset.getHeight()).toBe(2);
171
178
 
172
- const removed9 = treeMultiset.remove(9, true);
179
+ const removed9 = treeMultiset.delete(9, true);
173
180
  expect(removed9 instanceof Array);
174
181
  expect(removed9[0]);
175
182
  expect(removed9[0].deleted);
@@ -177,7 +184,7 @@ describe('TreeMultiset operations test', () => {
177
184
  expect(treeMultiset.isAVLBalanced()).toBe(true);
178
185
  expect(treeMultiset.getHeight()).toBe(2);
179
186
 
180
- const removed14 = treeMultiset.remove(14, true);
187
+ const removed14 = treeMultiset.delete(14, true);
181
188
  expect(removed14 instanceof Array);
182
189
  expect(removed14[0]);
183
190
  expect(removed14[0].deleted);
@@ -288,7 +295,7 @@ describe('TreeMultiset operations test', () => {
288
295
  // expect(bfsNodesAfterBalanced[0].key).toBe(8);
289
296
  // expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
290
297
  //
291
- // const removed11 = objTreeMultiset.remove(11, true);
298
+ // const removed11 = objTreeMultiset.delete(11, true);
292
299
  // expect(removed11).toBeInstanceOf(Array);
293
300
  // expect(removed11[0]).toBeDefined();
294
301
  // expect(removed11[0].deleted).toBeDefined();
@@ -299,7 +306,7 @@ describe('TreeMultiset operations test', () => {
299
306
  //
300
307
  // expect(node15 && objTreeMultiset.getHeight(node15)).toBe(2);
301
308
  //
302
- // const removed1 = objTreeMultiset.remove(1, true);
309
+ // const removed1 = objTreeMultiset.delete(1, true);
303
310
  // expect(removed1).toBeInstanceOf(Array);
304
311
  // expect(removed1[0]).toBeDefined();
305
312
  // expect(removed1[0].deleted).toBeDefined();
@@ -309,7 +316,7 @@ describe('TreeMultiset operations test', () => {
309
316
  //
310
317
  // expect(objTreeMultiset.getHeight()).toBe(4);
311
318
  //
312
- // const removed4 = objTreeMultiset.remove(4, true);
319
+ // const removed4 = objTreeMultiset.delete(4, true);
313
320
  // expect(removed4).toBeInstanceOf(Array);
314
321
  // expect(removed4[0]).toBeDefined();
315
322
  // expect(removed4[0].deleted).toBeDefined();
@@ -317,7 +324,7 @@ describe('TreeMultiset operations test', () => {
317
324
  // expect(objTreeMultiset.isAVLBalanced()).toBe(true);
318
325
  // expect(objTreeMultiset.getHeight()).toBe(4);
319
326
  //
320
- // const removed10 = objTreeMultiset.remove(10, true);
327
+ // const removed10 = objTreeMultiset.delete(10, true);
321
328
  // expect(removed10).toBeInstanceOf(Array);
322
329
  // expect(removed10[0]).toBeDefined();
323
330
  // expect(removed10[0].deleted).toBeDefined();
@@ -325,7 +332,7 @@ describe('TreeMultiset operations test', () => {
325
332
  // expect(objTreeMultiset.isAVLBalanced()).toBe(false);
326
333
  // expect(objTreeMultiset.getHeight()).toBe(4);
327
334
  //
328
- // const removed15 = objTreeMultiset.remove(15, true);
335
+ // const removed15 = objTreeMultiset.delete(15, true);
329
336
  // expect(removed15).toBeInstanceOf(Array);
330
337
  // expect(removed15[0]).toBeDefined();
331
338
  // expect(removed15[0].deleted).toBeDefined();
@@ -334,7 +341,7 @@ describe('TreeMultiset operations test', () => {
334
341
  // expect(objTreeMultiset.isAVLBalanced()).toBe(true);
335
342
  // expect(objTreeMultiset.getHeight()).toBe(3);
336
343
  //
337
- // const removed5 = objTreeMultiset.remove(5, true);
344
+ // const removed5 = objTreeMultiset.delete(5, true);
338
345
  // expect(removed5).toBeInstanceOf(Array);
339
346
  // expect(removed5[0]).toBeDefined();
340
347
  // expect(removed5[0].deleted).toBeDefined();
@@ -343,7 +350,7 @@ describe('TreeMultiset operations test', () => {
343
350
  // expect(objTreeMultiset.isAVLBalanced()).toBe(true);
344
351
  // expect(objTreeMultiset.getHeight()).toBe(3);
345
352
  //
346
- // const removed13 = objTreeMultiset.remove(13, true);
353
+ // const removed13 = objTreeMultiset.delete(13, true);
347
354
  // expect(removed13).toBeInstanceOf(Array);
348
355
  // expect(removed13[0]).toBeDefined();
349
356
  // expect(removed13[0].deleted).toBeDefined();
@@ -351,7 +358,7 @@ describe('TreeMultiset operations test', () => {
351
358
  // expect(objTreeMultiset.isAVLBalanced()).toBe(true);
352
359
  // expect(objTreeMultiset.getHeight()).toBe(3);
353
360
  //
354
- // const removed3 = objTreeMultiset.remove(3, true);
361
+ // const removed3 = objTreeMultiset.delete(3, true);
355
362
  // expect(removed3).toBeInstanceOf(Array);
356
363
  // expect(removed3[0]).toBeDefined();
357
364
  // expect(removed3[0].deleted).toBeDefined();
@@ -359,7 +366,7 @@ describe('TreeMultiset operations test', () => {
359
366
  // expect(objTreeMultiset.isAVLBalanced()).toBe(false);
360
367
  // expect(objTreeMultiset.getHeight()).toBe(3);
361
368
  //
362
- // const removed8 = objTreeMultiset.remove(8, true);
369
+ // const removed8 = objTreeMultiset.delete(8, true);
363
370
  // expect(removed8).toBeInstanceOf(Array);
364
371
  // expect(removed8[0]).toBeDefined();
365
372
  // expect(removed8[0].deleted).toBeDefined();
@@ -367,16 +374,16 @@ describe('TreeMultiset operations test', () => {
367
374
  // expect(objTreeMultiset.isAVLBalanced()).toBe(true);
368
375
  // expect(objTreeMultiset.getHeight()).toBe(3);
369
376
  //
370
- // const removed6 = objTreeMultiset.remove(6, true);
377
+ // const removed6 = objTreeMultiset.delete(6, true);
371
378
  // expect(removed6).toBeInstanceOf(Array);
372
379
  // expect(removed6[0]).toBeDefined();
373
380
  // expect(removed6[0].deleted).toBeDefined();
374
381
  // if (removed6[0].deleted) expect(removed6[0].deleted.key).toBe(6);
375
- // expect(objTreeMultiset.remove(6, true).length).toBe(0);
382
+ // expect(objTreeMultiset.delete(6, true).length).toBe(0);
376
383
  // expect(objTreeMultiset.isAVLBalanced()).toBe(false);
377
384
  // expect(objTreeMultiset.getHeight()).toBe(3);
378
385
  //
379
- // const removed7 = objTreeMultiset.remove(7, true);
386
+ // const removed7 = objTreeMultiset.delete(7, true);
380
387
  // expect(removed7).toBeInstanceOf(Array);
381
388
  // expect(removed7[0]).toBeDefined();
382
389
  // expect(removed7[0].deleted).toBeDefined();
@@ -384,7 +391,7 @@ describe('TreeMultiset operations test', () => {
384
391
  // expect(objTreeMultiset.isAVLBalanced()).toBe(false);
385
392
  // expect(objTreeMultiset.getHeight()).toBe(3);
386
393
  //
387
- // const removed9 = objTreeMultiset.remove(9, true);
394
+ // const removed9 = objTreeMultiset.delete(9, true);
388
395
  // expect(removed9).toBeInstanceOf(Array);
389
396
  // expect(removed9[0]).toBeDefined();
390
397
  // expect(removed9[0].deleted).toBeDefined();
@@ -392,7 +399,7 @@ describe('TreeMultiset operations test', () => {
392
399
  // expect(objTreeMultiset.isAVLBalanced()).toBe(false);
393
400
  // expect(objTreeMultiset.getHeight()).toBe(3);
394
401
  //
395
- // const removed14 = objTreeMultiset.remove(14, true);
402
+ // const removed14 = objTreeMultiset.delete(14, true);
396
403
  // expect(removed14).toBeInstanceOf(Array);
397
404
  // expect(removed14[0]).toBeDefined();
398
405
  // expect(removed14[0].deleted).toBeDefined();
@@ -419,13 +426,19 @@ describe('TreeMultiset operations test', () => {
419
426
 
420
427
  describe('TreeMultiset Performance test', function () {
421
428
  // const treeMS = new TreeMultiset<TreeMultisetNode<number>>();
422
- // const inputSizes = [100]; // Adjust input sizes as needed
429
+ // const inputSize = [100]; // Adjust input sizes as needed
423
430
  //
424
431
  // // Define a function to calculate the expected O(n log n) time
425
432
  // function expectedTime(n: number): number {
426
433
  // return n * Math.log(n);
427
434
  // }
428
435
 
436
+ const treeMS = new TreeMultiset<TreeMultisetNode<number>>();
437
+ const inputSize = 100000; // Adjust input sizes as needed
438
+
439
+ beforeEach(() => {
440
+ treeMS.clear();
441
+ });
429
442
  it(`Observe the time consumption of TreeMultiset.add fitting O(n log n)`, function () {
430
443
  // // Create a benchmark suite
431
444
  // const suite = new Benchmark.Suite();
@@ -437,9 +450,9 @@ describe('TreeMultiset Performance test', function () {
437
450
  // }
438
451
  // return arr;
439
452
  // }
440
- // const inputArray = generateRandomArray(inputSizes[0]);
453
+ // const inputArray = generateRandomArray(inputSize[0]);
441
454
  //
442
- // suite.add(`TreeMultiset addMany (n=${inputSizes[0]})`, () => {
455
+ // suite.add(`TreeMultiset addMany (n=${inputSize[0]})`, () => {
443
456
  // treeMS.addMany([...inputArray]);
444
457
  // });
445
458
  //
@@ -453,9 +466,26 @@ describe('TreeMultiset Performance test', function () {
453
466
  // console.log(`Input size (n): ${n}, Observed time: ${observedTime.toFixed(2)}ms, Expected time: ${expected.toFixed(2)}ms`);
454
467
  // })
455
468
  // .on('complete', () => {
456
- // console.log(`Benchmark (n=${inputSizes[0]}) completed.`);
469
+ // console.log(`Benchmark (n=${inputSize[0]}) completed.`);
457
470
  // done(); // Call done to indicate the test is complete
458
471
  // })
459
472
  // .run({async: true});
460
473
  });
474
+
475
+ it(`Observe the time consumption of TreeMultiset.dfs be good`, function () {
476
+ const startDFS = performance.now();
477
+ const dfs = treeMS.dfs();
478
+ isDebug && console.log('---bfs', performance.now() - startDFS, dfs.length);
479
+ });
480
+
481
+ it('Should the time consumption of lesserOrGreaterForeach fitting O(n log n)', function () {
482
+ const start = performance.now();
483
+ for (let i = 0; i < inputSize; i++) {
484
+ treeMS.add(i);
485
+ }
486
+ isDebug && console.log('---add', performance.now() - start);
487
+ const startL = performance.now();
488
+ treeMS.lesserOrGreaterForeach(inputSize / 2, CP.lt, (node: TreeMultisetNode<number>) => (node.count += 1));
489
+ isDebug && console.log('---lesserOrGreaterForeach', performance.now() - startL);
490
+ });
461
491
  });
@@ -31,7 +31,7 @@ describe('DirectedGraph Operation Test', () => {
31
31
  expect(graph.hasEdge('B', 'A')).toBe(false);
32
32
  });
33
33
 
34
- it('should remove edges', () => {
34
+ it('should delete edges', () => {
35
35
  const vertex1 = new DirectedVertex('A');
36
36
  const vertex2 = new DirectedVertex('B');
37
37
  const edge = new DirectedEdge('A', 'B');
@@ -31,7 +31,7 @@ describe('UndirectedGraph Operation Test', () => {
31
31
  expect(graph.hasEdge('B', 'A')).toBe(true);
32
32
  });
33
33
 
34
- it('should remove edges', () => {
34
+ it('should delete edges', () => {
35
35
  const vertex1 = new UndirectedVertex('A');
36
36
  const vertex2 = new UndirectedVertex('B');
37
37
  const edge = new UndirectedEdge('A', 'B');
@@ -36,11 +36,11 @@ describe('HashMap', () => {
36
36
  expect(hashMap.get('key2')).toBe(2);
37
37
  });
38
38
 
39
- it('should remove values', () => {
39
+ it('should delete values', () => {
40
40
  hashMap.set('one', 1);
41
41
  hashMap.set('two', 2);
42
42
 
43
- hashMap.remove('one');
43
+ hashMap.delete('one');
44
44
  expect(hashMap.get('one')).toBeUndefined();
45
45
  expect(hashMap.size).toBe(1);
46
46
  });
@@ -81,13 +81,13 @@ describe('HashTable', () => {
81
81
  expect(retrievedValue).toBeUndefined();
82
82
  });
83
83
 
84
- it('should remove key-value pair correctly', () => {
84
+ it('should delete key-value pair correctly', () => {
85
85
  const hashTable = new HashTable<string, string>();
86
86
  const key = 'testKey';
87
87
  const value = 'testValue';
88
88
 
89
89
  hashTable.set(key, value);
90
- hashTable.remove(key);
90
+ hashTable.delete(key);
91
91
 
92
92
  const retrievedValue = hashTable.get(key);
93
93
 
@@ -128,10 +128,10 @@ describe('HashTable', () => {
128
128
  expect(hashTable.get('two')).toBe(2);
129
129
  });
130
130
 
131
- it('should remove values correctly', () => {
131
+ it('should delete values correctly', () => {
132
132
  hashTable.set('one', 1);
133
133
  hashTable.set('two', 2);
134
- hashTable.remove('one');
134
+ hashTable.delete('one');
135
135
 
136
136
  expect(hashTable.get('one')).toBeUndefined();
137
137
  expect(hashTable.get('two')).toBe(2);
@@ -139,7 +139,7 @@ describe('HashTable', () => {
139
139
 
140
140
  it('should handle non-existent keys correctly', () => {
141
141
  expect(hashTable.get('non-existent')).toBeUndefined();
142
- hashTable.remove('non-existent'); // Removing a non-existent key should not cause errors
142
+ hashTable.delete('non-existent'); // Removing a non-existent key should not cause errors
143
143
  });
144
144
 
145
145
  it('should handle custom hash function correctly', () => {
@@ -1,5 +1,5 @@
1
1
  import {FibonacciHeap, MaxHeap, MinHeap} from '../../../../src';
2
- import {logBigOMetricsWrap} from "../../../utils";
2
+ import {logBigOMetricsWrap} from '../../../utils';
3
3
 
4
4
  describe('Heap Operation Test', () => {
5
5
  it('should numeric heap work well', function () {
@@ -201,10 +201,8 @@ describe('FibonacciHeap', () => {
201
201
  });
202
202
  });
203
203
 
204
-
205
204
  describe('FibonacciHeap Stress Test', () => {
206
205
  it('should handle a large number of elements efficiently', () => {
207
-
208
206
  const testByMagnitude = (magnitude: number) => {
209
207
  const heap = new FibonacciHeap<number>();
210
208
 
@@ -229,7 +227,7 @@ describe('FibonacciHeap Stress Test', () => {
229
227
 
230
228
  // Verify that the heap is now empty
231
229
  expect(heap.size).toBe(0);
232
- }
230
+ };
233
231
 
234
232
  testByMagnitude(1000);
235
233
 
@@ -238,13 +236,18 @@ describe('FibonacciHeap Stress Test', () => {
238
236
  // 150000, 200000, 250000, 300000, 400000, 500000, 600000, 700000, 800000, 900000, 1000000
239
237
  // ].forEach(m => logBigOMetricsWrap<typeof testByMagnitude>(testByMagnitude, [m]));
240
238
  [
241
- 10, 100, 1000, 5000, 10000, 20000, 50000, 75000, 100000,
242
- 150000, 200000, 250000, 300000, 400000, 500000, 600000, 700000, 800000, 900000, 1000000
243
- ].forEach(m => logBigOMetricsWrap((c: number) => {
244
- const result: number[] = [];
245
- for (let i = 0; i < c; i++) result.push(i);
246
- return result;
247
- } , [m], 'loopPush'));
248
-
239
+ 10, 100, 1000, 5000, 10000, 20000, 50000, 75000, 100000, 150000, 200000, 250000, 300000, 400000, 500000, 600000,
240
+ 700000, 800000, 900000, 1000000
241
+ ].forEach(m =>
242
+ logBigOMetricsWrap(
243
+ (c: number) => {
244
+ const result: number[] = [];
245
+ for (let i = 0; i < c; i++) result.push(i);
246
+ return result;
247
+ },
248
+ [m],
249
+ 'loopPush'
250
+ )
251
+ );
249
252
  });
250
253
  });
@@ -18,7 +18,7 @@ describe('SinglyLinkedList Operation Test', () => {
18
18
  });
19
19
 
20
20
  describe('pop', () => {
21
- it('should remove and return the last element of the list', () => {
21
+ it('should delete and return the last element of the list', () => {
22
22
  list.push(1);
23
23
  list.push(2);
24
24
  const popped = list.pop();
@@ -33,7 +33,7 @@ describe('SinglyLinkedList Operation Test', () => {
33
33
  });
34
34
 
35
35
  describe('shift', () => {
36
- it('should remove and return the first element of the list', () => {
36
+ it('should delete and return the first element of the list', () => {
37
37
  list.push(1);
38
38
  list.push(2);
39
39
  const shifted = list.shift();
@@ -109,7 +109,7 @@ describe('SinglyLinkedList Operation Test', () => {
109
109
  });
110
110
 
111
111
  describe('removeValue', () => {
112
- it('should remove the first occurrence of a value from the list', () => {
112
+ it('should delete the first occurrence of a value from the list', () => {
113
113
  list.push(1);
114
114
  list.push(2);
115
115
  list.push(3);
@@ -240,8 +240,8 @@ describe('SinglyLinkedList Operation Test', () => {
240
240
  });
241
241
  });
242
242
 
243
- describe('remove', () => {
244
- it('should remove and return the element at the specified index', () => {
243
+ describe('delete', () => {
244
+ it('should delete and return the element at the specified index', () => {
245
245
  list.push(1);
246
246
  list.push(2);
247
247
  list.push(3);
@@ -256,7 +256,7 @@ describe('SinglyLinkedList Operation Test', () => {
256
256
  expect(removed).toBeUndefined();
257
257
  });
258
258
 
259
- it('should remove and return the first element', () => {
259
+ it('should delete and return the first element', () => {
260
260
  list.push(1);
261
261
  list.push(2);
262
262
  const removed = list.deleteAt(0);
@@ -264,7 +264,7 @@ describe('SinglyLinkedList Operation Test', () => {
264
264
  expect(list.toArray()).toEqual([2]);
265
265
  });
266
266
 
267
- it('should remove and return the last element', () => {
267
+ it('should delete and return the last element', () => {
268
268
  list.push(1);
269
269
  list.push(2);
270
270
  const removed = list.deleteAt(1);
@@ -25,12 +25,12 @@ describe('SkipList', () => {
25
25
  expect(skipList.get(0)).toBeUndefined();
26
26
  });
27
27
 
28
- it('should remove elements correctly', () => {
28
+ it('should delete elements correctly', () => {
29
29
  skipList.add(1, 'One');
30
30
  skipList.add(2, 'Two');
31
31
  skipList.add(3, 'Three');
32
32
 
33
- skipList.remove(2);
33
+ skipList.delete(2);
34
34
 
35
35
  expect(skipList.get(2)).toBeUndefined(); // 修改这里的断言
36
36
  });
@@ -27,7 +27,7 @@ describe('MaxPriorityQueue Operation Test', () => {
27
27
  expect(priorityQueue.poll()?.keyA).toBe(1);
28
28
  });
29
29
 
30
- it('should return and remove the smallest element', () => {
30
+ it('should return and delete the smallest element', () => {
31
31
  const priorityQueue = new MaxPriorityQueue<number>();
32
32
  priorityQueue.add(5);
33
33
  priorityQueue.add(3);
@@ -1,4 +1,5 @@
1
1
  import {Deque, ArrayDeque, ObjectDeque} from '../../../../src';
2
+ import {bigO} from '../../../utils';
2
3
 
3
4
  describe('Deque Tests', () => {
4
5
  // Test cases for the Deque class (DoublyLinkedList-based)
@@ -16,7 +17,7 @@ describe('Deque Tests', () => {
16
17
  expect(deque.peekLast()).toBe(2);
17
18
  });
18
19
 
19
- it('should remove elements from the beginning and end', () => {
20
+ it('should delete elements from the beginning and end', () => {
20
21
  deque.addFirst(1);
21
22
  deque.addLast(2);
22
23
  deque.pollFirst();
@@ -69,7 +70,7 @@ describe('Deque Tests', () => {
69
70
  expect(objectDeque.peekLast()).toBe('two');
70
71
  });
71
72
 
72
- it('should remove elements from the beginning and end', () => {
73
+ it('should delete elements from the beginning and end', () => {
73
74
  objectDeque.addFirst('one');
74
75
  objectDeque.addLast('two');
75
76
  objectDeque.pollFirst();
@@ -106,7 +107,7 @@ describe('Deque Tests', () => {
106
107
  expect(arrayDeque.peekLast()).toBe(2);
107
108
  });
108
109
 
109
- it('should remove elements from the beginning and end', () => {
110
+ it('should delete elements from the beginning and end', () => {
110
111
  arrayDeque.addFirst(1);
111
112
  arrayDeque.addLast(2);
112
113
  arrayDeque.pollFirst();
@@ -128,3 +129,19 @@ describe('Deque Tests', () => {
128
129
  // Add more test cases as needed
129
130
  });
130
131
  });
132
+
133
+ describe('Deque Performance Test', () => {
134
+ const dataSize = 10000;
135
+ it('should numeric queue be efficient', function () {
136
+ const startTime = performance.now();
137
+ const queue = new Deque<number>();
138
+ for (let i = 0; i < dataSize; i++) {
139
+ queue.unshift(i);
140
+ }
141
+ for (let i = 0; i < dataSize; i++) {
142
+ queue.pop();
143
+ }
144
+ console.log(`Queue Deque Test: ${performance.now() - startTime} ms`);
145
+ expect(performance.now() - startTime).toBeLessThan(bigO.LINEAR * 100);
146
+ });
147
+ });
@@ -197,3 +197,45 @@ describe('LinkedListQueue', () => {
197
197
 
198
198
  // Add more test cases for other methods of LinkedListQueue.
199
199
  });
200
+
201
+ describe('Queue Performance Test', () => {
202
+ const dataSize = 10000;
203
+ it('should numeric queue be efficient', function () {
204
+ const startTime = performance.now();
205
+ const queue = new Queue<number>();
206
+ for (let i = 0; i < dataSize; i++) {
207
+ queue.enqueue(i);
208
+ }
209
+ for (let i = 0; i < dataSize; i++) {
210
+ queue.dequeue();
211
+ }
212
+ console.log(`Queue Performance Test: ${performance.now() - startTime} ms`);
213
+ expect(performance.now() - startTime).toBeLessThan(bigO.LINEAR * 100);
214
+ });
215
+
216
+ it('should numeric Array be more efficient than Queue when the data size is 10000', function () {
217
+ const startTime2 = performance.now();
218
+ const queue2: number[] = [];
219
+ for (let i = 0; i < dataSize; i++) {
220
+ queue2.push(i);
221
+ }
222
+ for (let i = 0; i < dataSize; i++) {
223
+ queue2.shift();
224
+ }
225
+ console.log(`Array Performance Test: ${performance.now() - startTime2} ms`);
226
+ expect(performance.now() - startTime2).toBeLessThan(bigO.CUBED * 100);
227
+ });
228
+
229
+ it('should numeric LinkedListQueue be efficient', function () {
230
+ const startTime = performance.now();
231
+ const queue = new LinkedListQueue<number>();
232
+ for (let i = 0; i < dataSize; i++) {
233
+ queue.enqueue(i);
234
+ }
235
+ for (let i = 0; i < dataSize; i++) {
236
+ queue.dequeue();
237
+ }
238
+ console.log(`LinkedListQueue Performance Test: ${performance.now() - startTime} ms`);
239
+ expect(performance.now() - startTime).toBeLessThan(bigO.LINEAR * 100);
240
+ });
241
+ });
@@ -81,15 +81,15 @@ describe('Trie', () => {
81
81
  expect(words).toEqual(['apple', 'application', 'app']);
82
82
  });
83
83
 
84
- it('should remove words from Trie', () => {
84
+ it('should delete words from Trie', () => {
85
85
  const trie = new Trie();
86
86
  trie.add('apple');
87
87
  trie.add('app');
88
88
  expect(trie.has('apple')).toBe(true);
89
- trie.remove('apple');
89
+ trie.delete('apple');
90
90
  expect(trie.has('apple')).toBe(false);
91
91
  expect(trie.has('app')).toBe(true);
92
- trie.remove('app');
92
+ trie.delete('app');
93
93
  expect(trie.has('app')).toBe(false);
94
94
  });
95
95
 
@@ -772,9 +772,9 @@ describe('Trie operations', () => {
772
772
  test('Remove Words', () => {
773
773
  trie.add('apple');
774
774
  trie.add('banana');
775
- expect(trie.remove('apple')).toBe(true);
775
+ expect(trie.delete('apple')).toBe(true);
776
776
  expect(trie.has('apple')).toBe(false);
777
- expect(trie.remove('cherry')).toBe(false);
777
+ expect(trie.delete('cherry')).toBe(false);
778
778
  });
779
779
 
780
780
  test('Case Sensitivity', () => {