data-structure-typed 1.48.5 → 1.48.7

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 (63) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +109 -59
  3. package/README_zh-CN.md +1028 -0
  4. package/benchmark/report.html +16 -16
  5. package/benchmark/report.json +204 -174
  6. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +7 -16
  7. package/dist/cjs/data-structures/binary-tree/binary-tree.js +24 -19
  8. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  9. package/dist/cjs/data-structures/binary-tree/bst.d.ts +35 -11
  10. package/dist/cjs/data-structures/binary-tree/bst.js +58 -39
  11. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  12. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  13. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +4 -4
  14. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +4 -4
  15. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  16. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +4 -4
  17. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +4 -4
  18. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  19. package/dist/cjs/data-structures/queue/deque.d.ts +9 -9
  20. package/dist/cjs/data-structures/queue/deque.js +9 -9
  21. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  22. package/dist/cjs/interfaces/binary-tree.d.ts +1 -1
  23. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +7 -16
  24. package/dist/mjs/data-structures/binary-tree/binary-tree.js +24 -19
  25. package/dist/mjs/data-structures/binary-tree/bst.d.ts +35 -11
  26. package/dist/mjs/data-structures/binary-tree/bst.js +58 -39
  27. package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +4 -4
  28. package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +4 -4
  29. package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +4 -4
  30. package/dist/mjs/data-structures/linked-list/singly-linked-list.js +4 -4
  31. package/dist/mjs/data-structures/queue/deque.d.ts +9 -9
  32. package/dist/mjs/data-structures/queue/deque.js +9 -9
  33. package/dist/mjs/interfaces/binary-tree.d.ts +1 -1
  34. package/dist/umd/data-structure-typed.js +99 -78
  35. package/dist/umd/data-structure-typed.min.js +2 -2
  36. package/dist/umd/data-structure-typed.min.js.map +1 -1
  37. package/package.json +2 -2
  38. package/src/data-structures/binary-tree/avl-tree.ts +1 -1
  39. package/src/data-structures/binary-tree/binary-tree.ts +31 -20
  40. package/src/data-structures/binary-tree/bst.ts +73 -46
  41. package/src/data-structures/binary-tree/rb-tree.ts +1 -1
  42. package/src/data-structures/binary-tree/tree-multimap.ts +1 -1
  43. package/src/data-structures/hash/hash-map.ts +1 -1
  44. package/src/data-structures/linked-list/doubly-linked-list.ts +4 -4
  45. package/src/data-structures/linked-list/singly-linked-list.ts +4 -4
  46. package/src/data-structures/queue/deque.ts +10 -10
  47. package/src/data-structures/queue/queue.ts +1 -1
  48. package/src/interfaces/binary-tree.ts +1 -1
  49. package/src/types/data-structures/binary-tree/rb-tree.ts +1 -1
  50. package/src/types/data-structures/heap/heap.ts +1 -1
  51. package/src/types/data-structures/priority-queue/priority-queue.ts +1 -1
  52. package/test/performance/data-structures/binary-tree/rb-tree.test.ts +1 -1
  53. package/test/performance/data-structures/hash/hash-map.test.ts +8 -8
  54. package/test/performance/data-structures/linked-list/doubly-linked-list.test.ts +2 -2
  55. package/test/performance/data-structures/linked-list/singly-linked-list.test.ts +12 -1
  56. package/test/performance/data-structures/priority-queue/priority-queue.test.ts +1 -1
  57. package/test/performance/data-structures/queue/deque.test.ts +27 -15
  58. package/test/performance/data-structures/queue/queue.test.ts +27 -4
  59. package/test/performance/data-structures/stack/stack.test.ts +2 -2
  60. package/test/unit/data-structures/binary-tree/bst.test.ts +29 -29
  61. package/test/unit/data-structures/binary-tree/overall.test.ts +1 -1
  62. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +2 -2
  63. package/test/unit/data-structures/queue/deque.test.ts +15 -15
@@ -5,7 +5,7 @@ import { magnitude } from '../../../utils';
5
5
  import { isCompetitor } from '../../../config';
6
6
 
7
7
  export const suite = new Benchmark.Suite();
8
- const { LINEAR } = magnitude;
8
+ const { LINEAR, HUNDRED_THOUSAND } = magnitude;
9
9
 
10
10
  suite.add(`${LINEAR.toLocaleString()} push`, () => {
11
11
  const deque = new Deque<number>();
@@ -13,7 +13,7 @@ suite.add(`${LINEAR.toLocaleString()} push`, () => {
13
13
  });
14
14
 
15
15
  if (isCompetitor) {
16
- suite.add(`${LINEAR.toLocaleString()} CPT push`, () => {
16
+ suite.add(`CPT ${LINEAR.toLocaleString()} push`, () => {
17
17
  const _deque = new CDeque<number>();
18
18
  for (let i = 0; i < LINEAR; i++) _deque.pushBack(i);
19
19
  });
@@ -26,16 +26,28 @@ suite.add(`${LINEAR.toLocaleString()} push & pop`, () => {
26
26
  for (let i = 0; i < LINEAR; i++) _deque.push(i);
27
27
  for (let i = 0; i < LINEAR; i++) _deque.pop();
28
28
 
29
- });
30
- suite.add(`${LINEAR.toLocaleString()} push & shift`, () => {
31
- const _deque = new Deque<number>();
32
-
33
- for (let i = 0; i < LINEAR; i++) _deque.push(i);
34
- for (let i = 0; i < LINEAR; i++) _deque.shift();
35
- });
36
- suite.add(`${LINEAR.toLocaleString()} unshift & shift`, () => {
37
- const _deque = new Deque<number>();
38
-
39
- for (let i = 0; i < LINEAR; i++) _deque.unshift(i);
40
- for (let i = 0; i < LINEAR; i++) _deque.shift();
41
- });
29
+ })
30
+ .add(`${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => {
31
+ const _deque = new Deque<number>();
32
+
33
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.push(i);
34
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.shift();
35
+ })
36
+ .add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => {
37
+ const _deque = new Array<number>();
38
+
39
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.push(i);
40
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.shift();
41
+ })
42
+ .add(`${HUNDRED_THOUSAND.toLocaleString()} unshift & shift`, () => {
43
+ const _deque = new Deque<number>();
44
+
45
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.unshift(i);
46
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.shift();
47
+ })
48
+ .add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} unshift & shift`, () => {
49
+ const _deque = new Array<number>();
50
+
51
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.unshift(i);
52
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.shift();
53
+ });
@@ -5,7 +5,7 @@ import { magnitude } from '../../../utils';
5
5
  import { isCompetitor } from '../../../config';
6
6
 
7
7
  const suite = new Benchmark.Suite();
8
- const { LINEAR } = magnitude;
8
+ const { LINEAR, HUNDRED_THOUSAND } = magnitude;
9
9
 
10
10
  suite.add(`${LINEAR.toLocaleString()} push`, () => {
11
11
  const queue = new Queue<number>();
@@ -15,7 +15,7 @@ suite.add(`${LINEAR.toLocaleString()} push`, () => {
15
15
  }
16
16
  });
17
17
  if (isCompetitor) {
18
- suite.add(`${LINEAR.toLocaleString()} CPT push`, () => {
18
+ suite.add(`CPT ${LINEAR.toLocaleString()} push`, () => {
19
19
  const queue = new CQueue<number>();
20
20
 
21
21
  for (let i = 0; i < LINEAR; i++) {
@@ -23,13 +23,36 @@ if (isCompetitor) {
23
23
  }
24
24
  });
25
25
  }
26
- suite.add(`${LINEAR.toLocaleString()} push & shift`, () => {
26
+ suite.add(`${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => {
27
27
  const queue = new Queue<number>();
28
28
 
29
- for (let i = 0; i < LINEAR; i++) {
29
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) {
30
30
  queue.push(i);
31
+ }
32
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) {
31
33
  queue.shift();
32
34
  }
33
35
  });
36
+ suite.add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => {
37
+ const arr = new Array<number>();
38
+
39
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) {
40
+ arr.push(i);
41
+ }
42
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) {
43
+ arr.shift();
44
+ }
45
+ })
46
+ .add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} push & pop`, () => {
47
+ const arr = new Array<number>();
48
+
49
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) {
50
+ arr.push(i);
51
+ }
52
+
53
+ for (let i = 0; i < HUNDRED_THOUSAND; i++) {
54
+ arr.pop();
55
+ }
56
+ });
34
57
 
35
58
  export { suite };
@@ -15,7 +15,7 @@ suite.add(`${LINEAR.toLocaleString()} push`, () => {
15
15
  }
16
16
  });
17
17
  if (isCompetitor) {
18
- suite.add(`${LINEAR.toLocaleString()} CPT push`, () => {
18
+ suite.add(`CPT ${LINEAR.toLocaleString()} push`, () => {
19
19
  const queue = new CStack<number>();
20
20
 
21
21
  for (let i = 0; i < LINEAR; i++) {
@@ -34,7 +34,7 @@ suite.add(`${LINEAR.toLocaleString()} push & pop`, () => {
34
34
  }
35
35
  });
36
36
  if (isCompetitor) {
37
- suite.add(`${LINEAR.toLocaleString()} CPT push & pop`, () => {
37
+ suite.add(`CPT ${LINEAR.toLocaleString()} push & pop`, () => {
38
38
  const queue = new CStack<number>();
39
39
 
40
40
  for (let i = 0; i < LINEAR; i++) {
@@ -10,7 +10,7 @@ describe('BST operations test', () => {
10
10
  bst.add([11, 11]);
11
11
  bst.add([3, 3]);
12
12
  const idsAndValues: [number, number][] = [[15, 15], [1, 1], [8, 8], [13, 13], [16, 16], [2, 2], [6, 6], [9, 9], [12, 12], [14, 14], [4, 4], [7, 7], [10, 10], [5, 5]];
13
- bst.addMany(idsAndValues, false);
13
+ bst.addMany(idsAndValues, undefined, false);
14
14
  expect(bst.root).toBeInstanceOf(BSTNode);
15
15
 
16
16
  if (bst.root) expect(bst.root.key).toBe(11);
@@ -189,28 +189,27 @@ describe('BST operations test', () => {
189
189
  });
190
190
 
191
191
  it('should perform various operations on a Binary Search Tree with object values', () => {
192
- const objBST = new BST<number, { key: number; keyA: number }>();
192
+ const objBST = new BST<number, { name: string; age: number }>();
193
193
  expect(objBST).toBeInstanceOf(BST);
194
- objBST.add([11, { key: 11, keyA: 11 }]);
195
- objBST.add([3, { key: 3, keyA: 3 }]);
196
- const values: [number, { key: number; keyA: number }][] = [
197
- [15, { key: 15, keyA: 15 }],
198
- [1, { key: 1, keyA: 1 }],
199
- [8, { key: 8, keyA: 8 }],
200
- [13, { key: 13, keyA: 13 }],
201
- [16, { key: 16, keyA: 16 }],
202
- [2, { key: 2, keyA: 2 }],
203
- [6, { key: 6, keyA: 6 }],
204
- [9, { key: 9, keyA: 9 }],
205
- [12, { key: 12, keyA: 12 }],
206
- [14, { key: 14, keyA: 14 }],
207
- [4, { key: 4, keyA: 4 }],
208
- [7, { key: 7, keyA: 7 }],
209
- [10, { key: 10, keyA: 10 }],
210
- [5, { key: 5, keyA: 5 }]
211
- ];
212
-
213
- objBST.addMany(values, false);
194
+ objBST.add([11, { name: '11', age: 11 }]);
195
+ objBST.add([3, { name: '3', age: 3 }]);
196
+
197
+ objBST.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], [
198
+ { "name": "Alice", "age": 15 },
199
+ { "name": "Bob", "age": 1 },
200
+ { "name": "Charlie", "age": 8 },
201
+ { "name": "David", "age": 13 },
202
+ { "name": "Emma", "age": 16 },
203
+ { "name": "Frank", "age": 2 },
204
+ { "name": "Grace", "age": 6 },
205
+ { "name": "Hannah", "age": 9 },
206
+ { "name": "Isaac", "age": 12 },
207
+ { "name": "Jack", "age": 14 },
208
+ { "name": "Katie", "age": 4 },
209
+ { "name": "Liam", "age": 7 },
210
+ { "name": "Mia", "age": 10 },
211
+ { "name": "Noah", "age": 5 }
212
+ ], false);
214
213
 
215
214
  expect(objBST.root).toBeInstanceOf(BSTNode);
216
215
 
@@ -232,7 +231,7 @@ describe('BST operations test', () => {
232
231
  expect(leftMost?.key).toBe(1);
233
232
 
234
233
  const node15 = objBST.getNode(15);
235
- expect(node15?.value).toEqual({ key: 15, keyA: 15 });
234
+ expect(node15?.value).toEqual({ name: 'Alice', age: 15 });
236
235
  const minNodeBySpecificNode = node15 && objBST.getLeftMost(node15);
237
236
  expect(minNodeBySpecificNode?.key).toBe(12);
238
237
 
@@ -256,7 +255,7 @@ describe('BST operations test', () => {
256
255
  objBST.perfectlyBalance();
257
256
  expect(objBST.isPerfectlyBalanced()).toBe(true);
258
257
 
259
- const bfsNodesAfterBalanced: BSTNode<number, { key: number; keyA: number }>[] = [];
258
+ const bfsNodesAfterBalanced: BSTNode<number, { name: string; age: number }>[] = [];
260
259
  objBST.bfs(node => bfsNodesAfterBalanced.push(node));
261
260
  expect(bfsNodesAfterBalanced[0].key).toBe(8);
262
261
  expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
@@ -381,7 +380,7 @@ describe('BST operations test', () => {
381
380
  expect(bfsIDs[1]).toBe(12);
382
381
  expect(bfsIDs[2]).toBe(16);
383
382
 
384
- const bfsNodes: BSTNode<number, { key: number; keyA: number }>[] = [];
383
+ const bfsNodes: BSTNode<number, { name: string; age: number }>[] = [];
385
384
  objBST.bfs(node => bfsNodes.push(node));
386
385
  expect(bfsNodes[0].key).toBe(2);
387
386
  expect(bfsNodes[1].key).toBe(12);
@@ -396,7 +395,7 @@ describe('BST operations test recursively', () => {
396
395
  bst.add([11, 11]);
397
396
  bst.add([3, 3]);
398
397
  const idsAndValues = [15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5];
399
- bst.addMany(idsAndValues, false);
398
+ bst.addMany(idsAndValues, undefined, false);
400
399
  expect(bst.root).toBeInstanceOf(BSTNode);
401
400
 
402
401
  if (bst.root) expect(bst.root.key).toBe(11);
@@ -580,7 +579,7 @@ describe('BST operations test recursively', () => {
580
579
  expect(objBST).toBeInstanceOf(BST);
581
580
  objBST.add([11, { key: 11, keyA: 11 }]);
582
581
  objBST.add([3, { key: 3, keyA: 3 }]);
583
- const values: [number, { key: number; keyA: number }][] = [
582
+ const entries: [number, { key: number; keyA: number }][] = [
584
583
  [15, { key: 15, keyA: 15 }],
585
584
  [1, { key: 1, keyA: 1 }],
586
585
  [8, { key: 8, keyA: 8 }],
@@ -598,7 +597,8 @@ describe('BST operations test recursively', () => {
598
597
  ];
599
598
 
600
599
  objBST.addMany(
601
- values,
600
+ entries,
601
+ undefined,
602
602
  false
603
603
  );
604
604
 
@@ -829,7 +829,7 @@ describe('BST Performance test', function () {
829
829
 
830
830
  it('should the lastKey of a BST to be the largest key', function () {
831
831
  const bst = new BST();
832
- bst.addMany([9, 8, 7, 3, 1, 2, 5, 4, 6], false);
832
+ bst.addMany([9, 8, 7, 3, 1, 2, 5, 4, 6], undefined, false);
833
833
  // TODO
834
834
  // expect(bst.lastKey()).toBe(9);
835
835
  });
@@ -5,7 +5,7 @@ describe('Overall BinaryTree Test', () => {
5
5
  const bst = new BST();
6
6
  bst.add(11);
7
7
  bst.add(3);
8
- bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], false);
8
+ bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], undefined, false);
9
9
  bst.size === 16; // true
10
10
  expect(bst.size).toBe(16); // true
11
11
  bst.has(6); // true
@@ -32,7 +32,7 @@ describe('SinglyLinkedList Operation Test', () => {
32
32
  list.push(3);
33
33
  const popped = list.pop();
34
34
  expect(popped).toBe(3);
35
- expect(list.popLast()).toBe(2);
35
+ expect(list.pollLast()).toBe(2);
36
36
  expect(list.toArray()).toEqual([1]);
37
37
  });
38
38
 
@@ -49,7 +49,7 @@ describe('SinglyLinkedList Operation Test', () => {
49
49
  list.push(3);
50
50
  const shifted = list.shift();
51
51
  expect(shifted).toBe(1);
52
- expect(list.popFirst()).toBe(2);
52
+ expect(list.pollFirst()).toBe(2);
53
53
  expect(list.toArray()).toEqual([3]);
54
54
  });
55
55
 
@@ -22,13 +22,13 @@ describe('Deque Tests', () => {
22
22
  it('should delete elements from the beginning and end', () => {
23
23
  deque.addFirst(1);
24
24
  deque.addLast(2);
25
- deque.popFirst();
26
- deque.popLast();
25
+ deque.pollFirst();
26
+ deque.pollLast();
27
27
  expect(deque.isEmpty()).toBe(true);
28
28
  });
29
29
 
30
30
  it('should handle edge case when removing from an empty deque', () => {
31
- const result = deque.popFirst();
31
+ const result = deque.pollFirst();
32
32
  expect(result).toBeUndefined();
33
33
  });
34
34
 
@@ -40,18 +40,18 @@ describe('Deque Tests', () => {
40
40
 
41
41
  it('should handle adding and removing elements alternately', () => {
42
42
  deque.addFirst(1);
43
- expect(deque.popFirst()).toBe(1);
43
+ expect(deque.pollFirst()).toBe(1);
44
44
  deque.addLast(2);
45
- expect(deque.popLast()).toBe(2);
45
+ expect(deque.pollLast()).toBe(2);
46
46
  expect(deque.isEmpty()).toBe(true);
47
47
  });
48
48
 
49
49
  it('should handle adding and removing elements in a cyclic manner', () => {
50
50
  deque.addFirst(1);
51
51
  deque.addLast(2);
52
- expect(deque.popFirst()).toBe(1);
52
+ expect(deque.pollFirst()).toBe(1);
53
53
  deque.addFirst(3);
54
- expect(deque.popLast()).toBe(2);
54
+ expect(deque.pollLast()).toBe(2);
55
55
  expect(deque.size).toBe(1);
56
56
  });
57
57
  // Add more test cases as needed
@@ -75,13 +75,13 @@ describe('Deque Tests', () => {
75
75
  // it('should delete elements from the beginning and end', () => {
76
76
  // objectDeque.addFirst('one');
77
77
  // objectDeque.addLast('two');
78
- // objectDeque.popFirst();
79
- // objectDeque.popLast();
78
+ // objectDeque.pollFirst();
79
+ // objectDeque.pollLast();
80
80
  // expect(objectDeque.isEmpty()).toBe(true);
81
81
  // });
82
82
  //
83
83
  // it('should handle edge case when removing from an empty deque', () => {
84
- // const result = objectDeque.popFirst();
84
+ // const result = objectDeque.pollFirst();
85
85
  // expect(result).toBeUndefined();
86
86
  // });
87
87
  //
@@ -136,8 +136,8 @@ describe('Deque', () => {
136
136
  deque.addFirst(1);
137
137
  deque.addLast(2);
138
138
 
139
- const firstElement = deque.popFirst();
140
- const lastElement = deque.popLast();
139
+ const firstElement = deque.pollFirst();
140
+ const lastElement = deque.pollLast();
141
141
 
142
142
  expect(deque.size).toBe(0);
143
143
  expect(firstElement).toBe(1);
@@ -166,7 +166,7 @@ describe('Deque', () => {
166
166
  deque.addLast(1);
167
167
  expect(deque.isEmpty()).toBe(false);
168
168
 
169
- deque.popFirst();
169
+ deque.pollFirst();
170
170
  expect(deque.isEmpty()).toBe(true);
171
171
  });
172
172
  });
@@ -200,7 +200,7 @@ describe('Deque', () => {
200
200
  // deque.addLast(1);
201
201
  // deque.addLast(2);
202
202
  //
203
- // const removedElement = deque.popFirst();
203
+ // const removedElement = deque.pollFirst();
204
204
  //
205
205
  // expect(deque.size).toBe(1);
206
206
  // expect(removedElement).toBe(1);
@@ -211,7 +211,7 @@ describe('Deque', () => {
211
211
  // deque.addLast(1);
212
212
  // deque.addLast(2);
213
213
  //
214
- // const removedElement = deque.popFirst();
214
+ // const removedElement = deque.pollFirst();
215
215
  //
216
216
  // expect(deque.size).toBe(1);
217
217
  // expect(removedElement).toBe(1);