data-structure-typed 1.36.0 → 1.36.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +3 -1
  2. package/dist/data-structures/binary-tree/abstract-binary-tree.d.ts +3 -509
  3. package/dist/data-structures/binary-tree/abstract-binary-tree.js +1 -1175
  4. package/dist/data-structures/binary-tree/abstract-binary-tree.js.map +1 -1
  5. package/dist/data-structures/binary-tree/avl-tree.d.ts +1 -1
  6. package/dist/data-structures/binary-tree/avl-tree.js.map +1 -1
  7. package/dist/data-structures/binary-tree/binary-tree.d.ts +506 -1
  8. package/dist/data-structures/binary-tree/binary-tree.js +1173 -2
  9. package/dist/data-structures/binary-tree/binary-tree.js.map +1 -1
  10. package/dist/data-structures/binary-tree/bst.d.ts +1 -1
  11. package/dist/data-structures/binary-tree/bst.js.map +1 -1
  12. package/dist/data-structures/binary-tree/rb-tree.d.ts +1 -1
  13. package/dist/data-structures/binary-tree/rb-tree.js.map +1 -1
  14. package/dist/data-structures/binary-tree/tree-multiset.d.ts +1 -1
  15. package/dist/data-structures/binary-tree/tree-multiset.js.map +1 -1
  16. package/dist/data-structures/heap/heap.d.ts +22 -23
  17. package/dist/data-structures/heap/heap.js +8 -25
  18. package/dist/data-structures/heap/heap.js.map +1 -1
  19. package/dist/data-structures/heap/max-heap.d.ts +2 -2
  20. package/dist/data-structures/heap/min-heap.d.ts +2 -2
  21. package/dist/data-structures/priority-queue/max-priority-queue.d.ts +2 -2
  22. package/dist/data-structures/priority-queue/min-priority-queue.d.ts +2 -2
  23. package/dist/data-structures/priority-queue/priority-queue.d.ts +2 -2
  24. package/dist/types/data-structures/abstract-binary-tree.d.ts +1 -3
  25. package/dist/types/data-structures/binary-tree.d.ts +4 -2
  26. package/lib/data-structures/binary-tree/abstract-binary-tree.d.ts +3 -509
  27. package/lib/data-structures/binary-tree/abstract-binary-tree.js +1 -1175
  28. package/lib/data-structures/binary-tree/avl-tree.d.ts +1 -1
  29. package/lib/data-structures/binary-tree/binary-tree.d.ts +506 -1
  30. package/lib/data-structures/binary-tree/binary-tree.js +1173 -2
  31. package/lib/data-structures/binary-tree/bst.d.ts +1 -1
  32. package/lib/data-structures/binary-tree/rb-tree.d.ts +1 -1
  33. package/lib/data-structures/binary-tree/tree-multiset.d.ts +1 -1
  34. package/lib/data-structures/heap/heap.d.ts +22 -23
  35. package/lib/data-structures/heap/heap.js +8 -25
  36. package/lib/data-structures/heap/max-heap.d.ts +2 -2
  37. package/lib/data-structures/heap/min-heap.d.ts +2 -2
  38. package/lib/data-structures/priority-queue/max-priority-queue.d.ts +2 -2
  39. package/lib/data-structures/priority-queue/min-priority-queue.d.ts +2 -2
  40. package/lib/data-structures/priority-queue/priority-queue.d.ts +2 -2
  41. package/lib/types/data-structures/abstract-binary-tree.d.ts +1 -3
  42. package/lib/types/data-structures/binary-tree.d.ts +4 -2
  43. package/package.json +4 -4
  44. package/src/data-structures/binary-tree/abstract-binary-tree.ts +4 -1527
  45. package/src/data-structures/binary-tree/avl-tree.ts +3 -3
  46. package/src/data-structures/binary-tree/binary-tree.ts +1524 -5
  47. package/src/data-structures/binary-tree/bst.ts +3 -3
  48. package/src/data-structures/binary-tree/rb-tree.ts +3 -3
  49. package/src/data-structures/binary-tree/tree-multiset.ts +3 -3
  50. package/src/data-structures/heap/heap.ts +29 -47
  51. package/src/data-structures/heap/max-heap.ts +2 -2
  52. package/src/data-structures/heap/min-heap.ts +2 -2
  53. package/src/data-structures/priority-queue/max-priority-queue.ts +2 -2
  54. package/src/data-structures/priority-queue/min-priority-queue.ts +2 -2
  55. package/src/data-structures/priority-queue/priority-queue.ts +2 -2
  56. package/src/types/data-structures/abstract-binary-tree.ts +1 -1
  57. package/src/types/data-structures/binary-tree.ts +2 -2
  58. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +2 -1
  59. package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +1 -1
  60. package/umd/bundle.min.js +1 -1
  61. package/umd/bundle.min.js.LICENSE.txt +7 -0
  62. package/umd/bundle.min.js.map +1 -1
@@ -16,9 +16,9 @@ import {CP, LoopType} from '../../types';
16
16
  import {BinaryTree, BinaryTreeNode} from './binary-tree';
17
17
  import {IBST, IBSTNode} from '../../interfaces';
18
18
 
19
- export class BSTNode<V = any, NEIGHBOR extends BSTNode<V, NEIGHBOR> = BSTNodeNested<V>>
20
- extends BinaryTreeNode<V, NEIGHBOR>
21
- implements IBSTNode<V, NEIGHBOR>
19
+ export class BSTNode<V = any, FAMILY extends BSTNode<V, FAMILY> = BSTNodeNested<V>>
20
+ extends BinaryTreeNode<V, FAMILY>
21
+ implements IBSTNode<V, FAMILY>
22
22
  {
23
23
  constructor(key: BinaryTreeNodeKey, val?: V) {
24
24
  super(key, val);
@@ -2,9 +2,9 @@ import {BinaryTreeNodeKey, RBColor, RBTreeNodeNested, RBTreeOptions} from '../..
2
2
  import {IRBTree, IRBTreeNode} from '../../interfaces';
3
3
  import {BST, BSTNode} from './bst';
4
4
 
5
- export class RBTreeNode<V = any, NEIGHBOR extends RBTreeNode<V, NEIGHBOR> = RBTreeNodeNested<V>>
6
- extends BSTNode<V, NEIGHBOR>
7
- implements IRBTreeNode<V, NEIGHBOR>
5
+ export class RBTreeNode<V = any, FAMILY extends RBTreeNode<V, FAMILY> = RBTreeNodeNested<V>>
6
+ extends BSTNode<V, FAMILY>
7
+ implements IRBTreeNode<V, FAMILY>
8
8
  {
9
9
  private _color: RBColor;
10
10
 
@@ -10,9 +10,9 @@ import {BinaryTreeDeletedResult, CP, DFSOrderPattern, FamilyPosition, LoopType}
10
10
  import {ITreeMultiset, ITreeMultisetNode} from '../../interfaces';
11
11
  import {AVLTree, AVLTreeNode} from './avl-tree';
12
12
 
13
- export class TreeMultisetNode<V = any, NEIGHBOR extends TreeMultisetNode<V, NEIGHBOR> = TreeMultisetNodeNested<V>>
14
- extends AVLTreeNode<V, NEIGHBOR>
15
- implements ITreeMultisetNode<V, NEIGHBOR>
13
+ export class TreeMultisetNode<V = any, FAMILY extends TreeMultisetNode<V, FAMILY> = TreeMultisetNodeNested<V>>
14
+ extends AVLTreeNode<V, FAMILY>
15
+ implements ITreeMultisetNode<V, FAMILY>
16
16
  {
17
17
  /**
18
18
  * The constructor function initializes a BinaryTreeNode object with a key, value, and count.
@@ -1,6 +1,5 @@
1
1
  /**
2
2
  * data-structure-typed
3
- *
4
3
  * @author Kirk Qi
5
4
  * @copyright Copyright (c) 2022 Kirk Qi <qilinaus@gmail.com>
6
5
  * @license MIT License
@@ -8,11 +7,11 @@
8
7
 
9
8
  import type {CompareFunction} from '../../types';
10
9
 
11
- export class Heap<T> {
12
- private nodes: T[] = [];
13
- private readonly comparator: CompareFunction<T>;
10
+ export class Heap<E> {
11
+ protected nodes: E[] = [];
12
+ private readonly comparator: CompareFunction<E>;
14
13
 
15
- constructor(comparator: CompareFunction<T>) {
14
+ constructor(comparator: CompareFunction<E>) {
16
15
  this.comparator = comparator;
17
16
  }
18
17
 
@@ -20,7 +19,7 @@ export class Heap<T> {
20
19
  * Insert an element into the heap and maintain the heap properties.
21
20
  * @param value - The element to be inserted.
22
21
  */
23
- add(value: T): Heap<T> {
22
+ add(value: E): Heap<E> {
24
23
  this.nodes.push(value);
25
24
  this.bubbleUp(this.nodes.length - 1);
26
25
  return this;
@@ -30,16 +29,16 @@ export class Heap<T> {
30
29
  * Remove and return the top element (smallest or largest element) from the heap.
31
30
  * @returns The top element or null if the heap is empty.
32
31
  */
33
- poll(): T | null {
32
+ poll(): E | null {
34
33
  if (this.nodes.length === 0) {
35
34
  return null;
36
35
  }
37
36
  if (this.nodes.length === 1) {
38
- return this.nodes.pop() as T;
37
+ return this.nodes.pop() as E;
39
38
  }
40
39
 
41
40
  const topValue = this.nodes[0];
42
- this.nodes[0] = this.nodes.pop() as T;
41
+ this.nodes[0] = this.nodes.pop() as E;
43
42
  this.sinkDown(0);
44
43
  return topValue;
45
44
  }
@@ -99,7 +98,7 @@ export class Heap<T> {
99
98
  * Peek at the top element of the heap without removing it.
100
99
  * @returns The top element or null if the heap is empty.
101
100
  */
102
- peek(): T | null {
101
+ peek(): E | null {
103
102
  if (this.nodes.length === 0) {
104
103
  return null;
105
104
  }
@@ -117,7 +116,7 @@ export class Heap<T> {
117
116
  * Get the last element in the heap, which is not necessarily a leaf node.
118
117
  * @returns The last element or null if the heap is empty.
119
118
  */
120
- leaf(): T | null {
119
+ get leaf(): E | null {
121
120
  return this.nodes[this.size - 1] ?? null;
122
121
  }
123
122
 
@@ -129,11 +128,18 @@ export class Heap<T> {
129
128
  return this.size === 0;
130
129
  }
131
130
 
131
+ /**
132
+ * Reset the nodes of the heap. Make the nodes empty.
133
+ */
132
134
  clear() {
133
135
  this.nodes = [];
134
136
  }
135
137
 
136
- refill(nodes: T[]) {
138
+ /**
139
+ * Clear and add nodes of the heap
140
+ * @param nodes
141
+ */
142
+ refill(nodes: E[]) {
137
143
  this.nodes = nodes;
138
144
  this.fix();
139
145
  }
@@ -143,41 +149,17 @@ export class Heap<T> {
143
149
  * @param value - the element to check.
144
150
  * @returns Returns true if the specified element is contained; otherwise, returns false.
145
151
  */
146
- has(value: T): boolean {
152
+ has(value: E): boolean {
147
153
  return this.nodes.includes(value);
148
154
  }
149
155
 
150
- /**
151
- * Use a comparison function to find the index of an element in the heap.
152
- * @param value - the element to find.
153
- * @param index - the index currently being searched.
154
- * @returns The index of the element, or -1 if not found.
155
- */
156
- private findIndex(value: T, index: number): number {
157
- if (index >= this.size) {
158
- return -1;
159
- }
160
-
161
- const compareResult = this.comparator(value, this.nodes[index]);
162
-
163
- if (compareResult === 0) {
164
- return index; // Element found
165
- } else if (compareResult < 0) {
166
- // The element should be in the left subtree
167
- return this.findIndex(value, 2 * index + 1);
168
- } else {
169
- // The element should be in the right subtree
170
- return this.findIndex(value, 2 * index + 2);
171
- }
172
- }
173
-
174
156
  /**
175
157
  * Depth-first search (DFS) method, different traversal orders can be selected。
176
158
  * @param order - Traversal order parameter: 'in' (in-order), 'pre' (pre-order) or 'post' (post-order).
177
159
  * @returns An array containing elements traversed in the specified order.
178
160
  */
179
- dfs(order: 'in' | 'pre' | 'post'): T[] {
180
- const result: T[] = [];
161
+ dfs(order: 'in' | 'pre' | 'post'): E[] {
162
+ const result: E[] = [];
181
163
 
182
164
  // Auxiliary recursive function, traverses the binary heap according to the traversal order
183
165
  const dfsHelper = (index: number) => {
@@ -207,11 +189,11 @@ export class Heap<T> {
207
189
  * Convert the heap to an array.
208
190
  * @returns An array containing the elements of the heap.
209
191
  */
210
- toArray(): T[] {
192
+ toArray(): E[] {
211
193
  return [...this.nodes];
212
194
  }
213
195
 
214
- getNodes(): T[] {
196
+ getNodes(): E[] {
215
197
  return this.nodes;
216
198
  }
217
199
 
@@ -219,8 +201,8 @@ export class Heap<T> {
219
201
  * Clone the heap, creating a new heap with the same elements.
220
202
  * @returns A new Heap instance containing the same elements.
221
203
  */
222
- clone(): Heap<T> {
223
- const clonedHeap = new Heap<T>(this.comparator);
204
+ clone(): Heap<E> {
205
+ const clonedHeap = new Heap<E>(this.comparator);
224
206
  clonedHeap.nodes = [...this.nodes];
225
207
  return clonedHeap;
226
208
  }
@@ -229,8 +211,8 @@ export class Heap<T> {
229
211
  * Sort the elements in the heap and return them as an array.
230
212
  * @returns An array containing the elements sorted in ascending order.
231
213
  */
232
- sort(): T[] {
233
- const visitedNode: T[] = [];
214
+ sort(): E[] {
215
+ const visitedNode: E[] = [];
234
216
  const cloned = this.clone();
235
217
  while (cloned.size !== 0) {
236
218
  const top = cloned.poll();
@@ -245,8 +227,8 @@ export class Heap<T> {
245
227
  * @param comparator - Comparison function.
246
228
  * @returns A new Heap instance.
247
229
  */
248
- static heapify<T>(nodes: T[], comparator: CompareFunction<T>): Heap<T> {
249
- const binaryHeap = new Heap<T>(comparator);
230
+ static heapify<E>(nodes: E[], comparator: CompareFunction<E>): Heap<E> {
231
+ const binaryHeap = new Heap<E>(comparator);
250
232
  binaryHeap.nodes = [...nodes];
251
233
  binaryHeap.fix(); // Fix heap properties
252
234
  return binaryHeap;
@@ -9,9 +9,9 @@
9
9
  import {Heap} from './heap';
10
10
  import type {CompareFunction} from '../../types';
11
11
 
12
- export class MaxHeap<T = any> extends Heap<T> {
12
+ export class MaxHeap<E = any> extends Heap<E> {
13
13
  constructor(
14
- comparator: CompareFunction<T> = (a: T, b: T) => {
14
+ comparator: CompareFunction<E> = (a: E, b: E) => {
15
15
  if (!(typeof a === 'number' && typeof b === 'number')) {
16
16
  throw new Error('The a, b params of compare function must be number');
17
17
  } else {
@@ -9,9 +9,9 @@
9
9
  import {Heap} from './heap';
10
10
  import type {CompareFunction} from '../../types';
11
11
 
12
- export class MinHeap<T = any> extends Heap<T> {
12
+ export class MinHeap<E = any> extends Heap<E> {
13
13
  constructor(
14
- comparator: CompareFunction<T> = (a: T, b: T) => {
14
+ comparator: CompareFunction<E> = (a: E, b: E) => {
15
15
  if (!(typeof a === 'number' && typeof b === 'number')) {
16
16
  throw new Error('The a, b params of compare function must be number');
17
17
  } else {
@@ -8,9 +8,9 @@
8
8
  import {PriorityQueue} from './priority-queue';
9
9
  import type {CompareFunction} from '../../types';
10
10
 
11
- export class MaxPriorityQueue<T = any> extends PriorityQueue<T> {
11
+ export class MaxPriorityQueue<E = any> extends PriorityQueue<E> {
12
12
  constructor(
13
- compare: CompareFunction<T> = (a: T, b: T) => {
13
+ compare: CompareFunction<E> = (a: E, b: E) => {
14
14
  if (!(typeof a === 'number' && typeof b === 'number')) {
15
15
  throw new Error('The a, b params of compare function must be number');
16
16
  } else {
@@ -8,9 +8,9 @@
8
8
  import {PriorityQueue} from './priority-queue';
9
9
  import type {CompareFunction} from '../../types';
10
10
 
11
- export class MinPriorityQueue<T = any> extends PriorityQueue<T> {
11
+ export class MinPriorityQueue<E = any> extends PriorityQueue<E> {
12
12
  constructor(
13
- compare: CompareFunction<T> = (a: T, b: T) => {
13
+ compare: CompareFunction<E> = (a: E, b: E) => {
14
14
  if (!(typeof a === 'number' && typeof b === 'number')) {
15
15
  throw new Error('The a, b params of compare function must be number');
16
16
  } else {
@@ -9,8 +9,8 @@
9
9
  import {Heap} from '../heap';
10
10
  import {CompareFunction} from '../../types';
11
11
 
12
- export class PriorityQueue<T> extends Heap<T> {
13
- constructor(comparator: CompareFunction<T>) {
12
+ export class PriorityQueue<E> extends Heap<E> {
13
+ constructor(comparator: CompareFunction<E>) {
14
14
  super(comparator);
15
15
  }
16
16
  }
@@ -45,5 +45,5 @@ export type AbstractBinaryTreeNodeProperties<N extends AbstractBinaryTreeNode<N[
45
45
  export type AbstractBinaryTreeNodeNested<T> = AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, AbstractBinaryTreeNode<T, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;
46
46
 
47
47
  export type AbstractBinaryTreeOptions = {
48
- loopType?: LoopType
48
+
49
49
  };
@@ -1,5 +1,5 @@
1
1
  import {BinaryTreeNode} from '../../data-structures/binary-tree';
2
- import {AbstractBinaryTreeOptions} from './abstract-binary-tree';
2
+ import {AbstractBinaryTreeOptions, LoopType} from './abstract-binary-tree';
3
3
 
4
4
  export type BinaryTreeNodeNested<T> = BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, BinaryTreeNode<T, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
5
- export type BinaryTreeOptions = AbstractBinaryTreeOptions & {}
5
+ export type BinaryTreeOptions = AbstractBinaryTreeOptions & { loopType?: LoopType }
@@ -89,7 +89,8 @@ describe('MaxPriorityQueue Performance Test', () => {
89
89
  prev = polled;
90
90
  }
91
91
  }
92
- expect(performance.now() - startTime).toBeLessThan(bigO.LINEAR * 50);
92
+ const cost = performance.now() - startTime;
93
+ expect(cost).toBeLessThan(bigO.LINEAR * 20);
93
94
  expect(prev).toBeGreaterThan(0);
94
95
  });
95
96
 
@@ -25,7 +25,7 @@ describe('MinPriorityQueue Operation Test', () => {
25
25
  priorityQueue.add(3);
26
26
  priorityQueue.add(7);
27
27
 
28
- expect(priorityQueue.leaf()).toBe(7);
28
+ expect(priorityQueue.leaf).toBe(7);
29
29
  });
30
30
 
31
31
  it('should check if the queue is empty', () => {