data-structure-typed 1.41.6 → 1.41.8

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 (115) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +14 -11
  3. package/benchmark/report.html +14 -11
  4. package/benchmark/report.json +153 -202
  5. package/dist/cjs/src/data-structures/binary-tree/rb-tree.d.ts +5 -2
  6. package/dist/cjs/src/data-structures/binary-tree/rb-tree.js +15 -2
  7. package/dist/cjs/src/data-structures/binary-tree/rb-tree.js.map +1 -1
  8. package/dist/cjs/src/data-structures/graph/abstract-graph.js +5 -5
  9. package/dist/cjs/src/data-structures/graph/abstract-graph.js.map +1 -1
  10. package/dist/mjs/src/data-structures/binary-tree/rb-tree.d.ts +5 -2
  11. package/dist/mjs/src/data-structures/binary-tree/rb-tree.js +15 -2
  12. package/dist/mjs/src/data-structures/graph/abstract-graph.js +5 -5
  13. package/dist/umd/data-structure-typed.min.js +1 -1
  14. package/dist/umd/data-structure-typed.min.js.map +1 -1
  15. package/package.json +5 -5
  16. package/src/data-structures/binary-tree/binary-tree.ts +1 -1
  17. package/src/data-structures/binary-tree/bst.ts +1 -1
  18. package/src/data-structures/binary-tree/rb-tree.ts +18 -2
  19. package/src/data-structures/graph/abstract-graph.ts +6 -6
  20. package/test/config.ts +1 -0
  21. package/test/integration/avl-tree.test.ts +110 -0
  22. package/test/integration/bst.test.ts +385 -0
  23. package/test/integration/heap.test.js +16 -0
  24. package/test/integration/index.html +51 -0
  25. package/test/performance/data-structures/binary-tree/avl-tree.test.ts +36 -0
  26. package/test/performance/data-structures/binary-tree/binary-index-tree.test.ts +0 -0
  27. package/test/performance/data-structures/binary-tree/binary-tree.test.ts +45 -0
  28. package/test/performance/data-structures/binary-tree/bst.test.ts +36 -0
  29. package/test/performance/data-structures/binary-tree/overall.test.ts +0 -0
  30. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +32 -0
  31. package/test/performance/data-structures/binary-tree/segment-tree.test.ts +0 -0
  32. package/test/performance/data-structures/binary-tree/tree-multiset.test.ts +0 -0
  33. package/test/performance/data-structures/graph/abstract-graph.test.ts +0 -0
  34. package/test/performance/data-structures/graph/directed-graph.test.ts +49 -0
  35. package/test/performance/data-structures/graph/map-graph.test.ts +0 -0
  36. package/test/performance/data-structures/graph/overall.test.ts +0 -0
  37. package/test/performance/data-structures/graph/undirected-graph.test.ts +0 -0
  38. package/test/performance/data-structures/hash/coordinate-map.test.ts +0 -0
  39. package/test/performance/data-structures/hash/coordinate-set.test.ts +0 -0
  40. package/test/performance/data-structures/hash/hash-map.test.ts +0 -0
  41. package/test/performance/data-structures/hash/hash-table.test.ts +0 -0
  42. package/test/performance/data-structures/heap/heap.test.ts +30 -0
  43. package/test/performance/data-structures/heap/max-heap.test.ts +0 -0
  44. package/test/performance/data-structures/heap/min-heap.test.ts +0 -0
  45. package/test/performance/data-structures/linked-list/doubly-linked-list.test.ts +40 -0
  46. package/test/performance/data-structures/linked-list/linked-list.test.ts +0 -0
  47. package/test/performance/data-structures/linked-list/singly-linked-list.test.ts +34 -0
  48. package/test/performance/data-structures/linked-list/skip-linked-list.test.ts +0 -0
  49. package/test/performance/data-structures/linked-list/skip-list.test.ts +0 -0
  50. package/test/performance/data-structures/matrix/matrix.test.ts +0 -0
  51. package/test/performance/data-structures/matrix/matrix2d.test.ts +0 -0
  52. package/test/performance/data-structures/matrix/navigator.test.ts +0 -0
  53. package/test/performance/data-structures/matrix/vector2d.test.ts +0 -0
  54. package/test/performance/data-structures/priority-queue/max-priority-queue.test.ts +19 -0
  55. package/test/performance/data-structures/priority-queue/min-priority-queue.test.ts +0 -0
  56. package/test/performance/data-structures/priority-queue/priority-queue.test.ts +0 -0
  57. package/test/performance/data-structures/queue/deque.test.ts +21 -0
  58. package/test/performance/data-structures/queue/queue.test.ts +25 -0
  59. package/test/performance/data-structures/stack/stack.test.ts +0 -0
  60. package/test/performance/data-structures/tree/tree.test.ts +0 -0
  61. package/test/performance/data-structures/trie/trie.test.ts +22 -0
  62. package/test/performance/reportor.ts +185 -0
  63. package/test/performance/types/index.ts +1 -0
  64. package/test/performance/types/reportor.ts +3 -0
  65. package/test/types/index.ts +1 -0
  66. package/test/types/utils/big-o.ts +1 -0
  67. package/test/types/utils/index.ts +2 -0
  68. package/test/types/utils/json2html.ts +1 -0
  69. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +269 -0
  70. package/test/unit/data-structures/binary-tree/binary-index-tree.test.ts +320 -0
  71. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +486 -0
  72. package/test/unit/data-structures/binary-tree/bst.test.ts +840 -0
  73. package/test/unit/data-structures/binary-tree/overall.test.ts +66 -0
  74. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +435 -0
  75. package/test/unit/data-structures/binary-tree/segment-tree.test.ts +50 -0
  76. package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +542 -0
  77. package/test/unit/data-structures/graph/abstract-graph.test.ts +100 -0
  78. package/test/unit/data-structures/graph/directed-graph.test.ts +564 -0
  79. package/test/unit/data-structures/graph/map-graph.test.ts +126 -0
  80. package/test/unit/data-structures/graph/overall.test.ts +49 -0
  81. package/test/unit/data-structures/graph/salty-edges.json +1 -0
  82. package/test/unit/data-structures/graph/salty-vertexes.json +1 -0
  83. package/test/unit/data-structures/graph/undirected-graph.test.ts +167 -0
  84. package/test/unit/data-structures/hash/coordinate-map.test.ts +74 -0
  85. package/test/unit/data-structures/hash/coordinate-set.test.ts +66 -0
  86. package/test/unit/data-structures/hash/hash-map.test.ts +103 -0
  87. package/test/unit/data-structures/hash/hash-table.test.ts +186 -0
  88. package/test/unit/data-structures/heap/heap.test.ts +254 -0
  89. package/test/unit/data-structures/heap/max-heap.test.ts +52 -0
  90. package/test/unit/data-structures/heap/min-heap.test.ts +52 -0
  91. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +400 -0
  92. package/test/unit/data-structures/linked-list/linked-list.test.ts +8 -0
  93. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +474 -0
  94. package/test/unit/data-structures/linked-list/skip-linked-list.test.ts +13 -0
  95. package/test/unit/data-structures/linked-list/skip-list.test.ts +86 -0
  96. package/test/unit/data-structures/matrix/matrix.test.ts +54 -0
  97. package/test/unit/data-structures/matrix/matrix2d.test.ts +345 -0
  98. package/test/unit/data-structures/matrix/navigator.test.ts +244 -0
  99. package/test/unit/data-structures/matrix/vector2d.test.ts +171 -0
  100. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +73 -0
  101. package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +63 -0
  102. package/test/unit/data-structures/priority-queue/priority-queue.test.ts +53 -0
  103. package/test/unit/data-structures/queue/deque.test.ts +410 -0
  104. package/test/unit/data-structures/queue/queue.test.ts +207 -0
  105. package/test/unit/data-structures/stack/stack.test.ts +67 -0
  106. package/test/unit/data-structures/tree/tree.test.ts +39 -0
  107. package/test/unit/data-structures/trie/trie.test.ts +825 -0
  108. package/test/utils/array.ts +5514 -0
  109. package/test/utils/big-o.ts +207 -0
  110. package/test/utils/console.ts +31 -0
  111. package/test/utils/index.ts +7 -0
  112. package/test/utils/is.ts +56 -0
  113. package/test/utils/json2html.ts +322 -0
  114. package/test/utils/number.ts +13 -0
  115. package/test/utils/string.ts +1 -0
@@ -0,0 +1,254 @@
1
+ import {FibonacciHeap, MaxHeap, MinHeap} from '../../../../src';
2
+ import {logBigOMetricsWrap} from '../../../utils';
3
+
4
+ describe('Heap Operation Test', () => {
5
+ it('should numeric heap work well', function () {
6
+ const minNumHeap = new MinHeap<number>();
7
+ minNumHeap.add(1).add(6).add(2).add(0).add(5).add(9);
8
+ expect(minNumHeap.has(1)).toBe(true);
9
+ expect(minNumHeap.has(2)).toBe(true);
10
+ expect(minNumHeap.poll()).toBe(0);
11
+ expect(minNumHeap.poll()).toBe(1);
12
+ expect(minNumHeap.peek()).toBe(2);
13
+ expect(!minNumHeap.has(1));
14
+ expect(minNumHeap.has(2));
15
+ const arrFromHeap = minNumHeap.toArray();
16
+ expect(arrFromHeap.length).toBe(4);
17
+ expect(arrFromHeap[0]).toBe(2);
18
+ expect(arrFromHeap[1]).toBe(5);
19
+ expect(arrFromHeap[2]).toBe(9);
20
+ expect(arrFromHeap[3]).toBe(6);
21
+ expect(minNumHeap.sort()).toEqual([2, 5, 6, 9]);
22
+ });
23
+
24
+ it('should object heap work well', function () {
25
+ const minHeap = new MinHeap<{a: string; key: number}>({comparator: (a, b) => a.key - b.key});
26
+ minHeap.add({key: 1, a: 'a1'});
27
+ minHeap.add({key: 6, a: 'a6'});
28
+ minHeap.add({key: 2, a: 'a2'});
29
+ minHeap.add({key: 0, a: 'a0'});
30
+
31
+ expect(minHeap.peek()).toEqual({a: 'a0', key: 0});
32
+ expect(minHeap.toArray().map(item => ({a: item.a}))).toEqual([{a: 'a0'}, {a: 'a1'}, {a: 'a2'}, {a: 'a6'}]);
33
+ let i = 0;
34
+ const expectPolled = [{a: 'a0'}, {a: 'a1'}, {a: 'a2'}, {a: 'a6'}];
35
+ while (minHeap.size > 0) {
36
+ expect({a: minHeap.poll()?.a}).toEqual(expectPolled[i]);
37
+ i++;
38
+ }
39
+
40
+ const maxHeap = new MaxHeap<{key: number; a: string}>({comparator: (a, b) => b.key - a.key});
41
+ maxHeap.add({key: 1, a: 'a1'});
42
+ maxHeap.add({key: 6, a: 'a6'});
43
+ maxHeap.add({key: 5, a: 'a5'});
44
+ maxHeap.add({key: 2, a: 'a2'});
45
+ maxHeap.add({key: 0, a: 'a0'});
46
+ maxHeap.add({key: 9, a: 'a9'});
47
+ expect(maxHeap.peek()).toEqual({a: 'a9', key: 9});
48
+ expect(maxHeap.toArray().map(item => ({a: item.a}))).toEqual([
49
+ {a: 'a9'},
50
+ {a: 'a2'},
51
+ {a: 'a6'},
52
+ {a: 'a1'},
53
+ {a: 'a0'},
54
+ {a: 'a5'}
55
+ ]);
56
+ const maxExpectPolled = [{a: 'a9'}, {a: 'a6'}, {a: 'a5'}, {a: 'a2'}, {a: 'a1'}, {a: 'a0'}];
57
+ let maxI = 0;
58
+ while (maxHeap.size > 0) {
59
+ expect({a: maxHeap.poll()?.a}).toEqual(maxExpectPolled[maxI]);
60
+ maxI++;
61
+ }
62
+ });
63
+ });
64
+
65
+ describe('FibonacciHeap', () => {
66
+ let heap: FibonacciHeap<number>;
67
+
68
+ beforeEach(() => {
69
+ heap = new FibonacciHeap<number>();
70
+ });
71
+
72
+ test('push & peek', () => {
73
+ heap.push(10);
74
+ heap.push(5);
75
+ expect(heap.peek()).toBe(5);
76
+ });
77
+
78
+ test('pop', () => {
79
+ heap.push(10);
80
+ heap.push(5);
81
+ heap.push(15);
82
+ expect(heap.pop()).toBe(5);
83
+ expect(heap.pop()).toBe(10);
84
+ expect(heap.pop()).toBe(15);
85
+ });
86
+
87
+ test('pop on an empty heap', () => {
88
+ expect(heap.pop()).toBeUndefined();
89
+ });
90
+
91
+ test('size', () => {
92
+ expect(heap.size).toBe(0);
93
+ heap.push(10);
94
+ expect(heap.size).toBe(1);
95
+ heap.pop();
96
+ expect(heap.size).toBe(0);
97
+ });
98
+
99
+ test('clear', () => {
100
+ heap.push(10);
101
+ heap.push(5);
102
+ heap.clear();
103
+ expect(heap.size).toBe(0);
104
+ expect(heap.peek()).toBeUndefined();
105
+ });
106
+
107
+ test('custom comparator', () => {
108
+ const maxHeap = new FibonacciHeap<number>((a, b) => b - a);
109
+ maxHeap.push(10);
110
+ maxHeap.push(5);
111
+ expect(maxHeap.peek()).toBe(10);
112
+ });
113
+ });
114
+
115
+ describe('FibonacciHeap', () => {
116
+ let heap: FibonacciHeap<number>;
117
+
118
+ beforeEach(() => {
119
+ heap = new FibonacciHeap<number>();
120
+ });
121
+
122
+ it('should initialize an empty heap', () => {
123
+ expect(heap.size).toBe(0);
124
+ expect(heap.peek()).toBeUndefined();
125
+ });
126
+
127
+ it('should push items into the heap and update size', () => {
128
+ heap.push(10);
129
+ heap.push(5);
130
+
131
+ expect(heap.size).toBe(2);
132
+ });
133
+
134
+ it('should peek the minimum item', () => {
135
+ heap.push(10);
136
+ heap.push(5);
137
+ heap.push(15);
138
+
139
+ expect(heap.peek()).toBe(5);
140
+ });
141
+
142
+ it('should pop the minimum item and update size', () => {
143
+ heap.push(10);
144
+ heap.push(5);
145
+ heap.push(15);
146
+
147
+ const minItem = heap.pop();
148
+
149
+ expect(minItem).toBe(5);
150
+ expect(heap.size).toBe(2);
151
+ });
152
+
153
+ it('should correctly merge two heaps', () => {
154
+ const heap1 = new FibonacciHeap<number>();
155
+ const heap2 = new FibonacciHeap<number>();
156
+
157
+ heap1.push(10);
158
+ heap2.push(5);
159
+
160
+ heap1.merge(heap2);
161
+
162
+ expect(heap1.size).toBe(2);
163
+ expect(heap1.peek()).toBe(5);
164
+ });
165
+
166
+ it('should clear the heap', () => {
167
+ heap.push(10);
168
+ heap.push(5);
169
+
170
+ heap.clear();
171
+
172
+ expect(heap.size).toBe(0);
173
+ expect(heap.peek()).toBeUndefined();
174
+ });
175
+
176
+ it('should handle custom comparators', () => {
177
+ const customComparator = (a: number, b: number) => b - a;
178
+ const customHeap = new FibonacciHeap<number>(customComparator);
179
+
180
+ customHeap.push(10);
181
+ customHeap.push(5);
182
+ customHeap.push(15);
183
+
184
+ expect(customHeap.peek()).toBe(15);
185
+ });
186
+
187
+ describe('FibonacciHeap Merge', () => {
188
+ it('should merge two Fibonacci heaps correctly', () => {
189
+ const heap1 = new FibonacciHeap<number>();
190
+ heap1.push(5).push(10);
191
+
192
+ const heap2 = new FibonacciHeap<number>();
193
+ heap2.push(3).push(7);
194
+
195
+ heap1.merge(heap2);
196
+
197
+ expect(heap1.size).toBe(4); // Combined size of both heaps
198
+ expect(heap2.size).toBe(0); // Merged heap should be empty
199
+ expect(heap1.peek()).toBe(3); // Minimum element should be 3
200
+ });
201
+ });
202
+ });
203
+
204
+ describe('FibonacciHeap Stress Test', () => {
205
+ it('should handle a large number of elements efficiently', () => {
206
+ const testByMagnitude = (magnitude: number) => {
207
+ const heap = new FibonacciHeap<number>();
208
+
209
+ // Add 1000 elements to the heap
210
+ for (let i = 1; i <= magnitude; i++) {
211
+ heap.push(i);
212
+ }
213
+
214
+ // Verify that the minimum element is 1 (smallest element)
215
+ expect(heap.peek()).toBe(1);
216
+
217
+ // Remove all 1000 elements from the heap
218
+ const elements = [];
219
+ while (heap.size > 0) {
220
+ elements.push(heap.pop());
221
+ }
222
+
223
+ // Verify that all elements were removed in ascending order
224
+ for (let i = 1; i <= magnitude; i++) {
225
+ expect(elements[i - 1]).toBe(i);
226
+ }
227
+
228
+ // Verify that the heap is now empty
229
+ expect(heap.size).toBe(0);
230
+ };
231
+
232
+ testByMagnitude(1000);
233
+
234
+ // [
235
+ // 10, 100, 1000, 5000, 10000, 20000, 50000, 75000, 100000,
236
+ // 150000, 200000, 250000, 300000, 400000, 500000, 600000, 700000, 800000, 900000, 1000000
237
+ // ].forEach(m => logBigOMetricsWrap<typeof testByMagnitude>(testByMagnitude, [m]));
238
+ // [
239
+ // 10, 100, 1000, 5000, 10000, 20000, 50000, 75000, 100000, 150000, 200000, 250000, 300000, 400000, 500000, 600000,
240
+ // 700000, 800000, 900000, 1000000
241
+ // ]
242
+ [10, 100, 1000, 5000].forEach(m =>
243
+ logBigOMetricsWrap(
244
+ (c: number) => {
245
+ const result: number[] = [];
246
+ for (let i = 0; i < c; i++) result.push(i);
247
+ return result;
248
+ },
249
+ [m],
250
+ 'loopPush'
251
+ )
252
+ );
253
+ });
254
+ });
@@ -0,0 +1,52 @@
1
+ import {Comparator, MaxHeap} from '../../../../src';
2
+
3
+ describe('MaxHeap', () => {
4
+ const numberComparator: Comparator<number> = (a, b) => b - a;
5
+ let maxHeap: MaxHeap<number>;
6
+
7
+ beforeEach(() => {
8
+ maxHeap = new MaxHeap({comparator: numberComparator});
9
+ });
10
+
11
+ test('add and poll elements in descending order', () => {
12
+ maxHeap.add(3);
13
+ maxHeap.add(1);
14
+ maxHeap.add(4);
15
+ maxHeap.add(2);
16
+
17
+ expect(maxHeap.poll()).toBe(4);
18
+ expect(maxHeap.poll()).toBe(3);
19
+ expect(maxHeap.poll()).toBe(2);
20
+ expect(maxHeap.poll()).toBe(1);
21
+ });
22
+
23
+ test('peek at the top element without removing it', () => {
24
+ maxHeap.add(3);
25
+ maxHeap.add(1);
26
+ maxHeap.add(4);
27
+ maxHeap.add(2);
28
+
29
+ expect(maxHeap.peek()).toBe(4);
30
+ expect(maxHeap.size).toBe(4);
31
+ });
32
+
33
+ test('sort elements in descending order', () => {
34
+ maxHeap.add(3);
35
+ maxHeap.add(1);
36
+ maxHeap.add(4);
37
+ maxHeap.add(2);
38
+
39
+ const sortedArray = maxHeap.sort();
40
+ expect(sortedArray).toEqual([4, 3, 2, 1]);
41
+ });
42
+
43
+ test('check if the heap is empty', () => {
44
+ expect(maxHeap.isEmpty()).toBe(true);
45
+
46
+ maxHeap.add(5);
47
+ expect(maxHeap.isEmpty()).toBe(false);
48
+
49
+ maxHeap.poll();
50
+ expect(maxHeap.isEmpty()).toBe(true);
51
+ });
52
+ });
@@ -0,0 +1,52 @@
1
+ import {Comparator, MinHeap} from '../../../../src';
2
+
3
+ describe('MinHeap', () => {
4
+ const numberComparator: Comparator<number> = (a, b) => a - b;
5
+ let minHeap: MinHeap<number>;
6
+
7
+ beforeEach(() => {
8
+ minHeap = new MinHeap({comparator: numberComparator});
9
+ });
10
+
11
+ test('add and poll elements in ascending order', () => {
12
+ minHeap.add(3);
13
+ minHeap.add(1);
14
+ minHeap.add(4);
15
+ minHeap.add(2);
16
+
17
+ expect(minHeap.poll()).toBe(1);
18
+ expect(minHeap.poll()).toBe(2);
19
+ expect(minHeap.poll()).toBe(3);
20
+ expect(minHeap.poll()).toBe(4);
21
+ });
22
+
23
+ test('peek at the top element without removing it', () => {
24
+ minHeap.add(3);
25
+ minHeap.add(1);
26
+ minHeap.add(4);
27
+ minHeap.add(2);
28
+
29
+ expect(minHeap.peek()).toBe(1);
30
+ expect(minHeap.size).toBe(4);
31
+ });
32
+
33
+ test('sort elements in ascending order', () => {
34
+ minHeap.add(3);
35
+ minHeap.add(1);
36
+ minHeap.add(4);
37
+ minHeap.add(2);
38
+
39
+ const sortedArray = minHeap.sort();
40
+ expect(sortedArray).toEqual([1, 2, 3, 4]);
41
+ });
42
+
43
+ test('check if the heap is empty', () => {
44
+ expect(minHeap.isEmpty()).toBe(true);
45
+
46
+ minHeap.add(5);
47
+ expect(minHeap.isEmpty()).toBe(false);
48
+
49
+ minHeap.poll();
50
+ expect(minHeap.isEmpty()).toBe(true);
51
+ });
52
+ });