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.
- package/CHANGELOG.md +3 -1
- package/README.md +8 -0
- package/dist/data-structures/binary-tree/avl-tree.d.ts +5 -5
- package/dist/data-structures/binary-tree/avl-tree.js +6 -6
- package/dist/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/data-structures/binary-tree/binary-tree.d.ts +18 -95
- package/dist/data-structures/binary-tree/binary-tree.js +82 -183
- package/dist/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/data-structures/binary-tree/bst.d.ts +6 -20
- package/dist/data-structures/binary-tree/bst.js +22 -122
- package/dist/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/data-structures/binary-tree/tree-multiset.d.ts +6 -67
- package/dist/data-structures/binary-tree/tree-multiset.js +10 -257
- package/dist/data-structures/binary-tree/tree-multiset.js.map +1 -1
- package/dist/data-structures/graph/abstract-graph.js +4 -3
- package/dist/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/data-structures/hash/hash-map.d.ts +1 -1
- package/dist/data-structures/hash/hash-map.js +1 -1
- package/dist/data-structures/hash/hash-table.d.ts +3 -3
- package/dist/data-structures/hash/hash-table.js +3 -3
- package/dist/data-structures/heap/heap.js.map +1 -1
- package/dist/data-structures/linked-list/skip-linked-list.d.ts +3 -3
- package/dist/data-structures/linked-list/skip-linked-list.js +3 -3
- package/dist/data-structures/queue/deque.d.ts +2 -2
- package/dist/data-structures/queue/deque.js +2 -2
- package/dist/data-structures/queue/queue.js +1 -1
- package/dist/data-structures/trie/trie.d.ts +2 -2
- package/dist/data-structures/trie/trie.js +2 -2
- package/dist/interfaces/binary-tree.d.ts +1 -1
- package/lib/data-structures/binary-tree/avl-tree.d.ts +5 -5
- package/lib/data-structures/binary-tree/avl-tree.js +6 -6
- package/lib/data-structures/binary-tree/binary-tree.d.ts +18 -95
- package/lib/data-structures/binary-tree/binary-tree.js +82 -183
- package/lib/data-structures/binary-tree/bst.d.ts +6 -20
- package/lib/data-structures/binary-tree/bst.js +22 -122
- package/lib/data-structures/binary-tree/tree-multiset.d.ts +6 -67
- package/lib/data-structures/binary-tree/tree-multiset.js +10 -257
- package/lib/data-structures/graph/abstract-graph.js +4 -3
- package/lib/data-structures/hash/hash-map.d.ts +1 -1
- package/lib/data-structures/hash/hash-map.js +1 -1
- package/lib/data-structures/hash/hash-table.d.ts +3 -3
- package/lib/data-structures/hash/hash-table.js +3 -3
- package/lib/data-structures/linked-list/skip-linked-list.d.ts +3 -3
- package/lib/data-structures/linked-list/skip-linked-list.js +3 -3
- package/lib/data-structures/queue/deque.d.ts +2 -2
- package/lib/data-structures/queue/deque.js +2 -2
- package/lib/data-structures/queue/queue.js +1 -1
- package/lib/data-structures/trie/trie.d.ts +2 -2
- package/lib/data-structures/trie/trie.js +2 -2
- package/lib/interfaces/binary-tree.d.ts +1 -1
- package/package.json +9 -7
- package/src/data-structures/binary-tree/avl-tree.ts +6 -6
- package/src/data-structures/binary-tree/binary-tree.ts +85 -274
- package/src/data-structures/binary-tree/bst.ts +22 -106
- package/src/data-structures/binary-tree/rb-tree.ts +3 -3
- package/src/data-structures/binary-tree/tree-multiset.ts +10 -249
- package/src/data-structures/graph/abstract-graph.ts +4 -3
- package/src/data-structures/hash/hash-map.ts +1 -1
- package/src/data-structures/hash/hash-table.ts +3 -3
- package/src/data-structures/heap/heap.ts +5 -2
- package/src/data-structures/linked-list/skip-linked-list.ts +3 -3
- package/src/data-structures/queue/deque.ts +2 -2
- package/src/data-structures/queue/queue.ts +1 -1
- package/src/data-structures/trie/trie.ts +2 -2
- package/src/interfaces/binary-tree.ts +1 -1
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +19 -17
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +2 -2
- package/test/unit/data-structures/binary-tree/bst.test.ts +72 -35
- package/test/unit/data-structures/binary-tree/overall.test.ts +4 -4
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +1 -1
- package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +67 -37
- package/test/unit/data-structures/graph/directed-graph.test.ts +1 -1
- package/test/unit/data-structures/graph/undirected-graph.test.ts +1 -1
- package/test/unit/data-structures/hash/hash-map.test.ts +2 -2
- package/test/unit/data-structures/hash/hash-table.test.ts +5 -5
- package/test/unit/data-structures/heap/heap.test.ts +15 -12
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +7 -7
- package/test/unit/data-structures/linked-list/skip-list.test.ts +2 -2
- package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +1 -1
- package/test/unit/data-structures/queue/deque.test.ts +20 -3
- package/test/unit/data-structures/queue/queue.test.ts +42 -0
- package/test/unit/data-structures/trie/trie.test.ts +5 -5
- package/test/utils/big-o.ts +64 -57
- package/umd/bundle.min.js +1 -1
- 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
|
-
|
|
43
|
+
let subTreeSum = 0;
|
|
44
|
+
node15 && treeMultiset.subTreeForeach(15, (node: TreeMultisetNode<number>) => (subTreeSum += node.key));
|
|
43
45
|
expect(subTreeSum).toBe(70);
|
|
44
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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(
|
|
453
|
+
// const inputArray = generateRandomArray(inputSize[0]);
|
|
441
454
|
//
|
|
442
|
-
// suite.add(`TreeMultiset addMany (n=${
|
|
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=${
|
|
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
|
|
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
|
|
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
|
|
39
|
+
it('should delete values', () => {
|
|
40
40
|
hashMap.set('one', 1);
|
|
41
41
|
hashMap.set('two', 2);
|
|
42
42
|
|
|
43
|
-
hashMap.
|
|
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
|
|
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.
|
|
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
|
|
131
|
+
it('should delete values correctly', () => {
|
|
132
132
|
hashTable.set('one', 1);
|
|
133
133
|
hashTable.set('two', 2);
|
|
134
|
-
hashTable.
|
|
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.
|
|
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
|
|
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
|
-
|
|
243
|
-
].forEach(m =>
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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
|
|
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
|
|
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
|
|
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('
|
|
244
|
-
it('should
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
89
|
+
trie.delete('apple');
|
|
90
90
|
expect(trie.has('apple')).toBe(false);
|
|
91
91
|
expect(trie.has('app')).toBe(true);
|
|
92
|
-
trie.
|
|
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.
|
|
775
|
+
expect(trie.delete('apple')).toBe(true);
|
|
776
776
|
expect(trie.has('apple')).toBe(false);
|
|
777
|
-
expect(trie.
|
|
777
|
+
expect(trie.delete('cherry')).toBe(false);
|
|
778
778
|
});
|
|
779
779
|
|
|
780
780
|
test('Case Sensitivity', () => {
|